`, and ``.\n$font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n\n$font-size-base: 14px !default;\n$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px\n\n$font-size-h1: floor(($font-size-base * 2.6)) !default; // ~36px\n$font-size-h2: floor(($font-size-base * 2.15)) !default; // ~30px\n$font-size-h3: ceil(($font-size-base * 1.7)) !default; // ~24px\n$font-size-h4: ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-h5: $font-size-base !default;\n$font-size-h6: ceil(($font-size-base * 0.85)) !default; // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n$line-height-base: 1.428571429 !default; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n$line-height-computed: floor(($font-size-base * $line-height-base)) !default; // ~20px\n\n//** By default, this inherits from the ``.\n$headings-font-family: inherit !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n\n// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.\n// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.\n$icon-font-path: if($bootstrap-sass-asset-helper, \"bootstrap/\", \"../fonts/bootstrap/\") !default;\n\n//** File name for all font files.\n$icon-font-name: \"glyphicons-halflings-regular\" !default;\n//** Element ID within SVG icon file.\n$icon-font-svg-id: \"glyphicons_halflingsregular\" !default;\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n$padding-base-vertical: 6px !default;\n$padding-base-horizontal: 12px !default;\n\n$padding-large-vertical: 10px !default;\n$padding-large-horizontal: 16px !default;\n\n$padding-small-vertical: 5px !default;\n$padding-small-horizontal: 10px !default;\n\n$padding-xs-vertical: 1px !default;\n$padding-xs-horizontal: 5px !default;\n\n$line-height-large: 1.3333333 !default; // extra decimals for Win 8.1 Chrome\n$line-height-small: 1.5 !default;\n\n$border-radius-base: 4px !default;\n$border-radius-large: 6px !default;\n$border-radius-small: 3px !default;\n\n//** Global color for active items (e.g., navs or dropdowns).\n$component-active-color: #fff !default;\n//** Global background color for active items (e.g., navs or dropdowns).\n$component-active-bg: $brand-primary !default;\n\n//** Width of the `border` for generating carets that indicate dropdowns.\n$caret-width-base: 4px !default;\n//** Carets increase slightly in size for larger components.\n$caret-width-large: 5px !default;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ` `s.\n$table-cell-padding: 8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding: 5px !default;\n\n//** Default background color used for all tables.\n$table-bg: transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent: #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover: #f5f5f5 !default;\n$table-bg-active: $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color: #ddd !default;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$btn-font-weight: normal !default;\n\n$btn-default-color: #333 !default;\n$btn-default-bg: #fff !default;\n$btn-default-border: #ccc !default;\n\n$btn-primary-color: #fff !default;\n$btn-primary-bg: $brand-primary !default;\n$btn-primary-border: darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color: #fff !default;\n$btn-success-bg: $brand-success !default;\n$btn-success-border: darken($btn-success-bg, 5%) !default;\n\n$btn-info-color: #fff !default;\n$btn-info-bg: $brand-info !default;\n$btn-info-border: darken($btn-info-bg, 5%) !default;\n\n$btn-warning-color: #fff !default;\n$btn-warning-bg: $brand-warning !default;\n$btn-warning-border: darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color: #fff !default;\n$btn-danger-bg: $brand-danger !default;\n$btn-danger-border: darken($btn-danger-bg, 5%) !default;\n\n$btn-link-disabled-color: $gray-light !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius-base: $border-radius-base !default;\n$btn-border-radius-large: $border-radius-large !default;\n$btn-border-radius-small: $border-radius-small !default;\n\n\n//== Forms\n//\n//##\n\n//** ` ` background color\n$input-bg: #fff !default;\n//** ` ` background color\n$input-bg-disabled: $gray-lighter !default;\n\n//** Text color for ` `s\n$input-color: $gray !default;\n//** ` ` border color\n$input-border: #ccc !default;\n\n// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on ``s in some browsers, due to the limited stylability of ``s in CSS.\n$input-border-radius: $border-radius-base !default;\n//** Large `.form-control` border radius\n$input-border-radius-large: $border-radius-large !default;\n//** Small `.form-control` border radius\n$input-border-radius-small: $border-radius-small !default;\n\n//** Border color for inputs on focus\n$input-border-focus: #66afe9 !default;\n\n//** Placeholder text color\n$input-color-placeholder: #999 !default;\n\n//** Default `.form-control` height\n$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n//** Large `.form-control` height\n$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n//** Small `.form-control` height\n$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n//** `.form-group` margin\n$form-group-margin-bottom: 15px !default;\n\n$legend-color: $gray-dark !default;\n$legend-border-color: #e5e5e5 !default;\n\n//** Background color for textual input addons\n$input-group-addon-bg: $gray-lighter !default;\n//** Border color for textual input addons\n$input-group-addon-border-color: $input-border !default;\n\n//** Disabled cursor for form controls and buttons.\n$cursor-disabled: not-allowed !default;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n$dropdown-bg: #fff !default;\n//** Dropdown menu `border-color`.\n$dropdown-border: rgba(0,0,0,.15) !default;\n//** Dropdown menu `border-color` **for IE8**.\n$dropdown-fallback-border: #ccc !default;\n//** Divider color for between dropdown items.\n$dropdown-divider-bg: #e5e5e5 !default;\n\n//** Dropdown link text color.\n$dropdown-link-color: $gray-dark !default;\n//** Hover color for dropdown links.\n$dropdown-link-hover-color: darken($gray-dark, 5%) !default;\n//** Hover background for dropdown links.\n$dropdown-link-hover-bg: #f5f5f5 !default;\n\n//** Active dropdown menu item text color.\n$dropdown-link-active-color: $component-active-color !default;\n//** Active dropdown menu item background color.\n$dropdown-link-active-bg: $component-active-bg !default;\n\n//** Disabled dropdown menu item background color.\n$dropdown-link-disabled-color: $gray-light !default;\n\n//** Text color for headers within dropdown menus.\n$dropdown-header-color: $gray-light !default;\n\n//** Deprecated `$dropdown-caret-color` as of v3.1.0\n$dropdown-caret-color: #000 !default;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n$zindex-navbar: 1000 !default;\n$zindex-dropdown: 1000 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n$zindex-navbar-fixed: 1030 !default;\n$zindex-modal-background: 1040 !default;\n$zindex-modal: 1050 !default;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs: 480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min: $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone: $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm: 768px !default;\n$screen-sm-min: $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet: $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md: 992px !default;\n$screen-md-min: $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop: $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg: 1200px !default;\n$screen-lg-min: $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop: $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max: ($screen-sm-min - 1) !default;\n$screen-sm-max: ($screen-md-min - 1) !default;\n$screen-md-max: ($screen-lg-min - 1) !default;\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n$grid-columns: 12 !default;\n//** Padding between columns. Gets divided in half for the left and right.\n$grid-gutter-width: 30px !default;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n$grid-float-breakpoint: $screen-sm-min !default;\n//** Point at which the navbar begins collapsing.\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n$container-tablet: (720px + $grid-gutter-width) !default;\n//** For `$screen-sm-min` and up.\n$container-sm: $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop: (940px + $grid-gutter-width) !default;\n//** For `$screen-md-min` and up.\n$container-md: $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop: (1140px + $grid-gutter-width) !default;\n//** For `$screen-lg-min` and up.\n$container-lg: $container-large-desktop !default;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n$navbar-height: 50px !default;\n$navbar-margin-bottom: $line-height-computed !default;\n$navbar-border-radius: $border-radius-base !default;\n$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;\n$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;\n$navbar-collapse-max-height: 340px !default;\n\n$navbar-default-color: #777 !default;\n$navbar-default-bg: #f8f8f8 !default;\n$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color: #777 !default;\n$navbar-default-link-hover-color: #333 !default;\n$navbar-default-link-hover-bg: transparent !default;\n$navbar-default-link-active-color: #555 !default;\n$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color: #ccc !default;\n$navbar-default-link-disabled-bg: transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color: $navbar-default-link-color !default;\n$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg: transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg: #ddd !default;\n$navbar-default-toggle-icon-bar-bg: #888 !default;\n$navbar-default-toggle-border-color: #ddd !default;\n\n\n//=== Inverted navbar\n// Reset inverted navbar basics\n$navbar-inverse-color: lighten($gray-light, 15%) !default;\n$navbar-inverse-bg: #222 !default;\n$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color: lighten($gray-light, 15%) !default;\n$navbar-inverse-link-hover-color: #fff !default;\n$navbar-inverse-link-hover-bg: transparent !default;\n$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color: #444 !default;\n$navbar-inverse-link-disabled-bg: transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color: $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color: #fff !default;\n$navbar-inverse-brand-hover-bg: transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg: #333 !default;\n$navbar-inverse-toggle-icon-bar-bg: #fff !default;\n$navbar-inverse-toggle-border-color: #333 !default;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n$nav-link-padding: 10px 15px !default;\n$nav-link-hover-bg: $gray-lighter !default;\n\n$nav-disabled-link-color: $gray-light !default;\n$nav-disabled-link-hover-color: $gray-light !default;\n\n//== Tabs\n$nav-tabs-border-color: #ddd !default;\n\n$nav-tabs-link-hover-border-color: $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg: $body-bg !default;\n$nav-tabs-active-link-hover-color: $gray !default;\n$nav-tabs-active-link-hover-border-color: #ddd !default;\n\n$nav-tabs-justified-link-border-color: #ddd !default;\n$nav-tabs-justified-active-link-border-color: $body-bg !default;\n\n//== Pills\n$nav-pills-border-radius: $border-radius-base !default;\n$nav-pills-active-link-hover-bg: $component-active-bg !default;\n$nav-pills-active-link-hover-color: $component-active-color !default;\n\n\n//== Pagination\n//\n//##\n\n$pagination-color: $link-color !default;\n$pagination-bg: #fff !default;\n$pagination-border: #ddd !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-lighter !default;\n$pagination-hover-border: #ddd !default;\n\n$pagination-active-color: #fff !default;\n$pagination-active-bg: $brand-primary !default;\n$pagination-active-border: $brand-primary !default;\n\n$pagination-disabled-color: $gray-light !default;\n$pagination-disabled-bg: #fff !default;\n$pagination-disabled-border: #ddd !default;\n\n\n//== Pager\n//\n//##\n\n$pager-bg: $pagination-bg !default;\n$pager-border: $pagination-border !default;\n$pager-border-radius: 15px !default;\n\n$pager-hover-bg: $pagination-hover-bg !default;\n\n$pager-active-bg: $pagination-active-bg !default;\n$pager-active-color: $pagination-active-color !default;\n\n$pager-disabled-color: $pagination-disabled-color !default;\n\n\n//== Jumbotron\n//\n//##\n\n$jumbotron-padding: 30px !default;\n$jumbotron-color: inherit !default;\n$jumbotron-bg: $gray-lighter !default;\n$jumbotron-heading-color: inherit !default;\n$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;\n$jumbotron-heading-font-size: ceil(($font-size-base * 4.5)) !default;\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text: #3c763d !default;\n$state-success-bg: #dff0d8 !default;\n$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text: #31708f !default;\n$state-info-bg: #d9edf7 !default;\n$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text: #8a6d3b !default;\n$state-warning-bg: #fcf8e3 !default;\n$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text: #a94442 !default;\n$state-danger-bg: #f2dede !default;\n$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n$tooltip-max-width: 200px !default;\n//** Tooltip text color\n$tooltip-color: #fff !default;\n//** Tooltip background color\n$tooltip-bg: #000 !default;\n$tooltip-opacity: .9 !default;\n\n//** Tooltip arrow width\n$tooltip-arrow-width: 5px !default;\n//** Tooltip arrow color\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n$popover-bg: #fff !default;\n//** Popover maximum width\n$popover-max-width: 276px !default;\n//** Popover border color\n$popover-border-color: rgba(0,0,0,.2) !default;\n//** Popover fallback border color\n$popover-fallback-border-color: #ccc !default;\n\n//** Popover title background color\n$popover-title-bg: darken($popover-bg, 3%) !default;\n\n//** Popover arrow width\n$popover-arrow-width: 10px !default;\n//** Popover arrow color\n$popover-arrow-color: $popover-bg !default;\n\n//** Popover outer arrow width\n$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;\n//** Popover outer arrow color\n$popover-arrow-outer-color: fade_in($popover-border-color, 0.05) !default;\n//** Popover outer arrow fallback color\n$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n$label-default-bg: $gray-light !default;\n//** Primary label background color\n$label-primary-bg: $brand-primary !default;\n//** Success label background color\n$label-success-bg: $brand-success !default;\n//** Info label background color\n$label-info-bg: $brand-info !default;\n//** Warning label background color\n$label-warning-bg: $brand-warning !default;\n//** Danger label background color\n$label-danger-bg: $brand-danger !default;\n\n//** Default label text color\n$label-color: #fff !default;\n//** Default text color of a linked label\n$label-link-hover-color: #fff !default;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n$modal-inner-padding: 15px !default;\n\n//** Padding applied to the modal title\n$modal-title-padding: 15px !default;\n//** Modal title line-height\n$modal-title-line-height: $line-height-base !default;\n\n//** Background color of modal content area\n$modal-content-bg: #fff !default;\n//** Modal content border color\n$modal-content-border-color: rgba(0,0,0,.2) !default;\n//** Modal content border color **for IE8**\n$modal-content-fallback-border-color: #999 !default;\n\n//** Modal backdrop background color\n$modal-backdrop-bg: #000 !default;\n//** Modal backdrop opacity\n$modal-backdrop-opacity: .5 !default;\n//** Modal header border color\n$modal-header-border-color: #e5e5e5 !default;\n//** Modal footer border color\n$modal-footer-border-color: $modal-header-border-color !default;\n\n$modal-lg: 900px !default;\n$modal-md: 600px !default;\n$modal-sm: 300px !default;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n$alert-padding: 15px !default;\n$alert-border-radius: $border-radius-base !default;\n$alert-link-font-weight: bold !default;\n\n$alert-success-bg: $state-success-bg !default;\n$alert-success-text: $state-success-text !default;\n$alert-success-border: $state-success-border !default;\n\n$alert-info-bg: $state-info-bg !default;\n$alert-info-text: $state-info-text !default;\n$alert-info-border: $state-info-border !default;\n\n$alert-warning-bg: $state-warning-bg !default;\n$alert-warning-text: $state-warning-text !default;\n$alert-warning-border: $state-warning-border !default;\n\n$alert-danger-bg: $state-danger-bg !default;\n$alert-danger-text: $state-danger-text !default;\n$alert-danger-border: $state-danger-border !default;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n$progress-bg: #f5f5f5 !default;\n//** Progress bar text color\n$progress-bar-color: #fff !default;\n//** Variable for setting rounded corners on progress bar.\n$progress-border-radius: $border-radius-base !default;\n\n//** Default progress bar color\n$progress-bar-bg: $brand-primary !default;\n//** Success progress bar color\n$progress-bar-success-bg: $brand-success !default;\n//** Warning progress bar color\n$progress-bar-warning-bg: $brand-warning !default;\n//** Danger progress bar color\n$progress-bar-danger-bg: $brand-danger !default;\n//** Info progress bar color\n$progress-bar-info-bg: $brand-info !default;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n$list-group-bg: #fff !default;\n//** `.list-group-item` border color\n$list-group-border: #ddd !default;\n//** List group border radius\n$list-group-border-radius: $border-radius-base !default;\n\n//** Background color of single list items on hover\n$list-group-hover-bg: #f5f5f5 !default;\n//** Text color of active list items\n$list-group-active-color: $component-active-color !default;\n//** Background color of active list items\n$list-group-active-bg: $component-active-bg !default;\n//** Border color of active list elements\n$list-group-active-border: $list-group-active-bg !default;\n//** Text color for content within active list items\n$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;\n\n//** Text color of disabled list items\n$list-group-disabled-color: $gray-light !default;\n//** Background color of disabled list items\n$list-group-disabled-bg: $gray-lighter !default;\n//** Text color for content within disabled list items\n$list-group-disabled-text-color: $list-group-disabled-color !default;\n\n$list-group-link-color: #555 !default;\n$list-group-link-hover-color: $list-group-link-color !default;\n$list-group-link-heading-color: #333 !default;\n\n\n//== Panels\n//\n//##\n\n$panel-bg: #fff !default;\n$panel-body-padding: 15px !default;\n$panel-heading-padding: 10px 15px !default;\n$panel-footer-padding: $panel-heading-padding !default;\n$panel-border-radius: $border-radius-base !default;\n\n//** Border color for elements within panels\n$panel-inner-border: #ddd !default;\n$panel-footer-bg: #f5f5f5 !default;\n\n$panel-default-text: $gray-dark !default;\n$panel-default-border: #ddd !default;\n$panel-default-heading-bg: #f5f5f5 !default;\n\n$panel-primary-text: #fff !default;\n$panel-primary-border: $brand-primary !default;\n$panel-primary-heading-bg: $brand-primary !default;\n\n$panel-success-text: $state-success-text !default;\n$panel-success-border: $state-success-border !default;\n$panel-success-heading-bg: $state-success-bg !default;\n\n$panel-info-text: $state-info-text !default;\n$panel-info-border: $state-info-border !default;\n$panel-info-heading-bg: $state-info-bg !default;\n\n$panel-warning-text: $state-warning-text !default;\n$panel-warning-border: $state-warning-border !default;\n$panel-warning-heading-bg: $state-warning-bg !default;\n\n$panel-danger-text: $state-danger-text !default;\n$panel-danger-border: $state-danger-border !default;\n$panel-danger-heading-bg: $state-danger-bg !default;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n$thumbnail-padding: 4px !default;\n//** Thumbnail background color\n$thumbnail-bg: $body-bg !default;\n//** Thumbnail border color\n$thumbnail-border: #ddd !default;\n//** Thumbnail border radius\n$thumbnail-border-radius: $border-radius-base !default;\n\n//** Custom text color for thumbnail captions\n$thumbnail-caption-color: $text-color !default;\n//** Padding around the thumbnail caption\n$thumbnail-caption-padding: 9px !default;\n\n\n//== Wells\n//\n//##\n\n$well-bg: #f5f5f5 !default;\n$well-border: darken($well-bg, 7%) !default;\n\n\n//== Badges\n//\n//##\n\n$badge-color: #fff !default;\n//** Linked badge text color on hover\n$badge-link-hover-color: #fff !default;\n$badge-bg: $gray-light !default;\n\n//** Badge text color in active nav link\n$badge-active-color: $link-color !default;\n//** Badge background color in active nav link\n$badge-active-bg: #fff !default;\n\n$badge-font-weight: bold !default;\n$badge-line-height: 1 !default;\n$badge-border-radius: 10px !default;\n\n\n//== Breadcrumbs\n//\n//##\n\n$breadcrumb-padding-vertical: 8px !default;\n$breadcrumb-padding-horizontal: 15px !default;\n//** Breadcrumb background color\n$breadcrumb-bg: #f5f5f5 !default;\n//** Breadcrumb text color\n$breadcrumb-color: #ccc !default;\n//** Text color of current page in the breadcrumb\n$breadcrumb-active-color: $gray-light !default;\n//** Textual separator for between breadcrumb elements\n$breadcrumb-separator: \"/\" !default;\n\n\n//== Carousel\n//\n//##\n\n$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color: #fff !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-font-size: 20px !default;\n\n$carousel-indicator-active-bg: #fff !default;\n$carousel-indicator-border-color: #fff !default;\n\n$carousel-caption-color: #fff !default;\n\n\n//== Close\n//\n//##\n\n$close-font-weight: bold !default;\n$close-color: #000 !default;\n$close-text-shadow: 0 1px 0 #fff !default;\n\n\n//== Code\n//\n//##\n\n$code-color: #c7254e !default;\n$code-bg: #f9f2f4 !default;\n\n$kbd-color: #fff !default;\n$kbd-bg: #333 !default;\n\n$pre-bg: #f5f5f5 !default;\n$pre-color: $gray-dark !default;\n$pre-border-color: #ccc !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n$component-offset-horizontal: 180px !default;\n//** Text muted color\n$text-muted: $gray-light !default;\n//** Abbreviations and acronyms border color\n$abbr-border-color: $gray-light !default;\n//** Headings small color\n$headings-small-color: $gray-light !default;\n//** Blockquote small color\n$blockquote-small-color: $gray-light !default;\n//** Blockquote font size\n$blockquote-font-size: ($font-size-base * 1.25) !default;\n//** Blockquote border color\n$blockquote-border-color: $gray-lighter !default;\n//** Page header border color\n$page-header-border-color: $gray-lighter !default;\n//** Width of horizontal description list titles\n$dl-horizontal-offset: $component-offset-horizontal !default;\n//** Point at which .dl-horizontal becomes horizontal\n$dl-horizontal-breakpoint: $grid-float-breakpoint !default;\n//** Horizontal line color.\n$hr-border: $gray-lighter !default;\n","@mixin from($device) {\n @media screen and (min-width: $device) {\n @content; } }\n\n@mixin until($device) {\n @media screen and (max-width: $device - 1px) {\n @content; } }\n\n@mixin mobile {\n @media screen and (max-width: $screen-tablet - 1px) {\n @content; } }\n\n@mixin tablet {\n @media screen and (min-width: $screen-tablet) {\n @content; } }\n\n@mixin tablet-only {\n @media screen and (min-width: $screen-tablet) and (max-width: $screen-desktop - 1px) {\n @content; } }\n\n@mixin touch {\n @media screen and (max-width: $screen-desktop - 1px) {\n @content; } }\n\n@mixin desktop {\n @media screen and (min-width: $screen-desktop) {\n @content; } }\n\n@mixin desktop-only {\n @media screen and (min-width: $screen-desktop) and (max-width: $screen-lg - 1px) {\n @content; } }\n\n@mixin widescreen {\n @media screen and (min-width: $screen-lg) {\n @content; } }\n"]}
\ No newline at end of file
diff --git a/docs/assets/css/main.css b/docs/assets/css/main.css
new file mode 100644
index 00000000..b6855bd4
--- /dev/null
+++ b/docs/assets/css/main.css
@@ -0,0 +1,8217 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url("../fonts/fontawesome-webfont.eot?v=4.7.0");
+ src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");
+ font-weight: normal;
+ font-style: normal; }
+
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale; }
+
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.33333333em;
+ line-height: 0.75em;
+ vertical-align: -15%; }
+
+.fa-2x {
+ font-size: 2em; }
+
+.fa-3x {
+ font-size: 3em; }
+
+.fa-4x {
+ font-size: 4em; }
+
+.fa-5x {
+ font-size: 5em; }
+
+.fa-fw {
+ width: 1.28571429em;
+ text-align: center; }
+
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.14285714em;
+ list-style-type: none; }
+
+.fa-ul > li {
+ position: relative; }
+
+.fa-li {
+ position: absolute;
+ left: -2.14285714em;
+ width: 2.14285714em;
+ top: 0.14285714em;
+ text-align: center; }
+
+.fa-li.fa-lg {
+ left: -1.85714286em; }
+
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid 0.08em #eeeeee;
+ border-radius: .1em; }
+
+.fa-pull-left {
+ float: left; }
+
+.fa-pull-right {
+ float: right; }
+
+.fa.fa-pull-left {
+ margin-right: .3em; }
+
+.fa.fa-pull-right {
+ margin-left: .3em; }
+
+/* Deprecated as of 4.4.0 */
+.pull-right {
+ float: right; }
+
+.pull-left {
+ float: left; }
+
+.fa.pull-left {
+ margin-right: .3em; }
+
+.fa.pull-right {
+ margin-left: .3em; }
+
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear; }
+
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8); }
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg); } }
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg); } }
+
+.fa-rotate-90 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg); }
+
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg); }
+
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+ -webkit-transform: scale(-1, 1);
+ transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+ -webkit-transform: scale(1, -1);
+ transform: scale(1, -1); }
+
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+ -webkit-filter: none;
+ filter: none; }
+
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle; }
+
+.fa-stack-1x,
+.fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center; }
+
+.fa-stack-1x {
+ line-height: inherit; }
+
+.fa-stack-2x {
+ font-size: 2em; }
+
+.fa-inverse {
+ color: #ffffff; }
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.fa-glass:before {
+ content: "\f000"; }
+
+.fa-music:before {
+ content: "\f001"; }
+
+.fa-search:before {
+ content: "\f002"; }
+
+.fa-envelope-o:before {
+ content: "\f003"; }
+
+.fa-heart:before {
+ content: "\f004"; }
+
+.fa-star:before {
+ content: "\f005"; }
+
+.fa-star-o:before {
+ content: "\f006"; }
+
+.fa-user:before {
+ content: "\f007"; }
+
+.fa-film:before {
+ content: "\f008"; }
+
+.fa-th-large:before {
+ content: "\f009"; }
+
+.fa-th:before {
+ content: "\f00a"; }
+
+.fa-th-list:before {
+ content: "\f00b"; }
+
+.fa-check:before {
+ content: "\f00c"; }
+
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+ content: "\f00d"; }
+
+.fa-search-plus:before {
+ content: "\f00e"; }
+
+.fa-search-minus:before {
+ content: "\f010"; }
+
+.fa-power-off:before {
+ content: "\f011"; }
+
+.fa-signal:before {
+ content: "\f012"; }
+
+.fa-gear:before,
+.fa-cog:before {
+ content: "\f013"; }
+
+.fa-trash-o:before {
+ content: "\f014"; }
+
+.fa-home:before {
+ content: "\f015"; }
+
+.fa-file-o:before {
+ content: "\f016"; }
+
+.fa-clock-o:before {
+ content: "\f017"; }
+
+.fa-road:before {
+ content: "\f018"; }
+
+.fa-download:before {
+ content: "\f019"; }
+
+.fa-arrow-circle-o-down:before {
+ content: "\f01a"; }
+
+.fa-arrow-circle-o-up:before {
+ content: "\f01b"; }
+
+.fa-inbox:before {
+ content: "\f01c"; }
+
+.fa-play-circle-o:before {
+ content: "\f01d"; }
+
+.fa-rotate-right:before,
+.fa-repeat:before {
+ content: "\f01e"; }
+
+.fa-refresh:before {
+ content: "\f021"; }
+
+.fa-list-alt:before {
+ content: "\f022"; }
+
+.fa-lock:before {
+ content: "\f023"; }
+
+.fa-flag:before {
+ content: "\f024"; }
+
+.fa-headphones:before {
+ content: "\f025"; }
+
+.fa-volume-off:before {
+ content: "\f026"; }
+
+.fa-volume-down:before {
+ content: "\f027"; }
+
+.fa-volume-up:before {
+ content: "\f028"; }
+
+.fa-qrcode:before {
+ content: "\f029"; }
+
+.fa-barcode:before {
+ content: "\f02a"; }
+
+.fa-tag:before {
+ content: "\f02b"; }
+
+.fa-tags:before {
+ content: "\f02c"; }
+
+.fa-book:before {
+ content: "\f02d"; }
+
+.fa-bookmark:before {
+ content: "\f02e"; }
+
+.fa-print:before {
+ content: "\f02f"; }
+
+.fa-camera:before {
+ content: "\f030"; }
+
+.fa-font:before {
+ content: "\f031"; }
+
+.fa-bold:before {
+ content: "\f032"; }
+
+.fa-italic:before {
+ content: "\f033"; }
+
+.fa-text-height:before {
+ content: "\f034"; }
+
+.fa-text-width:before {
+ content: "\f035"; }
+
+.fa-align-left:before {
+ content: "\f036"; }
+
+.fa-align-center:before {
+ content: "\f037"; }
+
+.fa-align-right:before {
+ content: "\f038"; }
+
+.fa-align-justify:before {
+ content: "\f039"; }
+
+.fa-list:before {
+ content: "\f03a"; }
+
+.fa-dedent:before,
+.fa-outdent:before {
+ content: "\f03b"; }
+
+.fa-indent:before {
+ content: "\f03c"; }
+
+.fa-video-camera:before {
+ content: "\f03d"; }
+
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+ content: "\f03e"; }
+
+.fa-pencil:before {
+ content: "\f040"; }
+
+.fa-map-marker:before {
+ content: "\f041"; }
+
+.fa-adjust:before {
+ content: "\f042"; }
+
+.fa-tint:before {
+ content: "\f043"; }
+
+.fa-edit:before,
+.fa-pencil-square-o:before {
+ content: "\f044"; }
+
+.fa-share-square-o:before {
+ content: "\f045"; }
+
+.fa-check-square-o:before {
+ content: "\f046"; }
+
+.fa-arrows:before {
+ content: "\f047"; }
+
+.fa-step-backward:before {
+ content: "\f048"; }
+
+.fa-fast-backward:before {
+ content: "\f049"; }
+
+.fa-backward:before {
+ content: "\f04a"; }
+
+.fa-play:before {
+ content: "\f04b"; }
+
+.fa-pause:before {
+ content: "\f04c"; }
+
+.fa-stop:before {
+ content: "\f04d"; }
+
+.fa-forward:before {
+ content: "\f04e"; }
+
+.fa-fast-forward:before {
+ content: "\f050"; }
+
+.fa-step-forward:before {
+ content: "\f051"; }
+
+.fa-eject:before {
+ content: "\f052"; }
+
+.fa-chevron-left:before {
+ content: "\f053"; }
+
+.fa-chevron-right:before {
+ content: "\f054"; }
+
+.fa-plus-circle:before {
+ content: "\f055"; }
+
+.fa-minus-circle:before {
+ content: "\f056"; }
+
+.fa-times-circle:before {
+ content: "\f057"; }
+
+.fa-check-circle:before {
+ content: "\f058"; }
+
+.fa-question-circle:before {
+ content: "\f059"; }
+
+.fa-info-circle:before {
+ content: "\f05a"; }
+
+.fa-crosshairs:before {
+ content: "\f05b"; }
+
+.fa-times-circle-o:before {
+ content: "\f05c"; }
+
+.fa-check-circle-o:before {
+ content: "\f05d"; }
+
+.fa-ban:before {
+ content: "\f05e"; }
+
+.fa-arrow-left:before {
+ content: "\f060"; }
+
+.fa-arrow-right:before {
+ content: "\f061"; }
+
+.fa-arrow-up:before {
+ content: "\f062"; }
+
+.fa-arrow-down:before {
+ content: "\f063"; }
+
+.fa-mail-forward:before,
+.fa-share:before {
+ content: "\f064"; }
+
+.fa-expand:before {
+ content: "\f065"; }
+
+.fa-compress:before {
+ content: "\f066"; }
+
+.fa-plus:before {
+ content: "\f067"; }
+
+.fa-minus:before {
+ content: "\f068"; }
+
+.fa-asterisk:before {
+ content: "\f069"; }
+
+.fa-exclamation-circle:before {
+ content: "\f06a"; }
+
+.fa-gift:before {
+ content: "\f06b"; }
+
+.fa-leaf:before {
+ content: "\f06c"; }
+
+.fa-fire:before {
+ content: "\f06d"; }
+
+.fa-eye:before {
+ content: "\f06e"; }
+
+.fa-eye-slash:before {
+ content: "\f070"; }
+
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+ content: "\f071"; }
+
+.fa-plane:before {
+ content: "\f072"; }
+
+.fa-calendar:before {
+ content: "\f073"; }
+
+.fa-random:before {
+ content: "\f074"; }
+
+.fa-comment:before {
+ content: "\f075"; }
+
+.fa-magnet:before {
+ content: "\f076"; }
+
+.fa-chevron-up:before {
+ content: "\f077"; }
+
+.fa-chevron-down:before {
+ content: "\f078"; }
+
+.fa-retweet:before {
+ content: "\f079"; }
+
+.fa-shopping-cart:before {
+ content: "\f07a"; }
+
+.fa-folder:before {
+ content: "\f07b"; }
+
+.fa-folder-open:before {
+ content: "\f07c"; }
+
+.fa-arrows-v:before {
+ content: "\f07d"; }
+
+.fa-arrows-h:before {
+ content: "\f07e"; }
+
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+ content: "\f080"; }
+
+.fa-twitter-square:before {
+ content: "\f081"; }
+
+.fa-facebook-square:before {
+ content: "\f082"; }
+
+.fa-camera-retro:before {
+ content: "\f083"; }
+
+.fa-key:before {
+ content: "\f084"; }
+
+.fa-gears:before,
+.fa-cogs:before {
+ content: "\f085"; }
+
+.fa-comments:before {
+ content: "\f086"; }
+
+.fa-thumbs-o-up:before {
+ content: "\f087"; }
+
+.fa-thumbs-o-down:before {
+ content: "\f088"; }
+
+.fa-star-half:before {
+ content: "\f089"; }
+
+.fa-heart-o:before {
+ content: "\f08a"; }
+
+.fa-sign-out:before {
+ content: "\f08b"; }
+
+.fa-linkedin-square:before {
+ content: "\f08c"; }
+
+.fa-thumb-tack:before {
+ content: "\f08d"; }
+
+.fa-external-link:before {
+ content: "\f08e"; }
+
+.fa-sign-in:before {
+ content: "\f090"; }
+
+.fa-trophy:before {
+ content: "\f091"; }
+
+.fa-github-square:before {
+ content: "\f092"; }
+
+.fa-upload:before {
+ content: "\f093"; }
+
+.fa-lemon-o:before {
+ content: "\f094"; }
+
+.fa-phone:before {
+ content: "\f095"; }
+
+.fa-square-o:before {
+ content: "\f096"; }
+
+.fa-bookmark-o:before {
+ content: "\f097"; }
+
+.fa-phone-square:before {
+ content: "\f098"; }
+
+.fa-twitter:before {
+ content: "\f099"; }
+
+.fa-facebook-f:before,
+.fa-facebook:before {
+ content: "\f09a"; }
+
+.fa-github:before {
+ content: "\f09b"; }
+
+.fa-unlock:before {
+ content: "\f09c"; }
+
+.fa-credit-card:before {
+ content: "\f09d"; }
+
+.fa-feed:before,
+.fa-rss:before {
+ content: "\f09e"; }
+
+.fa-hdd-o:before {
+ content: "\f0a0"; }
+
+.fa-bullhorn:before {
+ content: "\f0a1"; }
+
+.fa-bell:before {
+ content: "\f0f3"; }
+
+.fa-certificate:before {
+ content: "\f0a3"; }
+
+.fa-hand-o-right:before {
+ content: "\f0a4"; }
+
+.fa-hand-o-left:before {
+ content: "\f0a5"; }
+
+.fa-hand-o-up:before {
+ content: "\f0a6"; }
+
+.fa-hand-o-down:before {
+ content: "\f0a7"; }
+
+.fa-arrow-circle-left:before {
+ content: "\f0a8"; }
+
+.fa-arrow-circle-right:before {
+ content: "\f0a9"; }
+
+.fa-arrow-circle-up:before {
+ content: "\f0aa"; }
+
+.fa-arrow-circle-down:before {
+ content: "\f0ab"; }
+
+.fa-globe:before {
+ content: "\f0ac"; }
+
+.fa-wrench:before {
+ content: "\f0ad"; }
+
+.fa-tasks:before {
+ content: "\f0ae"; }
+
+.fa-filter:before {
+ content: "\f0b0"; }
+
+.fa-briefcase:before {
+ content: "\f0b1"; }
+
+.fa-arrows-alt:before {
+ content: "\f0b2"; }
+
+.fa-group:before,
+.fa-users:before {
+ content: "\f0c0"; }
+
+.fa-chain:before,
+.fa-link:before {
+ content: "\f0c1"; }
+
+.fa-cloud:before {
+ content: "\f0c2"; }
+
+.fa-flask:before {
+ content: "\f0c3"; }
+
+.fa-cut:before,
+.fa-scissors:before {
+ content: "\f0c4"; }
+
+.fa-copy:before,
+.fa-files-o:before {
+ content: "\f0c5"; }
+
+.fa-paperclip:before {
+ content: "\f0c6"; }
+
+.fa-save:before,
+.fa-floppy-o:before {
+ content: "\f0c7"; }
+
+.fa-square:before {
+ content: "\f0c8"; }
+
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+ content: "\f0c9"; }
+
+.fa-list-ul:before {
+ content: "\f0ca"; }
+
+.fa-list-ol:before {
+ content: "\f0cb"; }
+
+.fa-strikethrough:before {
+ content: "\f0cc"; }
+
+.fa-underline:before {
+ content: "\f0cd"; }
+
+.fa-table:before {
+ content: "\f0ce"; }
+
+.fa-magic:before {
+ content: "\f0d0"; }
+
+.fa-truck:before {
+ content: "\f0d1"; }
+
+.fa-pinterest:before {
+ content: "\f0d2"; }
+
+.fa-pinterest-square:before {
+ content: "\f0d3"; }
+
+.fa-google-plus-square:before {
+ content: "\f0d4"; }
+
+.fa-google-plus:before {
+ content: "\f0d5"; }
+
+.fa-money:before {
+ content: "\f0d6"; }
+
+.fa-caret-down:before {
+ content: "\f0d7"; }
+
+.fa-caret-up:before {
+ content: "\f0d8"; }
+
+.fa-caret-left:before {
+ content: "\f0d9"; }
+
+.fa-caret-right:before {
+ content: "\f0da"; }
+
+.fa-columns:before {
+ content: "\f0db"; }
+
+.fa-unsorted:before,
+.fa-sort:before {
+ content: "\f0dc"; }
+
+.fa-sort-down:before,
+.fa-sort-desc:before {
+ content: "\f0dd"; }
+
+.fa-sort-up:before,
+.fa-sort-asc:before {
+ content: "\f0de"; }
+
+.fa-envelope:before {
+ content: "\f0e0"; }
+
+.fa-linkedin:before {
+ content: "\f0e1"; }
+
+.fa-rotate-left:before,
+.fa-undo:before {
+ content: "\f0e2"; }
+
+.fa-legal:before,
+.fa-gavel:before {
+ content: "\f0e3"; }
+
+.fa-dashboard:before,
+.fa-tachometer:before {
+ content: "\f0e4"; }
+
+.fa-comment-o:before {
+ content: "\f0e5"; }
+
+.fa-comments-o:before {
+ content: "\f0e6"; }
+
+.fa-flash:before,
+.fa-bolt:before {
+ content: "\f0e7"; }
+
+.fa-sitemap:before {
+ content: "\f0e8"; }
+
+.fa-umbrella:before {
+ content: "\f0e9"; }
+
+.fa-paste:before,
+.fa-clipboard:before {
+ content: "\f0ea"; }
+
+.fa-lightbulb-o:before {
+ content: "\f0eb"; }
+
+.fa-exchange:before {
+ content: "\f0ec"; }
+
+.fa-cloud-download:before {
+ content: "\f0ed"; }
+
+.fa-cloud-upload:before {
+ content: "\f0ee"; }
+
+.fa-user-md:before {
+ content: "\f0f0"; }
+
+.fa-stethoscope:before {
+ content: "\f0f1"; }
+
+.fa-suitcase:before {
+ content: "\f0f2"; }
+
+.fa-bell-o:before {
+ content: "\f0a2"; }
+
+.fa-coffee:before {
+ content: "\f0f4"; }
+
+.fa-cutlery:before {
+ content: "\f0f5"; }
+
+.fa-file-text-o:before {
+ content: "\f0f6"; }
+
+.fa-building-o:before {
+ content: "\f0f7"; }
+
+.fa-hospital-o:before {
+ content: "\f0f8"; }
+
+.fa-ambulance:before {
+ content: "\f0f9"; }
+
+.fa-medkit:before {
+ content: "\f0fa"; }
+
+.fa-fighter-jet:before {
+ content: "\f0fb"; }
+
+.fa-beer:before {
+ content: "\f0fc"; }
+
+.fa-h-square:before {
+ content: "\f0fd"; }
+
+.fa-plus-square:before {
+ content: "\f0fe"; }
+
+.fa-angle-double-left:before {
+ content: "\f100"; }
+
+.fa-angle-double-right:before {
+ content: "\f101"; }
+
+.fa-angle-double-up:before {
+ content: "\f102"; }
+
+.fa-angle-double-down:before {
+ content: "\f103"; }
+
+.fa-angle-left:before {
+ content: "\f104"; }
+
+.fa-angle-right:before {
+ content: "\f105"; }
+
+.fa-angle-up:before {
+ content: "\f106"; }
+
+.fa-angle-down:before {
+ content: "\f107"; }
+
+.fa-desktop:before {
+ content: "\f108"; }
+
+.fa-laptop:before {
+ content: "\f109"; }
+
+.fa-tablet:before {
+ content: "\f10a"; }
+
+.fa-mobile-phone:before,
+.fa-mobile:before {
+ content: "\f10b"; }
+
+.fa-circle-o:before {
+ content: "\f10c"; }
+
+.fa-quote-left:before {
+ content: "\f10d"; }
+
+.fa-quote-right:before {
+ content: "\f10e"; }
+
+.fa-spinner:before {
+ content: "\f110"; }
+
+.fa-circle:before {
+ content: "\f111"; }
+
+.fa-mail-reply:before,
+.fa-reply:before {
+ content: "\f112"; }
+
+.fa-github-alt:before {
+ content: "\f113"; }
+
+.fa-folder-o:before {
+ content: "\f114"; }
+
+.fa-folder-open-o:before {
+ content: "\f115"; }
+
+.fa-smile-o:before {
+ content: "\f118"; }
+
+.fa-frown-o:before {
+ content: "\f119"; }
+
+.fa-meh-o:before {
+ content: "\f11a"; }
+
+.fa-gamepad:before {
+ content: "\f11b"; }
+
+.fa-keyboard-o:before {
+ content: "\f11c"; }
+
+.fa-flag-o:before {
+ content: "\f11d"; }
+
+.fa-flag-checkered:before {
+ content: "\f11e"; }
+
+.fa-terminal:before {
+ content: "\f120"; }
+
+.fa-code:before {
+ content: "\f121"; }
+
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+ content: "\f122"; }
+
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+ content: "\f123"; }
+
+.fa-location-arrow:before {
+ content: "\f124"; }
+
+.fa-crop:before {
+ content: "\f125"; }
+
+.fa-code-fork:before {
+ content: "\f126"; }
+
+.fa-unlink:before,
+.fa-chain-broken:before {
+ content: "\f127"; }
+
+.fa-question:before {
+ content: "\f128"; }
+
+.fa-info:before {
+ content: "\f129"; }
+
+.fa-exclamation:before {
+ content: "\f12a"; }
+
+.fa-superscript:before {
+ content: "\f12b"; }
+
+.fa-subscript:before {
+ content: "\f12c"; }
+
+.fa-eraser:before {
+ content: "\f12d"; }
+
+.fa-puzzle-piece:before {
+ content: "\f12e"; }
+
+.fa-microphone:before {
+ content: "\f130"; }
+
+.fa-microphone-slash:before {
+ content: "\f131"; }
+
+.fa-shield:before {
+ content: "\f132"; }
+
+.fa-calendar-o:before {
+ content: "\f133"; }
+
+.fa-fire-extinguisher:before {
+ content: "\f134"; }
+
+.fa-rocket:before {
+ content: "\f135"; }
+
+.fa-maxcdn:before {
+ content: "\f136"; }
+
+.fa-chevron-circle-left:before {
+ content: "\f137"; }
+
+.fa-chevron-circle-right:before {
+ content: "\f138"; }
+
+.fa-chevron-circle-up:before {
+ content: "\f139"; }
+
+.fa-chevron-circle-down:before {
+ content: "\f13a"; }
+
+.fa-html5:before {
+ content: "\f13b"; }
+
+.fa-css3:before {
+ content: "\f13c"; }
+
+.fa-anchor:before {
+ content: "\f13d"; }
+
+.fa-unlock-alt:before {
+ content: "\f13e"; }
+
+.fa-bullseye:before {
+ content: "\f140"; }
+
+.fa-ellipsis-h:before {
+ content: "\f141"; }
+
+.fa-ellipsis-v:before {
+ content: "\f142"; }
+
+.fa-rss-square:before {
+ content: "\f143"; }
+
+.fa-play-circle:before {
+ content: "\f144"; }
+
+.fa-ticket:before {
+ content: "\f145"; }
+
+.fa-minus-square:before {
+ content: "\f146"; }
+
+.fa-minus-square-o:before {
+ content: "\f147"; }
+
+.fa-level-up:before {
+ content: "\f148"; }
+
+.fa-level-down:before {
+ content: "\f149"; }
+
+.fa-check-square:before {
+ content: "\f14a"; }
+
+.fa-pencil-square:before {
+ content: "\f14b"; }
+
+.fa-external-link-square:before {
+ content: "\f14c"; }
+
+.fa-share-square:before {
+ content: "\f14d"; }
+
+.fa-compass:before {
+ content: "\f14e"; }
+
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+ content: "\f150"; }
+
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+ content: "\f151"; }
+
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+ content: "\f152"; }
+
+.fa-euro:before,
+.fa-eur:before {
+ content: "\f153"; }
+
+.fa-gbp:before {
+ content: "\f154"; }
+
+.fa-dollar:before,
+.fa-usd:before {
+ content: "\f155"; }
+
+.fa-rupee:before,
+.fa-inr:before {
+ content: "\f156"; }
+
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+ content: "\f157"; }
+
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+ content: "\f158"; }
+
+.fa-won:before,
+.fa-krw:before {
+ content: "\f159"; }
+
+.fa-bitcoin:before,
+.fa-btc:before {
+ content: "\f15a"; }
+
+.fa-file:before {
+ content: "\f15b"; }
+
+.fa-file-text:before {
+ content: "\f15c"; }
+
+.fa-sort-alpha-asc:before {
+ content: "\f15d"; }
+
+.fa-sort-alpha-desc:before {
+ content: "\f15e"; }
+
+.fa-sort-amount-asc:before {
+ content: "\f160"; }
+
+.fa-sort-amount-desc:before {
+ content: "\f161"; }
+
+.fa-sort-numeric-asc:before {
+ content: "\f162"; }
+
+.fa-sort-numeric-desc:before {
+ content: "\f163"; }
+
+.fa-thumbs-up:before {
+ content: "\f164"; }
+
+.fa-thumbs-down:before {
+ content: "\f165"; }
+
+.fa-youtube-square:before {
+ content: "\f166"; }
+
+.fa-youtube:before {
+ content: "\f167"; }
+
+.fa-xing:before {
+ content: "\f168"; }
+
+.fa-xing-square:before {
+ content: "\f169"; }
+
+.fa-youtube-play:before {
+ content: "\f16a"; }
+
+.fa-dropbox:before {
+ content: "\f16b"; }
+
+.fa-stack-overflow:before {
+ content: "\f16c"; }
+
+.fa-instagram:before {
+ content: "\f16d"; }
+
+.fa-flickr:before {
+ content: "\f16e"; }
+
+.fa-adn:before {
+ content: "\f170"; }
+
+.fa-bitbucket:before {
+ content: "\f171"; }
+
+.fa-bitbucket-square:before {
+ content: "\f172"; }
+
+.fa-tumblr:before {
+ content: "\f173"; }
+
+.fa-tumblr-square:before {
+ content: "\f174"; }
+
+.fa-long-arrow-down:before {
+ content: "\f175"; }
+
+.fa-long-arrow-up:before {
+ content: "\f176"; }
+
+.fa-long-arrow-left:before {
+ content: "\f177"; }
+
+.fa-long-arrow-right:before {
+ content: "\f178"; }
+
+.fa-apple:before {
+ content: "\f179"; }
+
+.fa-windows:before {
+ content: "\f17a"; }
+
+.fa-android:before {
+ content: "\f17b"; }
+
+.fa-linux:before {
+ content: "\f17c"; }
+
+.fa-dribbble:before {
+ content: "\f17d"; }
+
+.fa-skype:before {
+ content: "\f17e"; }
+
+.fa-foursquare:before {
+ content: "\f180"; }
+
+.fa-trello:before {
+ content: "\f181"; }
+
+.fa-female:before {
+ content: "\f182"; }
+
+.fa-male:before {
+ content: "\f183"; }
+
+.fa-gittip:before,
+.fa-gratipay:before {
+ content: "\f184"; }
+
+.fa-sun-o:before {
+ content: "\f185"; }
+
+.fa-moon-o:before {
+ content: "\f186"; }
+
+.fa-archive:before {
+ content: "\f187"; }
+
+.fa-bug:before {
+ content: "\f188"; }
+
+.fa-vk:before {
+ content: "\f189"; }
+
+.fa-weibo:before {
+ content: "\f18a"; }
+
+.fa-renren:before {
+ content: "\f18b"; }
+
+.fa-pagelines:before {
+ content: "\f18c"; }
+
+.fa-stack-exchange:before {
+ content: "\f18d"; }
+
+.fa-arrow-circle-o-right:before {
+ content: "\f18e"; }
+
+.fa-arrow-circle-o-left:before {
+ content: "\f190"; }
+
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+ content: "\f191"; }
+
+.fa-dot-circle-o:before {
+ content: "\f192"; }
+
+.fa-wheelchair:before {
+ content: "\f193"; }
+
+.fa-vimeo-square:before {
+ content: "\f194"; }
+
+.fa-turkish-lira:before,
+.fa-try:before {
+ content: "\f195"; }
+
+.fa-plus-square-o:before {
+ content: "\f196"; }
+
+.fa-space-shuttle:before {
+ content: "\f197"; }
+
+.fa-slack:before {
+ content: "\f198"; }
+
+.fa-envelope-square:before {
+ content: "\f199"; }
+
+.fa-wordpress:before {
+ content: "\f19a"; }
+
+.fa-openid:before {
+ content: "\f19b"; }
+
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+ content: "\f19c"; }
+
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+ content: "\f19d"; }
+
+.fa-yahoo:before {
+ content: "\f19e"; }
+
+.fa-google:before {
+ content: "\f1a0"; }
+
+.fa-reddit:before {
+ content: "\f1a1"; }
+
+.fa-reddit-square:before {
+ content: "\f1a2"; }
+
+.fa-stumbleupon-circle:before {
+ content: "\f1a3"; }
+
+.fa-stumbleupon:before {
+ content: "\f1a4"; }
+
+.fa-delicious:before {
+ content: "\f1a5"; }
+
+.fa-digg:before {
+ content: "\f1a6"; }
+
+.fa-pied-piper-pp:before {
+ content: "\f1a7"; }
+
+.fa-pied-piper-alt:before {
+ content: "\f1a8"; }
+
+.fa-drupal:before {
+ content: "\f1a9"; }
+
+.fa-joomla:before {
+ content: "\f1aa"; }
+
+.fa-language:before {
+ content: "\f1ab"; }
+
+.fa-fax:before {
+ content: "\f1ac"; }
+
+.fa-building:before {
+ content: "\f1ad"; }
+
+.fa-child:before {
+ content: "\f1ae"; }
+
+.fa-paw:before {
+ content: "\f1b0"; }
+
+.fa-spoon:before {
+ content: "\f1b1"; }
+
+.fa-cube:before {
+ content: "\f1b2"; }
+
+.fa-cubes:before {
+ content: "\f1b3"; }
+
+.fa-behance:before {
+ content: "\f1b4"; }
+
+.fa-behance-square:before {
+ content: "\f1b5"; }
+
+.fa-steam:before {
+ content: "\f1b6"; }
+
+.fa-steam-square:before {
+ content: "\f1b7"; }
+
+.fa-recycle:before {
+ content: "\f1b8"; }
+
+.fa-automobile:before,
+.fa-car:before {
+ content: "\f1b9"; }
+
+.fa-cab:before,
+.fa-taxi:before {
+ content: "\f1ba"; }
+
+.fa-tree:before {
+ content: "\f1bb"; }
+
+.fa-spotify:before {
+ content: "\f1bc"; }
+
+.fa-deviantart:before {
+ content: "\f1bd"; }
+
+.fa-soundcloud:before {
+ content: "\f1be"; }
+
+.fa-database:before {
+ content: "\f1c0"; }
+
+.fa-file-pdf-o:before {
+ content: "\f1c1"; }
+
+.fa-file-word-o:before {
+ content: "\f1c2"; }
+
+.fa-file-excel-o:before {
+ content: "\f1c3"; }
+
+.fa-file-powerpoint-o:before {
+ content: "\f1c4"; }
+
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+ content: "\f1c5"; }
+
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+ content: "\f1c6"; }
+
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+ content: "\f1c7"; }
+
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+ content: "\f1c8"; }
+
+.fa-file-code-o:before {
+ content: "\f1c9"; }
+
+.fa-vine:before {
+ content: "\f1ca"; }
+
+.fa-codepen:before {
+ content: "\f1cb"; }
+
+.fa-jsfiddle:before {
+ content: "\f1cc"; }
+
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+ content: "\f1cd"; }
+
+.fa-circle-o-notch:before {
+ content: "\f1ce"; }
+
+.fa-ra:before,
+.fa-resistance:before,
+.fa-rebel:before {
+ content: "\f1d0"; }
+
+.fa-ge:before,
+.fa-empire:before {
+ content: "\f1d1"; }
+
+.fa-git-square:before {
+ content: "\f1d2"; }
+
+.fa-git:before {
+ content: "\f1d3"; }
+
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+ content: "\f1d4"; }
+
+.fa-tencent-weibo:before {
+ content: "\f1d5"; }
+
+.fa-qq:before {
+ content: "\f1d6"; }
+
+.fa-wechat:before,
+.fa-weixin:before {
+ content: "\f1d7"; }
+
+.fa-send:before,
+.fa-paper-plane:before {
+ content: "\f1d8"; }
+
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+ content: "\f1d9"; }
+
+.fa-history:before {
+ content: "\f1da"; }
+
+.fa-circle-thin:before {
+ content: "\f1db"; }
+
+.fa-header:before {
+ content: "\f1dc"; }
+
+.fa-paragraph:before {
+ content: "\f1dd"; }
+
+.fa-sliders:before {
+ content: "\f1de"; }
+
+.fa-share-alt:before {
+ content: "\f1e0"; }
+
+.fa-share-alt-square:before {
+ content: "\f1e1"; }
+
+.fa-bomb:before {
+ content: "\f1e2"; }
+
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+ content: "\f1e3"; }
+
+.fa-tty:before {
+ content: "\f1e4"; }
+
+.fa-binoculars:before {
+ content: "\f1e5"; }
+
+.fa-plug:before {
+ content: "\f1e6"; }
+
+.fa-slideshare:before {
+ content: "\f1e7"; }
+
+.fa-twitch:before {
+ content: "\f1e8"; }
+
+.fa-yelp:before {
+ content: "\f1e9"; }
+
+.fa-newspaper-o:before {
+ content: "\f1ea"; }
+
+.fa-wifi:before {
+ content: "\f1eb"; }
+
+.fa-calculator:before {
+ content: "\f1ec"; }
+
+.fa-paypal:before {
+ content: "\f1ed"; }
+
+.fa-google-wallet:before {
+ content: "\f1ee"; }
+
+.fa-cc-visa:before {
+ content: "\f1f0"; }
+
+.fa-cc-mastercard:before {
+ content: "\f1f1"; }
+
+.fa-cc-discover:before {
+ content: "\f1f2"; }
+
+.fa-cc-amex:before {
+ content: "\f1f3"; }
+
+.fa-cc-paypal:before {
+ content: "\f1f4"; }
+
+.fa-cc-stripe:before {
+ content: "\f1f5"; }
+
+.fa-bell-slash:before {
+ content: "\f1f6"; }
+
+.fa-bell-slash-o:before {
+ content: "\f1f7"; }
+
+.fa-trash:before {
+ content: "\f1f8"; }
+
+.fa-copyright:before {
+ content: "\f1f9"; }
+
+.fa-at:before {
+ content: "\f1fa"; }
+
+.fa-eyedropper:before {
+ content: "\f1fb"; }
+
+.fa-paint-brush:before {
+ content: "\f1fc"; }
+
+.fa-birthday-cake:before {
+ content: "\f1fd"; }
+
+.fa-area-chart:before {
+ content: "\f1fe"; }
+
+.fa-pie-chart:before {
+ content: "\f200"; }
+
+.fa-line-chart:before {
+ content: "\f201"; }
+
+.fa-lastfm:before {
+ content: "\f202"; }
+
+.fa-lastfm-square:before {
+ content: "\f203"; }
+
+.fa-toggle-off:before {
+ content: "\f204"; }
+
+.fa-toggle-on:before {
+ content: "\f205"; }
+
+.fa-bicycle:before {
+ content: "\f206"; }
+
+.fa-bus:before {
+ content: "\f207"; }
+
+.fa-ioxhost:before {
+ content: "\f208"; }
+
+.fa-angellist:before {
+ content: "\f209"; }
+
+.fa-cc:before {
+ content: "\f20a"; }
+
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+ content: "\f20b"; }
+
+.fa-meanpath:before {
+ content: "\f20c"; }
+
+.fa-buysellads:before {
+ content: "\f20d"; }
+
+.fa-connectdevelop:before {
+ content: "\f20e"; }
+
+.fa-dashcube:before {
+ content: "\f210"; }
+
+.fa-forumbee:before {
+ content: "\f211"; }
+
+.fa-leanpub:before {
+ content: "\f212"; }
+
+.fa-sellsy:before {
+ content: "\f213"; }
+
+.fa-shirtsinbulk:before {
+ content: "\f214"; }
+
+.fa-simplybuilt:before {
+ content: "\f215"; }
+
+.fa-skyatlas:before {
+ content: "\f216"; }
+
+.fa-cart-plus:before {
+ content: "\f217"; }
+
+.fa-cart-arrow-down:before {
+ content: "\f218"; }
+
+.fa-diamond:before {
+ content: "\f219"; }
+
+.fa-ship:before {
+ content: "\f21a"; }
+
+.fa-user-secret:before {
+ content: "\f21b"; }
+
+.fa-motorcycle:before {
+ content: "\f21c"; }
+
+.fa-street-view:before {
+ content: "\f21d"; }
+
+.fa-heartbeat:before {
+ content: "\f21e"; }
+
+.fa-venus:before {
+ content: "\f221"; }
+
+.fa-mars:before {
+ content: "\f222"; }
+
+.fa-mercury:before {
+ content: "\f223"; }
+
+.fa-intersex:before,
+.fa-transgender:before {
+ content: "\f224"; }
+
+.fa-transgender-alt:before {
+ content: "\f225"; }
+
+.fa-venus-double:before {
+ content: "\f226"; }
+
+.fa-mars-double:before {
+ content: "\f227"; }
+
+.fa-venus-mars:before {
+ content: "\f228"; }
+
+.fa-mars-stroke:before {
+ content: "\f229"; }
+
+.fa-mars-stroke-v:before {
+ content: "\f22a"; }
+
+.fa-mars-stroke-h:before {
+ content: "\f22b"; }
+
+.fa-neuter:before {
+ content: "\f22c"; }
+
+.fa-genderless:before {
+ content: "\f22d"; }
+
+.fa-facebook-official:before {
+ content: "\f230"; }
+
+.fa-pinterest-p:before {
+ content: "\f231"; }
+
+.fa-whatsapp:before {
+ content: "\f232"; }
+
+.fa-server:before {
+ content: "\f233"; }
+
+.fa-user-plus:before {
+ content: "\f234"; }
+
+.fa-user-times:before {
+ content: "\f235"; }
+
+.fa-hotel:before,
+.fa-bed:before {
+ content: "\f236"; }
+
+.fa-viacoin:before {
+ content: "\f237"; }
+
+.fa-train:before {
+ content: "\f238"; }
+
+.fa-subway:before {
+ content: "\f239"; }
+
+.fa-medium:before {
+ content: "\f23a"; }
+
+.fa-yc:before,
+.fa-y-combinator:before {
+ content: "\f23b"; }
+
+.fa-optin-monster:before {
+ content: "\f23c"; }
+
+.fa-opencart:before {
+ content: "\f23d"; }
+
+.fa-expeditedssl:before {
+ content: "\f23e"; }
+
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+ content: "\f240"; }
+
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+ content: "\f241"; }
+
+.fa-battery-2:before,
+.fa-battery-half:before {
+ content: "\f242"; }
+
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+ content: "\f243"; }
+
+.fa-battery-0:before,
+.fa-battery-empty:before {
+ content: "\f244"; }
+
+.fa-mouse-pointer:before {
+ content: "\f245"; }
+
+.fa-i-cursor:before {
+ content: "\f246"; }
+
+.fa-object-group:before {
+ content: "\f247"; }
+
+.fa-object-ungroup:before {
+ content: "\f248"; }
+
+.fa-sticky-note:before {
+ content: "\f249"; }
+
+.fa-sticky-note-o:before {
+ content: "\f24a"; }
+
+.fa-cc-jcb:before {
+ content: "\f24b"; }
+
+.fa-cc-diners-club:before {
+ content: "\f24c"; }
+
+.fa-clone:before {
+ content: "\f24d"; }
+
+.fa-balance-scale:before {
+ content: "\f24e"; }
+
+.fa-hourglass-o:before {
+ content: "\f250"; }
+
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+ content: "\f251"; }
+
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+ content: "\f252"; }
+
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+ content: "\f253"; }
+
+.fa-hourglass:before {
+ content: "\f254"; }
+
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+ content: "\f255"; }
+
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+ content: "\f256"; }
+
+.fa-hand-scissors-o:before {
+ content: "\f257"; }
+
+.fa-hand-lizard-o:before {
+ content: "\f258"; }
+
+.fa-hand-spock-o:before {
+ content: "\f259"; }
+
+.fa-hand-pointer-o:before {
+ content: "\f25a"; }
+
+.fa-hand-peace-o:before {
+ content: "\f25b"; }
+
+.fa-trademark:before {
+ content: "\f25c"; }
+
+.fa-registered:before {
+ content: "\f25d"; }
+
+.fa-creative-commons:before {
+ content: "\f25e"; }
+
+.fa-gg:before {
+ content: "\f260"; }
+
+.fa-gg-circle:before {
+ content: "\f261"; }
+
+.fa-tripadvisor:before {
+ content: "\f262"; }
+
+.fa-odnoklassniki:before {
+ content: "\f263"; }
+
+.fa-odnoklassniki-square:before {
+ content: "\f264"; }
+
+.fa-get-pocket:before {
+ content: "\f265"; }
+
+.fa-wikipedia-w:before {
+ content: "\f266"; }
+
+.fa-safari:before {
+ content: "\f267"; }
+
+.fa-chrome:before {
+ content: "\f268"; }
+
+.fa-firefox:before {
+ content: "\f269"; }
+
+.fa-opera:before {
+ content: "\f26a"; }
+
+.fa-internet-explorer:before {
+ content: "\f26b"; }
+
+.fa-tv:before,
+.fa-television:before {
+ content: "\f26c"; }
+
+.fa-contao:before {
+ content: "\f26d"; }
+
+.fa-500px:before {
+ content: "\f26e"; }
+
+.fa-amazon:before {
+ content: "\f270"; }
+
+.fa-calendar-plus-o:before {
+ content: "\f271"; }
+
+.fa-calendar-minus-o:before {
+ content: "\f272"; }
+
+.fa-calendar-times-o:before {
+ content: "\f273"; }
+
+.fa-calendar-check-o:before {
+ content: "\f274"; }
+
+.fa-industry:before {
+ content: "\f275"; }
+
+.fa-map-pin:before {
+ content: "\f276"; }
+
+.fa-map-signs:before {
+ content: "\f277"; }
+
+.fa-map-o:before {
+ content: "\f278"; }
+
+.fa-map:before {
+ content: "\f279"; }
+
+.fa-commenting:before {
+ content: "\f27a"; }
+
+.fa-commenting-o:before {
+ content: "\f27b"; }
+
+.fa-houzz:before {
+ content: "\f27c"; }
+
+.fa-vimeo:before {
+ content: "\f27d"; }
+
+.fa-black-tie:before {
+ content: "\f27e"; }
+
+.fa-fonticons:before {
+ content: "\f280"; }
+
+.fa-reddit-alien:before {
+ content: "\f281"; }
+
+.fa-edge:before {
+ content: "\f282"; }
+
+.fa-credit-card-alt:before {
+ content: "\f283"; }
+
+.fa-codiepie:before {
+ content: "\f284"; }
+
+.fa-modx:before {
+ content: "\f285"; }
+
+.fa-fort-awesome:before {
+ content: "\f286"; }
+
+.fa-usb:before {
+ content: "\f287"; }
+
+.fa-product-hunt:before {
+ content: "\f288"; }
+
+.fa-mixcloud:before {
+ content: "\f289"; }
+
+.fa-scribd:before {
+ content: "\f28a"; }
+
+.fa-pause-circle:before {
+ content: "\f28b"; }
+
+.fa-pause-circle-o:before {
+ content: "\f28c"; }
+
+.fa-stop-circle:before {
+ content: "\f28d"; }
+
+.fa-stop-circle-o:before {
+ content: "\f28e"; }
+
+.fa-shopping-bag:before {
+ content: "\f290"; }
+
+.fa-shopping-basket:before {
+ content: "\f291"; }
+
+.fa-hashtag:before {
+ content: "\f292"; }
+
+.fa-bluetooth:before {
+ content: "\f293"; }
+
+.fa-bluetooth-b:before {
+ content: "\f294"; }
+
+.fa-percent:before {
+ content: "\f295"; }
+
+.fa-gitlab:before {
+ content: "\f296"; }
+
+.fa-wpbeginner:before {
+ content: "\f297"; }
+
+.fa-wpforms:before {
+ content: "\f298"; }
+
+.fa-envira:before {
+ content: "\f299"; }
+
+.fa-universal-access:before {
+ content: "\f29a"; }
+
+.fa-wheelchair-alt:before {
+ content: "\f29b"; }
+
+.fa-question-circle-o:before {
+ content: "\f29c"; }
+
+.fa-blind:before {
+ content: "\f29d"; }
+
+.fa-audio-description:before {
+ content: "\f29e"; }
+
+.fa-volume-control-phone:before {
+ content: "\f2a0"; }
+
+.fa-braille:before {
+ content: "\f2a1"; }
+
+.fa-assistive-listening-systems:before {
+ content: "\f2a2"; }
+
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+ content: "\f2a3"; }
+
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+ content: "\f2a4"; }
+
+.fa-glide:before {
+ content: "\f2a5"; }
+
+.fa-glide-g:before {
+ content: "\f2a6"; }
+
+.fa-signing:before,
+.fa-sign-language:before {
+ content: "\f2a7"; }
+
+.fa-low-vision:before {
+ content: "\f2a8"; }
+
+.fa-viadeo:before {
+ content: "\f2a9"; }
+
+.fa-viadeo-square:before {
+ content: "\f2aa"; }
+
+.fa-snapchat:before {
+ content: "\f2ab"; }
+
+.fa-snapchat-ghost:before {
+ content: "\f2ac"; }
+
+.fa-snapchat-square:before {
+ content: "\f2ad"; }
+
+.fa-pied-piper:before {
+ content: "\f2ae"; }
+
+.fa-first-order:before {
+ content: "\f2b0"; }
+
+.fa-yoast:before {
+ content: "\f2b1"; }
+
+.fa-themeisle:before {
+ content: "\f2b2"; }
+
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+ content: "\f2b3"; }
+
+.fa-fa:before,
+.fa-font-awesome:before {
+ content: "\f2b4"; }
+
+.fa-handshake-o:before {
+ content: "\f2b5"; }
+
+.fa-envelope-open:before {
+ content: "\f2b6"; }
+
+.fa-envelope-open-o:before {
+ content: "\f2b7"; }
+
+.fa-linode:before {
+ content: "\f2b8"; }
+
+.fa-address-book:before {
+ content: "\f2b9"; }
+
+.fa-address-book-o:before {
+ content: "\f2ba"; }
+
+.fa-vcard:before,
+.fa-address-card:before {
+ content: "\f2bb"; }
+
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+ content: "\f2bc"; }
+
+.fa-user-circle:before {
+ content: "\f2bd"; }
+
+.fa-user-circle-o:before {
+ content: "\f2be"; }
+
+.fa-user-o:before {
+ content: "\f2c0"; }
+
+.fa-id-badge:before {
+ content: "\f2c1"; }
+
+.fa-drivers-license:before,
+.fa-id-card:before {
+ content: "\f2c2"; }
+
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+ content: "\f2c3"; }
+
+.fa-quora:before {
+ content: "\f2c4"; }
+
+.fa-free-code-camp:before {
+ content: "\f2c5"; }
+
+.fa-telegram:before {
+ content: "\f2c6"; }
+
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+ content: "\f2c7"; }
+
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+ content: "\f2c8"; }
+
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+ content: "\f2c9"; }
+
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+ content: "\f2ca"; }
+
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+ content: "\f2cb"; }
+
+.fa-shower:before {
+ content: "\f2cc"; }
+
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+ content: "\f2cd"; }
+
+.fa-podcast:before {
+ content: "\f2ce"; }
+
+.fa-window-maximize:before {
+ content: "\f2d0"; }
+
+.fa-window-minimize:before {
+ content: "\f2d1"; }
+
+.fa-window-restore:before {
+ content: "\f2d2"; }
+
+.fa-times-rectangle:before,
+.fa-window-close:before {
+ content: "\f2d3"; }
+
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+ content: "\f2d4"; }
+
+.fa-bandcamp:before {
+ content: "\f2d5"; }
+
+.fa-grav:before {
+ content: "\f2d6"; }
+
+.fa-etsy:before {
+ content: "\f2d7"; }
+
+.fa-imdb:before {
+ content: "\f2d8"; }
+
+.fa-ravelry:before {
+ content: "\f2d9"; }
+
+.fa-eercast:before {
+ content: "\f2da"; }
+
+.fa-microchip:before {
+ content: "\f2db"; }
+
+.fa-snowflake-o:before {
+ content: "\f2dc"; }
+
+.fa-superpowers:before {
+ content: "\f2dd"; }
+
+.fa-wpexplorer:before {
+ content: "\f2de"; }
+
+.fa-meetup:before {
+ content: "\f2e0"; }
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0; }
+
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto; }
+
+@charset "UTF-8";
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+html {
+ font-family: sans-serif;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%; }
+
+body {
+ margin: 0; }
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block; }
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+ vertical-align: baseline; }
+
+audio:not([controls]) {
+ display: none;
+ height: 0; }
+
+[hidden],
+template {
+ display: none; }
+
+a {
+ background-color: transparent; }
+
+a:active,
+a:hover {
+ outline: 0; }
+
+abbr[title] {
+ border-bottom: 1px dotted; }
+
+b,
+strong {
+ font-weight: bold; }
+
+dfn {
+ font-style: italic; }
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0; }
+
+mark {
+ background: #ff0;
+ color: #000; }
+
+small {
+ font-size: 80%; }
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline; }
+
+sup {
+ top: -0.5em; }
+
+sub {
+ bottom: -0.25em; }
+
+img {
+ border: 0; }
+
+svg:not(:root) {
+ overflow: hidden; }
+
+figure {
+ margin: 1em 40px; }
+
+hr {
+ box-sizing: content-box;
+ height: 0; }
+
+pre {
+ overflow: auto; }
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em; }
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit;
+ font: inherit;
+ margin: 0; }
+
+button {
+ overflow: visible; }
+
+button,
+select {
+ text-transform: none; }
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer; }
+
+button[disabled],
+html input[disabled] {
+ cursor: default; }
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0; }
+
+input {
+ line-height: normal; }
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0; }
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto; }
+
+input[type="search"] {
+ -webkit-appearance: textfield;
+ box-sizing: content-box; }
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none; }
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em; }
+
+legend {
+ border: 0;
+ padding: 0; }
+
+textarea {
+ overflow: auto; }
+
+optgroup {
+ font-weight: bold; }
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0; }
+
+td,
+th {
+ padding: 0; }
+
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+ *,
+ *:before,
+ *:after {
+ background: transparent !important;
+ color: #000 !important;
+ box-shadow: none !important;
+ text-shadow: none !important; }
+ a,
+ a:visited {
+ text-decoration: underline; }
+ a[href]:after {
+ content: " (" attr(href) ")"; }
+ abbr[title]:after {
+ content: " (" attr(title) ")"; }
+ a[href^="#"]:after,
+ a[href^="javascript:"]:after {
+ content: ""; }
+ pre,
+ blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid; }
+ thead {
+ display: table-header-group; }
+ tr,
+ img {
+ page-break-inside: avoid; }
+ img {
+ max-width: 100% !important; }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3; }
+ h2,
+ h3 {
+ page-break-after: avoid; }
+ .navbar {
+ display: none; }
+ .btn > .caret,
+ .dropup > .btn > .caret {
+ border-top-color: #000 !important; }
+ .label {
+ border: 1px solid #000; }
+ .table {
+ border-collapse: collapse !important; }
+ .table td,
+ .table th {
+ background-color: #fff !important; }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #ddd !important; } }
+
+@font-face {
+ font-family: 'Glyphicons Halflings';
+ src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot");
+ src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); }
+
+.glyphicon {
+ position: relative;
+ top: 1px;
+ display: inline-block;
+ font-family: 'Glyphicons Halflings';
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale; }
+
+.glyphicon-asterisk:before {
+ content: "\002a"; }
+
+.glyphicon-plus:before {
+ content: "\002b"; }
+
+.glyphicon-euro:before,
+.glyphicon-eur:before {
+ content: "\20ac"; }
+
+.glyphicon-minus:before {
+ content: "\2212"; }
+
+.glyphicon-cloud:before {
+ content: "\2601"; }
+
+.glyphicon-envelope:before {
+ content: "\2709"; }
+
+.glyphicon-pencil:before {
+ content: "\270f"; }
+
+.glyphicon-glass:before {
+ content: "\e001"; }
+
+.glyphicon-music:before {
+ content: "\e002"; }
+
+.glyphicon-search:before {
+ content: "\e003"; }
+
+.glyphicon-heart:before {
+ content: "\e005"; }
+
+.glyphicon-star:before {
+ content: "\e006"; }
+
+.glyphicon-star-empty:before {
+ content: "\e007"; }
+
+.glyphicon-user:before {
+ content: "\e008"; }
+
+.glyphicon-film:before {
+ content: "\e009"; }
+
+.glyphicon-th-large:before {
+ content: "\e010"; }
+
+.glyphicon-th:before {
+ content: "\e011"; }
+
+.glyphicon-th-list:before {
+ content: "\e012"; }
+
+.glyphicon-ok:before {
+ content: "\e013"; }
+
+.glyphicon-remove:before {
+ content: "\e014"; }
+
+.glyphicon-zoom-in:before {
+ content: "\e015"; }
+
+.glyphicon-zoom-out:before {
+ content: "\e016"; }
+
+.glyphicon-off:before {
+ content: "\e017"; }
+
+.glyphicon-signal:before {
+ content: "\e018"; }
+
+.glyphicon-cog:before {
+ content: "\e019"; }
+
+.glyphicon-trash:before {
+ content: "\e020"; }
+
+.glyphicon-home:before {
+ content: "\e021"; }
+
+.glyphicon-file:before {
+ content: "\e022"; }
+
+.glyphicon-time:before {
+ content: "\e023"; }
+
+.glyphicon-road:before {
+ content: "\e024"; }
+
+.glyphicon-download-alt:before {
+ content: "\e025"; }
+
+.glyphicon-download:before {
+ content: "\e026"; }
+
+.glyphicon-upload:before {
+ content: "\e027"; }
+
+.glyphicon-inbox:before {
+ content: "\e028"; }
+
+.glyphicon-play-circle:before {
+ content: "\e029"; }
+
+.glyphicon-repeat:before {
+ content: "\e030"; }
+
+.glyphicon-refresh:before {
+ content: "\e031"; }
+
+.glyphicon-list-alt:before {
+ content: "\e032"; }
+
+.glyphicon-lock:before {
+ content: "\e033"; }
+
+.glyphicon-flag:before {
+ content: "\e034"; }
+
+.glyphicon-headphones:before {
+ content: "\e035"; }
+
+.glyphicon-volume-off:before {
+ content: "\e036"; }
+
+.glyphicon-volume-down:before {
+ content: "\e037"; }
+
+.glyphicon-volume-up:before {
+ content: "\e038"; }
+
+.glyphicon-qrcode:before {
+ content: "\e039"; }
+
+.glyphicon-barcode:before {
+ content: "\e040"; }
+
+.glyphicon-tag:before {
+ content: "\e041"; }
+
+.glyphicon-tags:before {
+ content: "\e042"; }
+
+.glyphicon-book:before {
+ content: "\e043"; }
+
+.glyphicon-bookmark:before {
+ content: "\e044"; }
+
+.glyphicon-print:before {
+ content: "\e045"; }
+
+.glyphicon-camera:before {
+ content: "\e046"; }
+
+.glyphicon-font:before {
+ content: "\e047"; }
+
+.glyphicon-bold:before {
+ content: "\e048"; }
+
+.glyphicon-italic:before {
+ content: "\e049"; }
+
+.glyphicon-text-height:before {
+ content: "\e050"; }
+
+.glyphicon-text-width:before {
+ content: "\e051"; }
+
+.glyphicon-align-left:before {
+ content: "\e052"; }
+
+.glyphicon-align-center:before {
+ content: "\e053"; }
+
+.glyphicon-align-right:before {
+ content: "\e054"; }
+
+.glyphicon-align-justify:before {
+ content: "\e055"; }
+
+.glyphicon-list:before {
+ content: "\e056"; }
+
+.glyphicon-indent-left:before {
+ content: "\e057"; }
+
+.glyphicon-indent-right:before {
+ content: "\e058"; }
+
+.glyphicon-facetime-video:before {
+ content: "\e059"; }
+
+.glyphicon-picture:before {
+ content: "\e060"; }
+
+.glyphicon-map-marker:before {
+ content: "\e062"; }
+
+.glyphicon-adjust:before {
+ content: "\e063"; }
+
+.glyphicon-tint:before {
+ content: "\e064"; }
+
+.glyphicon-edit:before {
+ content: "\e065"; }
+
+.glyphicon-share:before {
+ content: "\e066"; }
+
+.glyphicon-check:before {
+ content: "\e067"; }
+
+.glyphicon-move:before {
+ content: "\e068"; }
+
+.glyphicon-step-backward:before {
+ content: "\e069"; }
+
+.glyphicon-fast-backward:before {
+ content: "\e070"; }
+
+.glyphicon-backward:before {
+ content: "\e071"; }
+
+.glyphicon-play:before {
+ content: "\e072"; }
+
+.glyphicon-pause:before {
+ content: "\e073"; }
+
+.glyphicon-stop:before {
+ content: "\e074"; }
+
+.glyphicon-forward:before {
+ content: "\e075"; }
+
+.glyphicon-fast-forward:before {
+ content: "\e076"; }
+
+.glyphicon-step-forward:before {
+ content: "\e077"; }
+
+.glyphicon-eject:before {
+ content: "\e078"; }
+
+.glyphicon-chevron-left:before {
+ content: "\e079"; }
+
+.glyphicon-chevron-right:before {
+ content: "\e080"; }
+
+.glyphicon-plus-sign:before {
+ content: "\e081"; }
+
+.glyphicon-minus-sign:before {
+ content: "\e082"; }
+
+.glyphicon-remove-sign:before {
+ content: "\e083"; }
+
+.glyphicon-ok-sign:before {
+ content: "\e084"; }
+
+.glyphicon-question-sign:before {
+ content: "\e085"; }
+
+.glyphicon-info-sign:before {
+ content: "\e086"; }
+
+.glyphicon-screenshot:before {
+ content: "\e087"; }
+
+.glyphicon-remove-circle:before {
+ content: "\e088"; }
+
+.glyphicon-ok-circle:before {
+ content: "\e089"; }
+
+.glyphicon-ban-circle:before {
+ content: "\e090"; }
+
+.glyphicon-arrow-left:before {
+ content: "\e091"; }
+
+.glyphicon-arrow-right:before {
+ content: "\e092"; }
+
+.glyphicon-arrow-up:before {
+ content: "\e093"; }
+
+.glyphicon-arrow-down:before {
+ content: "\e094"; }
+
+.glyphicon-share-alt:before {
+ content: "\e095"; }
+
+.glyphicon-resize-full:before {
+ content: "\e096"; }
+
+.glyphicon-resize-small:before {
+ content: "\e097"; }
+
+.glyphicon-exclamation-sign:before {
+ content: "\e101"; }
+
+.glyphicon-gift:before {
+ content: "\e102"; }
+
+.glyphicon-leaf:before {
+ content: "\e103"; }
+
+.glyphicon-fire:before {
+ content: "\e104"; }
+
+.glyphicon-eye-open:before {
+ content: "\e105"; }
+
+.glyphicon-eye-close:before {
+ content: "\e106"; }
+
+.glyphicon-warning-sign:before {
+ content: "\e107"; }
+
+.glyphicon-plane:before {
+ content: "\e108"; }
+
+.glyphicon-calendar:before {
+ content: "\e109"; }
+
+.glyphicon-random:before {
+ content: "\e110"; }
+
+.glyphicon-comment:before {
+ content: "\e111"; }
+
+.glyphicon-magnet:before {
+ content: "\e112"; }
+
+.glyphicon-chevron-up:before {
+ content: "\e113"; }
+
+.glyphicon-chevron-down:before {
+ content: "\e114"; }
+
+.glyphicon-retweet:before {
+ content: "\e115"; }
+
+.glyphicon-shopping-cart:before {
+ content: "\e116"; }
+
+.glyphicon-folder-close:before {
+ content: "\e117"; }
+
+.glyphicon-folder-open:before {
+ content: "\e118"; }
+
+.glyphicon-resize-vertical:before {
+ content: "\e119"; }
+
+.glyphicon-resize-horizontal:before {
+ content: "\e120"; }
+
+.glyphicon-hdd:before {
+ content: "\e121"; }
+
+.glyphicon-bullhorn:before {
+ content: "\e122"; }
+
+.glyphicon-bell:before {
+ content: "\e123"; }
+
+.glyphicon-certificate:before {
+ content: "\e124"; }
+
+.glyphicon-thumbs-up:before {
+ content: "\e125"; }
+
+.glyphicon-thumbs-down:before {
+ content: "\e126"; }
+
+.glyphicon-hand-right:before {
+ content: "\e127"; }
+
+.glyphicon-hand-left:before {
+ content: "\e128"; }
+
+.glyphicon-hand-up:before {
+ content: "\e129"; }
+
+.glyphicon-hand-down:before {
+ content: "\e130"; }
+
+.glyphicon-circle-arrow-right:before {
+ content: "\e131"; }
+
+.glyphicon-circle-arrow-left:before {
+ content: "\e132"; }
+
+.glyphicon-circle-arrow-up:before {
+ content: "\e133"; }
+
+.glyphicon-circle-arrow-down:before {
+ content: "\e134"; }
+
+.glyphicon-globe:before {
+ content: "\e135"; }
+
+.glyphicon-wrench:before {
+ content: "\e136"; }
+
+.glyphicon-tasks:before {
+ content: "\e137"; }
+
+.glyphicon-filter:before {
+ content: "\e138"; }
+
+.glyphicon-briefcase:before {
+ content: "\e139"; }
+
+.glyphicon-fullscreen:before {
+ content: "\e140"; }
+
+.glyphicon-dashboard:before {
+ content: "\e141"; }
+
+.glyphicon-paperclip:before {
+ content: "\e142"; }
+
+.glyphicon-heart-empty:before {
+ content: "\e143"; }
+
+.glyphicon-link:before {
+ content: "\e144"; }
+
+.glyphicon-phone:before {
+ content: "\e145"; }
+
+.glyphicon-pushpin:before {
+ content: "\e146"; }
+
+.glyphicon-usd:before {
+ content: "\e148"; }
+
+.glyphicon-gbp:before {
+ content: "\e149"; }
+
+.glyphicon-sort:before {
+ content: "\e150"; }
+
+.glyphicon-sort-by-alphabet:before {
+ content: "\e151"; }
+
+.glyphicon-sort-by-alphabet-alt:before {
+ content: "\e152"; }
+
+.glyphicon-sort-by-order:before {
+ content: "\e153"; }
+
+.glyphicon-sort-by-order-alt:before {
+ content: "\e154"; }
+
+.glyphicon-sort-by-attributes:before {
+ content: "\e155"; }
+
+.glyphicon-sort-by-attributes-alt:before {
+ content: "\e156"; }
+
+.glyphicon-unchecked:before {
+ content: "\e157"; }
+
+.glyphicon-expand:before {
+ content: "\e158"; }
+
+.glyphicon-collapse-down:before {
+ content: "\e159"; }
+
+.glyphicon-collapse-up:before {
+ content: "\e160"; }
+
+.glyphicon-log-in:before {
+ content: "\e161"; }
+
+.glyphicon-flash:before {
+ content: "\e162"; }
+
+.glyphicon-log-out:before {
+ content: "\e163"; }
+
+.glyphicon-new-window:before {
+ content: "\e164"; }
+
+.glyphicon-record:before {
+ content: "\e165"; }
+
+.glyphicon-save:before {
+ content: "\e166"; }
+
+.glyphicon-open:before {
+ content: "\e167"; }
+
+.glyphicon-saved:before {
+ content: "\e168"; }
+
+.glyphicon-import:before {
+ content: "\e169"; }
+
+.glyphicon-export:before {
+ content: "\e170"; }
+
+.glyphicon-send:before {
+ content: "\e171"; }
+
+.glyphicon-floppy-disk:before {
+ content: "\e172"; }
+
+.glyphicon-floppy-saved:before {
+ content: "\e173"; }
+
+.glyphicon-floppy-remove:before {
+ content: "\e174"; }
+
+.glyphicon-floppy-save:before {
+ content: "\e175"; }
+
+.glyphicon-floppy-open:before {
+ content: "\e176"; }
+
+.glyphicon-credit-card:before {
+ content: "\e177"; }
+
+.glyphicon-transfer:before {
+ content: "\e178"; }
+
+.glyphicon-cutlery:before {
+ content: "\e179"; }
+
+.glyphicon-header:before {
+ content: "\e180"; }
+
+.glyphicon-compressed:before {
+ content: "\e181"; }
+
+.glyphicon-earphone:before {
+ content: "\e182"; }
+
+.glyphicon-phone-alt:before {
+ content: "\e183"; }
+
+.glyphicon-tower:before {
+ content: "\e184"; }
+
+.glyphicon-stats:before {
+ content: "\e185"; }
+
+.glyphicon-sd-video:before {
+ content: "\e186"; }
+
+.glyphicon-hd-video:before {
+ content: "\e187"; }
+
+.glyphicon-subtitles:before {
+ content: "\e188"; }
+
+.glyphicon-sound-stereo:before {
+ content: "\e189"; }
+
+.glyphicon-sound-dolby:before {
+ content: "\e190"; }
+
+.glyphicon-sound-5-1:before {
+ content: "\e191"; }
+
+.glyphicon-sound-6-1:before {
+ content: "\e192"; }
+
+.glyphicon-sound-7-1:before {
+ content: "\e193"; }
+
+.glyphicon-copyright-mark:before {
+ content: "\e194"; }
+
+.glyphicon-registration-mark:before {
+ content: "\e195"; }
+
+.glyphicon-cloud-download:before {
+ content: "\e197"; }
+
+.glyphicon-cloud-upload:before {
+ content: "\e198"; }
+
+.glyphicon-tree-conifer:before {
+ content: "\e199"; }
+
+.glyphicon-tree-deciduous:before {
+ content: "\e200"; }
+
+.glyphicon-cd:before {
+ content: "\e201"; }
+
+.glyphicon-save-file:before {
+ content: "\e202"; }
+
+.glyphicon-open-file:before {
+ content: "\e203"; }
+
+.glyphicon-level-up:before {
+ content: "\e204"; }
+
+.glyphicon-copy:before {
+ content: "\e205"; }
+
+.glyphicon-paste:before {
+ content: "\e206"; }
+
+.glyphicon-alert:before {
+ content: "\e209"; }
+
+.glyphicon-equalizer:before {
+ content: "\e210"; }
+
+.glyphicon-king:before {
+ content: "\e211"; }
+
+.glyphicon-queen:before {
+ content: "\e212"; }
+
+.glyphicon-pawn:before {
+ content: "\e213"; }
+
+.glyphicon-bishop:before {
+ content: "\e214"; }
+
+.glyphicon-knight:before {
+ content: "\e215"; }
+
+.glyphicon-baby-formula:before {
+ content: "\e216"; }
+
+.glyphicon-tent:before {
+ content: "\26fa"; }
+
+.glyphicon-blackboard:before {
+ content: "\e218"; }
+
+.glyphicon-bed:before {
+ content: "\e219"; }
+
+.glyphicon-apple:before {
+ content: "\f8ff"; }
+
+.glyphicon-erase:before {
+ content: "\e221"; }
+
+.glyphicon-hourglass:before {
+ content: "\231b"; }
+
+.glyphicon-lamp:before {
+ content: "\e223"; }
+
+.glyphicon-duplicate:before {
+ content: "\e224"; }
+
+.glyphicon-piggy-bank:before {
+ content: "\e225"; }
+
+.glyphicon-scissors:before {
+ content: "\e226"; }
+
+.glyphicon-bitcoin:before {
+ content: "\e227"; }
+
+.glyphicon-btc:before {
+ content: "\e227"; }
+
+.glyphicon-xbt:before {
+ content: "\e227"; }
+
+.glyphicon-yen:before {
+ content: "\00a5"; }
+
+.glyphicon-jpy:before {
+ content: "\00a5"; }
+
+.glyphicon-ruble:before {
+ content: "\20bd"; }
+
+.glyphicon-rub:before {
+ content: "\20bd"; }
+
+.glyphicon-scale:before {
+ content: "\e230"; }
+
+.glyphicon-ice-lolly:before {
+ content: "\e231"; }
+
+.glyphicon-ice-lolly-tasted:before {
+ content: "\e232"; }
+
+.glyphicon-education:before {
+ content: "\e233"; }
+
+.glyphicon-option-horizontal:before {
+ content: "\e234"; }
+
+.glyphicon-option-vertical:before {
+ content: "\e235"; }
+
+.glyphicon-menu-hamburger:before {
+ content: "\e236"; }
+
+.glyphicon-modal-window:before {
+ content: "\e237"; }
+
+.glyphicon-oil:before {
+ content: "\e238"; }
+
+.glyphicon-grain:before {
+ content: "\e239"; }
+
+.glyphicon-sunglasses:before {
+ content: "\e240"; }
+
+.glyphicon-text-size:before {
+ content: "\e241"; }
+
+.glyphicon-text-color:before {
+ content: "\e242"; }
+
+.glyphicon-text-background:before {
+ content: "\e243"; }
+
+.glyphicon-object-align-top:before {
+ content: "\e244"; }
+
+.glyphicon-object-align-bottom:before {
+ content: "\e245"; }
+
+.glyphicon-object-align-horizontal:before {
+ content: "\e246"; }
+
+.glyphicon-object-align-left:before {
+ content: "\e247"; }
+
+.glyphicon-object-align-vertical:before {
+ content: "\e248"; }
+
+.glyphicon-object-align-right:before {
+ content: "\e249"; }
+
+.glyphicon-triangle-right:before {
+ content: "\e250"; }
+
+.glyphicon-triangle-left:before {
+ content: "\e251"; }
+
+.glyphicon-triangle-bottom:before {
+ content: "\e252"; }
+
+.glyphicon-triangle-top:before {
+ content: "\e253"; }
+
+.glyphicon-console:before {
+ content: "\e254"; }
+
+.glyphicon-superscript:before {
+ content: "\e255"; }
+
+.glyphicon-subscript:before {
+ content: "\e256"; }
+
+.glyphicon-menu-left:before {
+ content: "\e257"; }
+
+.glyphicon-menu-right:before {
+ content: "\e258"; }
+
+.glyphicon-menu-down:before {
+ content: "\e259"; }
+
+.glyphicon-menu-up:before {
+ content: "\e260"; }
+
+* {
+ box-sizing: border-box; }
+
+*:before,
+*:after {
+ box-sizing: border-box; }
+
+html {
+ font-size: 10px;
+ -webkit-tap-highlight-color: transparent; }
+
+body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 1.42857;
+ color: #333333;
+ background-color: #fff; }
+
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit; }
+
+a {
+ color: #337ab7;
+ text-decoration: none; }
+ a:hover, a:focus {
+ color: #23527c;
+ text-decoration: underline; }
+ a:focus {
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px; }
+
+figure {
+ margin: 0; }
+
+img {
+ vertical-align: middle; }
+
+.img-responsive, main img {
+ display: block;
+ max-width: 100%;
+ height: auto; }
+
+.img-rounded {
+ border-radius: 6px; }
+
+.img-thumbnail {
+ padding: 4px;
+ line-height: 1.42857;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ -webkit-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+ display: inline-block;
+ max-width: 100%;
+ height: auto; }
+
+.img-circle {
+ border-radius: 50%; }
+
+hr {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ border: 0;
+ border-top: 1px solid #eeeeee; }
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto; }
+
+[role="button"] {
+ cursor: pointer; }
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit; }
+ h1 small,
+ h1 .small, h2 small,
+ h2 .small, h3 small,
+ h3 .small, h4 small,
+ h4 .small, h5 small,
+ h5 .small, h6 small,
+ h6 .small,
+ .h1 small,
+ .h1 .small, .h2 small,
+ .h2 .small, .h3 small,
+ .h3 .small, .h4 small,
+ .h4 .small, .h5 small,
+ .h5 .small, .h6 small,
+ .h6 .small {
+ font-weight: normal;
+ line-height: 1;
+ color: #777777; }
+
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+ margin-top: 20px;
+ margin-bottom: 10px; }
+ h1 small,
+ h1 .small, .h1 small,
+ .h1 .small,
+ h2 small,
+ h2 .small, .h2 small,
+ .h2 .small,
+ h3 small,
+ h3 .small, .h3 small,
+ .h3 .small {
+ font-size: 65%; }
+
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+ margin-top: 10px;
+ margin-bottom: 10px; }
+ h4 small,
+ h4 .small, .h4 small,
+ .h4 .small,
+ h5 small,
+ h5 .small, .h5 small,
+ .h5 .small,
+ h6 small,
+ h6 .small, .h6 small,
+ .h6 .small {
+ font-size: 75%; }
+
+h1, .h1 {
+ font-size: 36px; }
+
+h2, .h2 {
+ font-size: 30px; }
+
+h3, .h3 {
+ font-size: 24px; }
+
+h4, .h4 {
+ font-size: 18px; }
+
+h5, .h5 {
+ font-size: 14px; }
+
+h6, .h6 {
+ font-size: 12px; }
+
+p {
+ margin: 0 0 10px; }
+
+.lead {
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 1.4; }
+ @media (min-width: 768px) {
+ .lead {
+ font-size: 21px; } }
+
+small,
+.small {
+ font-size: 85%; }
+
+mark,
+.mark {
+ background-color: #fcf8e3;
+ padding: .2em; }
+
+.text-left {
+ text-align: left; }
+
+.text-right {
+ text-align: right; }
+
+.text-center {
+ text-align: center; }
+
+.text-justify {
+ text-align: justify; }
+
+.text-nowrap {
+ white-space: nowrap; }
+
+.text-lowercase {
+ text-transform: lowercase; }
+
+.text-uppercase, .initialism {
+ text-transform: uppercase; }
+
+.text-capitalize {
+ text-transform: capitalize; }
+
+.text-muted {
+ color: #777777; }
+
+.text-primary {
+ color: #337ab7; }
+
+a.text-primary:hover,
+a.text-primary:focus {
+ color: #286090; }
+
+.text-success {
+ color: #3c763d; }
+
+a.text-success:hover,
+a.text-success:focus {
+ color: #2b542c; }
+
+.text-info {
+ color: #31708f; }
+
+a.text-info:hover,
+a.text-info:focus {
+ color: #245269; }
+
+.text-warning {
+ color: #8a6d3b; }
+
+a.text-warning:hover,
+a.text-warning:focus {
+ color: #66512c; }
+
+.text-danger {
+ color: #a94442; }
+
+a.text-danger:hover,
+a.text-danger:focus {
+ color: #843534; }
+
+.bg-primary {
+ color: #fff; }
+
+.bg-primary {
+ background-color: #337ab7; }
+
+a.bg-primary:hover,
+a.bg-primary:focus {
+ background-color: #286090; }
+
+.bg-success {
+ background-color: #dff0d8; }
+
+a.bg-success:hover,
+a.bg-success:focus {
+ background-color: #c1e2b3; }
+
+.bg-info {
+ background-color: #d9edf7; }
+
+a.bg-info:hover,
+a.bg-info:focus {
+ background-color: #afd9ee; }
+
+.bg-warning {
+ background-color: #fcf8e3; }
+
+a.bg-warning:hover,
+a.bg-warning:focus {
+ background-color: #f7ecb5; }
+
+.bg-danger {
+ background-color: #f2dede; }
+
+a.bg-danger:hover,
+a.bg-danger:focus {
+ background-color: #e4b9b9; }
+
+.page-header {
+ padding-bottom: 9px;
+ margin: 40px 0 20px;
+ border-bottom: 1px solid #eeeeee; }
+
+ul,
+ol {
+ margin-top: 0;
+ margin-bottom: 10px; }
+ ul ul,
+ ul ol,
+ ol ul,
+ ol ol {
+ margin-bottom: 0; }
+
+.list-unstyled {
+ padding-left: 0;
+ list-style: none; }
+
+.list-inline {
+ padding-left: 0;
+ list-style: none;
+ margin-left: -5px; }
+ .list-inline > li {
+ display: inline-block;
+ padding-left: 5px;
+ padding-right: 5px; }
+
+dl {
+ margin-top: 0;
+ margin-bottom: 20px; }
+
+dt,
+dd {
+ line-height: 1.42857; }
+
+dt {
+ font-weight: bold; }
+
+dd {
+ margin-left: 0; }
+
+.dl-horizontal dd:before, .dl-horizontal dd:after {
+ content: " ";
+ display: table; }
+
+.dl-horizontal dd:after {
+ clear: both; }
+
+@media (min-width: 768px) {
+ .dl-horizontal dt {
+ float: left;
+ width: 160px;
+ clear: left;
+ text-align: right;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap; }
+ .dl-horizontal dd {
+ margin-left: 180px; } }
+
+abbr[title],
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted #777777; }
+
+.initialism {
+ font-size: 90%; }
+
+blockquote {
+ padding: 10px 20px;
+ margin: 0 0 20px;
+ font-size: 17.5px;
+ border-left: 5px solid #eeeeee; }
+ blockquote p:last-child,
+ blockquote ul:last-child,
+ blockquote ol:last-child {
+ margin-bottom: 0; }
+ blockquote footer,
+ blockquote small,
+ blockquote .small {
+ display: block;
+ font-size: 80%;
+ line-height: 1.42857;
+ color: #777777; }
+ blockquote footer:before,
+ blockquote small:before,
+ blockquote .small:before {
+ content: '\2014 \00A0'; }
+
+.blockquote-reverse,
+blockquote.pull-right {
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid #eeeeee;
+ border-left: 0;
+ text-align: right; }
+ .blockquote-reverse footer:before,
+ .blockquote-reverse small:before,
+ .blockquote-reverse .small:before,
+ blockquote.pull-right footer:before,
+ blockquote.pull-right small:before,
+ blockquote.pull-right .small:before {
+ content: ''; }
+ .blockquote-reverse footer:after,
+ .blockquote-reverse small:after,
+ .blockquote-reverse .small:after,
+ blockquote.pull-right footer:after,
+ blockquote.pull-right small:after,
+ blockquote.pull-right .small:after {
+ content: '\00A0 \2014'; }
+
+address {
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.42857; }
+
+code,
+kbd,
+pre,
+samp {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace; }
+
+code {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #c7254e;
+ background-color: #f9f2f4;
+ border-radius: 4px; }
+
+kbd {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #fff;
+ background-color: #333;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }
+ kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+ box-shadow: none; }
+
+pre {
+ display: block;
+ padding: 9.5px;
+ margin: 0 0 10px;
+ font-size: 13px;
+ line-height: 1.42857;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #333333;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border-radius: 4px; }
+ pre code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border-radius: 0; }
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll; }
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 15px;
+ padding-right: 15px; }
+ .container:before, .container:after {
+ content: " ";
+ display: table; }
+ .container:after {
+ clear: both; }
+ @media (min-width: 768px) {
+ .container {
+ width: 750px; } }
+ @media (min-width: 992px) {
+ .container {
+ width: 970px; } }
+ @media (min-width: 1200px) {
+ .container {
+ width: 1170px; } }
+
+.container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 15px;
+ padding-right: 15px; }
+ .container-fluid:before, .container-fluid:after {
+ content: " ";
+ display: table; }
+ .container-fluid:after {
+ clear: both; }
+
+.row {
+ margin-left: -15px;
+ margin-right: -15px; }
+ .row:before, .row:after {
+ content: " ";
+ display: table; }
+ .row:after {
+ clear: both; }
+
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+ position: relative;
+ min-height: 1px;
+ padding-left: 15px;
+ padding-right: 15px; }
+
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+ float: left; }
+
+.col-xs-1 {
+ width: 8.33333%; }
+
+.col-xs-2 {
+ width: 16.66667%; }
+
+.col-xs-3 {
+ width: 25%; }
+
+.col-xs-4 {
+ width: 33.33333%; }
+
+.col-xs-5 {
+ width: 41.66667%; }
+
+.col-xs-6 {
+ width: 50%; }
+
+.col-xs-7 {
+ width: 58.33333%; }
+
+.col-xs-8 {
+ width: 66.66667%; }
+
+.col-xs-9 {
+ width: 75%; }
+
+.col-xs-10 {
+ width: 83.33333%; }
+
+.col-xs-11 {
+ width: 91.66667%; }
+
+.col-xs-12 {
+ width: 100%; }
+
+.col-xs-pull-0 {
+ right: auto; }
+
+.col-xs-pull-1 {
+ right: 8.33333%; }
+
+.col-xs-pull-2 {
+ right: 16.66667%; }
+
+.col-xs-pull-3 {
+ right: 25%; }
+
+.col-xs-pull-4 {
+ right: 33.33333%; }
+
+.col-xs-pull-5 {
+ right: 41.66667%; }
+
+.col-xs-pull-6 {
+ right: 50%; }
+
+.col-xs-pull-7 {
+ right: 58.33333%; }
+
+.col-xs-pull-8 {
+ right: 66.66667%; }
+
+.col-xs-pull-9 {
+ right: 75%; }
+
+.col-xs-pull-10 {
+ right: 83.33333%; }
+
+.col-xs-pull-11 {
+ right: 91.66667%; }
+
+.col-xs-pull-12 {
+ right: 100%; }
+
+.col-xs-push-0 {
+ left: auto; }
+
+.col-xs-push-1 {
+ left: 8.33333%; }
+
+.col-xs-push-2 {
+ left: 16.66667%; }
+
+.col-xs-push-3 {
+ left: 25%; }
+
+.col-xs-push-4 {
+ left: 33.33333%; }
+
+.col-xs-push-5 {
+ left: 41.66667%; }
+
+.col-xs-push-6 {
+ left: 50%; }
+
+.col-xs-push-7 {
+ left: 58.33333%; }
+
+.col-xs-push-8 {
+ left: 66.66667%; }
+
+.col-xs-push-9 {
+ left: 75%; }
+
+.col-xs-push-10 {
+ left: 83.33333%; }
+
+.col-xs-push-11 {
+ left: 91.66667%; }
+
+.col-xs-push-12 {
+ left: 100%; }
+
+.col-xs-offset-0 {
+ margin-left: 0%; }
+
+.col-xs-offset-1 {
+ margin-left: 8.33333%; }
+
+.col-xs-offset-2 {
+ margin-left: 16.66667%; }
+
+.col-xs-offset-3 {
+ margin-left: 25%; }
+
+.col-xs-offset-4 {
+ margin-left: 33.33333%; }
+
+.col-xs-offset-5 {
+ margin-left: 41.66667%; }
+
+.col-xs-offset-6 {
+ margin-left: 50%; }
+
+.col-xs-offset-7 {
+ margin-left: 58.33333%; }
+
+.col-xs-offset-8 {
+ margin-left: 66.66667%; }
+
+.col-xs-offset-9 {
+ margin-left: 75%; }
+
+.col-xs-offset-10 {
+ margin-left: 83.33333%; }
+
+.col-xs-offset-11 {
+ margin-left: 91.66667%; }
+
+.col-xs-offset-12 {
+ margin-left: 100%; }
+
+@media (min-width: 768px) {
+ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+ float: left; }
+ .col-sm-1 {
+ width: 8.33333%; }
+ .col-sm-2 {
+ width: 16.66667%; }
+ .col-sm-3 {
+ width: 25%; }
+ .col-sm-4 {
+ width: 33.33333%; }
+ .col-sm-5 {
+ width: 41.66667%; }
+ .col-sm-6 {
+ width: 50%; }
+ .col-sm-7 {
+ width: 58.33333%; }
+ .col-sm-8 {
+ width: 66.66667%; }
+ .col-sm-9 {
+ width: 75%; }
+ .col-sm-10 {
+ width: 83.33333%; }
+ .col-sm-11 {
+ width: 91.66667%; }
+ .col-sm-12 {
+ width: 100%; }
+ .col-sm-pull-0 {
+ right: auto; }
+ .col-sm-pull-1 {
+ right: 8.33333%; }
+ .col-sm-pull-2 {
+ right: 16.66667%; }
+ .col-sm-pull-3 {
+ right: 25%; }
+ .col-sm-pull-4 {
+ right: 33.33333%; }
+ .col-sm-pull-5 {
+ right: 41.66667%; }
+ .col-sm-pull-6 {
+ right: 50%; }
+ .col-sm-pull-7 {
+ right: 58.33333%; }
+ .col-sm-pull-8 {
+ right: 66.66667%; }
+ .col-sm-pull-9 {
+ right: 75%; }
+ .col-sm-pull-10 {
+ right: 83.33333%; }
+ .col-sm-pull-11 {
+ right: 91.66667%; }
+ .col-sm-pull-12 {
+ right: 100%; }
+ .col-sm-push-0 {
+ left: auto; }
+ .col-sm-push-1 {
+ left: 8.33333%; }
+ .col-sm-push-2 {
+ left: 16.66667%; }
+ .col-sm-push-3 {
+ left: 25%; }
+ .col-sm-push-4 {
+ left: 33.33333%; }
+ .col-sm-push-5 {
+ left: 41.66667%; }
+ .col-sm-push-6 {
+ left: 50%; }
+ .col-sm-push-7 {
+ left: 58.33333%; }
+ .col-sm-push-8 {
+ left: 66.66667%; }
+ .col-sm-push-9 {
+ left: 75%; }
+ .col-sm-push-10 {
+ left: 83.33333%; }
+ .col-sm-push-11 {
+ left: 91.66667%; }
+ .col-sm-push-12 {
+ left: 100%; }
+ .col-sm-offset-0 {
+ margin-left: 0%; }
+ .col-sm-offset-1 {
+ margin-left: 8.33333%; }
+ .col-sm-offset-2 {
+ margin-left: 16.66667%; }
+ .col-sm-offset-3 {
+ margin-left: 25%; }
+ .col-sm-offset-4 {
+ margin-left: 33.33333%; }
+ .col-sm-offset-5 {
+ margin-left: 41.66667%; }
+ .col-sm-offset-6 {
+ margin-left: 50%; }
+ .col-sm-offset-7 {
+ margin-left: 58.33333%; }
+ .col-sm-offset-8 {
+ margin-left: 66.66667%; }
+ .col-sm-offset-9 {
+ margin-left: 75%; }
+ .col-sm-offset-10 {
+ margin-left: 83.33333%; }
+ .col-sm-offset-11 {
+ margin-left: 91.66667%; }
+ .col-sm-offset-12 {
+ margin-left: 100%; } }
+
+@media (min-width: 992px) {
+ .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+ float: left; }
+ .col-md-1 {
+ width: 8.33333%; }
+ .col-md-2 {
+ width: 16.66667%; }
+ .col-md-3 {
+ width: 25%; }
+ .col-md-4 {
+ width: 33.33333%; }
+ .col-md-5 {
+ width: 41.66667%; }
+ .col-md-6 {
+ width: 50%; }
+ .col-md-7 {
+ width: 58.33333%; }
+ .col-md-8 {
+ width: 66.66667%; }
+ .col-md-9 {
+ width: 75%; }
+ .col-md-10 {
+ width: 83.33333%; }
+ .col-md-11 {
+ width: 91.66667%; }
+ .col-md-12 {
+ width: 100%; }
+ .col-md-pull-0 {
+ right: auto; }
+ .col-md-pull-1 {
+ right: 8.33333%; }
+ .col-md-pull-2 {
+ right: 16.66667%; }
+ .col-md-pull-3 {
+ right: 25%; }
+ .col-md-pull-4 {
+ right: 33.33333%; }
+ .col-md-pull-5 {
+ right: 41.66667%; }
+ .col-md-pull-6 {
+ right: 50%; }
+ .col-md-pull-7 {
+ right: 58.33333%; }
+ .col-md-pull-8 {
+ right: 66.66667%; }
+ .col-md-pull-9 {
+ right: 75%; }
+ .col-md-pull-10 {
+ right: 83.33333%; }
+ .col-md-pull-11 {
+ right: 91.66667%; }
+ .col-md-pull-12 {
+ right: 100%; }
+ .col-md-push-0 {
+ left: auto; }
+ .col-md-push-1 {
+ left: 8.33333%; }
+ .col-md-push-2 {
+ left: 16.66667%; }
+ .col-md-push-3 {
+ left: 25%; }
+ .col-md-push-4 {
+ left: 33.33333%; }
+ .col-md-push-5 {
+ left: 41.66667%; }
+ .col-md-push-6 {
+ left: 50%; }
+ .col-md-push-7 {
+ left: 58.33333%; }
+ .col-md-push-8 {
+ left: 66.66667%; }
+ .col-md-push-9 {
+ left: 75%; }
+ .col-md-push-10 {
+ left: 83.33333%; }
+ .col-md-push-11 {
+ left: 91.66667%; }
+ .col-md-push-12 {
+ left: 100%; }
+ .col-md-offset-0 {
+ margin-left: 0%; }
+ .col-md-offset-1 {
+ margin-left: 8.33333%; }
+ .col-md-offset-2 {
+ margin-left: 16.66667%; }
+ .col-md-offset-3 {
+ margin-left: 25%; }
+ .col-md-offset-4 {
+ margin-left: 33.33333%; }
+ .col-md-offset-5 {
+ margin-left: 41.66667%; }
+ .col-md-offset-6 {
+ margin-left: 50%; }
+ .col-md-offset-7 {
+ margin-left: 58.33333%; }
+ .col-md-offset-8 {
+ margin-left: 66.66667%; }
+ .col-md-offset-9 {
+ margin-left: 75%; }
+ .col-md-offset-10 {
+ margin-left: 83.33333%; }
+ .col-md-offset-11 {
+ margin-left: 91.66667%; }
+ .col-md-offset-12 {
+ margin-left: 100%; } }
+
+@media (min-width: 1200px) {
+ .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+ float: left; }
+ .col-lg-1 {
+ width: 8.33333%; }
+ .col-lg-2 {
+ width: 16.66667%; }
+ .col-lg-3 {
+ width: 25%; }
+ .col-lg-4 {
+ width: 33.33333%; }
+ .col-lg-5 {
+ width: 41.66667%; }
+ .col-lg-6 {
+ width: 50%; }
+ .col-lg-7 {
+ width: 58.33333%; }
+ .col-lg-8 {
+ width: 66.66667%; }
+ .col-lg-9 {
+ width: 75%; }
+ .col-lg-10 {
+ width: 83.33333%; }
+ .col-lg-11 {
+ width: 91.66667%; }
+ .col-lg-12 {
+ width: 100%; }
+ .col-lg-pull-0 {
+ right: auto; }
+ .col-lg-pull-1 {
+ right: 8.33333%; }
+ .col-lg-pull-2 {
+ right: 16.66667%; }
+ .col-lg-pull-3 {
+ right: 25%; }
+ .col-lg-pull-4 {
+ right: 33.33333%; }
+ .col-lg-pull-5 {
+ right: 41.66667%; }
+ .col-lg-pull-6 {
+ right: 50%; }
+ .col-lg-pull-7 {
+ right: 58.33333%; }
+ .col-lg-pull-8 {
+ right: 66.66667%; }
+ .col-lg-pull-9 {
+ right: 75%; }
+ .col-lg-pull-10 {
+ right: 83.33333%; }
+ .col-lg-pull-11 {
+ right: 91.66667%; }
+ .col-lg-pull-12 {
+ right: 100%; }
+ .col-lg-push-0 {
+ left: auto; }
+ .col-lg-push-1 {
+ left: 8.33333%; }
+ .col-lg-push-2 {
+ left: 16.66667%; }
+ .col-lg-push-3 {
+ left: 25%; }
+ .col-lg-push-4 {
+ left: 33.33333%; }
+ .col-lg-push-5 {
+ left: 41.66667%; }
+ .col-lg-push-6 {
+ left: 50%; }
+ .col-lg-push-7 {
+ left: 58.33333%; }
+ .col-lg-push-8 {
+ left: 66.66667%; }
+ .col-lg-push-9 {
+ left: 75%; }
+ .col-lg-push-10 {
+ left: 83.33333%; }
+ .col-lg-push-11 {
+ left: 91.66667%; }
+ .col-lg-push-12 {
+ left: 100%; }
+ .col-lg-offset-0 {
+ margin-left: 0%; }
+ .col-lg-offset-1 {
+ margin-left: 8.33333%; }
+ .col-lg-offset-2 {
+ margin-left: 16.66667%; }
+ .col-lg-offset-3 {
+ margin-left: 25%; }
+ .col-lg-offset-4 {
+ margin-left: 33.33333%; }
+ .col-lg-offset-5 {
+ margin-left: 41.66667%; }
+ .col-lg-offset-6 {
+ margin-left: 50%; }
+ .col-lg-offset-7 {
+ margin-left: 58.33333%; }
+ .col-lg-offset-8 {
+ margin-left: 66.66667%; }
+ .col-lg-offset-9 {
+ margin-left: 75%; }
+ .col-lg-offset-10 {
+ margin-left: 83.33333%; }
+ .col-lg-offset-11 {
+ margin-left: 91.66667%; }
+ .col-lg-offset-12 {
+ margin-left: 100%; } }
+
+table {
+ background-color: transparent; }
+
+caption {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ color: #777777;
+ text-align: left; }
+
+th {
+ text-align: left; }
+
+.table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 20px; }
+ .table > thead > tr > th,
+ .table > thead > tr > td,
+ .table > tbody > tr > th,
+ .table > tbody > tr > td,
+ .table > tfoot > tr > th,
+ .table > tfoot > tr > td {
+ padding: 8px;
+ line-height: 1.42857;
+ vertical-align: top;
+ border-top: 1px solid #ddd; }
+ .table > thead > tr > th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #ddd; }
+ .table > caption + thead > tr:first-child > th,
+ .table > caption + thead > tr:first-child > td,
+ .table > colgroup + thead > tr:first-child > th,
+ .table > colgroup + thead > tr:first-child > td,
+ .table > thead:first-child > tr:first-child > th,
+ .table > thead:first-child > tr:first-child > td {
+ border-top: 0; }
+ .table > tbody + tbody {
+ border-top: 2px solid #ddd; }
+ .table .table {
+ background-color: #fff; }
+
+.table-condensed > thead > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > th,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > th,
+.table-condensed > tfoot > tr > td {
+ padding: 5px; }
+
+.table-bordered {
+ border: 1px solid #ddd; }
+ .table-bordered > thead > tr > th,
+ .table-bordered > thead > tr > td,
+ .table-bordered > tbody > tr > th,
+ .table-bordered > tbody > tr > td,
+ .table-bordered > tfoot > tr > th,
+ .table-bordered > tfoot > tr > td {
+ border: 1px solid #ddd; }
+ .table-bordered > thead > tr > th,
+ .table-bordered > thead > tr > td {
+ border-bottom-width: 2px; }
+
+.table-striped > tbody > tr:nth-of-type(odd) {
+ background-color: #f9f9f9; }
+
+.table-hover > tbody > tr:hover {
+ background-color: #f5f5f5; }
+
+table col[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-column; }
+
+table td[class*="col-"],
+table th[class*="col-"] {
+ position: static;
+ float: none;
+ display: table-cell; }
+
+.table > thead > tr > td.active,
+.table > thead > tr > th.active,
+.table > thead > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr > td.active,
+.table > tbody > tr > th.active,
+.table > tbody > tr.active > td,
+.table > tbody > tr.active > th,
+.table > tfoot > tr > td.active,
+.table > tfoot > tr > th.active,
+.table > tfoot > tr.active > td,
+.table > tfoot > tr.active > th {
+ background-color: #f5f5f5; }
+
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+ background-color: #e8e8e8; }
+
+.table > thead > tr > td.success,
+.table > thead > tr > th.success,
+.table > thead > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr > td.success,
+.table > tbody > tr > th.success,
+.table > tbody > tr.success > td,
+.table > tbody > tr.success > th,
+.table > tfoot > tr > td.success,
+.table > tfoot > tr > th.success,
+.table > tfoot > tr.success > td,
+.table > tfoot > tr.success > th {
+ background-color: #dff0d8; }
+
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+ background-color: #d0e9c6; }
+
+.table > thead > tr > td.info,
+.table > thead > tr > th.info,
+.table > thead > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr > td.info,
+.table > tbody > tr > th.info,
+.table > tbody > tr.info > td,
+.table > tbody > tr.info > th,
+.table > tfoot > tr > td.info,
+.table > tfoot > tr > th.info,
+.table > tfoot > tr.info > td,
+.table > tfoot > tr.info > th {
+ background-color: #d9edf7; }
+
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+ background-color: #c4e3f3; }
+
+.table > thead > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr > td.warning,
+.table > tbody > tr > th.warning,
+.table > tbody > tr.warning > td,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr > td.warning,
+.table > tfoot > tr > th.warning,
+.table > tfoot > tr.warning > td,
+.table > tfoot > tr.warning > th {
+ background-color: #fcf8e3; }
+
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+ background-color: #faf2cc; }
+
+.table > thead > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr > td.danger,
+.table > tbody > tr > th.danger,
+.table > tbody > tr.danger > td,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr > td.danger,
+.table > tfoot > tr > th.danger,
+.table > tfoot > tr.danger > td,
+.table > tfoot > tr.danger > th {
+ background-color: #f2dede; }
+
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+ background-color: #ebcccc; }
+
+.table-responsive {
+ overflow-x: auto;
+ min-height: 0.01%; }
+ @media screen and (max-width: 767px) {
+ .table-responsive {
+ width: 100%;
+ margin-bottom: 15px;
+ overflow-y: hidden;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ border: 1px solid #ddd; }
+ .table-responsive > .table {
+ margin-bottom: 0; }
+ .table-responsive > .table > thead > tr > th,
+ .table-responsive > .table > thead > tr > td,
+ .table-responsive > .table > tbody > tr > th,
+ .table-responsive > .table > tbody > tr > td,
+ .table-responsive > .table > tfoot > tr > th,
+ .table-responsive > .table > tfoot > tr > td {
+ white-space: nowrap; }
+ .table-responsive > .table-bordered {
+ border: 0; }
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0; }
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0; }
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0; } }
+
+fieldset {
+ padding: 0;
+ margin: 0;
+ border: 0;
+ min-width: 0; }
+
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 20px;
+ font-size: 21px;
+ line-height: inherit;
+ color: #333333;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5; }
+
+label {
+ display: inline-block;
+ max-width: 100%;
+ margin-bottom: 5px;
+ font-weight: bold; }
+
+input[type="search"] {
+ box-sizing: border-box; }
+
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ line-height: normal; }
+
+input[type="file"] {
+ display: block; }
+
+input[type="range"] {
+ display: block;
+ width: 100%; }
+
+select[multiple],
+select[size] {
+ height: auto; }
+
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px; }
+
+output {
+ display: block;
+ padding-top: 7px;
+ font-size: 14px;
+ line-height: 1.42857;
+ color: #555555; }
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: 34px;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.42857;
+ color: #555555;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }
+ .form-control:focus {
+ border-color: #66afe9;
+ outline: 0;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }
+ .form-control::-moz-placeholder {
+ color: #999;
+ opacity: 1; }
+ .form-control:-ms-input-placeholder {
+ color: #999; }
+ .form-control::-webkit-input-placeholder {
+ color: #999; }
+ .form-control::-ms-expand {
+ border: 0;
+ background-color: transparent; }
+ .form-control[disabled], .form-control[readonly],
+ fieldset[disabled] .form-control {
+ background-color: #eeeeee;
+ opacity: 1; }
+ .form-control[disabled],
+ fieldset[disabled] .form-control {
+ cursor: not-allowed; }
+
+textarea.form-control {
+ height: auto; }
+
+input[type="search"] {
+ -webkit-appearance: none; }
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+ input[type="date"].form-control,
+ input[type="time"].form-control,
+ input[type="datetime-local"].form-control,
+ input[type="month"].form-control {
+ line-height: 34px; }
+ input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control,
+ .input-group-sm > input[type="date"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="date"].btn,
+ .input-group-sm input[type="date"],
+ input[type="time"].input-sm,
+ .input-group-sm > input[type="time"].form-control,
+ .input-group-sm > input[type="time"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="time"].btn,
+ .input-group-sm
+ input[type="time"],
+ input[type="datetime-local"].input-sm,
+ .input-group-sm > input[type="datetime-local"].form-control,
+ .input-group-sm > input[type="datetime-local"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
+ .input-group-sm
+ input[type="datetime-local"],
+ input[type="month"].input-sm,
+ .input-group-sm > input[type="month"].form-control,
+ .input-group-sm > input[type="month"].input-group-addon,
+ .input-group-sm > .input-group-btn > input[type="month"].btn,
+ .input-group-sm
+ input[type="month"] {
+ line-height: 30px; }
+ input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control,
+ .input-group-lg > input[type="date"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="date"].btn,
+ .input-group-lg input[type="date"],
+ input[type="time"].input-lg,
+ .input-group-lg > input[type="time"].form-control,
+ .input-group-lg > input[type="time"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="time"].btn,
+ .input-group-lg
+ input[type="time"],
+ input[type="datetime-local"].input-lg,
+ .input-group-lg > input[type="datetime-local"].form-control,
+ .input-group-lg > input[type="datetime-local"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
+ .input-group-lg
+ input[type="datetime-local"],
+ input[type="month"].input-lg,
+ .input-group-lg > input[type="month"].form-control,
+ .input-group-lg > input[type="month"].input-group-addon,
+ .input-group-lg > .input-group-btn > input[type="month"].btn,
+ .input-group-lg
+ input[type="month"] {
+ line-height: 46px; } }
+
+.form-group {
+ margin-bottom: 15px; }
+
+.radio,
+.checkbox {
+ position: relative;
+ display: block;
+ margin-top: 10px;
+ margin-bottom: 10px; }
+ .radio label,
+ .checkbox label {
+ min-height: 20px;
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ cursor: pointer; }
+
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+ position: absolute;
+ margin-left: -20px;
+ margin-top: 4px \9; }
+
+.radio + .radio,
+.checkbox + .checkbox {
+ margin-top: -5px; }
+
+.radio-inline,
+.checkbox-inline {
+ position: relative;
+ display: inline-block;
+ padding-left: 20px;
+ margin-bottom: 0;
+ vertical-align: middle;
+ font-weight: normal;
+ cursor: pointer; }
+
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+ margin-top: 0;
+ margin-left: 10px; }
+
+input[type="radio"][disabled], input[type="radio"].disabled,
+fieldset[disabled] input[type="radio"],
+input[type="checkbox"][disabled],
+input[type="checkbox"].disabled,
+fieldset[disabled]
+input[type="checkbox"] {
+ cursor: not-allowed; }
+
+.radio-inline.disabled,
+fieldset[disabled] .radio-inline,
+.checkbox-inline.disabled,
+fieldset[disabled]
+.checkbox-inline {
+ cursor: not-allowed; }
+
+.radio.disabled label,
+fieldset[disabled] .radio label,
+.checkbox.disabled label,
+fieldset[disabled]
+.checkbox label {
+ cursor: not-allowed; }
+
+.form-control-static {
+ padding-top: 7px;
+ padding-bottom: 7px;
+ margin-bottom: 0;
+ min-height: 34px; }
+ .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,
+ .input-group-lg > .form-control-static.input-group-addon,
+ .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,
+ .input-group-sm > .form-control-static.input-group-addon,
+ .input-group-sm > .input-group-btn > .form-control-static.btn {
+ padding-left: 0;
+ padding-right: 0; }
+
+.input-sm, .input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px; }
+
+select.input-sm, .input-group-sm > select.form-control,
+.input-group-sm > select.input-group-addon,
+.input-group-sm > .input-group-btn > select.btn {
+ height: 30px;
+ line-height: 30px; }
+
+textarea.input-sm, .input-group-sm > textarea.form-control,
+.input-group-sm > textarea.input-group-addon,
+.input-group-sm > .input-group-btn > textarea.btn,
+select[multiple].input-sm,
+.input-group-sm > select[multiple].form-control,
+.input-group-sm > select[multiple].input-group-addon,
+.input-group-sm > .input-group-btn > select[multiple].btn {
+ height: auto; }
+
+.form-group-sm .form-control {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px; }
+
+.form-group-sm select.form-control {
+ height: 30px;
+ line-height: 30px; }
+
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+ height: auto; }
+
+.form-group-sm .form-control-static {
+ height: 30px;
+ min-height: 32px;
+ padding: 6px 10px;
+ font-size: 12px;
+ line-height: 1.5; }
+
+.input-lg, .input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33333;
+ border-radius: 6px; }
+
+select.input-lg, .input-group-lg > select.form-control,
+.input-group-lg > select.input-group-addon,
+.input-group-lg > .input-group-btn > select.btn {
+ height: 46px;
+ line-height: 46px; }
+
+textarea.input-lg, .input-group-lg > textarea.form-control,
+.input-group-lg > textarea.input-group-addon,
+.input-group-lg > .input-group-btn > textarea.btn,
+select[multiple].input-lg,
+.input-group-lg > select[multiple].form-control,
+.input-group-lg > select[multiple].input-group-addon,
+.input-group-lg > .input-group-btn > select[multiple].btn {
+ height: auto; }
+
+.form-group-lg .form-control {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33333;
+ border-radius: 6px; }
+
+.form-group-lg select.form-control {
+ height: 46px;
+ line-height: 46px; }
+
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+ height: auto; }
+
+.form-group-lg .form-control-static {
+ height: 46px;
+ min-height: 38px;
+ padding: 11px 16px;
+ font-size: 18px;
+ line-height: 1.33333; }
+
+.has-feedback {
+ position: relative; }
+ .has-feedback .form-control {
+ padding-right: 42.5px; }
+
+.form-control-feedback {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ display: block;
+ width: 34px;
+ height: 34px;
+ line-height: 34px;
+ text-align: center;
+ pointer-events: none; }
+
+.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,
+.input-group-lg > .input-group-addon + .form-control-feedback,
+.input-group-lg > .input-group-btn > .btn + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+ width: 46px;
+ height: 46px;
+ line-height: 46px; }
+
+.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,
+.input-group-sm > .input-group-addon + .form-control-feedback,
+.input-group-sm > .input-group-btn > .btn + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+ width: 30px;
+ height: 30px;
+ line-height: 30px; }
+
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+ color: #3c763d; }
+
+.has-success .form-control {
+ border-color: #3c763d;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
+ .has-success .form-control:focus {
+ border-color: #2b542c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }
+
+.has-success .input-group-addon {
+ color: #3c763d;
+ border-color: #3c763d;
+ background-color: #dff0d8; }
+
+.has-success .form-control-feedback {
+ color: #3c763d; }
+
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+ color: #8a6d3b; }
+
+.has-warning .form-control {
+ border-color: #8a6d3b;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
+ .has-warning .form-control:focus {
+ border-color: #66512c;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; }
+
+.has-warning .input-group-addon {
+ color: #8a6d3b;
+ border-color: #8a6d3b;
+ background-color: #fcf8e3; }
+
+.has-warning .form-control-feedback {
+ color: #8a6d3b; }
+
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+ color: #a94442; }
+
+.has-error .form-control {
+ border-color: #a94442;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
+ .has-error .form-control:focus {
+ border-color: #843534;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }
+
+.has-error .input-group-addon {
+ color: #a94442;
+ border-color: #a94442;
+ background-color: #f2dede; }
+
+.has-error .form-control-feedback {
+ color: #a94442; }
+
+.has-feedback label ~ .form-control-feedback {
+ top: 25px; }
+
+.has-feedback label.sr-only ~ .form-control-feedback {
+ top: 0; }
+
+.help-block {
+ display: block;
+ margin-top: 5px;
+ margin-bottom: 10px;
+ color: #737373; }
+
+@media (min-width: 768px) {
+ .form-inline .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle; }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle; }
+ .form-inline .form-control-static {
+ display: inline-block; }
+ .form-inline .input-group {
+ display: inline-table;
+ vertical-align: middle; }
+ .form-inline .input-group .input-group-addon,
+ .form-inline .input-group .input-group-btn,
+ .form-inline .input-group .form-control {
+ width: auto; }
+ .form-inline .input-group > .form-control {
+ width: 100%; }
+ .form-inline .control-label {
+ margin-bottom: 0;
+ vertical-align: middle; }
+ .form-inline .radio,
+ .form-inline .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle; }
+ .form-inline .radio label,
+ .form-inline .checkbox label {
+ padding-left: 0; }
+ .form-inline .radio input[type="radio"],
+ .form-inline .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0; }
+ .form-inline .has-feedback .form-control-feedback {
+ top: 0; } }
+
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+ margin-top: 0;
+ margin-bottom: 0;
+ padding-top: 7px; }
+
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+ min-height: 27px; }
+
+.form-horizontal .form-group {
+ margin-left: -15px;
+ margin-right: -15px; }
+ .form-horizontal .form-group:before, .form-horizontal .form-group:after {
+ content: " ";
+ display: table; }
+ .form-horizontal .form-group:after {
+ clear: both; }
+
+@media (min-width: 768px) {
+ .form-horizontal .control-label {
+ text-align: right;
+ margin-bottom: 0;
+ padding-top: 7px; } }
+
+.form-horizontal .has-feedback .form-control-feedback {
+ right: 15px; }
+
+@media (min-width: 768px) {
+ .form-horizontal .form-group-lg .control-label {
+ padding-top: 11px;
+ font-size: 18px; } }
+
+@media (min-width: 768px) {
+ .form-horizontal .form-group-sm .control-label {
+ padding-top: 6px;
+ font-size: 12px; } }
+
+.btn {
+ display: inline-block;
+ margin-bottom: 0;
+ font-weight: normal;
+ text-align: center;
+ vertical-align: middle;
+ -ms-touch-action: manipulation;
+ touch-action: manipulation;
+ cursor: pointer;
+ background-image: none;
+ border: 1px solid transparent;
+ white-space: nowrap;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.42857;
+ border-radius: 4px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none; }
+ .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px; }
+ .btn:hover, .btn:focus, .btn.focus {
+ color: #333;
+ text-decoration: none; }
+ .btn:active, .btn.active {
+ outline: 0;
+ background-image: none;
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
+ .btn.disabled, .btn[disabled],
+ fieldset[disabled] .btn {
+ cursor: not-allowed;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ box-shadow: none; }
+
+a.btn.disabled,
+fieldset[disabled] a.btn {
+ pointer-events: none; }
+
+.btn-default {
+ color: #333;
+ background-color: #fff;
+ border-color: #ccc; }
+ .btn-default:focus, .btn-default.focus {
+ color: #333;
+ background-color: #e6e6e6;
+ border-color: #8c8c8c; }
+ .btn-default:hover {
+ color: #333;
+ background-color: #e6e6e6;
+ border-color: #adadad; }
+ .btn-default:active, .btn-default.active,
+ .open > .btn-default.dropdown-toggle {
+ color: #333;
+ background-color: #e6e6e6;
+ border-color: #adadad; }
+ .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,
+ .open > .btn-default.dropdown-toggle:hover,
+ .open > .btn-default.dropdown-toggle:focus,
+ .open > .btn-default.dropdown-toggle.focus {
+ color: #333;
+ background-color: #d4d4d4;
+ border-color: #8c8c8c; }
+ .btn-default:active, .btn-default.active,
+ .open > .btn-default.dropdown-toggle {
+ background-image: none; }
+ .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,
+ fieldset[disabled] .btn-default:hover,
+ fieldset[disabled] .btn-default:focus,
+ fieldset[disabled] .btn-default.focus {
+ background-color: #fff;
+ border-color: #ccc; }
+ .btn-default .badge {
+ color: #fff;
+ background-color: #333; }
+
+.btn-primary {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #2e6da4; }
+ .btn-primary:focus, .btn-primary.focus {
+ color: #fff;
+ background-color: #286090;
+ border-color: #122b40; }
+ .btn-primary:hover {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74; }
+ .btn-primary:active, .btn-primary.active,
+ .open > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74; }
+ .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,
+ .open > .btn-primary.dropdown-toggle:hover,
+ .open > .btn-primary.dropdown-toggle:focus,
+ .open > .btn-primary.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #204d74;
+ border-color: #122b40; }
+ .btn-primary:active, .btn-primary.active,
+ .open > .btn-primary.dropdown-toggle {
+ background-image: none; }
+ .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,
+ fieldset[disabled] .btn-primary:hover,
+ fieldset[disabled] .btn-primary:focus,
+ fieldset[disabled] .btn-primary.focus {
+ background-color: #337ab7;
+ border-color: #2e6da4; }
+ .btn-primary .badge {
+ color: #337ab7;
+ background-color: #fff; }
+
+.btn-success {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #4cae4c; }
+ .btn-success:focus, .btn-success.focus {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #255625; }
+ .btn-success:hover {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #398439; }
+ .btn-success:active, .btn-success.active,
+ .open > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #398439; }
+ .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,
+ .open > .btn-success.dropdown-toggle:hover,
+ .open > .btn-success.dropdown-toggle:focus,
+ .open > .btn-success.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #398439;
+ border-color: #255625; }
+ .btn-success:active, .btn-success.active,
+ .open > .btn-success.dropdown-toggle {
+ background-image: none; }
+ .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,
+ fieldset[disabled] .btn-success:hover,
+ fieldset[disabled] .btn-success:focus,
+ fieldset[disabled] .btn-success.focus {
+ background-color: #5cb85c;
+ border-color: #4cae4c; }
+ .btn-success .badge {
+ color: #5cb85c;
+ background-color: #fff; }
+
+.btn-info {
+ color: #fff;
+ background-color: #5bc0de;
+ border-color: #46b8da; }
+ .btn-info:focus, .btn-info.focus {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #1b6d85; }
+ .btn-info:hover {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #269abc; }
+ .btn-info:active, .btn-info.active,
+ .open > .btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #269abc; }
+ .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,
+ .open > .btn-info.dropdown-toggle:hover,
+ .open > .btn-info.dropdown-toggle:focus,
+ .open > .btn-info.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #269abc;
+ border-color: #1b6d85; }
+ .btn-info:active, .btn-info.active,
+ .open > .btn-info.dropdown-toggle {
+ background-image: none; }
+ .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,
+ fieldset[disabled] .btn-info:hover,
+ fieldset[disabled] .btn-info:focus,
+ fieldset[disabled] .btn-info.focus {
+ background-color: #5bc0de;
+ border-color: #46b8da; }
+ .btn-info .badge {
+ color: #5bc0de;
+ background-color: #fff; }
+
+.btn-warning {
+ color: #fff;
+ background-color: #f0ad4e;
+ border-color: #eea236; }
+ .btn-warning:focus, .btn-warning.focus {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #985f0d; }
+ .btn-warning:hover {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #d58512; }
+ .btn-warning:active, .btn-warning.active,
+ .open > .btn-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #d58512; }
+ .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,
+ .open > .btn-warning.dropdown-toggle:hover,
+ .open > .btn-warning.dropdown-toggle:focus,
+ .open > .btn-warning.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #d58512;
+ border-color: #985f0d; }
+ .btn-warning:active, .btn-warning.active,
+ .open > .btn-warning.dropdown-toggle {
+ background-image: none; }
+ .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,
+ fieldset[disabled] .btn-warning:hover,
+ fieldset[disabled] .btn-warning:focus,
+ fieldset[disabled] .btn-warning.focus {
+ background-color: #f0ad4e;
+ border-color: #eea236; }
+ .btn-warning .badge {
+ color: #f0ad4e;
+ background-color: #fff; }
+
+.btn-danger {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d43f3a; }
+ .btn-danger:focus, .btn-danger.focus {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #761c19; }
+ .btn-danger:hover {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #ac2925; }
+ .btn-danger:active, .btn-danger.active,
+ .open > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #ac2925; }
+ .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,
+ .open > .btn-danger.dropdown-toggle:hover,
+ .open > .btn-danger.dropdown-toggle:focus,
+ .open > .btn-danger.dropdown-toggle.focus {
+ color: #fff;
+ background-color: #ac2925;
+ border-color: #761c19; }
+ .btn-danger:active, .btn-danger.active,
+ .open > .btn-danger.dropdown-toggle {
+ background-image: none; }
+ .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,
+ fieldset[disabled] .btn-danger:hover,
+ fieldset[disabled] .btn-danger:focus,
+ fieldset[disabled] .btn-danger.focus {
+ background-color: #d9534f;
+ border-color: #d43f3a; }
+ .btn-danger .badge {
+ color: #d9534f;
+ background-color: #fff; }
+
+.btn-link {
+ color: #337ab7;
+ font-weight: normal;
+ border-radius: 0; }
+ .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],
+ fieldset[disabled] .btn-link {
+ background-color: transparent;
+ box-shadow: none; }
+ .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {
+ border-color: transparent; }
+ .btn-link:hover, .btn-link:focus {
+ color: #23527c;
+ text-decoration: underline;
+ background-color: transparent; }
+ .btn-link[disabled]:hover, .btn-link[disabled]:focus,
+ fieldset[disabled] .btn-link:hover,
+ fieldset[disabled] .btn-link:focus {
+ color: #777777;
+ text-decoration: none; }
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33333;
+ border-radius: 6px; }
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px; }
+
+.btn-xs, .btn-group-xs > .btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px; }
+
+.btn-block {
+ display: block;
+ width: 100%; }
+
+.btn-block + .btn-block {
+ margin-top: 5px; }
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%; }
+
+.fade {
+ opacity: 0;
+ -webkit-transition: opacity 0.15s linear;
+ transition: opacity 0.15s linear; }
+ .fade.in {
+ opacity: 1; }
+
+.collapse {
+ display: none; }
+ .collapse.in {
+ display: block; }
+
+tr.collapse.in {
+ display: table-row; }
+
+tbody.collapse.in {
+ display: table-row-group; }
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition-property: height, visibility;
+ transition-property: height, visibility;
+ -webkit-transition-duration: 0.35s;
+ transition-duration: 0.35s;
+ -webkit-transition-timing-function: ease;
+ transition-timing-function: ease; }
+
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 2px;
+ vertical-align: middle;
+ border-top: 4px dashed;
+ border-top: 4px solid \9;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent; }
+
+.dropup,
+.dropdown {
+ position: relative; }
+
+.dropdown-toggle:focus {
+ outline: 0; }
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ margin: 2px 0 0;
+ list-style: none;
+ font-size: 14px;
+ text-align: left;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 4px;
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ background-clip: padding-box; }
+ .dropdown-menu.pull-right {
+ right: 0;
+ left: auto; }
+ .dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5; }
+ .dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.42857;
+ color: #333333;
+ white-space: nowrap; }
+
+.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
+ text-decoration: none;
+ color: #262626;
+ background-color: #f5f5f5; }
+
+.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ background-color: #337ab7; }
+
+.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+ color: #777777; }
+
+.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ cursor: not-allowed; }
+
+.open > .dropdown-menu {
+ display: block; }
+
+.open > a {
+ outline: 0; }
+
+.dropdown-menu-right {
+ left: auto;
+ right: 0; }
+
+.dropdown-menu-left {
+ left: 0;
+ right: auto; }
+
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: 12px;
+ line-height: 1.42857;
+ color: #777777;
+ white-space: nowrap; }
+
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: 990; }
+
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto; }
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+ border-top: 0;
+ border-bottom: 4px dashed;
+ border-bottom: 4px solid \9;
+ content: ""; }
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 2px; }
+
+@media (min-width: 768px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto; }
+ .navbar-right .dropdown-menu-left {
+ left: 0;
+ right: auto; } }
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle; }
+ .btn-group > .btn,
+ .btn-group-vertical > .btn {
+ position: relative;
+ float: left; }
+ .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
+ .btn-group-vertical > .btn:hover,
+ .btn-group-vertical > .btn:focus,
+ .btn-group-vertical > .btn:active,
+ .btn-group-vertical > .btn.active {
+ z-index: 2; }
+
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+ margin-left: -1px; }
+
+.btn-toolbar {
+ margin-left: -5px; }
+ .btn-toolbar:before, .btn-toolbar:after {
+ content: " ";
+ display: table; }
+ .btn-toolbar:after {
+ clear: both; }
+ .btn-toolbar .btn,
+ .btn-toolbar .btn-group,
+ .btn-toolbar .input-group {
+ float: left; }
+ .btn-toolbar > .btn,
+ .btn-toolbar > .btn-group,
+ .btn-toolbar > .input-group {
+ margin-left: 5px; }
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0; }
+
+.btn-group > .btn:first-child {
+ margin-left: 0; }
+ .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0; }
+
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0; }
+
+.btn-group > .btn-group {
+ float: left; }
+
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0; }
+
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0; }
+
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0; }
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0; }
+
+.btn-group > .btn + .dropdown-toggle {
+ padding-left: 8px;
+ padding-right: 8px; }
+
+.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle {
+ padding-left: 12px;
+ padding-right: 12px; }
+
+.btn-group.open .dropdown-toggle {
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
+ .btn-group.open .dropdown-toggle.btn-link {
+ box-shadow: none; }
+
+.btn .caret {
+ margin-left: 0; }
+
+.btn-lg .caret, .btn-group-lg > .btn .caret {
+ border-width: 5px 5px 0;
+ border-bottom-width: 0; }
+
+.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {
+ border-width: 0 5px 5px; }
+
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%; }
+
+.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after {
+ content: " ";
+ display: table; }
+
+.btn-group-vertical > .btn-group:after {
+ clear: both; }
+
+.btn-group-vertical > .btn-group > .btn {
+ float: none; }
+
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0; }
+
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+ border-radius: 0; }
+
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0; }
+
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px; }
+
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0; }
+
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0; }
+
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0; }
+
+.btn-group-justified {
+ display: table;
+ width: 100%;
+ table-layout: fixed;
+ border-collapse: separate; }
+ .btn-group-justified > .btn,
+ .btn-group-justified > .btn-group {
+ float: none;
+ display: table-cell;
+ width: 1%; }
+ .btn-group-justified > .btn-group .btn {
+ width: 100%; }
+ .btn-group-justified > .btn-group .dropdown-menu {
+ left: auto; }
+
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none; }
+
+.input-group {
+ position: relative;
+ display: table;
+ border-collapse: separate; }
+ .input-group[class*="col-"] {
+ float: none;
+ padding-left: 0;
+ padding-right: 0; }
+ .input-group .form-control {
+ position: relative;
+ z-index: 2;
+ float: left;
+ width: 100%;
+ margin-bottom: 0; }
+ .input-group .form-control:focus {
+ z-index: 3; }
+
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+ display: table-cell; }
+ .input-group-addon:not(:first-child):not(:last-child),
+ .input-group-btn:not(:first-child):not(:last-child),
+ .input-group .form-control:not(:first-child):not(:last-child) {
+ border-radius: 0; }
+
+.input-group-addon,
+.input-group-btn {
+ width: 1%;
+ white-space: nowrap;
+ vertical-align: middle; }
+
+.input-group-addon {
+ padding: 6px 12px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1;
+ color: #555555;
+ text-align: center;
+ background-color: #eeeeee;
+ border: 1px solid #ccc;
+ border-radius: 4px; }
+ .input-group-addon.input-sm,
+ .input-group-sm > .input-group-addon,
+ .input-group-sm > .input-group-btn > .input-group-addon.btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ border-radius: 3px; }
+ .input-group-addon.input-lg,
+ .input-group-lg > .input-group-addon,
+ .input-group-lg > .input-group-btn > .input-group-addon.btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ border-radius: 6px; }
+ .input-group-addon input[type="radio"],
+ .input-group-addon input[type="checkbox"] {
+ margin-top: 0; }
+
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0; }
+
+.input-group-addon:first-child {
+ border-right: 0; }
+
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0; }
+
+.input-group-addon:last-child {
+ border-left: 0; }
+
+.input-group-btn {
+ position: relative;
+ font-size: 0;
+ white-space: nowrap; }
+ .input-group-btn > .btn {
+ position: relative; }
+ .input-group-btn > .btn + .btn {
+ margin-left: -1px; }
+ .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {
+ z-index: 2; }
+ .input-group-btn:first-child > .btn,
+ .input-group-btn:first-child > .btn-group {
+ margin-right: -1px; }
+ .input-group-btn:last-child > .btn,
+ .input-group-btn:last-child > .btn-group {
+ z-index: 2;
+ margin-left: -1px; }
+
+.nav {
+ margin-bottom: 0;
+ padding-left: 0;
+ list-style: none; }
+ .nav:before, .nav:after {
+ content: " ";
+ display: table; }
+ .nav:after {
+ clear: both; }
+ .nav > li {
+ position: relative;
+ display: block; }
+ .nav > li > a {
+ position: relative;
+ display: block;
+ padding: 10px 15px; }
+ .nav > li > a:hover, .nav > li > a:focus {
+ text-decoration: none;
+ background-color: #eeeeee; }
+ .nav > li.disabled > a {
+ color: #777777; }
+ .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {
+ color: #777777;
+ text-decoration: none;
+ background-color: transparent;
+ cursor: not-allowed; }
+ .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {
+ background-color: #eeeeee;
+ border-color: #337ab7; }
+ .nav .nav-divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5; }
+ .nav > li > a > img {
+ max-width: none; }
+
+.nav-tabs {
+ border-bottom: 1px solid #ddd; }
+ .nav-tabs > li {
+ float: left;
+ margin-bottom: -1px; }
+ .nav-tabs > li > a {
+ margin-right: 2px;
+ line-height: 1.42857;
+ border: 1px solid transparent;
+ border-radius: 4px 4px 0 0; }
+ .nav-tabs > li > a:hover {
+ border-color: #eeeeee #eeeeee #ddd; }
+ .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
+ color: #555555;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+ cursor: default; }
+
+.nav-pills > li {
+ float: left; }
+ .nav-pills > li > a {
+ border-radius: 4px; }
+ .nav-pills > li + li {
+ margin-left: 2px; }
+ .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {
+ color: #fff;
+ background-color: #337ab7; }
+
+.nav-stacked > li {
+ float: none; }
+ .nav-stacked > li + li {
+ margin-top: 2px;
+ margin-left: 0; }
+
+.nav-justified, .nav-tabs.nav-justified {
+ width: 100%; }
+ .nav-justified > li, .nav-tabs.nav-justified > li {
+ float: none; }
+ .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+ text-align: center;
+ margin-bottom: 5px; }
+ .nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto; }
+ @media (min-width: 768px) {
+ .nav-justified > li, .nav-tabs.nav-justified > li {
+ display: table-cell;
+ width: 1%; }
+ .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-bottom: 0; } }
+
+.nav-tabs-justified, .nav-tabs.nav-justified {
+ border-bottom: 0; }
+ .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-right: 0;
+ border-radius: 4px; }
+ .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
+ .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
+ .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {
+ border: 1px solid #ddd; }
+ @media (min-width: 768px) {
+ .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ border-bottom: 1px solid #ddd;
+ border-radius: 4px 4px 0 0; }
+ .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
+ .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,
+ .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {
+ border-bottom-color: #fff; } }
+
+.tab-content > .tab-pane {
+ display: none; }
+
+.tab-content > .active {
+ display: block; }
+
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0; }
+
+.navbar {
+ position: relative;
+ min-height: 50px;
+ margin-bottom: 20px;
+ border: 1px solid transparent; }
+ .navbar:before, .navbar:after {
+ content: " ";
+ display: table; }
+ .navbar:after {
+ clear: both; }
+ @media (min-width: 768px) {
+ .navbar {
+ border-radius: 4px; } }
+
+.navbar-header:before, .navbar-header:after {
+ content: " ";
+ display: table; }
+
+.navbar-header:after {
+ clear: both; }
+
+@media (min-width: 768px) {
+ .navbar-header {
+ float: left; } }
+
+.navbar-collapse {
+ overflow-x: visible;
+ padding-right: 15px;
+ padding-left: 15px;
+ border-top: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+ -webkit-overflow-scrolling: touch; }
+ .navbar-collapse:before, .navbar-collapse:after {
+ content: " ";
+ display: table; }
+ .navbar-collapse:after {
+ clear: both; }
+ .navbar-collapse.in {
+ overflow-y: auto; }
+ @media (min-width: 768px) {
+ .navbar-collapse {
+ width: auto;
+ border-top: 0;
+ box-shadow: none; }
+ .navbar-collapse.collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0;
+ overflow: visible !important; }
+ .navbar-collapse.in {
+ overflow-y: visible; }
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-static-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ padding-left: 0;
+ padding-right: 0; } }
+
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+ max-height: 340px; }
+ @media (max-device-width: 480px) and (orientation: landscape) {
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ max-height: 200px; } }
+
+.container > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-header,
+.container-fluid > .navbar-collapse {
+ margin-right: -15px;
+ margin-left: -15px; }
+ @media (min-width: 768px) {
+ .container > .navbar-header,
+ .container > .navbar-collapse,
+ .container-fluid > .navbar-header,
+ .container-fluid > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0; } }
+
+.navbar-static-top {
+ z-index: 1000;
+ border-width: 0 0 1px; }
+ @media (min-width: 768px) {
+ .navbar-static-top {
+ border-radius: 0; } }
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: 1030; }
+ @media (min-width: 768px) {
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ border-radius: 0; } }
+
+.navbar-fixed-top {
+ top: 0;
+ border-width: 0 0 1px; }
+
+.navbar-fixed-bottom {
+ bottom: 0;
+ margin-bottom: 0;
+ border-width: 1px 0 0; }
+
+.navbar-brand {
+ float: left;
+ padding: 15px 15px;
+ font-size: 18px;
+ line-height: 20px;
+ height: 50px; }
+ .navbar-brand:hover, .navbar-brand:focus {
+ text-decoration: none; }
+ .navbar-brand > img {
+ display: block; }
+ @media (min-width: 768px) {
+ .navbar > .container .navbar-brand,
+ .navbar > .container-fluid .navbar-brand {
+ margin-left: -15px; } }
+
+.navbar-toggle {
+ position: relative;
+ float: right;
+ margin-right: 15px;
+ padding: 9px 10px;
+ margin-top: 8px;
+ margin-bottom: 8px;
+ background-color: transparent;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 4px; }
+ .navbar-toggle:focus {
+ outline: 0; }
+ .navbar-toggle .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px; }
+ .navbar-toggle .icon-bar + .icon-bar {
+ margin-top: 4px; }
+ @media (min-width: 768px) {
+ .navbar-toggle {
+ display: none; } }
+
+.navbar-nav {
+ margin: 7.5px -15px; }
+ .navbar-nav > li > a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 20px; }
+ @media (max-width: 767px) {
+ .navbar-nav .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ box-shadow: none; }
+ .navbar-nav .open .dropdown-menu > li > a,
+ .navbar-nav .open .dropdown-menu .dropdown-header {
+ padding: 5px 15px 5px 25px; }
+ .navbar-nav .open .dropdown-menu > li > a {
+ line-height: 20px; }
+ .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {
+ background-image: none; } }
+ @media (min-width: 768px) {
+ .navbar-nav {
+ float: left;
+ margin: 0; }
+ .navbar-nav > li {
+ float: left; }
+ .navbar-nav > li > a {
+ padding-top: 15px;
+ padding-bottom: 15px; } }
+
+.navbar-form {
+ margin-left: -15px;
+ margin-right: -15px;
+ padding: 10px 15px;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ margin-top: 8px;
+ margin-bottom: 8px; }
+ @media (min-width: 768px) {
+ .navbar-form .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle; }
+ .navbar-form .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle; }
+ .navbar-form .form-control-static {
+ display: inline-block; }
+ .navbar-form .input-group {
+ display: inline-table;
+ vertical-align: middle; }
+ .navbar-form .input-group .input-group-addon,
+ .navbar-form .input-group .input-group-btn,
+ .navbar-form .input-group .form-control {
+ width: auto; }
+ .navbar-form .input-group > .form-control {
+ width: 100%; }
+ .navbar-form .control-label {
+ margin-bottom: 0;
+ vertical-align: middle; }
+ .navbar-form .radio,
+ .navbar-form .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle; }
+ .navbar-form .radio label,
+ .navbar-form .checkbox label {
+ padding-left: 0; }
+ .navbar-form .radio input[type="radio"],
+ .navbar-form .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0; }
+ .navbar-form .has-feedback .form-control-feedback {
+ top: 0; } }
+ @media (max-width: 767px) {
+ .navbar-form .form-group {
+ margin-bottom: 5px; }
+ .navbar-form .form-group:last-child {
+ margin-bottom: 0; } }
+ @media (min-width: 768px) {
+ .navbar-form {
+ width: auto;
+ border: 0;
+ margin-left: 0;
+ margin-right: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ box-shadow: none; } }
+
+.navbar-nav > li > .dropdown-menu {
+ margin-top: 0;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0; }
+
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+ margin-bottom: 0;
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0; }
+
+.navbar-btn {
+ margin-top: 8px;
+ margin-bottom: 8px; }
+ .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {
+ margin-top: 10px;
+ margin-bottom: 10px; }
+ .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {
+ margin-top: 14px;
+ margin-bottom: 14px; }
+
+.navbar-text {
+ margin-top: 15px;
+ margin-bottom: 15px; }
+ @media (min-width: 768px) {
+ .navbar-text {
+ float: left;
+ margin-left: 15px;
+ margin-right: 15px; } }
+
+@media (min-width: 768px) {
+ .navbar-left {
+ float: left !important; }
+ .navbar-right {
+ float: right !important;
+ margin-right: -15px; }
+ .navbar-right ~ .navbar-right {
+ margin-right: 0; } }
+
+.navbar-default {
+ background-color: #f8f8f8;
+ border-color: #e7e7e7; }
+ .navbar-default .navbar-brand {
+ color: #777; }
+ .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
+ color: #5e5e5e;
+ background-color: transparent; }
+ .navbar-default .navbar-text {
+ color: #777; }
+ .navbar-default .navbar-nav > li > a {
+ color: #777; }
+ .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
+ color: #333;
+ background-color: transparent; }
+ .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7; }
+ .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent; }
+ .navbar-default .navbar-toggle {
+ border-color: #ddd; }
+ .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
+ background-color: #ddd; }
+ .navbar-default .navbar-toggle .icon-bar {
+ background-color: #888; }
+ .navbar-default .navbar-collapse,
+ .navbar-default .navbar-form {
+ border-color: #e7e7e7; }
+ .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
+ background-color: #e7e7e7;
+ color: #555; }
+ @media (max-width: 767px) {
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+ color: #777; }
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #333;
+ background-color: transparent; }
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7; }
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent; } }
+ .navbar-default .navbar-link {
+ color: #777; }
+ .navbar-default .navbar-link:hover {
+ color: #333; }
+ .navbar-default .btn-link {
+ color: #777; }
+ .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {
+ color: #333; }
+ .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,
+ fieldset[disabled] .navbar-default .btn-link:hover,
+ fieldset[disabled] .navbar-default .btn-link:focus {
+ color: #ccc; }
+
+.navbar-inverse {
+ background-color: #222;
+ border-color: #090909; }
+ .navbar-inverse .navbar-brand {
+ color: #9d9d9d; }
+ .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {
+ color: #fff;
+ background-color: transparent; }
+ .navbar-inverse .navbar-text {
+ color: #9d9d9d; }
+ .navbar-inverse .navbar-nav > li > a {
+ color: #9d9d9d; }
+ .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {
+ color: #fff;
+ background-color: transparent; }
+ .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {
+ color: #fff;
+ background-color: #090909; }
+ .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {
+ color: #444;
+ background-color: transparent; }
+ .navbar-inverse .navbar-toggle {
+ border-color: #333; }
+ .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {
+ background-color: #333; }
+ .navbar-inverse .navbar-toggle .icon-bar {
+ background-color: #fff; }
+ .navbar-inverse .navbar-collapse,
+ .navbar-inverse .navbar-form {
+ border-color: #101010; }
+ .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {
+ background-color: #090909;
+ color: #fff; }
+ @media (max-width: 767px) {
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+ border-color: #090909; }
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+ background-color: #090909; }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+ color: #9d9d9d; }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #fff;
+ background-color: transparent; }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-color: #090909; }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #444;
+ background-color: transparent; } }
+ .navbar-inverse .navbar-link {
+ color: #9d9d9d; }
+ .navbar-inverse .navbar-link:hover {
+ color: #fff; }
+ .navbar-inverse .btn-link {
+ color: #9d9d9d; }
+ .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {
+ color: #fff; }
+ .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,
+ fieldset[disabled] .navbar-inverse .btn-link:hover,
+ fieldset[disabled] .navbar-inverse .btn-link:focus {
+ color: #444; }
+
+.breadcrumb {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ list-style: none;
+ background-color: #f5f5f5;
+ border-radius: 4px; }
+ .breadcrumb > li {
+ display: inline-block; }
+ .breadcrumb > li + li:before {
+ content: "/ ";
+ padding: 0 5px;
+ color: #ccc; }
+ .breadcrumb > .active {
+ color: #777777; }
+
+.pagination {
+ display: inline-block;
+ padding-left: 0;
+ margin: 20px 0;
+ border-radius: 4px; }
+ .pagination > li {
+ display: inline; }
+ .pagination > li > a,
+ .pagination > li > span {
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ line-height: 1.42857;
+ text-decoration: none;
+ color: #337ab7;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ margin-left: -1px; }
+ .pagination > li:first-child > a,
+ .pagination > li:first-child > span {
+ margin-left: 0;
+ border-bottom-left-radius: 4px;
+ border-top-left-radius: 4px; }
+ .pagination > li:last-child > a,
+ .pagination > li:last-child > span {
+ border-bottom-right-radius: 4px;
+ border-top-right-radius: 4px; }
+ .pagination > li > a:hover, .pagination > li > a:focus,
+ .pagination > li > span:hover,
+ .pagination > li > span:focus {
+ z-index: 2;
+ color: #23527c;
+ background-color: #eeeeee;
+ border-color: #ddd; }
+ .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,
+ .pagination > .active > span,
+ .pagination > .active > span:hover,
+ .pagination > .active > span:focus {
+ z-index: 3;
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7;
+ cursor: default; }
+ .pagination > .disabled > span,
+ .pagination > .disabled > span:hover,
+ .pagination > .disabled > span:focus,
+ .pagination > .disabled > a,
+ .pagination > .disabled > a:hover,
+ .pagination > .disabled > a:focus {
+ color: #777777;
+ background-color: #fff;
+ border-color: #ddd;
+ cursor: not-allowed; }
+
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33333; }
+
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+ border-bottom-left-radius: 6px;
+ border-top-left-radius: 6px; }
+
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+ border-bottom-right-radius: 6px;
+ border-top-right-radius: 6px; }
+
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5; }
+
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px; }
+
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px; }
+
+.pager {
+ padding-left: 0;
+ margin: 20px 0;
+ list-style: none;
+ text-align: center; }
+ .pager:before, .pager:after {
+ content: " ";
+ display: table; }
+ .pager:after {
+ clear: both; }
+ .pager li {
+ display: inline; }
+ .pager li > a,
+ .pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 15px; }
+ .pager li > a:hover,
+ .pager li > a:focus {
+ text-decoration: none;
+ background-color: #eeeeee; }
+ .pager .next > a,
+ .pager .next > span {
+ float: right; }
+ .pager .previous > a,
+ .pager .previous > span {
+ float: left; }
+ .pager .disabled > a,
+ .pager .disabled > a:hover,
+ .pager .disabled > a:focus,
+ .pager .disabled > span {
+ color: #777777;
+ background-color: #fff;
+ cursor: not-allowed; }
+
+.label {
+ display: inline;
+ padding: .2em .6em .3em;
+ font-size: 75%;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em; }
+ .label:empty {
+ display: none; }
+ .btn .label {
+ position: relative;
+ top: -1px; }
+
+a.label:hover, a.label:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer; }
+
+.label-default {
+ background-color: #777777; }
+ .label-default[href]:hover, .label-default[href]:focus {
+ background-color: #5e5e5e; }
+
+.label-primary {
+ background-color: #337ab7; }
+ .label-primary[href]:hover, .label-primary[href]:focus {
+ background-color: #286090; }
+
+.label-success {
+ background-color: #5cb85c; }
+ .label-success[href]:hover, .label-success[href]:focus {
+ background-color: #449d44; }
+
+.label-info {
+ background-color: #5bc0de; }
+ .label-info[href]:hover, .label-info[href]:focus {
+ background-color: #31b0d5; }
+
+.label-warning {
+ background-color: #f0ad4e; }
+ .label-warning[href]:hover, .label-warning[href]:focus {
+ background-color: #ec971f; }
+
+.label-danger {
+ background-color: #d9534f; }
+ .label-danger[href]:hover, .label-danger[href]:focus {
+ background-color: #c9302c; }
+
+.badge {
+ display: inline-block;
+ min-width: 10px;
+ padding: 3px 7px;
+ font-size: 12px;
+ font-weight: bold;
+ color: #fff;
+ line-height: 1;
+ vertical-align: middle;
+ white-space: nowrap;
+ text-align: center;
+ background-color: #777777;
+ border-radius: 10px; }
+ .badge:empty {
+ display: none; }
+ .btn .badge {
+ position: relative;
+ top: -1px; }
+ .btn-xs .badge, .btn-group-xs > .btn .badge,
+ .btn-group-xs > .btn .badge {
+ top: 0;
+ padding: 1px 5px; }
+ .list-group-item.active > .badge,
+ .nav-pills > .active > a > .badge {
+ color: #337ab7;
+ background-color: #fff; }
+ .list-group-item > .badge {
+ float: right; }
+ .list-group-item > .badge + .badge {
+ margin-right: 5px; }
+ .nav-pills > li > a > .badge {
+ margin-left: 3px; }
+
+a.badge:hover, a.badge:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer; }
+
+.jumbotron {
+ padding-top: 30px;
+ padding-bottom: 30px;
+ margin-bottom: 30px;
+ color: inherit;
+ background-color: #eeeeee; }
+ .jumbotron h1,
+ .jumbotron .h1 {
+ color: inherit; }
+ .jumbotron p {
+ margin-bottom: 15px;
+ font-size: 21px;
+ font-weight: 200; }
+ .jumbotron > hr {
+ border-top-color: #d5d5d5; }
+ .container .jumbotron,
+ .container-fluid .jumbotron {
+ border-radius: 6px;
+ padding-left: 15px;
+ padding-right: 15px; }
+ .jumbotron .container {
+ max-width: 100%; }
+ @media screen and (min-width: 768px) {
+ .jumbotron {
+ padding-top: 48px;
+ padding-bottom: 48px; }
+ .container .jumbotron,
+ .container-fluid .jumbotron {
+ padding-left: 60px;
+ padding-right: 60px; }
+ .jumbotron h1,
+ .jumbotron .h1 {
+ font-size: 63px; } }
+
+.thumbnail {
+ display: block;
+ padding: 4px;
+ margin-bottom: 20px;
+ line-height: 1.42857;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ -webkit-transition: border 0.2s ease-in-out;
+ transition: border 0.2s ease-in-out; }
+ .thumbnail > img,
+ .thumbnail a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+ margin-left: auto;
+ margin-right: auto; }
+ .thumbnail .caption {
+ padding: 9px;
+ color: #333333; }
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+ border-color: #337ab7; }
+
+.alert {
+ padding: 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 4px; }
+ .alert h4 {
+ margin-top: 0;
+ color: inherit; }
+ .alert .alert-link {
+ font-weight: bold; }
+ .alert > p,
+ .alert > ul {
+ margin-bottom: 0; }
+ .alert > p + p {
+ margin-top: 5px; }
+
+.alert-dismissable,
+.alert-dismissible {
+ padding-right: 35px; }
+ .alert-dismissable .close,
+ .alert-dismissible .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ color: inherit; }
+
+.alert-success {
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+ color: #3c763d; }
+ .alert-success hr {
+ border-top-color: #c9e2b3; }
+ .alert-success .alert-link {
+ color: #2b542c; }
+
+.alert-info {
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+ color: #31708f; }
+ .alert-info hr {
+ border-top-color: #a6e1ec; }
+ .alert-info .alert-link {
+ color: #245269; }
+
+.alert-warning {
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+ color: #8a6d3b; }
+ .alert-warning hr {
+ border-top-color: #f7e1b5; }
+ .alert-warning .alert-link {
+ color: #66512c; }
+
+.alert-danger {
+ background-color: #f2dede;
+ border-color: #ebccd1;
+ color: #a94442; }
+ .alert-danger hr {
+ border-top-color: #e4b9c0; }
+ .alert-danger .alert-link {
+ color: #843534; }
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0; }
+ to {
+ background-position: 0 0; } }
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0; }
+ to {
+ background-position: 0 0; } }
+
+.progress {
+ overflow: hidden;
+ height: 20px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); }
+
+.progress-bar {
+ float: left;
+ width: 0%;
+ height: 100%;
+ font-size: 12px;
+ line-height: 20px;
+ color: #fff;
+ text-align: center;
+ background-color: #337ab7;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ -webkit-transition: width 0.6s ease;
+ transition: width 0.6s ease; }
+
+.progress-striped .progress-bar,
+.progress-bar-striped {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: 40px 40px; }
+
+.progress.active .progress-bar,
+.progress-bar.active {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite; }
+
+.progress-bar-success {
+ background-color: #5cb85c; }
+ .progress-striped .progress-bar-success {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+
+.progress-bar-info {
+ background-color: #5bc0de; }
+ .progress-striped .progress-bar-info {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+
+.progress-bar-warning {
+ background-color: #f0ad4e; }
+ .progress-striped .progress-bar-warning {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+
+.progress-bar-danger {
+ background-color: #d9534f; }
+ .progress-striped .progress-bar-danger {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+
+.media {
+ margin-top: 15px; }
+ .media:first-child {
+ margin-top: 0; }
+
+.media,
+.media-body {
+ zoom: 1;
+ overflow: hidden; }
+
+.media-body {
+ width: 10000px; }
+
+.media-object {
+ display: block; }
+ .media-object.img-thumbnail {
+ max-width: none; }
+
+.media-right,
+.media > .pull-right {
+ padding-left: 10px; }
+
+.media-left,
+.media > .pull-left {
+ padding-right: 10px; }
+
+.media-left,
+.media-right,
+.media-body {
+ display: table-cell;
+ vertical-align: top; }
+
+.media-middle {
+ vertical-align: middle; }
+
+.media-bottom {
+ vertical-align: bottom; }
+
+.media-heading {
+ margin-top: 0;
+ margin-bottom: 5px; }
+
+.media-list {
+ padding-left: 0;
+ list-style: none; }
+
+.list-group {
+ margin-bottom: 20px;
+ padding-left: 0; }
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid #ddd; }
+ .list-group-item:first-child {
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px; }
+ .list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px; }
+
+a.list-group-item,
+button.list-group-item {
+ color: #555; }
+ a.list-group-item .list-group-item-heading,
+ button.list-group-item .list-group-item-heading {
+ color: #333; }
+ a.list-group-item:hover, a.list-group-item:focus,
+ button.list-group-item:hover,
+ button.list-group-item:focus {
+ text-decoration: none;
+ color: #555;
+ background-color: #f5f5f5; }
+
+button.list-group-item {
+ width: 100%;
+ text-align: left; }
+
+.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {
+ background-color: #eeeeee;
+ color: #777777;
+ cursor: not-allowed; }
+ .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {
+ color: inherit; }
+ .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {
+ color: #777777; }
+
+.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7; }
+ .list-group-item.active .list-group-item-heading,
+ .list-group-item.active .list-group-item-heading > small,
+ .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,
+ .list-group-item.active:hover .list-group-item-heading > small,
+ .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,
+ .list-group-item.active:focus .list-group-item-heading > small,
+ .list-group-item.active:focus .list-group-item-heading > .small {
+ color: inherit; }
+ .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {
+ color: #c7ddef; }
+
+.list-group-item-success {
+ color: #3c763d;
+ background-color: #dff0d8; }
+
+a.list-group-item-success,
+button.list-group-item-success {
+ color: #3c763d; }
+ a.list-group-item-success .list-group-item-heading,
+ button.list-group-item-success .list-group-item-heading {
+ color: inherit; }
+ a.list-group-item-success:hover, a.list-group-item-success:focus,
+ button.list-group-item-success:hover,
+ button.list-group-item-success:focus {
+ color: #3c763d;
+ background-color: #d0e9c6; }
+ a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,
+ button.list-group-item-success.active,
+ button.list-group-item-success.active:hover,
+ button.list-group-item-success.active:focus {
+ color: #fff;
+ background-color: #3c763d;
+ border-color: #3c763d; }
+
+.list-group-item-info {
+ color: #31708f;
+ background-color: #d9edf7; }
+
+a.list-group-item-info,
+button.list-group-item-info {
+ color: #31708f; }
+ a.list-group-item-info .list-group-item-heading,
+ button.list-group-item-info .list-group-item-heading {
+ color: inherit; }
+ a.list-group-item-info:hover, a.list-group-item-info:focus,
+ button.list-group-item-info:hover,
+ button.list-group-item-info:focus {
+ color: #31708f;
+ background-color: #c4e3f3; }
+ a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,
+ button.list-group-item-info.active,
+ button.list-group-item-info.active:hover,
+ button.list-group-item-info.active:focus {
+ color: #fff;
+ background-color: #31708f;
+ border-color: #31708f; }
+
+.list-group-item-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3; }
+
+a.list-group-item-warning,
+button.list-group-item-warning {
+ color: #8a6d3b; }
+ a.list-group-item-warning .list-group-item-heading,
+ button.list-group-item-warning .list-group-item-heading {
+ color: inherit; }
+ a.list-group-item-warning:hover, a.list-group-item-warning:focus,
+ button.list-group-item-warning:hover,
+ button.list-group-item-warning:focus {
+ color: #8a6d3b;
+ background-color: #faf2cc; }
+ a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,
+ button.list-group-item-warning.active,
+ button.list-group-item-warning.active:hover,
+ button.list-group-item-warning.active:focus {
+ color: #fff;
+ background-color: #8a6d3b;
+ border-color: #8a6d3b; }
+
+.list-group-item-danger {
+ color: #a94442;
+ background-color: #f2dede; }
+
+a.list-group-item-danger,
+button.list-group-item-danger {
+ color: #a94442; }
+ a.list-group-item-danger .list-group-item-heading,
+ button.list-group-item-danger .list-group-item-heading {
+ color: inherit; }
+ a.list-group-item-danger:hover, a.list-group-item-danger:focus,
+ button.list-group-item-danger:hover,
+ button.list-group-item-danger:focus {
+ color: #a94442;
+ background-color: #ebcccc; }
+ a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,
+ button.list-group-item-danger.active,
+ button.list-group-item-danger.active:hover,
+ button.list-group-item-danger.active:focus {
+ color: #fff;
+ background-color: #a94442;
+ border-color: #a94442; }
+
+.list-group-item-heading {
+ margin-top: 0;
+ margin-bottom: 5px; }
+
+.list-group-item-text {
+ margin-bottom: 0;
+ line-height: 1.3; }
+
+.panel {
+ margin-bottom: 20px;
+ background-color: #fff;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }
+
+.panel-body {
+ padding: 15px; }
+ .panel-body:before, .panel-body:after {
+ content: " ";
+ display: table; }
+ .panel-body:after {
+ clear: both; }
+
+.panel-heading {
+ padding: 10px 15px;
+ border-bottom: 1px solid transparent;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px; }
+ .panel-heading > .dropdown .dropdown-toggle {
+ color: inherit; }
+
+.panel-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-size: 16px;
+ color: inherit; }
+ .panel-title > a,
+ .panel-title > small,
+ .panel-title > .small,
+ .panel-title > small > a,
+ .panel-title > .small > a {
+ color: inherit; }
+
+.panel-footer {
+ padding: 10px 15px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px; }
+
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+ margin-bottom: 0; }
+ .panel > .list-group .list-group-item,
+ .panel > .panel-collapse > .list-group .list-group-item {
+ border-width: 1px 0;
+ border-radius: 0; }
+ .panel > .list-group:first-child .list-group-item:first-child,
+ .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+ border-top: 0;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px; }
+ .panel > .list-group:last-child .list-group-item:last-child,
+ .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+ border-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px; }
+
+.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0; }
+
+.panel-heading + .list-group .list-group-item:first-child {
+ border-top-width: 0; }
+
+.list-group + .panel-footer {
+ border-top-width: 0; }
+
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+ margin-bottom: 0; }
+ .panel > .table caption,
+ .panel > .table-responsive > .table caption,
+ .panel > .panel-collapse > .table caption {
+ padding-left: 15px;
+ padding-right: 15px; }
+
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px; }
+ .panel > .table:first-child > thead:first-child > tr:first-child,
+ .panel > .table:first-child > tbody:first-child > tr:first-child,
+ .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+ .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px; }
+ .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+ .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+ .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+ .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+ .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+ .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+ .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+ .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+ border-top-left-radius: 3px; }
+ .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+ .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+ .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+ .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+ .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+ .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+ .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+ .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+ border-top-right-radius: 3px; }
+
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px; }
+ .panel > .table:last-child > tbody:last-child > tr:last-child,
+ .panel > .table:last-child > tfoot:last-child > tr:last-child,
+ .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+ .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px; }
+ .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+ .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+ .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+ .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+ .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+ .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+ .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+ .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+ border-bottom-left-radius: 3px; }
+ .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+ .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+ .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+ .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+ .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+ .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+ .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+ .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+ border-bottom-right-radius: 3px; }
+
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+ border-top: 1px solid #ddd; }
+
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+ border-top: 0; }
+
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+ border: 0; }
+ .panel > .table-bordered > thead > tr > th:first-child,
+ .panel > .table-bordered > thead > tr > td:first-child,
+ .panel > .table-bordered > tbody > tr > th:first-child,
+ .panel > .table-bordered > tbody > tr > td:first-child,
+ .panel > .table-bordered > tfoot > tr > th:first-child,
+ .panel > .table-bordered > tfoot > tr > td:first-child,
+ .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+ .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+ .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+ .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0; }
+ .panel > .table-bordered > thead > tr > th:last-child,
+ .panel > .table-bordered > thead > tr > td:last-child,
+ .panel > .table-bordered > tbody > tr > th:last-child,
+ .panel > .table-bordered > tbody > tr > td:last-child,
+ .panel > .table-bordered > tfoot > tr > th:last-child,
+ .panel > .table-bordered > tfoot > tr > td:last-child,
+ .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+ .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+ .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+ .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0; }
+ .panel > .table-bordered > thead > tr:first-child > td,
+ .panel > .table-bordered > thead > tr:first-child > th,
+ .panel > .table-bordered > tbody > tr:first-child > td,
+ .panel > .table-bordered > tbody > tr:first-child > th,
+ .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+ .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+ .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+ .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+ border-bottom: 0; }
+ .panel > .table-bordered > tbody > tr:last-child > td,
+ .panel > .table-bordered > tbody > tr:last-child > th,
+ .panel > .table-bordered > tfoot > tr:last-child > td,
+ .panel > .table-bordered > tfoot > tr:last-child > th,
+ .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+ .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+ .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+ .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+ border-bottom: 0; }
+
+.panel > .table-responsive {
+ border: 0;
+ margin-bottom: 0; }
+
+.panel-group {
+ margin-bottom: 20px; }
+ .panel-group .panel {
+ margin-bottom: 0;
+ border-radius: 4px; }
+ .panel-group .panel + .panel {
+ margin-top: 5px; }
+ .panel-group .panel-heading {
+ border-bottom: 0; }
+ .panel-group .panel-heading + .panel-collapse > .panel-body,
+ .panel-group .panel-heading + .panel-collapse > .list-group {
+ border-top: 1px solid #ddd; }
+ .panel-group .panel-footer {
+ border-top: 0; }
+ .panel-group .panel-footer + .panel-collapse .panel-body {
+ border-bottom: 1px solid #ddd; }
+
+.panel-default {
+ border-color: #ddd; }
+ .panel-default > .panel-heading {
+ color: #333333;
+ background-color: #f5f5f5;
+ border-color: #ddd; }
+ .panel-default > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ddd; }
+ .panel-default > .panel-heading .badge {
+ color: #f5f5f5;
+ background-color: #333333; }
+ .panel-default > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ddd; }
+
+.panel-primary {
+ border-color: #337ab7; }
+ .panel-primary > .panel-heading {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7; }
+ .panel-primary > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #337ab7; }
+ .panel-primary > .panel-heading .badge {
+ color: #337ab7;
+ background-color: #fff; }
+ .panel-primary > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #337ab7; }
+
+.panel-success {
+ border-color: #d6e9c6; }
+ .panel-success > .panel-heading {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6; }
+ .panel-success > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #d6e9c6; }
+ .panel-success > .panel-heading .badge {
+ color: #dff0d8;
+ background-color: #3c763d; }
+ .panel-success > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #d6e9c6; }
+
+.panel-info {
+ border-color: #bce8f1; }
+ .panel-info > .panel-heading {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1; }
+ .panel-info > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #bce8f1; }
+ .panel-info > .panel-heading .badge {
+ color: #d9edf7;
+ background-color: #31708f; }
+ .panel-info > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #bce8f1; }
+
+.panel-warning {
+ border-color: #faebcc; }
+ .panel-warning > .panel-heading {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc; }
+ .panel-warning > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #faebcc; }
+ .panel-warning > .panel-heading .badge {
+ color: #fcf8e3;
+ background-color: #8a6d3b; }
+ .panel-warning > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #faebcc; }
+
+.panel-danger {
+ border-color: #ebccd1; }
+ .panel-danger > .panel-heading {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1; }
+ .panel-danger > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ebccd1; }
+ .panel-danger > .panel-heading .badge {
+ color: #f2dede;
+ background-color: #a94442; }
+ .panel-danger > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ebccd1; }
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ height: 0;
+ padding: 0;
+ overflow: hidden; }
+ .embed-responsive .embed-responsive-item,
+ .embed-responsive iframe,
+ .embed-responsive embed,
+ .embed-responsive object,
+ .embed-responsive video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ height: 100%;
+ width: 100%;
+ border: 0; }
+
+.embed-responsive-16by9 {
+ padding-bottom: 56.25%; }
+
+.embed-responsive-4by3 {
+ padding-bottom: 75%; }
+
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ border-radius: 4px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }
+ .well blockquote {
+ border-color: #ddd;
+ border-color: rgba(0, 0, 0, 0.15); }
+
+.well-lg {
+ padding: 24px;
+ border-radius: 6px; }
+
+.well-sm {
+ padding: 9px;
+ border-radius: 3px; }
+
+.close {
+ float: right;
+ font-size: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: 0.2;
+ filter: alpha(opacity=20); }
+ .close:hover, .close:focus {
+ color: #000;
+ text-decoration: none;
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50); }
+
+button.close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none; }
+
+.modal-open {
+ overflow: hidden; }
+
+.modal {
+ display: none;
+ overflow: hidden;
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1050;
+ -webkit-overflow-scrolling: touch;
+ outline: 0; }
+ .modal.fade .modal-dialog {
+ -webkit-transform: translate(0, -25%);
+ transform: translate(0, -25%);
+ -webkit-transition: -webkit-transform 0.3s ease-out;
+ transition: -webkit-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+ transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; }
+ .modal.in .modal-dialog {
+ -webkit-transform: translate(0, 0);
+ transform: translate(0, 0); }
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto; }
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px; }
+
+.modal-content {
+ position: relative;
+ background-color: #fff;
+ border: 1px solid #999;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+ background-clip: padding-box;
+ outline: 0; }
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: #000; }
+ .modal-backdrop.fade {
+ opacity: 0;
+ filter: alpha(opacity=0); }
+ .modal-backdrop.in {
+ opacity: 0.5;
+ filter: alpha(opacity=50); }
+
+.modal-header {
+ padding: 15px;
+ border-bottom: 1px solid #e5e5e5; }
+ .modal-header:before, .modal-header:after {
+ content: " ";
+ display: table; }
+ .modal-header:after {
+ clear: both; }
+
+.modal-header .close {
+ margin-top: -2px; }
+
+.modal-title {
+ margin: 0;
+ line-height: 1.42857; }
+
+.modal-body {
+ position: relative;
+ padding: 15px; }
+
+.modal-footer {
+ padding: 15px;
+ text-align: right;
+ border-top: 1px solid #e5e5e5; }
+ .modal-footer:before, .modal-footer:after {
+ content: " ";
+ display: table; }
+ .modal-footer:after {
+ clear: both; }
+ .modal-footer .btn + .btn {
+ margin-left: 5px;
+ margin-bottom: 0; }
+ .modal-footer .btn-group .btn + .btn {
+ margin-left: -1px; }
+ .modal-footer .btn-block + .btn-block {
+ margin-left: 0; }
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll; }
+
+@media (min-width: 768px) {
+ .modal-dialog {
+ width: 600px;
+ margin: 30px auto; }
+ .modal-content {
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }
+ .modal-sm {
+ width: 300px; } }
+
+@media (min-width: 992px) {
+ .modal-lg {
+ width: 900px; } }
+
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-style: normal;
+ font-weight: normal;
+ letter-spacing: normal;
+ line-break: auto;
+ line-height: 1.42857;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ white-space: normal;
+ word-break: normal;
+ word-spacing: normal;
+ word-wrap: normal;
+ font-size: 12px;
+ opacity: 0;
+ filter: alpha(opacity=0); }
+ .tooltip.in {
+ opacity: 0.9;
+ filter: alpha(opacity=90); }
+ .tooltip.top {
+ margin-top: -3px;
+ padding: 5px 0; }
+ .tooltip.right {
+ margin-left: 3px;
+ padding: 0 5px; }
+ .tooltip.bottom {
+ margin-top: 3px;
+ padding: 5px 0; }
+ .tooltip.left {
+ margin-left: -3px;
+ padding: 0 5px; }
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: 4px; }
+
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid; }
+
+.tooltip.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000; }
+
+.tooltip.top-left .tooltip-arrow {
+ bottom: 0;
+ right: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000; }
+
+.tooltip.top-right .tooltip-arrow {
+ bottom: 0;
+ left: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000; }
+
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: #000; }
+
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000; }
+
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000; }
+
+.tooltip.bottom-left .tooltip-arrow {
+ top: 0;
+ right: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000; }
+
+.tooltip.bottom-right .tooltip-arrow {
+ top: 0;
+ left: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000; }
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-style: normal;
+ font-weight: normal;
+ letter-spacing: normal;
+ line-break: auto;
+ line-height: 1.42857;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ white-space: normal;
+ word-break: normal;
+ word-spacing: normal;
+ word-wrap: normal;
+ font-size: 14px;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }
+ .popover.top {
+ margin-top: -10px; }
+ .popover.right {
+ margin-left: 10px; }
+ .popover.bottom {
+ margin-top: 10px; }
+ .popover.left {
+ margin-left: -10px; }
+
+.popover-title {
+ margin: 0;
+ padding: 8px 14px;
+ font-size: 14px;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-radius: 5px 5px 0 0; }
+
+.popover-content {
+ padding: 9px 14px; }
+
+.popover > .arrow, .popover > .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid; }
+
+.popover > .arrow {
+ border-width: 11px; }
+
+.popover > .arrow:after {
+ border-width: 10px;
+ content: ""; }
+
+.popover.top > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-bottom-width: 0;
+ border-top-color: #999999;
+ border-top-color: rgba(0, 0, 0, 0.25);
+ bottom: -11px; }
+ .popover.top > .arrow:after {
+ content: " ";
+ bottom: 1px;
+ margin-left: -10px;
+ border-bottom-width: 0;
+ border-top-color: #fff; }
+
+.popover.right > .arrow {
+ top: 50%;
+ left: -11px;
+ margin-top: -11px;
+ border-left-width: 0;
+ border-right-color: #999999;
+ border-right-color: rgba(0, 0, 0, 0.25); }
+ .popover.right > .arrow:after {
+ content: " ";
+ left: 1px;
+ bottom: -10px;
+ border-left-width: 0;
+ border-right-color: #fff; }
+
+.popover.bottom > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-top-width: 0;
+ border-bottom-color: #999999;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+ top: -11px; }
+ .popover.bottom > .arrow:after {
+ content: " ";
+ top: 1px;
+ margin-left: -10px;
+ border-top-width: 0;
+ border-bottom-color: #fff; }
+
+.popover.left > .arrow {
+ top: 50%;
+ right: -11px;
+ margin-top: -11px;
+ border-right-width: 0;
+ border-left-color: #999999;
+ border-left-color: rgba(0, 0, 0, 0.25); }
+ .popover.left > .arrow:after {
+ content: " ";
+ right: 1px;
+ border-right-width: 0;
+ border-left-color: #fff;
+ bottom: -10px; }
+
+.carousel {
+ position: relative; }
+
+.carousel-inner {
+ position: relative;
+ overflow: hidden;
+ width: 100%; }
+ .carousel-inner > .item {
+ display: none;
+ position: relative;
+ -webkit-transition: 0.6s ease-in-out left;
+ transition: 0.6s ease-in-out left; }
+ .carousel-inner > .item > img,
+ .carousel-inner > .item > a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+ line-height: 1; }
+ @media all and (transform-3d), (-webkit-transform-3d) {
+ .carousel-inner > .item {
+ -webkit-transition: -webkit-transform 0.6s ease-in-out;
+ transition: -webkit-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-perspective: 1000px;
+ perspective: 1000px; }
+ .carousel-inner > .item.next, .carousel-inner > .item.active.right {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ left: 0; }
+ .carousel-inner > .item.prev, .carousel-inner > .item.active.left {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ left: 0; }
+ .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ left: 0; } }
+ .carousel-inner > .active,
+ .carousel-inner > .next,
+ .carousel-inner > .prev {
+ display: block; }
+ .carousel-inner > .active {
+ left: 0; }
+ .carousel-inner > .next,
+ .carousel-inner > .prev {
+ position: absolute;
+ top: 0;
+ width: 100%; }
+ .carousel-inner > .next {
+ left: 100%; }
+ .carousel-inner > .prev {
+ left: -100%; }
+ .carousel-inner > .next.left,
+ .carousel-inner > .prev.right {
+ left: 0; }
+ .carousel-inner > .active.left {
+ left: -100%; }
+ .carousel-inner > .active.right {
+ left: 100%; }
+
+.carousel-control {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 15%;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ font-size: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+ background-color: transparent; }
+ .carousel-control.left {
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); }
+ .carousel-control.right {
+ left: auto;
+ right: 0;
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }
+ .carousel-control:hover, .carousel-control:focus {
+ outline: 0;
+ color: #fff;
+ text-decoration: none;
+ opacity: 0.9;
+ filter: alpha(opacity=90); }
+ .carousel-control .icon-prev,
+ .carousel-control .icon-next,
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .glyphicon-chevron-right {
+ position: absolute;
+ top: 50%;
+ margin-top: -10px;
+ z-index: 5;
+ display: inline-block; }
+ .carousel-control .icon-prev,
+ .carousel-control .glyphicon-chevron-left {
+ left: 50%;
+ margin-left: -10px; }
+ .carousel-control .icon-next,
+ .carousel-control .glyphicon-chevron-right {
+ right: 50%;
+ margin-right: -10px; }
+ .carousel-control .icon-prev,
+ .carousel-control .icon-next {
+ width: 20px;
+ height: 20px;
+ line-height: 1;
+ font-family: serif; }
+ .carousel-control .icon-prev:before {
+ content: '\2039'; }
+ .carousel-control .icon-next:before {
+ content: '\203a'; }
+
+.carousel-indicators {
+ position: absolute;
+ bottom: 10px;
+ left: 50%;
+ z-index: 15;
+ width: 60%;
+ margin-left: -30%;
+ padding-left: 0;
+ list-style: none;
+ text-align: center; }
+ .carousel-indicators li {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin: 1px;
+ text-indent: -999px;
+ border: 1px solid #fff;
+ border-radius: 10px;
+ cursor: pointer;
+ background-color: #000 \9;
+ background-color: transparent; }
+ .carousel-indicators .active {
+ margin: 0;
+ width: 12px;
+ height: 12px;
+ background-color: #fff; }
+
+.carousel-caption {
+ position: absolute;
+ left: 15%;
+ right: 15%;
+ bottom: 20px;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }
+ .carousel-caption .btn {
+ text-shadow: none; }
+
+@media screen and (min-width: 768px) {
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-prev,
+ .carousel-control .icon-next {
+ width: 30px;
+ height: 30px;
+ margin-top: -10px;
+ font-size: 30px; }
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .icon-prev {
+ margin-left: -10px; }
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-next {
+ margin-right: -10px; }
+ .carousel-caption {
+ left: 20%;
+ right: 20%;
+ padding-bottom: 30px; }
+ .carousel-indicators {
+ bottom: 20px; } }
+
+.clearfix:before, .clearfix:after {
+ content: " ";
+ display: table; }
+
+.clearfix:after {
+ clear: both; }
+
+.center-block {
+ display: block;
+ margin-left: auto;
+ margin-right: auto; }
+
+.pull-right {
+ float: right !important; }
+
+.pull-left {
+ float: left !important; }
+
+.hide {
+ display: none !important; }
+
+.show {
+ display: block !important; }
+
+.invisible {
+ visibility: hidden; }
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0; }
+
+.hidden {
+ display: none !important; }
+
+.affix {
+ position: fixed; }
+
+@-ms-viewport {
+ width: device-width; }
+
+.visible-xs {
+ display: none !important; }
+
+.visible-sm {
+ display: none !important; }
+
+.visible-md {
+ display: none !important; }
+
+.visible-lg {
+ display: none !important; }
+
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important; }
+
+@media (max-width: 767px) {
+ .visible-xs {
+ display: block !important; }
+ table.visible-xs {
+ display: table !important; }
+ tr.visible-xs {
+ display: table-row !important; }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important; } }
+
+@media (max-width: 767px) {
+ .visible-xs-block {
+ display: block !important; } }
+
+@media (max-width: 767px) {
+ .visible-xs-inline {
+ display: inline !important; } }
+
+@media (max-width: 767px) {
+ .visible-xs-inline-block {
+ display: inline-block !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm {
+ display: block !important; }
+ table.visible-sm {
+ display: table !important; }
+ tr.visible-sm {
+ display: table-row !important; }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-block {
+ display: block !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-inline {
+ display: inline !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-inline-block {
+ display: inline-block !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md {
+ display: block !important; }
+ table.visible-md {
+ display: table !important; }
+ tr.visible-md {
+ display: table-row !important; }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-block {
+ display: block !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-inline {
+ display: inline !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-inline-block {
+ display: inline-block !important; } }
+
+@media (min-width: 1200px) {
+ .visible-lg {
+ display: block !important; }
+ table.visible-lg {
+ display: table !important; }
+ tr.visible-lg {
+ display: table-row !important; }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !important; } }
+
+@media (min-width: 1200px) {
+ .visible-lg-block {
+ display: block !important; } }
+
+@media (min-width: 1200px) {
+ .visible-lg-inline {
+ display: inline !important; } }
+
+@media (min-width: 1200px) {
+ .visible-lg-inline-block {
+ display: inline-block !important; } }
+
+@media (max-width: 767px) {
+ .hidden-xs {
+ display: none !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .hidden-sm {
+ display: none !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-md {
+ display: none !important; } }
+
+@media (min-width: 1200px) {
+ .hidden-lg {
+ display: none !important; } }
+
+.visible-print {
+ display: none !important; }
+
+@media print {
+ .visible-print {
+ display: block !important; }
+ table.visible-print {
+ display: table !important; }
+ tr.visible-print {
+ display: table-row !important; }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important; } }
+
+.visible-print-block {
+ display: none !important; }
+ @media print {
+ .visible-print-block {
+ display: block !important; } }
+
+.visible-print-inline {
+ display: none !important; }
+ @media print {
+ .visible-print-inline {
+ display: inline !important; } }
+
+.visible-print-inline-block {
+ display: none !important; }
+ @media print {
+ .visible-print-inline-block {
+ display: inline-block !important; } }
+
+@media print {
+ .hidden-print {
+ display: none !important; } }
+
+.bg-red {
+ background: red; }
+
+body {
+ padding-top: 60px; }
+
+main a:link,
+main a:hover {
+ border-bottom: 1px solid;
+ text-decoration: none; }
+
+main p img {
+ margin: 1.5em 0; }
+
+.embed-container {
+ padding: 56.25% 0 0;
+ position: relative;
+ width: 100%; }
+ .embed-container iframe,
+ .embed-container embed {
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%; }
+
+.is-centered {
+ margin: 0 auto; }
+
+.is-flex {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex; }
+
+.is-half {
+ width: 50%; }
+
+.flex {
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1; }
+
+.flex-wrap {
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap; }
+
+.list-style-none {
+ list-style: none; }
+
+.display-block {
+ display: block; }
+
+.display-inline {
+ display: inline; }
+
+.display-inline-block {
+ display: inline-block; }
+
+.text-left {
+ text-align: left; }
+
+.text-center {
+ text-align: center; }
+
+.text-right {
+ text-align: right; }
+
+.availability p:last-of-type {
+ margin-bottom: 0; }
+
+.badges > * {
+ display: block;
+ margin: 0 auto 10px; }
+ .badges > *:last-child {
+ margin-bottom: 0; }
+
+.badges img {
+ max-width: 100%; }
+
+.copyright {
+ border-top: 1px solid #CCC;
+ margin-top: 1em;
+ padding-top: 1em; }
+
+.meetups:before, .meetups:after {
+ content: " ";
+ display: table; }
+
+.meetups:after {
+ clear: both; }
+
+.meetups ul {
+ list-style: none;
+ padding-left: 0;
+ margin-left: 0; }
+
+.meetups li {
+ display: inline-block;
+ padding: 5px 0;
+ margin: 0 5px 5px 0; }
+
+.meetups a {
+ display: block; }
+
+.meetups img {
+ max-height: 40px;
+ width: auto; }
+
+.skills-list {
+ margin: 1em 0;
+ padding: 0; }
+
+.skill {
+ margin: 0 10px 15px 0; }
+
+.skill-image {
+ height: 40px;
+ width: auto; }
+
+/*# sourceMappingURL=main.css.map */
diff --git a/docs/assets/css/main.css.map b/docs/assets/css/main.css.map
new file mode 100644
index 00000000..d4d6d7cb
--- /dev/null
+++ b/docs/assets/css/main.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["font-awesome.css","main.css","../../node_modules/bootstrap-sass/assets/stylesheets/_bootstrap.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_normalize.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_print.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_glyphicons.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_tab-focus.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_image.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_type.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_background-variant.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_clearfix.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-overflow.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_code.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_grid.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid-framework.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tables.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_table-row.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_forms.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_forms.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_opacity.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_component-animations.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_dropdowns.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-divider.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-filter.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_button-groups.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_border-radius.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_input-groups.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navs.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navbar.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_breadcrumbs.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pagination.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_pagination.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pager.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_labels.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_labels.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_badges.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_jumbotron.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_thumbnails.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_alerts.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_alerts.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_progress-bars.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_gradients.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_progress-bar.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_media.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_list-group.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_list-group.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_panels.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_panels.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-embed.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_wells.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_close.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_modals.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tooltip.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-text.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_popovers.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_carousel.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_utilities.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_center-block.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_hide-text.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-utilities.scss","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss","_base.sass","base/_layout.sass","base/_typography.sass","components/_availability.sass","components/_badges.sass","components/_footer.sass","components/_meetups.sass","main.sass"],"names":[],"mappings":"AAAA;;;GAGG;AACH;gCACgC;AAChC;EACE,2BAA2B;EAC3B,qDAAQ;EACR,kXAA0W;EAC1W,oBAAoB;EACpB,mBAAmB,EAAA;;AAErB;EACE,sBAAsB;EACtB,8CAA8C;EAC9C,mBAAmB;EACnB,qBAAqB;EACrB,oCAAoC;EACpC,mCAAmC,EACpC;;AACD,8DAA8D;AAC9D;EACE,wBAAwB;EACxB,oBAAoB;EACpB,qBAAqB,EACtB;;AACD;EACE,eAAe,EAChB;;AACD;EACE,eAAe,EAChB;;AACD;EACE,eAAe,EAChB;;AACD;EACE,eAAe,EAChB;;AACD;EACE,oBAAoB;EACpB,mBAAmB,EACpB;;AACD;EACE,gBAAgB;EAChB,0BAA0B;EAC1B,sBAAsB,EACvB;;AACD;EACE,mBAAmB,EACpB;;AACD;EACE,mBAAmB;EACnB,oBAAoB;EACpB,oBAAoB;EACpB,kBAAkB;EAClB,mBAAmB,EACpB;;AACD;EACE,oBAAoB,EACrB;;AACD;EACE,0BAA0B;EAC1B,6BAA6B;EAC7B,oBAAoB,EACrB;;AACD;EACE,YAAY,EACb;;AACD;EACE,aAAa,EACd;;AACD;EACE,mBAAmB,EACpB;;AACD;EACE,kBAAkB,EACnB;;AACD,4BAA4B;AAC5B;EACE,aAAa,EACd;;AACD;EACE,YAAY,EACb;;AACD;EACE,mBAAmB,EACpB;;AACD;EACE,kBAAkB,EACnB;;AACD;EACE,8CAA8C;EAC9C,sCAAsC,EACvC;;AACD;EACE,gDAA4C;EAC5C,wCAAoC,EACrC;;AACD;EACE;IACE,gCAAyB;IACzB,wBAAiB,EAAA;EAEnB;IACE,kCAAyB;IACzB,0BAAiB,EAAA,EAAA;;AAGrB;EACE;IACE,gCAAyB;IACzB,wBAAiB,EAAA;EAEnB;IACE,kCAAyB;IACzB,0BAAiB,EAAA,EAAA;;AAGrB;EACE,uEAAuE;EACvE,iCAAyB;EAEzB,yBAAiB,EAClB;;AACD;EACE,uEAAuE;EACvE,kCAAyB;EAEzB,0BAAiB,EAClB;;AACD;EACE,uEAAuE;EACvE,kCAAyB;EAEzB,0BAAiB,EAClB;;AACD;EACE,iFAAiF;EACjF,gCAAwB;EAExB,wBAAgB,EACjB;;AACD;EACE,iFAAiF;EACjF,gCAAwB;EAExB,wBAAgB,EACjB;;AACD;;;;;EAKE,qBAAa;EAAb,aAAa,EACd;;AACD;EACE,mBAAmB;EACnB,sBAAsB;EACtB,WAAW;EACX,YAAY;EACZ,iBAAiB;EACjB,uBAAuB,EACxB;;AACD;;EAEE,mBAAmB;EACnB,QAAQ;EACR,YAAY;EACZ,mBAAmB,EACpB;;AACD;EACE,qBAAqB,EACtB;;AACD;EACE,eAAe,EAChB;;AACD;EACE,eAAe,EAChB;;AACD;oEACoE;AACpE;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;;;EAIE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;;;EAKE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;;EAGE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;;EAEE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AACD;EACE,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,uBAAU;EACV,UAAU,EACX;;AACD;;EAEE,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,UAAU;EACV,kBAAkB;EAClB,WAAW,EACZ;;AChyED,iBAAiB;ACAjB;;;;GAIG;ACJH,4EAA4E;AAQ5E;EACE,wBAAwB;EACxB,2BAA2B;EAC3B,+BAA+B,EAChC;;AAMD;EACE,UAAU,EACX;;AAYD;;;;;;;;;;;;;EAaE,eAAe,EAChB;;AAOD;;;;EAIE,sBAAsB;EACtB,yBAAyB,EAC1B;;AAOD;EACE,cAAc;EACd,UAAU,EACX;;AF5BD;;EEqCE,cAAc,EACf;;AASD;EACE,8BAA8B,EAC/B;;AAOD;;EAEE,WAAW,EACZ;;AASD;EACE,0BAA0B,EAC3B;;AAMD;;EAEE,kBAAkB,EACnB;;AAMD;EACE,mBAAmB,EACpB;;AAOD;EACE,eAAe;EACf,iBAAiB,EAClB;;AAMD;EACE,iBAAiB;EACjB,YAAY,EACb;;AAMD;EACE,eAAe,EAChB;;AAMD;;EAEE,eAAe;EACf,eAAe;EACf,mBAAmB;EACnB,yBAAyB,EAC1B;;AAED;EACE,YAAY,EACb;;AAED;EACE,gBAAgB,EACjB;;AASD;EACE,UAAU,EACX;;AAMD;EACE,iBAAiB,EAClB;;AASD;EACE,iBAAiB,EAClB;;AAMD;EACE,wBAAwB;EACxB,UAAU,EACX;;AAMD;EACE,eAAe,EAChB;;AAMD;;;;EAIE,kCAAkC;EAClC,eAAe,EAChB;;AAiBD;;;;;EAKE,eAAe;EACf,cAAc;EACd,UAAU,EACX;;AAMD;EACE,kBAAkB,EACnB;;AASD;;EAEE,qBAAqB,EACtB;;AAUD;;;;EAIE,2BAA2B;EAC3B,gBAAgB,EACjB;;AAMD;;EAEE,gBAAgB,EACjB;;AAMD;;EAEE,UAAU;EACV,WAAW,EACZ;;AAOD;EACE,oBAAoB,EACrB;;AAUD;;EAEE,uBAAuB;EACvB,WAAW,EACZ;;AAQD;;EAEE,aAAa,EACd;;AAOD;EACE,8BAA8B;EAC9B,wBAAwB,EACzB;;AAQD;;EAEE,yBAAyB,EAC1B;;AAMD;EACE,0BAA0B;EAC1B,cAAc;EACd,+BAA+B,EAChC;;AAOD;EACE,UAAU;EACV,WAAW,EACZ;;AAMD;EACE,eAAe,EAChB;;AAOD;EACE,kBAAkB,EACnB;;AASD;EACE,0BAA0B;EAC1B,kBAAkB,EACnB;;AAED;;EAEE,WAAW,EACZ;;ACvaD,qFAAqF;AAOrF;EACI;;;IAGI,mCAAmC;IACnC,uBAAuB;IACvB,4BAA4B;IAC5B,6BAA6B,EAChC;EAED;;IAEI,2BAA2B,EAC9B;EAED;IACI,6BAA4B,EAC/B;EAED;IACI,8BAA6B,EAChC;EAID;;IAEI,YAAY,EACf;EAED;;IAEI,uBAAuB;IACvB,yBAAyB,EAC5B;EAED;IACI,4BAA4B,EAC/B;EAED;;IAEI,yBAAyB,EAC5B;EAED;IACI,2BAA2B,EAC9B;EAED;;;IAGI,WAAW;IACX,UAAU,EACb;EAED;;IAEI,wBAAwB,EAC3B;EAKD;IACI,cAAc,EACjB;EACD;;IAGQ,kCAAkC,EACrC;EAEL;IACI,uBAAuB,EAC1B;EAED;IACI,qCAAqC,EAMxC;IAPD;;MAKQ,kCAAkC,EACrC;EAEL;;IAGQ,kCAAkC,EACrC,EAAA;;ACrFP;EACE,oCAAoC;EACpC,gEAAQ;EACR,kbAImM,EAAA;;AAKvM;EACE,mBAAmB;EACnB,SAAS;EACT,sBAAsB;EACtB,oCAAoC;EACpC,mBAAmB;EACnB,oBAAoB;EACpB,eAAe;EACf,oCAAoC;EACpC,mCAAmC,EACpC;;AAGD;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;;EAC+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AASpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;ACxSpE;ECkEU,uBDjEsB,EAC/B;;AACD;;EC+DU,uBD7DsB,EAC/B;;AAKD;EACE,gBAAgB;EAChB,yCAAiC,EAClC;;AAED;EACE,4DEkBsE;EFjBtE,gBEuB4B;EFtB5B,qBEkCmC;EFjCnC,eElB8B;EFmB9B,uBEF0B,EFG3B;;AAGD;;;;EAIE,qBAAqB;EACrB,mBAAmB;EACnB,qBAAqB,EACtB;;AAKD;EACE,eE/B4B;EFgC5B,sBAAsB,EAWvB;EAbD;IAMI,eEjB0B;IFkB1B,2BEhB6B,EFiB9B;EARH;IGzCE,2CAA2C;IAC3C,qBAAqB,EHoDpB;;AASH;EACE,UAAU,EACX;;AAKD;EACE,uBAAuB,EACxB;;AAGD;EIvEE,eADmC;EAEnC,gBAAgB;EAChB,aAAa,EJuEd;;AAGD;EACE,mBEwB6B,EFvB9B;;AAKD;EACE,aEgpB+B;EF/oB/B,qBE/BmC;EFgCnC,uBElE0B;EFmE1B,uBEipBgC;EFhpBhC,mBEY6B;ED4E7B,yCDvFuC;ECyF/B,iCDzF+B;EIzFvC,sBJ4FoC;EI3FpC,gBAAgB;EAChB,aAAa,EJ2Fd;;AAGD;EACE,mBAAmB,EACpB;;AAKD;EACE,iBEhD6B;EFiD7B,oBEjD6B;EFkD7B,UAAU;EACV,8BErG8B,EFsG/B;;AAOD;EACE,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,aAAa;EACb,WAAW;EACX,iBAAiB;EACjB,uBAAU;EACV,UAAU,EACX;;AAMD;EAGI,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,UAAU;EACV,kBAAkB;EAClB,WAAW,EACZ;;AL29BH;EKh9BE,gBAAgB,EACjB;;AKxJD;;EAEE,qBH0D+B;EGzD/B,iBH0D2B;EGzD3B,iBH0D2B;EGzD3B,eH0D+B,EGlDhC;EAbD;;;;;;;;;;;;;;IASI,oBAAoB;IACpB,eAAe;IACf,eHL4B,EGM7B;;AAGH;;;EAGE,iBHuC6B;EGtC7B,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAEH;;;EAGE,iBAAkC;EAClC,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAGH;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHCoB,EGDQ;;AACtC;EAAU,gBHSoB,EGTQ;;AAMtC;EACE,iBAAkC,EACnC;;AAED;EACE,oBHG6B;EGF7B,gBAAgB;EAChB,iBAAiB;EACjB,iBAAiB,EAKlB;EAHC;IANF;MAOI,gBAA2B,EAE9B,EAAA;;AAOD;;EAEE,eAAgB,EACjB;;AAED;;EAEE,0BH4asC;EG3atC,cAAc,EACf;;AAGD;EAAuB,iBAAiB,EAAI;;AAC5C;EAAuB,kBAAkB,EAAI;;AAC7C;EAAuB,mBAAmB,EAAI;;AAC9C;EAAuB,oBAAoB,EAAI;;AAC/C;EAAuB,oBAAoB,EAAI;;AAG/C;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,2BAA2B,EAAI;;AAGtD;EACE,eHxF8B,EGyF/B;;ACnGC;EACE,eJY0B,EIX3B;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJkfoC,EIjfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJsfoC,EIrfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ0foC,EIzfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ8foC,EI7frC;;AACD;;EACE,eAAa,EACd;;AD6GH;EAGE,YAAY,EACb;;AEtHC;EACE,0BLY0B,EKX3B;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLmfoC,EKlfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLufoC,EKtfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL2foC,EK1frC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL+foC,EK9frC;;AACD;;EACE,0BAAwB,EACzB;;AFgIH;EACE,oBAAuC;EACvC,oBH1E6B;EG2E7B,iCH7H8B,EG8H/B;;AAOD;;EAEE,cAAc;EACd,oBAAqC,EAKtC;EARD;;;;IAMI,iBAAiB,EAClB;;AAWH;EAJE,gBAAgB;EAChB,iBAAiB,EAKlB;;AAID;EAVE,gBAAgB;EAChB,iBAAiB;EAWjB,kBAAkB,EAOnB;EATD;IAKI,sBAAsB;IACtB,kBAAkB;IAClB,mBAAmB,EACpB;;AAIH;EACE,cAAc;EACd,oBHzH6B,EG0H9B;;AACD;;EAEE,qBH/HmC,EGgIpC;;AACD;EACE,kBAAkB,EACnB;;AACD;EACE,eAAe,EAChB;;AAOD;EG7LI,aAAa;EACb,eAAe,EAChB;;AH2LH;EGzLI,YAAY,EACb;;AH6LD;EALF;IAOM,YAAY;IACZ,aAA6B;IAC7B,YAAY;IACZ,kBAAkB;IIlNtB,iBAAiB;IACjB,wBAAwB;IACxB,oBAAoB,EJkNjB;EAZL;IAcM,mBH2nB6B,EG1nB9B,EAAA;;AASL;;EAGE,aAAa;EACb,kCH1N8B,EG2N/B;;AACD;EACE,eAAe,EAEhB;;AAGD;EACE,mBHhL6B;EGiL7B,iBHjL6B;EGkL7B,kBH4mB4C;EG3mB5C,+BHrO8B,EG6P/B;EA5BD;;;IAUM,iBAAiB,EAClB;EAXL;;;IAmBI,eAAe;IACf,eAAe;IACf,qBHtMiC;IGuMjC,eHxP4B,EG6P7B;IA3BH;;;MAyBM,uBAAuB,EACxB;;AAOL;;EAEE,oBAAoB;EACpB,gBAAgB;EAChB,gCHtQ8B;EGuQ9B,eAAe;EACf,kBAAkB,EAWnB;EAjBD;;;;;;IAYe,YAAY,EAAI;EAZ/B;;;;;;IAcM,uBAAuB,EACxB;;AAKL;EACE,oBHrO6B;EGsO7B,mBAAmB;EACnB,qBHzOmC,EG0OpC;;AKnSD;;;;EAIE,+DRsCyE,EQrC1E;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,eRmzBmC;EQlzBnC,0BRmzBmC;EQlzBnC,mBR0F6B,EQzF9B;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,YR6yBgC;EQ5yBhC,uBR6yBgC;EQ5yBhC,mBRmF6B;EQlF7B,+CAA+B,EAQhC;EAdD;IASI,WAAW;IACX,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB,EAClB;;AAIH;EACE,eAAe;EACf,eAAgC;EAChC,iBAAkC;EAClC,gBAA2B;EAC3B,qBRkBmC;EQjBnC,sBAAsB;EACtB,sBAAsB;EACtB,eRpC8B;EQqC9B,0BRyxBmC;EQxxBnC,uBR0xBgC;EQzxBhC,mBR0D6B,EQ/C9B;EAtBD;IAeI,WAAW;IACX,mBAAmB;IACnB,eAAe;IACf,sBAAsB;IACtB,8BAA8B;IAC9B,iBAAiB,EAClB;;AAIH;EACE,kBR2wBiC;EQ1wBjC,mBAAmB,EACpB;;AC3DD;ECHE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDYpB;EAZD;IHMI,aAAa;IACb,eAAe,EAChB;EGRH;IHUI,YAAY,EACb;EGRD;IAHF;MAII,aT2UiC,ESnUpC,EAAA;EANC;IANF;MAOI,aT6UiC,ESxUpC,EAAA;EAHC;IATF;MAUI,cT+UkC,ES7UrC,EAAA;;AAQD;ECvBE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDsBpB;EAFD;IHdI,aAAa;IACb,eAAe,EAChB;EGYH;IHVI,YAAY,EACb;;AGkBH;ECvBE,mBAAkB;EAClB,oBAAmB,EDwBpB;EAFD;IHvBI,aAAa;IACb,eAAe,EAChB;EGqBH;IHnBI,YAAY,EACb;;AKVD;EACE,mBAAmB;EAEnB,gBAAgB;EAEhB,mBAAmB;EACnB,oBAAoB,EACrB;;AASD;EACE,YAAY,EACb;;AAMC;EACE,gBAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAkBD;EACE,YAAY,EACb;;AAPD;EACE,gBAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,iBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAPD;EACE,WAAW,EACZ;;AAPD;EACE,eAAgB,EACjB;;AAFD;EACE,gBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,gBAAgB,EACjB;;AAFD;EACE,gBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,gBAAgB,EACjB;;AAFD;EACE,gBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,gBAAgB,EACjB;;AAFD;EACE,gBAAgB,EACjB;;AAFD;EACE,WAAgB,EACjB;;AAkBD;EACE,gBAAuB,EACxB;;AAFD;EACE,sBAAuB,EACxB;;AAFD;EACE,uBAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,uBAAuB,EACxB;;AAFD;EACE,uBAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,uBAAuB,EACxB;;AAFD;EACE,uBAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,uBAAuB,EACxB;;AAFD;EACE,uBAAuB,EACxB;;AAFD;EACE,kBAAuB,EACxB;;AFEL;EErCE;IACE,YAAY,EACb;EAMC;IACE,gBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,gBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,eAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,sBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFWL;EE9CE;IACE,YAAY,EACb;EAMC;IACE,gBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,gBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,eAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,sBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFoBL;EEvDE;IACE,YAAY,EACb;EAMC;IACE,gBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,gBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,iBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,eAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,gBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,sBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,uBAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;ACxDL;EACE,8BZgIyC,EY/H1C;;AACD;EACE,iBZwHiC;EYvHjC,oBZuHiC;EYtHjC,eZG8B;EYF9B,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AAKD;EACE,YAAY;EACZ,gBAAgB;EAChB,oBZyC6B,EYD9B;EA3CD;;;;;;IAWQ,aZiG2B;IYhG3B,qBZ8B6B;IY7B7B,oBAAoB;IACpB,2BZ2G4B,EY1G7B;EAfP;IAoBI,uBAAuB;IACvB,8BZoGgC,EYnGjC;EAtBH;;;;;;IA8BQ,cAAc,EACf;EA/BP;IAoCI,2BZqFgC,EYpFjC;EArCH;IAyCI,uBZjCwB,EYkCzB;;AAMH;;;;;;EAOQ,aZuD2B,EYtD5B;;AAUP;EACE,uBZsDkC,EYrCnC;EAlBD;;;;;;IAQQ,uBZ+C4B,EY9C7B;EATP;;IAeM,yBAAyB,EAC1B;;AASL;EAEI,0BZsBmC,EYrBpC;;AAQH;EAEI,0BZamC,EYZpC;;AAQH;EACE,iBAAiB;EACjB,YAAY;EACZ,sBAAsB,EACvB;;AACD;;EAIM,iBAAiB;EACjB,YAAY;EACZ,oBAAoB,EACrB;;AC7IH;;;;;;;;;;;;EAII,0BbiIiC,EahIlC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb+ekC,Ea9enC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbmfkC,EalfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbufkC,EatfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb2fkC,Ea1fnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;ADwJL;EACE,iBAAiB;EACjB,kBAAkB,EA6DnB;EA3DC;IAJF;MAKI,YAAY;MACZ,oBAAqC;MACrC,mBAAmB;MACnB,6CAA6C;MAC7C,uBZrCgC,EY2FnC;MA/DD;QAaM,iBAAiB,EAalB;QA1BL;;;;;;UAsBY,oBAAoB,EACrB;MAvBX;QA8BM,UAAU,EA+BX;QA7DL;;;;;;UAuCY,eAAe,EAChB;QAxCX;;;;;;UA2CY,gBAAgB,EACjB;QA5CX;;;;UAwDY,iBAAiB,EAClB,EAAA;;AE1NX;EACE,WAAW;EACX,UAAU;EACV,UAAU;EAIV,aAAa,EACd;;AAED;EACE,eAAe;EACf,YAAY;EACZ,WAAW;EACX,oBd0C6B;EczC7B,gBAA2B;EAC3B,qBAAqB;EACrB,edd8B;Ece9B,UAAU;EACV,iCdmMsC,EclMvC;;AAED;EACE,sBAAsB;EACtB,gBAAgB;EAChB,mBAAmB;EACnB,kBAAkB,EACnB;;AAUD;Ef8BU,uBe7BsB,EAC/B;;AAGD;;EAEE,gBAAgB;EAChB,mBAAmB;EACnB,oBAAoB,EACrB;;AAED;EACE,eAAe,EAChB;;AAGD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;;EAEE,aAAa,EACd;;AAGD;;;EbrEE,2CAA2C;EAC3C,qBAAqB,EawEtB;;AAGD;EACE,eAAe;EACf,iBAAoC;EACpC,gBdlC4B;EcmC5B,qBdvBmC;EcwBnC,ed1E8B,Ec2E/B;;AAyBD;EACE,eAAe;EACf,YAAY;EACZ,adiGqD;EchGrD,kBdtB8B;EcuB9B,gBdnE4B;EcoE5B,qBdxDmC;EcyDnC,ed3G8B;Ec4G9B,uBdmEmC;EclEnC,uBAAuB;EACvB,uBdwEmC;EcvEnC,mBdf6B;EDxCrB,iDewDgC;Ef4DxC,iFe3D8E;Ef6DtE,yEe7DsE,EAgC/E;EA7CD;ICxDI,sBfsJoC;IerJpC,WAAW;IhBWL,mFgBdS,EAKhB;EDqDH;IfVI,YC2GiC;ID1GjC,WAAW,EACZ;EeQH;IfP4B,YCwGS,EDxGQ;EeO7C;IfNkC,YCuGG,EDvGc;EeMnD;IAuBI,UAAU;IACV,8BAA8B,EAC/B;EAzBH;;IAmCI,0BdrI4B;IcsI5B,WAAW,EACZ;EArCH;;IAyCI,oBd6EwC,Ec5EzC;;AAMH;EACE,aAAa,EACd;;AAUD;EACE,yBAAyB,EAC1B;;AAYD;EACE;;;;IAKI,kBdoBiD,EcnBlD;EANH;;;;;;;;;;;;;;;;;;;;;;IAUI,kBdmBiC,EclBlC;EAXH;;;;;;;;;;;;;;;;;;;;;;IAeI,kBdYgC,EcXjC,EAAA;;AAUL;EACE,oBdKmC,EcJpC;;AAOD;;EAEE,mBAAmB;EACnB,eAAe;EACf,iBAAiB;EACjB,oBAAoB,EASrB;EAdD;;IAQI,iBdtK2B;IcuK3B,mBAAmB;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,gBAAgB,EACjB;;AAEH;;;;EAIE,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB,EACpB;;AAED;;EAEE,iBAAiB,EAClB;;AAGD;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;EACnB,iBAAiB;EACjB,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB,EACjB;;AACD;;EAEE,cAAc;EACd,kBAAkB,EACnB;;AAMD;;;;;;EAKI,oBd/CwC,EcgDzC;;AAGH;;;;;EAII,oBdvDwC,EcwDzC;;AAGH;;;;;EAKM,oBdhEsC,EciEvC;;AAUL;EAEE,iBAAoC;EACpC,oBAAuC;EAEvC,iBAAiB;EACjB,iBAAkC,EAOnC;EAbD;;;;;IAUI,gBAAgB;IAChB,iBAAiB,EAClB;;ACxPD;;;EACE,afkJmC;EejJnC,kBf6B4B;Ee5B5B,gBfpB0B;EeqB1B,iBfiC2B;EehC3B,mBfoC2B,EenC5B;;AAED;;;EACE,af0ImC;EezInC,kBfyImC,EexIpC;;AAED;;;;;;;EACE,aAAa,EACd;;ADsPH;EAEI,adpHmC;EcqHnC,kBdzO4B;Ec0O5B,gBd1R0B;Ec2R1B,iBdrO2B;EcsO3B,mBdlO2B,EcmO5B;;AAPH;EASI,ad3HmC;Ec4HnC,kBd5HmC,Ec6HpC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,adnImC;EcoInC,iBAAkC;EAClC,kBdzP4B;Ec0P5B,gBd1S0B;Ec2S1B,iBdrP2B,EcsP5B;;AC3RD;;;EACE,afgJkC;Ee/IlC,mBf0B4B;EezB5B,gBfrB0B;EesB1B,qBfgCiC;Ee/BjC,mBfmC2B,EelC5B;;AAED;;;EACE,afwIkC;EevIlC,kBfuIkC,EetInC;;AAED;;;;;;;EACE,aAAa,EACd;;ADgRH;EAEI,adhJkC;EciJlC,mBdtQ4B;EcuQ5B,gBdrT0B;EcsT1B,qBdhQiC;EciQjC,mBd7P2B,Ec8P5B;;AAPH;EASI,advJkC;EcwJlC,kBdxJkC,EcyJnC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,ad/JkC;EcgKlC,iBAAkC;EAClC,mBdtR4B;EcuR5B,gBdrU0B;EcsU1B,qBdhRiC,EciRlC;;AAQH;EAEE,mBAAmB,EAMpB;EARD;IAMI,sBAAkC,EACnC;;AAGH;EACE,mBAAmB;EACnB,OAAO;EACP,SAAS;EACT,WAAW;EACX,eAAe;EACf,Yd9LqD;Ec+LrD,ad/LqD;EcgMrD,kBdhMqD;EciMrD,mBAAmB;EACnB,qBAAqB,EACtB;;AACD;;;;;EAGE,YdrMoC;EcsMpC,adtMoC;EcuMpC,kBdvMoC,EcwMrC;;AACD;;;;;EAGE,Yd1MqC;Ec2MrC,ad3MqC;Ec4MrC,kBd5MqC,Ec6MtC;;AC/ZC;;;;;;;;;;EAUE,efseoC,EererC;;AAED;EACE,sBfkeoC;EDlb9B,iDgB/CkC,EAMzC;EARD;IAII,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;AAGH;EACE,efwdoC;EevdpC,sBfudoC;EetdpC,0BfudoC,EetdrC;;AAED;EACE,efkdoC,EejdrC;;AA/BD;;;;;;;;;;EAUE,ef8eoC,Ee7erC;;AAED;EACE,sBf0eoC;ED1b9B,iDgB/CkC,EAMzC;EARD;IAII,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;AAGH;EACE,efgeoC;Ee/dpC,sBf+doC;Ee9dpC,0Bf+doC,Ee9drC;;AAED;EACE,ef0doC,EezdrC;;AA/BD;;;;;;;;;;EAUE,efkfoC,EejfrC;;AAED;EACE,sBf8eoC;ED9b9B,iDgB/CkC,EAMzC;EARD;IAII,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;AAGH;EACE,efoeoC;EenepC,sBfmeoC;EelepC,0BfmeoC,EelerC;;AAED;EACE,ef8doC,Ee7drC;;AD8YH;EAGI,UAA2B,EAC5B;;AAJH;EAMI,OAAO,EACR;;AASH;EACE,eAAe;EACf,gBAAgB;EAChB,oBAAoB;EACpB,eAAc,EACf;;AAkBC;EAEE;IACE,sBAAsB;IACtB,iBAAiB;IACjB,uBAAuB,EACxB;EAGD;IACE,sBAAsB;IACtB,YAAY;IACZ,uBAAuB,EACxB;EAGD;IACE,sBAAsB,EACvB;EAED;IACE,sBAAsB;IACtB,uBAAuB,EAOxB;IALC;;;MAGE,YAAY,EACb;EAIY;IACb,YAAY,EACb;EAED;IACE,iBAAiB;IACjB,uBAAuB,EACxB;EAID;;IAEE,sBAAsB;IACtB,cAAc;IACd,iBAAiB;IACjB,uBAAuB,EAKxB;IAHC;;MACE,gBAAgB,EACjB;EAEsB;;IAEvB,mBAAmB;IACnB,eAAe,EAChB;EAGa;IACZ,OAAO,EACR,EAAA;;AAeL;;;;EASI,cAAc;EACd,iBAAiB;EACjB,iBAAoC,EACrC;;AAZH;;EAiBI,iBAAkC,EACnC;;AAlBH;EJ1hBE,mBAAkB;EAClB,oBAAmB,EIgjBlB;EAvBH;IR1hBI,aAAa;IACb,eAAe,EAChB;EQwhBH;IRthBI,YAAY,EACb;;AQgjBD;EA3BF;IA6BM,kBAAkB;IAClB,iBAAiB;IACjB,iBAAoC,EACrC,EAAA;;AAhCL;EAwCI,YAAY,EACb;;AAOC;EAhDJ;IAkDQ,kBAAqC;IACrC,gBdxiBsB,EcyiBvB,EAAA;;AAIH;EAxDJ;IA0DQ,iBAAqC;IACrC,gBd/iBsB,EcgjBvB,EAAA;;AE7lBP;EACE,sBAAsB;EACtB,iBAAiB;EACjB,oBhB0IqC;EgBzIrC,mBAAmB;EACnB,uBAAuB;EACvB,+BAA2B;EAA3B,2BAA2B;EAC3B,gBAAgB;EAChB,uBAAuB;EACvB,8BAA8B;EAC9B,oBAAoB;EC0CpB,kBjBmC8B;EiBlC9B,gBjBV4B;EiBW5B,qBjBCmC;EiBAnC,mBjB8C6B;ED4G7B,0BiBrMyB;EjBsMtB,uBiBtMsB;EjBuMrB,sBiBvMqB;EjBwMjB,kBiBxMiB,EAkC1B;EA9CD;IfFE,2CAA2C;IAC3C,qBAAqB,EeqBlB;EApBL;IA0BI,YhBqHiC;IgBpHjC,sBAAsB,EACvB;EA5BH;IAgCI,WAAW;IACX,uBAAuB;IjB4BjB,iDiB3BkC,EACzC;EAnCH;;IAwCI,oBhBuLwC;IkBpO1C,cF8CsB;IE3CtB,0BAAa;InB+DL,iBiBnBkB,EACzB;;AAKH;;EAGI,qBAAqB,EACtB;;AAOH;EC7DE,YjBiJmC;EiBhJnC,uBjBiJmC;EiBhJnC,mBjBiJmC,EgBpFpC;EAFD;ICvDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDoDH;IClDI,YjBsIiC;IiBrIjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+CH;;IC3CI,YjB+HiC;IiB9HjC,0BAAwB;IACpB,sBAAoB,EASzB;IDgCH;;;;MCpCM,YjBwH+B;MiBvH/B,0BAAwB;MACpB,sBAAoB,EACzB;EDiCL;;IC5BI,uBAAuB,EACxB;ED2BH;;;;ICpBM,uBjByG+B;IiBxG3B,mBjByG2B,EiBxGhC;EAGH;IACE,YjBmGiC;IiBlGjC,uBjBiGiC,EiBhGlC;;ADeH;EChEE,YjBqJmC;EiBpJnC,0BjBU4B;EiBT5B,sBjBqJqC,EgBrFtC;EAFD;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuDH;ICrDI,YjB0IiC;IiBzIjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkDH;;IC9CI,YjBmIiC;IiBlIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmCH;;;;MCvCM,YjB4H+B;MiB3H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoCL;;IC/BI,uBAAuB,EACxB;ED8BH;;;;ICvBM,0BjB9BwB;IiB+BpB,sBjB6G6B,EiB5GlC;EAGH;IACE,ejBpC0B;IiBqC1B,uBjBqGiC,EiBpGlC;;ADmBH;ECpEE,YjByJmC;EiBxJnC,0BjBW6B;EiBV7B,sBjByJqC,EgBrFtC;EAFD;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED2DH;ICzDI,YjB8IiC;IiB7IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDsDH;;IClDI,YjBuIiC;IiBtIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDuCH;;;;MC3CM,YjBgI+B;MiB/H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDwCL;;ICnCI,uBAAuB,EACxB;EDkCH;;;;IC3BM,0BjB7ByB;IiB8BrB,sBjBiH6B,EiBhHlC;EAGH;IACE,ejBnC2B;IiBoC3B,uBjByGiC,EiBxGlC;;ADuBH;ECxEE,YjB6JmC;EiB5JnC,0BjBY6B;EiBX7B,sBjB6JqC,EgBrFtC;EAFD;IClEI,YjBuJiC;IiBtJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+DH;IC7DI,YjBkJiC;IiBjJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED0DH;;ICtDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID2CH;;;;MC/CM,YjBoI+B;MiBnI/B,0BAAwB;MACpB,sBAAoB,EACzB;ED4CL;;ICvCI,uBAAuB,EACxB;EDsCH;;;;IC/BM,0BjB5ByB;IiB6BrB,sBjBqH6B,EiBpHlC;EAGH;IACE,ejBlC2B;IiBmC3B,uBjB6GiC,EiB5GlC;;AD2BH;EC5EE,YjBiKmC;EiBhKnC,0BjBa6B;EiBZ7B,sBjBiKqC,EgBrFtC;EAFD;ICtEI,YjB2JiC;IiB1JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDmEH;ICjEI,YjBsJiC;IiBrJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED8DH;;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID+CH;;;;MCnDM,YjBwI+B;MiBvI/B,0BAAwB;MACpB,sBAAoB,EACzB;EDgDL;;IC3CI,uBAAuB,EACxB;ED0CH;;;;ICnCM,0BjB3ByB;IiB4BrB,sBjByH6B,EiBxHlC;EAGH;IACE,ejBjC2B;IiBkC3B,uBjBiHiC,EiBhHlC;;AD+BH;EChFE,YjBqKmC;EiBpKnC,0BjBc6B;EiBb7B,sBjBqKqC,EgBrFtC;EAFD;IC1EI,YjB+JiC;IiB9JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuEH;ICrEI,YjB0JiC;IiBzJjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkEH;;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmDH;;;;MCvDM,YjB4I+B;MiB3I/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoDL;;IC/CI,uBAAuB,EACxB;ED8CH;;;;ICvCM,0BjB1ByB;IiB2BrB,sBjB6H6B,EiB5HlC;EAGH;IACE,ejBhC2B;IiBiC3B,uBjBqHiC,EiBpHlC;;ADwCH;EACE,ehB/E4B;EgBgF5B,oBAAoB;EACpB,iBAAiB,EA8BlB;EAjCD;;IAUI,8BAA8B;IjBpCxB,iBiBqCkB,EACzB;EAZH;IAiBI,0BAA0B,EAC3B;EAlBH;IAqBI,ehBhF0B;IgBiF1B,2BhB/E6B;IgBgF7B,8BAA8B,EAC/B;EAxBH;;;IA6BM,ehB9G0B;IgB+G1B,sBAAsB,EACvB;;AAQL;EC1EE,mBjBsC8B;EiBrC9B,gBjBT4B;EiBU5B,qBjB4CmC;EiB3CnC,mBjB+C6B,EgB2B9B;;AACD;EC9EE,kBjByC8B;EiBxC9B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgB8B9B;;AACD;EClFE,iBjB4C6B;EiB3C7B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgBiC9B;;AAMD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;EACE,gBAAgB,EACjB;;AAGD;;;EAII,YAAY,EACb;;AG7JH;EACE,WAAW;EpB+KX,yCoB9KuC;EpBgL/B,iCoBhL+B,EAIxC;EAND;IAII,WAAW,EACZ;;AAGH;EACE,cAAc,EAKf;EAND;IAGc,eAAe,EAAI;;AAKjC;EAAoB,mBAAmB,EAAI;;AAE3C;EAAoB,yBAAyB,EAAI;;AAEjD;EACE,mBAAmB;EACnB,UAAU;EACV,iBAAiB;EpB8JjB,gDoB7J+C;EpB8JvC,wCoB9JuC;EpBqK/C,mCoBpKiC;EpBqKzB,2BoBrKyB;EpBwKjC,yCoBvKwC;EpBwKhC,iCoBxKgC,EACzC;;AC9BD;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,uBAAuB;EACvB,uBAAsC;EACtC,yBAAwC;EACxC,oCAAiD;EACjD,mCAAiD,EAClD;;AAGD;;EAEE,mBAAmB,EACpB;;AAGD;EACE,WAAW,EACZ;;AAGD;EACE,mBAAmB;EACnB,UAAU;EACV,QAAQ;EACR,cpBmP6B;EoBlP7B,cAAc;EACd,YAAY;EACZ,iBAAiB;EACjB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,gBpBU4B;EoBT5B,iBAAiB;EACjB,uBpBoMmC;EoBnMnC,uBpBuMmC;EoBtMnC,sCpBoMmC;EoBnMnC,mBpB+D6B;EDxCrB,4CqBtB2B;EACnC,6BAA6B,EAyB9B;EA3CD;IAwBI,SAAS;IACT,WAAW,EACZ;EA1BH;ICzBE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BrB6OsC,EoBxLrC;EA/BH;IAmCI,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ,oBAAoB;IACpB,qBpBNiC;IoBOjC,epB1D4B;IoB2D5B,oBAAoB,EACrB;;AAIH;EAGI,sBAAsB;EACtB,epB0KmC;EoBzKnC,0BpB2KoC,EoB1KrC;;AAIH;EAII,YpBwB4B;EoBvB5B,sBAAsB;EACtB,WAAW;EACX,0BpB5E0B,EoB6E3B;;AAOH;EAII,epB3F4B,EoB4F7B;;AALH;EAUI,sBAAsB;EACtB,8BAA8B;EAC9B,uBAAuB;EE3GzB,oEAAmE;EF6GjE,oBpBoHwC,EoBnHzC;;AAIH;EAGI,eAAe,EAChB;;AAJH;EAQI,WAAW,EACZ;;AAOH;EACE,WAAW;EACX,SAAS,EACV;;AAOD;EACE,QAAQ;EACR,YAAY,EACb;;AAGD;EACE,eAAe;EACf,kBAAkB;EAClB,gBpBtG4B;EoBuG5B,qBpB7FmC;EoB8FnC,epB/I8B;EoBgJ9B,oBAAoB,EACrB;;AAGD;EACE,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,UAAU;EACV,OAAO;EACP,aAA0B,EAC3B;;AAGD;EACE,SAAS;EACT,WAAW,EACZ;;AAOD;;EAII,cAAc;EACd,0BAAuC;EACvC,4BAAyC;EACzC,YAAY,EACb;;AARH;;EAWI,UAAU;EACV,aAAa;EACb,mBAAmB,EACpB;;AAQH;EACE;IAEI,SAAS;IAAE,WAAW,EACvB;EAHH;IAOI,QAAQ;IAAE,YAAY,EACvB,EAAA;;AGhNL;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,uBAAuB,EAYxB;EAhBD;;IAMI,mBAAmB;IACnB,YAAY,EAQb;IAfH;;;;;MAaM,WAAW,EACZ;;AAKL;;;;EAKI,kBAAkB,EACnB;;AAIH;EACE,kBAAkB,EAanB;EAdD;IjBnBI,aAAa;IACb,eAAe,EAChB;EiBiBH;IjBfI,YAAY,EACb;EiBcH;;;IAOI,YAAY,EACb;EARH;;;IAYI,iBAAiB,EAClB;;AAGH;EACE,iBAAiB,EAClB;;AAGD;EACE,eAAe,EAIhB;EALD;IChDE,8BDmDgC;IClD7B,2BDkD6B,EAC/B;;AAGH;;EC/CE,6BDiD6B;EChD1B,0BDgD0B,EAC9B;;AAGD;EACE,YAAY,EACb;;AACD;EACE,iBAAiB,EAClB;;AACD;;ECnEE,8BDsEgC;ECrE7B,2BDqE6B,EAC/B;;AAEH;ECjEE,6BDkE6B;ECjE1B,0BDiE0B,EAC9B;;AAGD;;EAEE,WAAW,EACZ;;AAgBD;EACE,kBAAkB;EAClB,mBAAmB,EACpB;;AACD;EACE,mBAAmB;EACnB,oBAAoB,EACrB;;AAID;ExB9CU,iDwB+CgC,EAMzC;EAPD;IxB9CU,iBwBmDkB,EACzB;;AAKH;EACE,eAAe,EAChB;;AAED;EACE,wBAAqD;EACrD,uBAAuB,EACxB;;AAED;EACE,wBvBf6B,EuBgB9B;;AAMD;;;EAII,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,gBAAgB,EACjB;;AARH;EjBhII,aAAa;EACb,eAAe,EAChB;;AiB8HH;EjB5HI,YAAY,EACb;;AiB2HH;EAcM,YAAY,EACb;;AAfL;;;;EAsBI,iBAAiB;EACjB,eAAe,EAChB;;AAGH;EAEI,iBAAiB,EAClB;;AAHH;ECvKE,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BDqKiC;ECpKhC,6BDoKgC,EAChC;;AAPH;ECvKE,2BDgL8B;EC/K7B,0BD+K6B;ECxK9B,gCxBkG6B;EwBjG5B,+BxBiG4B,EuBwE5B;;AAEH;EACE,iBAAiB,EAClB;;AACD;;EC/KE,8BDkLiC;ECjLhC,6BDiLgC,EAChC;;AAEH;EC7LE,2BD8L4B;EC7L3B,0BD6L2B,EAC7B;;AAMD;EACE,eAAe;EACf,YAAY;EACZ,oBAAoB;EACpB,0BAA0B,EAc3B;EAlBD;;IAOI,YAAY;IACZ,oBAAoB;IACpB,UAAU,EACX;EAVH;IAYI,YAAY,EACb;EAbH;IAgBI,WAAW,EACZ;;A9BwoGH;;;;E8BnnGM,mBAAmB;EACnB,uBAAU;EACV,qBAAqB,EACtB;;AE3OL;EACE,mBAAmB;EACnB,eAAe;EACf,0BAA0B,EA2B3B;EA9BD;IAOI,YAAY;IACZ,gBAAgB;IAChB,iBAAiB,EAClB;EAVH;IAeI,mBAAmB;IACnB,WAAW;IAKX,YAAY;IAEZ,YAAY;IACZ,iBAAiB,EAKlB;IA7BH;MA2BM,WAAW,EACZ;;AAuBL;;;EAGE,oBAAoB,EAKrB;EARD;;;IAMI,iBAAiB,EAClB;;AAGH;;EAEE,UAAU;EACV,oBAAoB;EACpB,uBAAuB,EACxB;;AAID;EACE,kBzBkB8B;EyBjB9B,gBzB3B4B;EyB4B5B,oBAAoB;EACpB,eAAe;EACf,ezBpE8B;EyBqE9B,mBAAmB;EACnB,0BzBpE8B;EyBqE9B,uBzB+GmC;EyB9GnC,mBzBwB6B,EyBL9B;EA5BD;;;IAaI,kBzBY4B;IyBX5B,gBzBrC0B;IyBsC1B,mBzBoB2B,EyBnB5B;EAhBH;;;IAkBI,mBzBI4B;IyBH5B,gBzB3C0B;IyB4C1B,mBzBc2B,EyBb5B;EArBH;;IA0BI,cAAc,EACf;;AAIH;;;;;;;EDpGE,8BC2G8B;ED1G3B,2BC0G2B,EAC/B;;AACD;EACE,gBAAgB,EACjB;;AACD;;;;;;;EDxGE,6BC+G6B;ED9G1B,0BC8G0B,EAC9B;;AACD;EACE,eAAe,EAChB;;AAID;EACE,mBAAmB;EAGnB,aAAa;EACb,oBAAoB,EA+BrB;EApCD;IAUI,mBAAmB,EAUpB;IApBH;MAYM,kBAAkB,EACnB;IAbL;MAkBM,WAAW,EACZ;EAnBL;;IA0BM,mBAAmB,EACpB;EA3BL;;IAgCM,WAAW;IACX,kBAAkB,EACnB;;AChKL;EACE,iBAAiB;EACjB,gBAAgB;EAChB,iBAAiB,EAyDlB;EA5DD;IpBOI,aAAa;IACb,eAAe,EAChB;EoBTH;IpBWI,YAAY,EACb;EoBZH;IAOI,mBAAmB;IACnB,eAAe,EAyBhB;IAjCH;MAWM,mBAAmB;MACnB,eAAe;MACf,mB1BqZ+C,E0B/YhD;MAnBL;QAgBQ,sBAAsB;QACtB,0B1BVwB,E0BWzB;IAlBP;MAuBM,e1BjB0B,E0B0B3B;MAhCL;QA2BQ,e1BrBwB;Q0BsBxB,sBAAsB;QACtB,8BAA8B;QAC9B,oB1BiMoC,E0BhMrC;EA/BP;IAwCM,0B1BjC0B;I0BkC1B,sB1BhCwB,E0BiCzB;EA1CL;ILHE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BAJgC,EKwD/B;EApDH;IA0DI,gBAAgB,EACjB;;AAQH;EACE,8B1BqW8C,E0BlU/C;EApCD;IAGI,YAAY;IAEZ,oBAAoB,EAyBrB;IA9BH;MASM,kBAAkB;MAClB,qB1BtB+B;M0BuB/B,8BAA8B;MAC9B,2BAA0D,EAI3D;MAhBL;QAcQ,mC1BwVwC,E0BvVzC;IAfP;MAuBQ,e1BrFwB;M0BsFxB,uB1BtEoB;M0BuEpB,uB1BmVwC;M0BlVxC,iCAAiC;MACjC,gBAAgB,EACjB;;AAaP;EAEI,YAAY,EAmBb;EArBH;IAMM,mB1BbyB,E0Bc1B;EAPL;IASM,iBAAiB,EAClB;EAVL;IAiBQ,Y1BnBwB;I0BoBxB,0B1BrHsB,E0BsHvB;;AAOP;EAEI,YAAY,EAKb;EAPH;IAIM,gBAAgB;IAChB,eAAe,EAChB;;AAWL;EACE,YAAY,EAwBb;EAzBD;IAII,YAAY,EAKb;IATH;MAMM,mBAAmB;MACnB,mBAAmB,EACpB;EARL;IAYI,UAAU;IACV,WAAW,EACZ;EAED;IAhBF;MAkBM,oBAAoB;MACpB,UAAU,EAIX;MAvBL;QAqBQ,iBAAiB,EAClB,EAAA;;AAQP;EACE,iBAAiB,EAyBlB;EA1BD;IAKI,gBAAgB;IAChB,mB1BtF2B,E0BuF5B;EAPH;;;IAYI,uB1BgPkD,E0B/OnD;EAED;IAfF;MAiBM,8B1B2OgD;M0B1OhD,2BAA0D,EAC3D;IAnBL;;;MAuBM,0B1BvLsB,E0BwLvB,EAAA;;AASL;EAEI,cAAc,EACf;;AAHH;EAKI,eAAe,EAChB;;AAQH;EAEE,iBAAiB;EF3OjB,2BE6O4B;EF5O3B,0BE4O2B,EAC7B;;ACvOD;EACE,mBAAmB;EACnB,iB3BgWqC;E2B/VrC,oB3BoD6B;E2BnD7B,8BAA8B,EAQ/B;EAZD;IrBKI,aAAa;IACb,eAAe,EAChB;EqBPH;IrBSI,YAAY,EACb;EqBDD;IATF;MAUI,mB3ByF2B,E2BvF9B,EAAA;;AAQD;ErBfI,aAAa;EACb,eAAe,EAChB;;AqBaH;ErBXI,YAAY,EACb;;AqBaD;EAHF;IAII,YAAY,EAEf,EAAA;;AAaD;EACE,oBAAoB;EACpB,oB3B4TsC;E2B3TtC,mB3B2TsC;E2B1TtC,kCAAkC;EAClC,mDAA8B;EAE9B,kCAAkC,EA+BnC;EAtCD;IrBlCI,aAAa;IACb,eAAe,EAChB;EqBgCH;IrB9BI,YAAY,EACb;EqB6BH;IAUI,iBAAiB,EAClB;EAED;IAbF;MAcI,YAAY;MACZ,cAAc;MACd,iBAAiB,EAsBpB;MAtCD;QAmBM,0BAA0B;QAC1B,wBAAwB;QACxB,kBAAkB;QAClB,6BAA6B,EAC9B;MAvBL;QA0BM,oBAAoB,EACrB;MA3BL;;;QAkCM,gBAAgB;QAChB,iBAAiB,EAClB,EAAA;;AAIL;;EAGI,kB3BqRoC,E2BhRrC;EAHC;IALJ;;MAMM,kBAAkB,EAErB,EAAA;;AAQH;;;;EAII,oB3BkQoC;E2BjQpC,mB3BiQoC,E2B3PrC;EAJC;IAPJ;;;;MAQM,gBAAgB;MAChB,eAAgB,EAEnB,EAAA;;AAWH;EACE,c3BoJ6B;E2BnJ7B,sBAAsB,EAKvB;EAHC;IAJF;MAKI,iBAAiB,EAEpB,EAAA;;AAGD;;EAEE,gBAAgB;EAChB,SAAS;EACT,QAAQ;EACR,c3B0I6B,E2BpI9B;EAHC;IARF;;MASI,iBAAiB,EAEpB,EAAA;;AACD;EACE,OAAO;EACP,sBAAsB,EACvB;;AACD;EACE,UAAU;EACV,iBAAiB;EACjB,sBAAsB,EACvB;;AAKD;EACE,YAAY;EACZ,mB3B2MsC;E2B1MtC,gB3BjH4B;E2BkH5B,kB3BrG6B;E2BsG7B,a3BqMqC,E2BpLtC;EAtBD;IASI,sBAAsB,EACvB;EAVH;IAaI,eAAe,EAChB;EAED;IAhBF;;MAmBM,mB3B0LkC,E2BzLnC,EAAA;;AAUL;EACE,mBAAmB;EACnB,aAAa;EACb,mB3B4KsC;E2B3KtC,kBAAkB;EC9LlB,gBAA4B;EAC5B,mBAA+B;ED+L/B,8BAA8B;EAC9B,uBAAuB;EACvB,8BAA8B;EAC9B,mB3B5F6B,E2BkH9B;EA/BD;IAcI,WAAW,EACZ;EAfH;IAmBI,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,mBAAmB,EACpB;EAvBH;IAyBI,gBAAgB,EACjB;EAED;IA5BF;MA6BI,cAAc,EAEjB,EAAA;;AAQD;EACE,oB3BuIsC,E2B1FvC;EA9CD;IAII,kBAAqB;IACrB,qBAAqB;IACrB,kB3B5K2B,E2B6K5B;EAED;IATF;MAYM,iBAAiB;MACjB,YAAY;MACZ,YAAY;MACZ,cAAc;MACd,8BAA8B;MAC9B,UAAU;MACV,iBAAiB,EAYlB;MA9BL;;QAqBQ,2BAA2B,EAC5B;MAtBP;QAwBQ,kB3B9LuB,E2BmMxB;QA7BP;UA2BU,uBAAuB,EACxB,EAAA;EAMP;IAlCF;MAmCI,YAAY;MACZ,UAAU,EAUb;MA9CD;QAuCM,YAAY,EAKb;QA5CL;UAyCQ,kB3BgG2C;U2B/F3C,qB3B+F2C,E2B9F5C,EAAA;;AAWP;EACE,mB3BiFsC;E2BhFtC,oB3BgFsC;E2B/EtC,mB3B+EsC;E2B9EtC,kCAAkC;EAClC,qCAAqC;E5B7N7B,qF4B8NiD;EC7RzD,gBAA4B;EAC5B,mBAA+B,EDyThC;Eb2JC;IAEE;MACE,sBAAsB;MACtB,iBAAiB;MACjB,uBAAuB,EACxB;IAGD;MACE,sBAAsB;MACtB,YAAY;MACZ,uBAAuB,EACxB;IAGD;MACE,sBAAsB,EACvB;IAED;MACE,sBAAsB;MACtB,uBAAuB,EAOxB;MALC;;;QAGE,YAAY,EACb;IAIY;MACb,YAAY,EACb;IAED;MACE,iBAAiB;MACjB,uBAAuB,EACxB;IAID;;MAEE,sBAAsB;MACtB,cAAc;MACd,iBAAiB;MACjB,uBAAuB,EAKxB;MAHC;;QACE,gBAAgB,EACjB;IAEsB;;MAEvB,mBAAmB;MACnB,eAAe,EAChB;IAGa;MACZ,OAAO,EACR,EAAA;EahPD;IAbJ;MAcM,mBAAmB,EAMtB;MApBH;QAiBQ,iBAAiB,EAClB,EAAA;EAQL;IA1BF;MA2BI,YAAY;MACZ,UAAU;MACV,eAAe;MACf,gBAAgB;MAChB,eAAe;MACf,kBAAkB;M5BxPZ,iB4ByPkB,EAE3B,EAAA;;AAMD;EACE,cAAc;EHpUd,2BGqU4B;EHpU3B,0BGoU2B,EAC7B;;AAED;EACE,iBAAiB;EHzUjB,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BGmU+B;EHlU9B,6BGkU8B,EAChC;;AAOD;EChVE,gBAA4B;EAC5B,mBAA+B,EDwVhC;EATD;IChVE,iBAA4B;IAC5B,oBAA+B,EDoV9B;EALH;IChVE,iBAA4B;IAC5B,oBAA+B,EDuV9B;;AAQH;EChWE,iBAA4B;EAC5B,oBAA+B,EDuWhC;EALC;IAHF;MAII,YAAY;MACZ,kB3BIoC;M2BHpC,mB3BGoC,E2BDvC,EAAA;;AAWD;EACE;IACE,uBAAuB,EACxB;EACD;IACE,wBAAwB;IAC1B,oB3BhBsC,E2BqBrC;IAPD;MAKI,gBAAgB,EACjB,EAAA;;AASL;EACE,0B3BzBwC;E2B0BxC,sB3BzBuC,E2ByJxC;EAlID;IAKI,Y3BzB2C,E2B+B5C;IAXH;MAQM,e3BlB2C;M2BmB3C,8B3BlBgD,E2BmBjD;EAVL;IAcI,Y3BvCmC,E2BwCpC;EAfH;IAmBM,Y3BvCyC,E2B8C1C;IA1BL;MAuBQ,Y3B1CuC;M2B2CvC,8B3B1C8C,E2B2C/C;EAzBP;IA+BQ,Y3BhDuC;I2BiDvC,0B3BhDyC,E2BiD1C;EAjCP;IAuCQ,Y3BtDuC;I2BuDvC,8B3BtD8C,E2BuD/C;EAzCP;IA8CI,mB3BlD2C,E2B0D5C;IAtDH;MAiDM,uB3BvDyC,E2BwD1C;IAlDL;MAoDM,uB3BzDyC,E2B0D1C;EArDL;;IA0DI,sB3BjFqC,E2BkFtC;EA3DH;IAoEQ,0B3BpFyC;I2BqFzC,Y3BtFuC,E2BuFxC;EAGH;IAzEJ;MA6EU,Y3BjGqC,E2BuGtC;MAnFT;QAgFY,Y3BnGmC;Q2BoGnC,8B3BnG0C,E2BoG3C;IAlFX;MAwFY,Y3BzGmC;M2B0GnC,0B3BzGqC,E2B0GtC;IA1FX;MAgGY,Y3B/GmC;M2BgHnC,8B3B/G0C,E2BgH3C,EAAA;EAlGX;IA8GI,Y3BlI2C,E2BsI5C;IAlHH;MAgHM,Y3BnIyC,E2BoI1C;EAjHL;IAqHI,Y3BzI2C,E2BqJ5C;IAjIH;MAwHM,Y3B3IyC,E2B4I1C;IAzHL;;;MA8HQ,Y3B7IuC,E2B8IxC;;AAOP;EACE,uB3BrI8C;E2BsI9C,sB3BrIgD,E2BsQjD;EAnID;IAKI,e3BrI+C,E2B2IhD;IAXH;MAQM,Y3B9H0C;M2B+H1C,8B3B9HiD,E2B+HlD;EAVL;IAcI,e3BnJ+C,E2BoJhD;EAfH;IAmBM,e3BnJ6C,E2B0J9C;IA1BL;MAuBQ,Y3BtJwC;M2BuJxC,8B3BtJ+C,E2BuJhD;EAzBP;IA+BQ,Y3B9JwC;I2B+JxC,0B3B5J0C,E2B6J3C;EAjCP;IAuCQ,Y3BlKwC;I2BmKxC,8B3BlK+C,E2BmKhD;EAzCP;IA+CI,mB3B/J4C,E2BuK7C;IAvDH;MAkDM,uB3BpK0C,E2BqK3C;IAnDL;MAqDM,uB3BtK0C,E2BuK3C;EAtDL;;IA2DI,sBAAoB,EACrB;EA5DH;IAoEQ,0B3BhM0C;I2BiM1C,Y3BpMwC,E2BqMzC;EAGH;IAzEJ;MA6EU,sB3BhNwC,E2BiNzC;IA9ET;MAgFU,0B3BnNwC,E2BoNzC;IAjFT;MAmFU,e3BnNyC,E2ByN1C;MAzFT;QAsFY,Y3BrNoC;Q2BsNpC,8B3BrN2C,E2BsN5C;IAxFX;MA8FY,Y3B7NoC;M2B8NpC,0B3B3NsC,E2B4NvC;IAhGX;MAsGY,Y3BjOoC;M2BkOpC,8B3BjO2C,E2BkO5C,EAAA;EAxGX;IA+GI,e3B/O+C,E2BmPhD;IAnHH;MAiHM,Y3BhP0C,E2BiP3C;EAlHL;IAsHI,e3BtP+C,E2BkQhD;IAlIH;MAyHM,Y3BxP0C,E2ByP3C;IA1HL;;;MA+HQ,Y3B1PwC,E2B2PzC;;AE7oBP;EACE,kB7BqxBkC;E6BpxBlC,oB7B0D6B;E6BzD7B,iBAAiB;EACjB,0B7BoxBqC;E6BnxBrC,mB7BmG6B,E6BlF9B;EAtBD;IAQI,sBAAsB,EASvB;IAjBH;MAaM,cAA2C;MAC3C,eAAe;MACf,Y7B2wB8B,E6B1wB/B;EAhBL;IAoBI,e7BX4B,E6BY7B;;ACvBH;EACE,sBAAsB;EACtB,gBAAgB;EAChB,eAA+B;EAC/B,mB9BsG6B,E8BlC9B;EAxED;IAOI,gBAAgB,EA0BjB;IAjCH;;MAUM,mBAAmB;MACnB,YAAY;MACZ,kB9BgF0B;M8B/E1B,qB9B+C+B;M8B9C/B,sBAAsB;MACtB,e9BDwB;M8BExB,uB9BobqC;M8BnbrC,uB9BobqC;M8BnbrC,kBAAkB,EACnB;IAnBL;;MAuBQ,eAAe;MNXrB,+BxB8F6B;MwB7F1B,4BxB6F0B,E8BjFxB;IAzBP;;MNIE,gCxBsG6B;MwBrG1B,6BxBqG0B,E8B3ExB;EA/BP;;;IAuCM,WAAW;IACX,e9BPwB;I8BQxB,0B9B7B0B;I8B8B1B,mB9B+ZqC,E8B9ZtC;EA3CL;;;;IAmDM,WAAW;IACX,Y9BuZqC;I8BtZrC,0B9BvCwB;I8BwCxB,sB9BxCwB;I8ByCxB,gBAAgB,EACjB;EAxDL;;;;;;IAkEM,e9BvD0B;I8BwD1B,uB9B6YqC;I8B5YrC,mB9B6YqC;I8B5YrC,oB9B+JsC,E8B9JvC;;ACrEC;;EAEA,mB/B4F0B;E+B3F1B,gB/B6CwB;E+B5CxB,qB/BkG+B,E+BjGhC;;AAEG;;EPIN,+BxB+F6B;EwB9F1B,4BxB8F0B,E+BhGxB;;AAGC;;EPVN,gCxBuG6B;EwBtG1B,6BxBsG0B,E+B1FxB;;AAhBD;;EAEA,kB/B+F0B;E+B9F1B,gB/B8CwB;E+B7CxB,iB/BmGyB,E+BlG1B;;AAEG;;EPIN,+BxBgG6B;EwB/F1B,4BxB+F0B,E+BjGxB;;AAGC;;EPVN,gCxBwG6B;EwBvG1B,6BxBuG0B,E+B3FxB;;ACfP;EACE,gBAAgB;EAChB,eAA+B;EAC/B,iBAAiB;EACjB,mBAAmB,EA4CpB;EAhDD;I1BUI,aAAa;IACb,eAAe,EAChB;E0BZH;I1BcI,YAAY,EACb;E0BfH;IAOI,gBAAgB,EAejB;IAtBH;;MAUM,sBAAsB;MACtB,kBAAkB;MAClB,uBhCsbqC;MgCrbrC,uBhCsbqC;MgCrbrC,oBhC0cqC,EgCzctC;IAfL;;MAmBM,sBAAsB;MACtB,0BhCV0B,EgCW3B;EArBL;;IA2BM,aAAa,EACd;EA5BL;;IAkCM,YAAY,EACb;EAnCL;;;;IA2CM,ehClC0B;IgCmC1B,uBhCsZqC;IgCrZrC,oBhCqLsC,EgCpLvC;;AC/CL;EACE,gBAAgB;EAChB,wBAAwB;EACxB,eAAe;EACf,kBAAkB;EAClB,eAAe;EACf,YjC+jBgC;EiC9jBhC,mBAAmB;EACnB,oBAAoB;EACpB,yBAAyB;EACzB,qBAAqB,EActB;EAxBD;IAgBI,cAAc,EACf;EAjBH;IAqBI,mBAAmB;IACnB,UAAU,EACX;;AAIH;EAGI,YjCyiB8B;EiCxiB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AAMH;ECxCE,0BlCW8B,EiC+B/B;EAFD;ICnCM,0BAAwB,EACzB;;ADsCL;EC5CE,0BlCc4B,EiCgC7B;EAFD;ICvCM,0BAAwB,EACzB;;AD0CL;EChDE,0BlCe6B,EiCmC9B;EAFD;IC3CM,0BAAwB,EACzB;;AD8CL;ECpDE,0BlCgB6B,EiCsC9B;EAFD;IC/CM,0BAAwB,EACzB;;ADkDL;ECxDE,0BlCiB6B,EiCyC9B;EAFD;ICnDM,0BAAwB,EACzB;;ADsDL;EC5DE,0BlCkB6B,EiC4C9B;EAFD;ICvDM,0BAAwB,EACzB;;ACHL;EACE,sBAAsB;EACtB,gBAAgB;EAChB,iBAAiB;EACjB,gBnC2C4B;EmC1C5B,kBnCswBgC;EmCrwBhC,YnC2vBgC;EmC1vBhC,enCqwB6B;EmCpwB7B,uBAAuB;EACvB,oBAAoB;EACpB,mBAAmB;EACnB,0BnCH8B;EmCI9B,oBnCiwBgC,EmC1tBjC;EAnDD;IAgBI,cAAc,EACf;EAjBH;IAqBI,mBAAmB;IACnB,UAAU,EACX;EAvBH;;IA2BI,OAAO;IACP,iBAAiB,EAClB;EA7BH;;IAoCI,enCzB0B;ImC0B1B,uBnCouB8B,EmCnuB/B;EAtCH;IAyCI,aAAa,EACd;EA1CH;IA6CI,kBAAkB,EACnB;EA9CH;IAiDI,iBAAiB,EAClB;;AAIH;EAGI,YnC0sB8B;EmCzsB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AC7DH;EACE,kBpCqemC;EoCpenC,qBpCoemC;EoCnenC,oBpCmemC;EoClenC,epCmesC;EoCletC,0BpCK8B,EoCsC/B;EAhDD;;IASI,epCgeoC,EoC/drC;EAVH;IAaI,oBAAkC;IAClC,gBpC4diC;IoC3djC,iBAAiB,EAClB;EAhBH;IAmBI,0BAAwB,EACzB;EApBH;;IAwBI,mBpCiF2B;IoChF3B,mBAAkC;IAClC,oBAAkC,EACnC;EA3BH;IA8BI,gBAAgB,EACjB;EAED;IAjCF;MAkCI,kBAAmC;MACnC,qBAAmC,EAatC;MAhDD;;QAuCM,mBAAkC;QAClC,oBAAkC,EACnC;MAzCL;;QA6CM,gBpC8b+B,EoC7bhC,EAAA;;AC7CL;EACE,eAAe;EACf,arCquB+B;EqCpuB/B,oBrCwD6B;EqCvD7B,qBrCqDmC;EqCpDnC,uBrCkB0B;EqCjB1B,uBrCquBgC;EqCpuBhC,mBrCgG6B;ED4E7B,4CsC3K0C;EtC6KlC,oCsC7KkC,EAgB3C;EAxBD;;InCGE,eADmC;IAEnC,gBAAgB;IAChB,aAAa;ImCQX,kBAAkB;IAClB,mBAAmB,EACpB;EAfH;IAqBI,arC6tB6B;IqC5tB7B,erChB4B,EqCiB7B;;AAIH;;;EAGE,sBrCnB4B,EqCoB7B;;AC7BD;EACE,ctC0mBgC;EsCzmBhC,oBtCuD6B;EsCtD7B,8BAA8B;EAC9B,mBtCiG6B,EsC1E9B;EA3BD;IAQI,cAAc;IAEd,eAAe,EAChB;EAXH;IAeI,kBtC8lB8B,EsC7lB/B;EAhBH;;IAqBI,iBAAiB,EAClB;EAtBH;IAyBI,gBAAgB,EACjB;;AAOH;;EAEE,oBAA8B,EAS/B;EAXD;;IAMI,mBAAmB;IACnB,UAAU;IACV,aAAa;IACb,eAAe,EAChB;;AAOH;ECvDE,0BvCqfsC;EuCpftC,sBvCqfqC;EuCpfrC,evCkfsC,EsC3bvC;ECrDC;IACE,0BAAwB,EACzB;EACD;IACE,eAAa,EACd;;ADkDH;EC3DE,0BvCyfsC;EuCxftC,sBvCyfqC;EuCxfrC,evCsfsC,EsC3bvC;ECzDC;IACE,0BAAwB,EACzB;EACD;IACE,eAAa,EACd;;ADsDH;EC/DE,0BvC6fsC;EuC5ftC,sBvC6fqC;EuC5frC,evC0fsC,EsC3bvC;EC7DC;IACE,0BAAwB,EACzB;EACD;IACE,eAAa,EACd;;AD0DH;ECnEE,0BvCigBsC;EuChgBtC,sBvCigBqC;EuChgBrC,evC8fsC,EsC3bvC;ECjEC;IACE,0BAAwB,EACzB;EACD;IACE,eAAa,EACd;;ACHH;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAInC;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAQnC;EACE,iBAAiB;EACjB,axCsC6B;EwCrC7B,oBxCqC6B;EwCpC7B,0BxCgnBmC;EwC/mBnC,mBxC+E6B;EDxCrB,+CyCtCgC,EACzC;;AAGD;EACE,YAAY;EACZ,UAAU;EACV,aAAa;EACb,gBxCc4B;EwCb5B,kBxCyB6B;EwCxB7B,YxCsmBgC;EwCrmBhC,mBAAmB;EACnB,0BxC1B4B;EDoDpB,+CyCzB+B;EzC6IvC,oCyC5IkC;EzC8I1B,4ByC9I0B,EACnC;;AAOD;;ECCE,8MAAyC;EAEzC,sMAAiC;EDAjC,2BAA2B,EAC5B;;AAMD;;EzC5CE,2DyC8C0D;EzC5ClD,mDyC4CkD,EAC3D;;AAMD;EErEE,0B1Ce6B,EwCwD9B;EEpEC;IDgDA,8MAAyC;IAEzC,sMAAiC,EChDhC;;AFoEH;EEzEE,0B1CgB6B,EwC2D9B;EExEC;IDgDA,8MAAyC;IAEzC,sMAAiC,EChDhC;;AFwEH;EE7EE,0B1CiB6B,EwC8D9B;EE5EC;IDgDA,8MAAyC;IAEzC,sMAAiC,EChDhC;;AF4EH;EEjFE,0B1CkB6B,EwCiE9B;EEhFC;IDgDA,8MAAyC;IAEzC,sMAAiC,EChDhC;;ACRH;EAEE,iBAAiB,EAKlB;EAPD;IAKI,cAAc,EACf;;AAGH;;EAEE,QAAQ;EACR,iBAAiB,EAClB;;AAED;EACE,eAAe,EAChB;;AAED;EACE,eAAe,EAMhB;EAPD;IAKI,gBAAgB,EACjB;;AAGH;;EAEE,mBAAmB,EACpB;;AAED;;EAEE,oBAAoB,EACrB;;AAED;;;EAGE,oBAAoB;EACpB,oBAAoB,EACrB;;AAED;EACE,uBAAuB,EACxB;;AAED;EACE,uBAAuB,EACxB;;AAGD;EACE,cAAc;EACd,mBAAmB,EACpB;;AAKD;EACE,gBAAgB;EAChB,iBAAiB,EAClB;;ACxDD;EAEE,oBAAoB;EACpB,gBAAgB,EACjB;;AAOD;EACE,mBAAmB;EACnB,eAAe;EACf,mBAAmB;EAEnB,oBAAoB;EACpB,uB5C0oBkC;E4CzoBlC,uB5C2oBkC,E4CjoBnC;EAjBD;IpBjBE,6BxB0G6B;IwBzG5B,4BxByG4B,E4C7E5B;EAZH;IAcI,iBAAiB;IpBvBnB,gCxBkG6B;IwBjG5B,+BxBiG4B,E4CzE5B;;AASH;;EAEE,Y5C6oBkC,E4ChoBnC;EAfD;;IAKI,Y5C4oBgC,E4C3oBjC;EANH;;;IAWI,sBAAsB;IACtB,Y5CmoBgC;I4CloBhC,0B5CinBmC,E4ChnBpC;;AAGH;EACE,YAAY;EACZ,iBAAiB,EAClB;;AAED;EAKI,0B5CzD4B;E4C0D5B,e5C3D4B;E4C4D5B,oB5C6JwC,E4CpJzC;EAhBH;IAWM,eAAe,EAChB;EAZL;IAcM,e5CnE0B,E4CoE3B;;AAfL;EAsBI,WAAW;EACX,Y5CwB4B;E4CvB5B,0B5C1E0B;E4C2E1B,sB5C3E0B,E4CsF3B;EApCH;;;;;;;IA+BM,eAAe,EAChB;EAhCL;IAkCM,e5C8kBiC,E4C7kBlC;;ACnGH;EACE,e7CmfoC;E6ClfpC,0B7CmfoC,E6ChfrC;;AAED;;EACE,e7C4eoC,E6C1drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CoekC;I6CnelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7C6dkC;I6C5dlC,sB7C4dkC,E6C3dnC;;AAzBH;EACE,e7CufoC;E6CtfpC,0B7CufoC,E6CpfrC;;AAED;;EACE,e7CgfoC,E6C9drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CwekC;I6CvelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CiekC;I6ChelC,sB7CgekC,E6C/dnC;;AAzBH;EACE,e7C2foC;E6C1fpC,0B7C2foC,E6CxfrC;;AAED;;EACE,e7CofoC,E6ClerC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7C4ekC;I6C3elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CqekC;I6CpelC,sB7CoekC,E6CnenC;;AAzBH;EACE,e7C+foC;E6C9fpC,0B7C+foC,E6C5frC;;AAED;;EACE,e7CwfoC,E6CterC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CgfkC;I6C/elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CyekC;I6CxelC,sB7CwekC,E6CvenC;;AD8FL;EACE,cAAc;EACd,mBAAmB,EACpB;;AACD;EACE,iBAAiB;EACjB,iBAAiB,EAClB;;AE3HD;EACE,oB9C0D6B;E8CzD7B,uB9C6rBgC;E8C5rBhC,8BAA8B;EAC9B,mB9CmG6B;EDxCrB,0C+C1D0B,EACnC;;AAGD;EACE,c9CsrBgC,E8CprBjC;EAHD;IxCAI,aAAa;IACb,eAAe,EAChB;EwCFH;IxCII,YAAY,EACb;;AwCCH;EACE,mB9CirBqC;E8ChrBrC,qCAAqC;EtBpBrC,6BsBqBgD;EtBpB/C,4BsBoB+C,EAKjD;EARD;IAMI,eAAe,EAChB;;AAIH;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAe;EACf,eAAe,EAShB;EAbD;;;;;IAWI,eAAe,EAChB;;AAIH;EACE,mB9CspBqC;E8CrpBrC,0B9C2pBmC;E8C1pBnC,2B9CypBgC;EwBjsBhC,gCsByCmD;EtBxClD,+BsBwCkD,EACpD;;AAQD;;EAGI,iBAAiB,EAsBlB;EAzBH;;IAMM,oBAAoB;IACpB,iBAAiB,EAClB;EARL;;IAaQ,cAAc;ItBvEpB,6BsBwEsD;ItBvErD,4BsBuEqD,EACjD;EAfP;;IAqBQ,iBAAiB;ItBvEvB,gCsBwEyD;ItBvExD,+BsBuEwD,EACpD;;AAvBP;EtB1DE,2BsBsFgC;EtBrF/B,0BsBqF+B,EAC7B;;AAIL;EAEI,oBAAoB,EACrB;;AAEH;EACE,oBAAoB,EACrB;;AAOD;;;EAII,iBAAiB,EAMlB;EAVH;;;IAOM,mB9CmlB4B;I8CllB5B,oB9CklB4B,E8CjlB7B;;AATL;;EtBzGE,6BsBuHkD;EtBtHjD,4BsBsHiD,EAkBjD;EAhCH;;;;IAmBQ,4BAA6C;IAC7C,6BAA8C,EAU/C;IA9BP;;;;;;;;MAwBU,4BAA6C,EAC9C;IAzBT;;;;;;;;MA4BU,6BAA8C,EAC/C;;AA7BT;;EtBjGE,gCsBqIqD;EtBpIpD,+BsBoIoD,EAkBpD;EAtDH;;;;IAyCQ,+BAAgD;IAChD,gCAAiD,EAUlD;IApDP;;;;;;;;MA8CU,+BAAgD,EACjD;IA/CT;;;;;;;;MAkDU,gCAAiD,EAClD;;AAnDT;;;;EA2DI,2B9CzBgC,E8C0BjC;;AA5DH;;EA+DI,cAAc,EACf;;AAhEH;;EAmEI,UAAU,EAiCX;EApGH;;;;;;;;;;;;IA0EU,eAAe,EAChB;EA3ET;;;;;;;;;;;;IA8EU,gBAAgB,EACjB;EA/ET;;;;;;;;IAuFU,iBAAiB,EAClB;EAxFT;;;;;;;;IAgGU,iBAAiB,EAClB;;AAjGT;EAsGI,UAAU;EACV,iBAAiB,EAClB;;AASH;EACE,oB9C7J6B,E8CwL9B;EA5BD;IAKI,iBAAiB;IACjB,mB9CtH2B,E8C2H5B;IAXH;MASM,gBAAgB,EACjB;EAVL;IAcI,iBAAiB,EAMlB;IApBH;;MAkBM,2B9C6d4B,E8C5d7B;EAnBL;IAuBI,cAAc,EAIf;IA3BH;MAyBM,8B9Csd4B,E8Crd7B;;AAML;EC1PE,mB/C6sBgC,E8CjdjC;EC1PK;IACF,e/CM4B;I+CL5B,0B/C0sBiC;I+CzsBjC,mB/CwsB8B,E+C/rB/B;IAPqB;MAClB,uB/CqsB4B,E+CpsB7B;IACD;MACE,e/CmsB+B;M+ClsB/B,0B/CH0B,E+CI3B;EAGmB;IAClB,0B/C4rB4B,E+C3rB7B;;AD2OL;EC7PE,sB/Cc4B,E8CiP7B;EC7PK;IACF,Y/C6sB8B;I+C5sB9B,0B/CU0B;I+CT1B,sB/CS0B,E+CA3B;IAPqB;MAClB,0B/CMwB,E+CLzB;IACD;MACE,e/CGwB;M+CFxB,uB/CosB4B,E+CnsB7B;EAGmB;IAClB,6B/CHwB,E+CIzB;;AD8OL;EChQE,sB/CsfqC,E8CpPtC;EChQK;IACF,e/CifoC;I+ChfpC,0B/CifoC;I+ChfpC,sB/CifmC,E+CxepC;IAPqB;MAClB,0B/C8eiC,E+C7elC;IACD;MACE,e/C0ekC;M+CzelC,0B/CwekC,E+CvenC;EAGmB;IAClB,6B/CqeiC,E+CpelC;;ADiPL;ECnQE,sB/C0fqC,E8CrPtC;ECnQK;IACF,e/CqfoC;I+CpfpC,0B/CqfoC;I+CpfpC,sB/CqfmC,E+C5epC;IAPqB;MAClB,0B/CkfiC,E+CjflC;IACD;MACE,e/C8ekC;M+C7elC,0B/C4ekC,E+C3enC;EAGmB;IAClB,6B/CyeiC,E+CxelC;;ADoPL;ECtQE,sB/C8fqC,E8CtPtC;ECtQK;IACF,e/CyfoC;I+CxfpC,0B/CyfoC;I+CxfpC,sB/CyfmC,E+ChfpC;IAPqB;MAClB,0B/CsfiC,E+CrflC;IACD;MACE,e/CkfkC;M+CjflC,0B/CgfkC,E+C/enC;EAGmB;IAClB,6B/C6eiC,E+C5elC;;ADuPL;ECzQE,sB/CkgBqC,E8CvPtC;ECzQK;IACF,e/C6foC;I+C5fpC,0B/C6foC;I+C5fpC,sB/C6fmC,E+CpfpC;IAPqB;MAClB,0B/C0fiC,E+CzflC;IACD;MACE,e/CsfkC;M+CrflC,0B/CofkC,E+CnfnC;EAGmB;IAClB,6B/CifiC,E+ChflC;;ACjBL;EACE,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,WAAW;EACX,iBAAiB,EAelB;EApBD;;;;;IAYI,mBAAmB;IACnB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,aAAa;IACb,YAAY;IACZ,UAAU,EACX;;AAIH;EACE,uBAAuB,EACxB;;AAGD;EACE,oBAAoB,EACrB;;AC5BD;EACE,iBAAiB;EACjB,cAAc;EACd,oBAAoB;EACpB,0BjDqvBmC;EiDpvBnC,0BjDqvBkC;EiDpvBlC,mBjDiG6B;EDxCrB,gDkDxDgC,EAKzC;EAZD;IASI,mBAAmB;IACnB,kCAAkB,EACnB;;AAIH;EACE,cAAc;EACd,mBjDuF6B,EiDtF9B;;AACD;EACE,aAAa;EACb,mBjDoF6B,EiDnF9B;;ACvBD;EACE,aAAa;EACb,gBAA2B;EAC3B,kBlDmzBgC;EkDlzBhC,eAAe;EACf,YlDkzBgC;EkDjzBhC,0BlDkzBwC;EkB1zBxC,agCSmB;EhCNnB,0BAAa,EgCiBd;EAlBD;IAWI,YlD4yB8B;IkD3yB9B,sBAAsB;IACtB,gBAAgB;IhCflB,agCgBqB;IhCbrB,0BAAa,EgCcZ;;AASH;EACE,WAAW;EACX,gBAAgB;EAChB,wBAAwB;EACxB,UAAU;EACV,yBAAyB,EAC1B;;ACzBD;EACE,iBAAiB,EAClB;;AAGD;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDmQ6B;EmDlQ7B,kCAAkC;EAIlC,WAAW,EAQZ;EArBD;IpD0HE,sCAA4B;IAGpB,8BAAoB;IAkE5B,oDoD7K6C;IpDgLrC,4CoDhLqC;IpDgLrC,oCoDhLqC;IpDgLrC,qEoDhLqC,EAC5C;EAnBH;IpD0HE,mCAA4B;IAGpB,2BAAoB,EoDzGoB;;AAElD;EACE,mBAAmB;EACnB,iBAAiB,EAClB;;AAGD;EACE,mBAAmB;EACnB,YAAY;EACZ,aAAa,EACd;;AAGD;EACE,mBAAmB;EACnB,uBnDuiBiD;EmDtiBjD,uBnD0iBiD;EmDziBjD,qCnDuiBiD;EmDtiBjD,mBnDuD6B;EDzCrB,yCoDb0B;EAClC,6BAA6B;EAE7B,WAAW,EACZ;;AAGD;EACE,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDoN6B;EmDnN7B,uBnD4hBgC,EmDxhBjC;EAXD;IjC5DE,WiCqE2B;IjClE3B,yBAAa,EiCkEmB;EATlC;IjC5DE,alBimB8B;IkB9lB9B,0BAAa,EiCmEuC;;AAKtD;EACE,cnDugBgC;EmDtgBhC,iCnDshBmC,EmDphBpC;EAJD;I7C/DI,aAAa;IACb,eAAe,EAChB;E6C6DH;I7C3DI,YAAY,EACb;;A6CgEH;EACE,iBAAiB,EAClB;;AAGD;EACE,UAAU;EACV,qBnD5BmC,EmD6BpC;;AAID;EACE,mBAAmB;EACnB,cnDifgC,EmDhfjC;;AAGD;EACE,cnD4egC;EmD3ehC,kBAAkB;EAClB,8BnD6fmC,EmD7epC;EAnBD;I7CvFI,aAAa;IACb,eAAe,EAChB;E6CqFH;I7CnFI,YAAY,EACb;E6CkFH;IAQI,iBAAiB;IACjB,iBAAiB,EAClB;EAVH;IAaI,kBAAkB,EACnB;EAdH;IAiBI,eAAe,EAChB;;AAIH;EACE,mBAAmB;EACnB,aAAa;EACb,YAAY;EACZ,aAAa;EACb,iBAAiB,EAClB;;AAGD;EAEE;IACE,anDme+B;ImDle/B,kBAAkB,EACnB;EACD;IpDtEQ,0CoDuE6B,EACpC;EAGD;IAAY,anD4dqB,EmD5dD,EAAA;;AAGlC;EACE;IAAY,anDsdqB,EmDtdD,EAAA;;AC9IlC;EACE,mBAAmB;EACnB,cpD+Q6B;EoD9Q7B,eAAe;ECRf,4DrD4CsE;EqD1CtE,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,qBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;EDHlB,gBpDwC4B;EkBlD5B,WkCYkB;ElCTlB,yBAAa,EkCgBd;EAhBD;IlCHE,alB+gB8B;IkB5gB9B,0BAAa,EkCWoC;EAXnD;IAYa,iBAAkB;IAAE,eAA+B,EAAI;EAZpE;IAaa,iBAAkB;IAAE,epDkgBA,EoDlgBmC;EAbpE;IAca,gBAAkB;IAAE,eAA+B,EAAI;EAdpE;IAea,kBAAkB;IAAE,epDggBA,EoDhgBmC;;AAIpE;EACE,iBpDmfiC;EoDlfjC,iBAAiB;EACjB,YpDmfgC;EoDlfhC,mBAAmB;EACnB,uBpDmfgC;EoDlfhC,mBpD8E6B,EoD7E9B;;AAGD;EACE,mBAAmB;EACnB,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAED;EAEI,UAAU;EACV,UAAU;EACV,kBpDse6B;EoDre7B,wBAAyD;EACzD,uBpDge8B,EoD/d/B;;AAPH;EASI,UAAU;EACV,WpDge6B;EoD/d7B,oBpD+d6B;EoD9d7B,wBAAyD;EACzD,uBpDyd8B,EoDxd/B;;AAdH;EAgBI,UAAU;EACV,UpDyd6B;EoDxd7B,oBpDwd6B;EoDvd7B,wBAAyD;EACzD,uBpDkd8B,EoDjd/B;;AArBH;EAuBI,SAAS;EACT,QAAQ;EACR,iBpDid6B;EoDhd7B,4BAA8E;EAC9E,yBpD2c8B,EoD1c/B;;AA5BH;EA8BI,SAAS;EACT,SAAS;EACT,iBpD0c6B;EoDzc7B,4BpDyc6B;EoDxc7B,wBpDoc8B,EoDnc/B;;AAnCH;EAqCI,OAAO;EACP,UAAU;EACV,kBpDmc6B;EoDlc7B,wBpDkc6B;EoDjc7B,0BpD6b8B,EoD5b/B;;AA1CH;EA4CI,OAAO;EACP,WpD6b6B;EoD5b7B,iBpD4b6B;EoD3b7B,wBpD2b6B;EoD1b7B,0BpDsb8B,EoDrb/B;;AAjDH;EAmDI,OAAO;EACP,UpDsb6B;EoDrb7B,iBpDqb6B;EoDpb7B,wBpDob6B;EoDnb7B,0BpD+a8B,EoD9a/B;;AE9FH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,ctD6Q6B;EsD5Q7B,cAAc;EACd,iBtDshByC;EsDrhBzC,aAAa;EDXb,4DrD4CsE;EqD1CtE,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,qBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;ECAlB,gBtDmC4B;EsDjC5B,uBtD6gBwC;EsD5gBxC,6BAA6B;EAC7B,uBtDihBwC;EsDhhBxC,qCtD8gBwC;EsD7gBxC,mBtDwF6B;EDzCrB,0CuD9C2B,EAOpC;EAzBD;IAqBc,kBtDihB4B,EsDjhBS;EArBnD;IAsBc,kBtDghB4B,EsDhhBS;EAtBnD;IAuBc,iBtD+gB4B,EsD/gBQ;EAvBlD;IAwBc,mBtD8gB4B,EsD9gBU;;AAGpD;EACE,UAAU;EACV,kBAAkB;EAClB,gBtDgB4B;EsDf5B,0BtDogB0C;EsDngB1C,iCAA+B;EAC/B,2BAAwE,EACzE;;AAED;EACE,kBAAkB,EACnB;;AAMD;EAGI,mBAAmB;EACnB,eAAe;EACf,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAEH;EACE,mBtDmfyD,EsDlf1D;;AACD;EACE,mBtD2ewC;EsD1exC,YAAY,EACb;;AAED;EAEI,UAAU;EACV,mBtDyeuD;EsDxevD,uBAAuB;EACvB,0BtD2ewC;EsD1exC,sCtDweyC;EsDvezC,ctDqeuD,EsD7dxD;EAfH;IASM,aAAa;IACb,YAAY;IACZ,mBtD4doC;IsD3dpC,uBAAuB;IACvB,uBtD8coC,EsD7crC;;AAdL;EAiBI,SAAS;EACT,YtD0duD;EsDzdvD,kBtDyduD;EsDxdvD,qBAAqB;EACrB,4BtD2dwC;EsD1dxC,wCtDwdyC,EsDhd1C;EA9BH;IAwBM,aAAa;IACb,UAAU;IACV,ctD6coC;IsD5cpC,qBAAqB;IACrB,yBtD+boC,EsD9brC;;AA7BL;EAgCI,UAAU;EACV,mBtD2cuD;EsD1cvD,oBAAoB;EACpB,6BtD6cwC;EsD5cxC,yCtD0cyC;EsDzczC,WtDucuD,EsD/bxD;EA7CH;IAuCM,aAAa;IACb,SAAS;IACT,mBtD8boC;IsD7bpC,oBAAoB;IACpB,0BtDgboC,EsD/arC;;AA5CL;EAgDI,SAAS;EACT,atD2buD;EsD1bvD,kBtD0buD;EsDzbvD,sBAAsB;EACtB,2BtD4bwC;EsD3bxC,uCtDybyC,EsDjb1C;EA7DH;IAuDM,aAAa;IACb,WAAW;IACX,sBAAsB;IACtB,wBtDiaoC;IsDhapC,ctD4aoC,EsD3arC;;AC1HL;EACE,mBAAmB,EACpB;;AAED;EACE,mBAAmB;EACnB,iBAAiB;EACjB,YAAY,EA0Eb;EA7ED;IAMI,cAAc;IACd,mBAAmB;IxDwKrB,0CwDvK0C;IxDyKlC,kCwDzKkC,EAgCzC;IAxCH;;MrDDE,eADmC;MAEnC,gBAAgB;MAChB,aAAa;MqDaT,eAAe,EAChB;IAGD;MAlBJ;QxDoME,uDwDjLkD;QxDoL1C,+CwDpL0C;QxDoL1C,uCwDpL0C;QxDoL1C,2EwDpL0C;QxD4BlD,oCwD3BuC;QxD6B/B,4BwD7B+B;QxDuIvC,4BwDtI+B;QxDwIvB,oBwDxIuB,EAmB9B;QAxCH;UxDqIE,2CAA8B;UACtB,mCAAsB;UwD5GxB,QAAQ,EACT;QA3BP;UxDqIE,4CAA8B;UACtB,oCAAsB;UwDvGxB,QAAQ,EACT;QAhCP;UxDqIE,wCAA8B;UACtB,gCAAsB;UwDjGxB,QAAQ,EACT,EAAA;EAtCP;;;IA6CI,eAAe,EAChB;EA9CH;IAiDI,QAAQ,EACT;EAlDH;;IAsDI,mBAAmB;IACnB,OAAO;IACP,YAAY,EACb;EAzDH;IA4DI,WAAW,EACZ;EA7DH;IA+DI,YAAY,EACb;EAhEH;;IAmEI,QAAQ,EACT;EApEH;IAuEI,YAAY,EACb;EAxEH;IA0EI,WAAW,EACZ;;AAOH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,UAAU;EACV,WvD4sB+C;EkB1yB/C,alB2yB8C;EkBxyB9C,0BAAa;EqC6Fb,gBvD4sBgD;EuD3sBhD,YvDwsBgD;EuDvsBhD,mBAAmB;EACnB,0CvDosB0D;EuDnsB1D,8BAAsB,EA+DvB;EA1ED;IdnFE,mGAAyC;IAEzC,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EciGvJ;EAlBH;IAoBI,WAAW;IACX,SAAS;IdxGX,mGAAyC;IAEzC,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EcsGvJ;EAvBH;IA4BI,WAAW;IACX,YvDmrB8C;IuDlrB9C,sBAAsB;IrCvHxB,aqCwHqB;IrCrHrB,0BAAa,EqCsHZ;EAhCH;;;;IAuCI,mBAAmB;IACnB,SAAS;IACT,kBAAkB;IAClB,WAAW;IACX,sBAAsB,EACvB;EA5CH;;IA+CI,UAAU;IACV,mBAAmB,EACpB;EAjDH;;IAoDI,WAAW;IACX,oBAAoB,EACrB;EAtDH;;IAyDI,YAAa;IACb,aAAa;IACb,eAAe;IACf,mBAAmB,EACpB;EA7DH;IAkEM,iBAAiB,EAClB;EAnEL;IAuEM,iBAAiB,EAClB;;AASL;EACE,mBAAmB;EACnB,aAAa;EACb,UAAU;EACV,YAAY;EACZ,WAAW;EACX,kBAAkB;EAClB,gBAAgB;EAChB,iBAAiB;EACjB,mBAAmB,EA8BpB;EAvCD;IAYI,sBAAsB;IACtB,YAAa;IACb,aAAa;IACb,YAAY;IACZ,oBAAoB;IACpB,uBvDonB8C;IuDnnB9C,oBAAoB;IACpB,gBAAgB;IAWhB,0BAA0B;IAC1B,8BAAsB,EACvB;EAhCH;IAkCI,UAAU;IACV,YAAa;IACb,aAAa;IACb,uBvD+lB8C,EuD9lB/C;;AAMH;EACE,mBAAmB;EACnB,UAAU;EACV,WAAW;EACX,aAAa;EACb,YAAY;EACZ,kBAAkB;EAClB,qBAAqB;EACrB,YvDmlBgD;EuDllBhD,mBAAmB;EACnB,0CvDukB0D,EuDnkB3D;EAdD;IAYI,kBAAkB,EACnB;;AAKH;EAGE;;;;IAKI,YAAmC;IACnC,aAAoC;IACpC,kBAAwC;IACxC,gBAAuC,EACxC;EATH;;IAYI,mBAAyC,EAC1C;EAbH;;IAgBI,oBAA0C,EAC3C;EAIH;IACE,UAAU;IACV,WAAW;IACX,qBAAqB,EACtB;EAGD;IACE,aAAa,EACd,EAAA;;ACpQH;ElDOI,aAAa;EACb,eAAe,EAChB;;AkDTH;ElDWI,YAAY,EACb;;AkDTH;ECRE,eAAe;EACf,kBAAkB;EAClB,mBAAmB,EDQpB;;AACD;EACE,wBAAwB,EACzB;;AACD;EACE,uBAAuB,EACxB;;AAOD;EACE,yBAAyB,EAC1B;;AACD;EACE,0BAA0B,EAC3B;;AACD;EACE,mBAAmB,EACpB;;AACD;EEzBE,YAAY;EACZ,mBAAmB;EACnB,kBAAkB;EAClB,8BAA8B;EAC9B,UAAU,EFuBX;;AAOD;EACE,yBAAyB,EAC1B;;AAMD;EACE,gBAAgB,EACjB;;AGjCC;EACE,oBAAoB,EAAA;;ACNtB;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;ADiBH;;;;;;;;;;;;EAYE,yBAAyB,EAC1B;;AAED;EC5CE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD2CrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC/DE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD8DrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EClFE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADiFrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;ECrGE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADoGrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC9GE;IACE,yBAAyB,EAC1B,EAAA;;ADgHH;EClHE;IACE,yBAAyB,EAC1B,EAAA;;ADoHH;ECtHE;IACE,yBAAyB,EAC1B,EAAA;;ADwHH;EC1HE;IACE,yBAAyB,EAC1B,EAAA;;AAFD;EACE,yBAAyB,EAC1B;;ADqIH;ECjJE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD+IvC;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,0BAA0B,EAE7B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,2BAA2B,EAE9B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,iCAAiC,EAEpC,EAAA;;AAED;EChKE;IACE,yBAAyB,EAC1B,EAAA;;AClBH;EACI,gBAAgB,EAAG;;AAEvB;EACI,kBAAkB,EAAG;;AAEzB;;EAGQ,yBAAyB;EACzB,sBAAsB,EAAG;;AAJjC;EAUQ,gBAAgB,EAAG;;AAE3B;EACI,oBAAoB;EACpB,mBAAmB;EACnB,YAAY,EAQS;EAXzB;;IAOQ,aAAa;IACb,QAAQ;IACR,mBAAmB;IACnB,OAAO;IACP,YAAY,EAAG;;AC7BvB;EACI,eAAe,EAAG;;AAEtB;EACI,qBAAc;EAAd,qBAAc;EAAd,cAAc,EAAG;;AAErB;EACI,WAAW,EAAG;;AAElB;EACI,oBAAQ;EAAR,YAAQ;EAAR,QAAQ,EAAG;;AAEf;EACI,oBAAgB;EAAhB,gBAAgB,EAAG;;AAEvB;EACI,iBAAiB,EAAG;;AAGpB;EACI,eAAS,EAAY;;AADzB;EACI,gBAAS,EAAY;;AADzB;EACI,sBAAS,EAAY;;ACnBzB;EACI,iBAAY,EAAY;;AAD5B;EACI,mBAAY,EAAY;;AAD5B;EACI,kBAAY,EAAY;;ACFhC;EACI,iBAAiB,EAAG;;ACDxB;EACI,eAAe;EACf,oBAAoB,EAMtB;EARF;IAKQ,iBAAiB,EAAG;;AAK5B;EACI,gBAAgB,EAAG;;ACXvB;EACI,2BAA2B;EAC3B,gBAAgB;EAChB,iBAAiB,EAAG;;ACHxB;E7DeI,aAAa;EACb,eAAe,EAChB;;A6DjBH;E7DmBI,YAAY,EACb;;A6DpBH;EAIQ,iBAAiB;EACjB,gBAAgB;EAChB,eAAe,EAAG;;AAN1B;EASQ,sBAAsB;EACtB,eAAe;EACf,oBAAoB,EAAG;;AAX/B;EAcQ,eAAe,EAAG;;AAd1B;EAiBQ,iBAAiB;EACjB,YAAY,EAAG;;ACLvB;EACI,cAAc;EACd,WAAW,EAAG;;AAElB;EACI,sBAAsB,EAAG;;AAE7B;EACI,aAAa;EACb,YAAY,EAAG","file":"main.css","sourcesContent":["/*!\n * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n font-family: 'FontAwesome';\n src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');\n src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');\n font-weight: normal;\n font-style: normal;\n}\n.fa {\n display: inline-block;\n font: normal normal normal 14px/1 FontAwesome;\n font-size: inherit;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n font-size: 1.33333333em;\n line-height: 0.75em;\n vertical-align: -15%;\n}\n.fa-2x {\n font-size: 2em;\n}\n.fa-3x {\n font-size: 3em;\n}\n.fa-4x {\n font-size: 4em;\n}\n.fa-5x {\n font-size: 5em;\n}\n.fa-fw {\n width: 1.28571429em;\n text-align: center;\n}\n.fa-ul {\n padding-left: 0;\n margin-left: 2.14285714em;\n list-style-type: none;\n}\n.fa-ul > li {\n position: relative;\n}\n.fa-li {\n position: absolute;\n left: -2.14285714em;\n width: 2.14285714em;\n top: 0.14285714em;\n text-align: center;\n}\n.fa-li.fa-lg {\n left: -1.85714286em;\n}\n.fa-border {\n padding: .2em .25em .15em;\n border: solid 0.08em #eeeeee;\n border-radius: .1em;\n}\n.fa-pull-left {\n float: left;\n}\n.fa-pull-right {\n float: right;\n}\n.fa.fa-pull-left {\n margin-right: .3em;\n}\n.fa.fa-pull-right {\n margin-left: .3em;\n}\n/* Deprecated as of 4.4.0 */\n.pull-right {\n float: right;\n}\n.pull-left {\n float: left;\n}\n.fa.pull-left {\n margin-right: .3em;\n}\n.fa.pull-right {\n margin-left: .3em;\n}\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n.fa-rotate-90 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n -webkit-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n.fa-rotate-180 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n.fa-rotate-270 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n -webkit-transform: rotate(270deg);\n -ms-transform: rotate(270deg);\n transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n -webkit-transform: scale(-1, 1);\n -ms-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n -webkit-transform: scale(1, -1);\n -ms-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n filter: none;\n}\n.fa-stack {\n position: relative;\n display: inline-block;\n width: 2em;\n height: 2em;\n line-height: 2em;\n vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n position: absolute;\n left: 0;\n width: 100%;\n text-align: center;\n}\n.fa-stack-1x {\n line-height: inherit;\n}\n.fa-stack-2x {\n font-size: 2em;\n}\n.fa-inverse {\n color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n.fa-glass:before {\n content: \"\\f000\";\n}\n.fa-music:before {\n content: \"\\f001\";\n}\n.fa-search:before {\n content: \"\\f002\";\n}\n.fa-envelope-o:before {\n content: \"\\f003\";\n}\n.fa-heart:before {\n content: \"\\f004\";\n}\n.fa-star:before {\n content: \"\\f005\";\n}\n.fa-star-o:before {\n content: \"\\f006\";\n}\n.fa-user:before {\n content: \"\\f007\";\n}\n.fa-film:before {\n content: \"\\f008\";\n}\n.fa-th-large:before {\n content: \"\\f009\";\n}\n.fa-th:before {\n content: \"\\f00a\";\n}\n.fa-th-list:before {\n content: \"\\f00b\";\n}\n.fa-check:before {\n content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n content: \"\\f00d\";\n}\n.fa-search-plus:before {\n content: \"\\f00e\";\n}\n.fa-search-minus:before {\n content: \"\\f010\";\n}\n.fa-power-off:before {\n content: \"\\f011\";\n}\n.fa-signal:before {\n content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n content: \"\\f013\";\n}\n.fa-trash-o:before {\n content: \"\\f014\";\n}\n.fa-home:before {\n content: \"\\f015\";\n}\n.fa-file-o:before {\n content: \"\\f016\";\n}\n.fa-clock-o:before {\n content: \"\\f017\";\n}\n.fa-road:before {\n content: \"\\f018\";\n}\n.fa-download:before {\n content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n content: \"\\f01b\";\n}\n.fa-inbox:before {\n content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n content: \"\\f01e\";\n}\n.fa-refresh:before {\n content: \"\\f021\";\n}\n.fa-list-alt:before {\n content: \"\\f022\";\n}\n.fa-lock:before {\n content: \"\\f023\";\n}\n.fa-flag:before {\n content: \"\\f024\";\n}\n.fa-headphones:before {\n content: \"\\f025\";\n}\n.fa-volume-off:before {\n content: \"\\f026\";\n}\n.fa-volume-down:before {\n content: \"\\f027\";\n}\n.fa-volume-up:before {\n content: \"\\f028\";\n}\n.fa-qrcode:before {\n content: \"\\f029\";\n}\n.fa-barcode:before {\n content: \"\\f02a\";\n}\n.fa-tag:before {\n content: \"\\f02b\";\n}\n.fa-tags:before {\n content: \"\\f02c\";\n}\n.fa-book:before {\n content: \"\\f02d\";\n}\n.fa-bookmark:before {\n content: \"\\f02e\";\n}\n.fa-print:before {\n content: \"\\f02f\";\n}\n.fa-camera:before {\n content: \"\\f030\";\n}\n.fa-font:before {\n content: \"\\f031\";\n}\n.fa-bold:before {\n content: \"\\f032\";\n}\n.fa-italic:before {\n content: \"\\f033\";\n}\n.fa-text-height:before {\n content: \"\\f034\";\n}\n.fa-text-width:before {\n content: \"\\f035\";\n}\n.fa-align-left:before {\n content: \"\\f036\";\n}\n.fa-align-center:before {\n content: \"\\f037\";\n}\n.fa-align-right:before {\n content: \"\\f038\";\n}\n.fa-align-justify:before {\n content: \"\\f039\";\n}\n.fa-list:before {\n content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n content: \"\\f03b\";\n}\n.fa-indent:before {\n content: \"\\f03c\";\n}\n.fa-video-camera:before {\n content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n content: \"\\f03e\";\n}\n.fa-pencil:before {\n content: \"\\f040\";\n}\n.fa-map-marker:before {\n content: \"\\f041\";\n}\n.fa-adjust:before {\n content: \"\\f042\";\n}\n.fa-tint:before {\n content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n content: \"\\f044\";\n}\n.fa-share-square-o:before {\n content: \"\\f045\";\n}\n.fa-check-square-o:before {\n content: \"\\f046\";\n}\n.fa-arrows:before {\n content: \"\\f047\";\n}\n.fa-step-backward:before {\n content: \"\\f048\";\n}\n.fa-fast-backward:before {\n content: \"\\f049\";\n}\n.fa-backward:before {\n content: \"\\f04a\";\n}\n.fa-play:before {\n content: \"\\f04b\";\n}\n.fa-pause:before {\n content: \"\\f04c\";\n}\n.fa-stop:before {\n content: \"\\f04d\";\n}\n.fa-forward:before {\n content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n content: \"\\f050\";\n}\n.fa-step-forward:before {\n content: \"\\f051\";\n}\n.fa-eject:before {\n content: \"\\f052\";\n}\n.fa-chevron-left:before {\n content: \"\\f053\";\n}\n.fa-chevron-right:before {\n content: \"\\f054\";\n}\n.fa-plus-circle:before {\n content: \"\\f055\";\n}\n.fa-minus-circle:before {\n content: \"\\f056\";\n}\n.fa-times-circle:before {\n content: \"\\f057\";\n}\n.fa-check-circle:before {\n content: \"\\f058\";\n}\n.fa-question-circle:before {\n content: \"\\f059\";\n}\n.fa-info-circle:before {\n content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n content: \"\\f05d\";\n}\n.fa-ban:before {\n content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n content: \"\\f060\";\n}\n.fa-arrow-right:before {\n content: \"\\f061\";\n}\n.fa-arrow-up:before {\n content: \"\\f062\";\n}\n.fa-arrow-down:before {\n content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n content: \"\\f064\";\n}\n.fa-expand:before {\n content: \"\\f065\";\n}\n.fa-compress:before {\n content: \"\\f066\";\n}\n.fa-plus:before {\n content: \"\\f067\";\n}\n.fa-minus:before {\n content: \"\\f068\";\n}\n.fa-asterisk:before {\n content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n content: \"\\f06a\";\n}\n.fa-gift:before {\n content: \"\\f06b\";\n}\n.fa-leaf:before {\n content: \"\\f06c\";\n}\n.fa-fire:before {\n content: \"\\f06d\";\n}\n.fa-eye:before {\n content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n content: \"\\f071\";\n}\n.fa-plane:before {\n content: \"\\f072\";\n}\n.fa-calendar:before {\n content: \"\\f073\";\n}\n.fa-random:before {\n content: \"\\f074\";\n}\n.fa-comment:before {\n content: \"\\f075\";\n}\n.fa-magnet:before {\n content: \"\\f076\";\n}\n.fa-chevron-up:before {\n content: \"\\f077\";\n}\n.fa-chevron-down:before {\n content: \"\\f078\";\n}\n.fa-retweet:before {\n content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n content: \"\\f07a\";\n}\n.fa-folder:before {\n content: \"\\f07b\";\n}\n.fa-folder-open:before {\n content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n content: \"\\f080\";\n}\n.fa-twitter-square:before {\n content: \"\\f081\";\n}\n.fa-facebook-square:before {\n content: \"\\f082\";\n}\n.fa-camera-retro:before {\n content: \"\\f083\";\n}\n.fa-key:before {\n content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n content: \"\\f085\";\n}\n.fa-comments:before {\n content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n content: \"\\f088\";\n}\n.fa-star-half:before {\n content: \"\\f089\";\n}\n.fa-heart-o:before {\n content: \"\\f08a\";\n}\n.fa-sign-out:before {\n content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n content: \"\\f08d\";\n}\n.fa-external-link:before {\n content: \"\\f08e\";\n}\n.fa-sign-in:before {\n content: \"\\f090\";\n}\n.fa-trophy:before {\n content: \"\\f091\";\n}\n.fa-github-square:before {\n content: \"\\f092\";\n}\n.fa-upload:before {\n content: \"\\f093\";\n}\n.fa-lemon-o:before {\n content: \"\\f094\";\n}\n.fa-phone:before {\n content: \"\\f095\";\n}\n.fa-square-o:before {\n content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n content: \"\\f097\";\n}\n.fa-phone-square:before {\n content: \"\\f098\";\n}\n.fa-twitter:before {\n content: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n content: \"\\f09a\";\n}\n.fa-github:before {\n content: \"\\f09b\";\n}\n.fa-unlock:before {\n content: \"\\f09c\";\n}\n.fa-credit-card:before {\n content: \"\\f09d\";\n}\n.fa-feed:before,\n.fa-rss:before {\n content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n content: \"\\f0a1\";\n}\n.fa-bell:before {\n content: \"\\f0f3\";\n}\n.fa-certificate:before {\n content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n content: \"\\f0ab\";\n}\n.fa-globe:before {\n content: \"\\f0ac\";\n}\n.fa-wrench:before {\n content: \"\\f0ad\";\n}\n.fa-tasks:before {\n content: \"\\f0ae\";\n}\n.fa-filter:before {\n content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n content: \"\\f0c1\";\n}\n.fa-cloud:before {\n content: \"\\f0c2\";\n}\n.fa-flask:before {\n content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n content: \"\\f0c7\";\n}\n.fa-square:before {\n content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n content: \"\\f0cc\";\n}\n.fa-underline:before {\n content: \"\\f0cd\";\n}\n.fa-table:before {\n content: \"\\f0ce\";\n}\n.fa-magic:before {\n content: \"\\f0d0\";\n}\n.fa-truck:before {\n content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n content: \"\\f0d5\";\n}\n.fa-money:before {\n content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n content: \"\\f0da\";\n}\n.fa-columns:before {\n content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n content: \"\\f0de\";\n}\n.fa-envelope:before {\n content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n content: \"\\f0eb\";\n}\n.fa-exchange:before {\n content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n content: \"\\f0ee\";\n}\n.fa-user-md:before {\n content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n content: \"\\f0a2\";\n}\n.fa-coffee:before {\n content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n content: \"\\f0f6\";\n}\n.fa-building-o:before {\n content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n content: \"\\f0f9\";\n}\n.fa-medkit:before {\n content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n content: \"\\f0fb\";\n}\n.fa-beer:before {\n content: \"\\f0fc\";\n}\n.fa-h-square:before {\n content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n content: \"\\f103\";\n}\n.fa-angle-left:before {\n content: \"\\f104\";\n}\n.fa-angle-right:before {\n content: \"\\f105\";\n}\n.fa-angle-up:before {\n content: \"\\f106\";\n}\n.fa-angle-down:before {\n content: \"\\f107\";\n}\n.fa-desktop:before {\n content: \"\\f108\";\n}\n.fa-laptop:before {\n content: \"\\f109\";\n}\n.fa-tablet:before {\n content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n content: \"\\f10b\";\n}\n.fa-circle-o:before {\n content: \"\\f10c\";\n}\n.fa-quote-left:before {\n content: \"\\f10d\";\n}\n.fa-quote-right:before {\n content: \"\\f10e\";\n}\n.fa-spinner:before {\n content: \"\\f110\";\n}\n.fa-circle:before {\n content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n content: \"\\f112\";\n}\n.fa-github-alt:before {\n content: \"\\f113\";\n}\n.fa-folder-o:before {\n content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n content: \"\\f115\";\n}\n.fa-smile-o:before {\n content: \"\\f118\";\n}\n.fa-frown-o:before {\n content: \"\\f119\";\n}\n.fa-meh-o:before {\n content: \"\\f11a\";\n}\n.fa-gamepad:before {\n content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n content: \"\\f11c\";\n}\n.fa-flag-o:before {\n content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n content: \"\\f11e\";\n}\n.fa-terminal:before {\n content: \"\\f120\";\n}\n.fa-code:before {\n content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n content: \"\\f123\";\n}\n.fa-location-arrow:before {\n content: \"\\f124\";\n}\n.fa-crop:before {\n content: \"\\f125\";\n}\n.fa-code-fork:before {\n content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n content: \"\\f127\";\n}\n.fa-question:before {\n content: \"\\f128\";\n}\n.fa-info:before {\n content: \"\\f129\";\n}\n.fa-exclamation:before {\n content: \"\\f12a\";\n}\n.fa-superscript:before {\n content: \"\\f12b\";\n}\n.fa-subscript:before {\n content: \"\\f12c\";\n}\n.fa-eraser:before {\n content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n content: \"\\f12e\";\n}\n.fa-microphone:before {\n content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n content: \"\\f131\";\n}\n.fa-shield:before {\n content: \"\\f132\";\n}\n.fa-calendar-o:before {\n content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n content: \"\\f134\";\n}\n.fa-rocket:before {\n content: \"\\f135\";\n}\n.fa-maxcdn:before {\n content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n content: \"\\f13a\";\n}\n.fa-html5:before {\n content: \"\\f13b\";\n}\n.fa-css3:before {\n content: \"\\f13c\";\n}\n.fa-anchor:before {\n content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n content: \"\\f13e\";\n}\n.fa-bullseye:before {\n content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n content: \"\\f142\";\n}\n.fa-rss-square:before {\n content: \"\\f143\";\n}\n.fa-play-circle:before {\n content: \"\\f144\";\n}\n.fa-ticket:before {\n content: \"\\f145\";\n}\n.fa-minus-square:before {\n content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n content: \"\\f147\";\n}\n.fa-level-up:before {\n content: \"\\f148\";\n}\n.fa-level-down:before {\n content: \"\\f149\";\n}\n.fa-check-square:before {\n content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n content: \"\\f14c\";\n}\n.fa-share-square:before {\n content: \"\\f14d\";\n}\n.fa-compass:before {\n content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n content: \"\\f153\";\n}\n.fa-gbp:before {\n content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n content: \"\\f15a\";\n}\n.fa-file:before {\n content: \"\\f15b\";\n}\n.fa-file-text:before {\n content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n content: \"\\f165\";\n}\n.fa-youtube-square:before {\n content: \"\\f166\";\n}\n.fa-youtube:before {\n content: \"\\f167\";\n}\n.fa-xing:before {\n content: \"\\f168\";\n}\n.fa-xing-square:before {\n content: \"\\f169\";\n}\n.fa-youtube-play:before {\n content: \"\\f16a\";\n}\n.fa-dropbox:before {\n content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n content: \"\\f16c\";\n}\n.fa-instagram:before {\n content: \"\\f16d\";\n}\n.fa-flickr:before {\n content: \"\\f16e\";\n}\n.fa-adn:before {\n content: \"\\f170\";\n}\n.fa-bitbucket:before {\n content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n content: \"\\f172\";\n}\n.fa-tumblr:before {\n content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n content: \"\\f178\";\n}\n.fa-apple:before {\n content: \"\\f179\";\n}\n.fa-windows:before {\n content: \"\\f17a\";\n}\n.fa-android:before {\n content: \"\\f17b\";\n}\n.fa-linux:before {\n content: \"\\f17c\";\n}\n.fa-dribbble:before {\n content: \"\\f17d\";\n}\n.fa-skype:before {\n content: \"\\f17e\";\n}\n.fa-foursquare:before {\n content: \"\\f180\";\n}\n.fa-trello:before {\n content: \"\\f181\";\n}\n.fa-female:before {\n content: \"\\f182\";\n}\n.fa-male:before {\n content: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n content: \"\\f184\";\n}\n.fa-sun-o:before {\n content: \"\\f185\";\n}\n.fa-moon-o:before {\n content: \"\\f186\";\n}\n.fa-archive:before {\n content: \"\\f187\";\n}\n.fa-bug:before {\n content: \"\\f188\";\n}\n.fa-vk:before {\n content: \"\\f189\";\n}\n.fa-weibo:before {\n content: \"\\f18a\";\n}\n.fa-renren:before {\n content: \"\\f18b\";\n}\n.fa-pagelines:before {\n content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n content: \"\\f192\";\n}\n.fa-wheelchair:before {\n content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n content: \"\\f197\";\n}\n.fa-slack:before {\n content: \"\\f198\";\n}\n.fa-envelope-square:before {\n content: \"\\f199\";\n}\n.fa-wordpress:before {\n content: \"\\f19a\";\n}\n.fa-openid:before {\n content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n content: \"\\f19d\";\n}\n.fa-yahoo:before {\n content: \"\\f19e\";\n}\n.fa-google:before {\n content: \"\\f1a0\";\n}\n.fa-reddit:before {\n content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n content: \"\\f1a4\";\n}\n.fa-delicious:before {\n content: \"\\f1a5\";\n}\n.fa-digg:before {\n content: \"\\f1a6\";\n}\n.fa-pied-piper-pp:before {\n content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n content: \"\\f1a8\";\n}\n.fa-drupal:before {\n content: \"\\f1a9\";\n}\n.fa-joomla:before {\n content: \"\\f1aa\";\n}\n.fa-language:before {\n content: \"\\f1ab\";\n}\n.fa-fax:before {\n content: \"\\f1ac\";\n}\n.fa-building:before {\n content: \"\\f1ad\";\n}\n.fa-child:before {\n content: \"\\f1ae\";\n}\n.fa-paw:before {\n content: \"\\f1b0\";\n}\n.fa-spoon:before {\n content: \"\\f1b1\";\n}\n.fa-cube:before {\n content: \"\\f1b2\";\n}\n.fa-cubes:before {\n content: \"\\f1b3\";\n}\n.fa-behance:before {\n content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n content: \"\\f1b5\";\n}\n.fa-steam:before {\n content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n content: \"\\f1b7\";\n}\n.fa-recycle:before {\n content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n content: \"\\f1ba\";\n}\n.fa-tree:before {\n content: \"\\f1bb\";\n}\n.fa-spotify:before {\n content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n content: \"\\f1be\";\n}\n.fa-database:before {\n content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n content: \"\\f1c9\";\n}\n.fa-vine:before {\n content: \"\\f1ca\";\n}\n.fa-codepen:before {\n content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-resistance:before,\n.fa-rebel:before {\n content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n content: \"\\f1d1\";\n}\n.fa-git-square:before {\n content: \"\\f1d2\";\n}\n.fa-git:before {\n content: \"\\f1d3\";\n}\n.fa-y-combinator-square:before,\n.fa-yc-square:before,\n.fa-hacker-news:before {\n content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n content: \"\\f1d5\";\n}\n.fa-qq:before {\n content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n content: \"\\f1d9\";\n}\n.fa-history:before {\n content: \"\\f1da\";\n}\n.fa-circle-thin:before {\n content: \"\\f1db\";\n}\n.fa-header:before {\n content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n content: \"\\f1dd\";\n}\n.fa-sliders:before {\n content: \"\\f1de\";\n}\n.fa-share-alt:before {\n content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n content: \"\\f1e1\";\n}\n.fa-bomb:before {\n content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n content: \"\\f1e3\";\n}\n.fa-tty:before {\n content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n content: \"\\f1e5\";\n}\n.fa-plug:before {\n content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n content: \"\\f1e7\";\n}\n.fa-twitch:before {\n content: \"\\f1e8\";\n}\n.fa-yelp:before {\n content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n content: \"\\f1ea\";\n}\n.fa-wifi:before {\n content: \"\\f1eb\";\n}\n.fa-calculator:before {\n content: \"\\f1ec\";\n}\n.fa-paypal:before {\n content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n content: \"\\f1f7\";\n}\n.fa-trash:before {\n content: \"\\f1f8\";\n}\n.fa-copyright:before {\n content: \"\\f1f9\";\n}\n.fa-at:before {\n content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n content: \"\\f200\";\n}\n.fa-line-chart:before {\n content: \"\\f201\";\n}\n.fa-lastfm:before {\n content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n content: \"\\f203\";\n}\n.fa-toggle-off:before {\n content: \"\\f204\";\n}\n.fa-toggle-on:before {\n content: \"\\f205\";\n}\n.fa-bicycle:before {\n content: \"\\f206\";\n}\n.fa-bus:before {\n content: \"\\f207\";\n}\n.fa-ioxhost:before {\n content: \"\\f208\";\n}\n.fa-angellist:before {\n content: \"\\f209\";\n}\n.fa-cc:before {\n content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n content: \"\\f20b\";\n}\n.fa-meanpath:before {\n content: \"\\f20c\";\n}\n.fa-buysellads:before {\n content: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n content: \"\\f20e\";\n}\n.fa-dashcube:before {\n content: \"\\f210\";\n}\n.fa-forumbee:before {\n content: \"\\f211\";\n}\n.fa-leanpub:before {\n content: \"\\f212\";\n}\n.fa-sellsy:before {\n content: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n content: \"\\f214\";\n}\n.fa-simplybuilt:before {\n content: \"\\f215\";\n}\n.fa-skyatlas:before {\n content: \"\\f216\";\n}\n.fa-cart-plus:before {\n content: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n content: \"\\f218\";\n}\n.fa-diamond:before {\n content: \"\\f219\";\n}\n.fa-ship:before {\n content: \"\\f21a\";\n}\n.fa-user-secret:before {\n content: \"\\f21b\";\n}\n.fa-motorcycle:before {\n content: \"\\f21c\";\n}\n.fa-street-view:before {\n content: \"\\f21d\";\n}\n.fa-heartbeat:before {\n content: \"\\f21e\";\n}\n.fa-venus:before {\n content: \"\\f221\";\n}\n.fa-mars:before {\n content: \"\\f222\";\n}\n.fa-mercury:before {\n content: \"\\f223\";\n}\n.fa-intersex:before,\n.fa-transgender:before {\n content: \"\\f224\";\n}\n.fa-transgender-alt:before {\n content: \"\\f225\";\n}\n.fa-venus-double:before {\n content: \"\\f226\";\n}\n.fa-mars-double:before {\n content: \"\\f227\";\n}\n.fa-venus-mars:before {\n content: \"\\f228\";\n}\n.fa-mars-stroke:before {\n content: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n content: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n content: \"\\f22b\";\n}\n.fa-neuter:before {\n content: \"\\f22c\";\n}\n.fa-genderless:before {\n content: \"\\f22d\";\n}\n.fa-facebook-official:before {\n content: \"\\f230\";\n}\n.fa-pinterest-p:before {\n content: \"\\f231\";\n}\n.fa-whatsapp:before {\n content: \"\\f232\";\n}\n.fa-server:before {\n content: \"\\f233\";\n}\n.fa-user-plus:before {\n content: \"\\f234\";\n}\n.fa-user-times:before {\n content: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n content: \"\\f236\";\n}\n.fa-viacoin:before {\n content: \"\\f237\";\n}\n.fa-train:before {\n content: \"\\f238\";\n}\n.fa-subway:before {\n content: \"\\f239\";\n}\n.fa-medium:before {\n content: \"\\f23a\";\n}\n.fa-yc:before,\n.fa-y-combinator:before {\n content: \"\\f23b\";\n}\n.fa-optin-monster:before {\n content: \"\\f23c\";\n}\n.fa-opencart:before {\n content: \"\\f23d\";\n}\n.fa-expeditedssl:before {\n content: \"\\f23e\";\n}\n.fa-battery-4:before,\n.fa-battery:before,\n.fa-battery-full:before {\n content: \"\\f240\";\n}\n.fa-battery-3:before,\n.fa-battery-three-quarters:before {\n content: \"\\f241\";\n}\n.fa-battery-2:before,\n.fa-battery-half:before {\n content: \"\\f242\";\n}\n.fa-battery-1:before,\n.fa-battery-quarter:before {\n content: \"\\f243\";\n}\n.fa-battery-0:before,\n.fa-battery-empty:before {\n content: \"\\f244\";\n}\n.fa-mouse-pointer:before {\n content: \"\\f245\";\n}\n.fa-i-cursor:before {\n content: \"\\f246\";\n}\n.fa-object-group:before {\n content: \"\\f247\";\n}\n.fa-object-ungroup:before {\n content: \"\\f248\";\n}\n.fa-sticky-note:before {\n content: \"\\f249\";\n}\n.fa-sticky-note-o:before {\n content: \"\\f24a\";\n}\n.fa-cc-jcb:before {\n content: \"\\f24b\";\n}\n.fa-cc-diners-club:before {\n content: \"\\f24c\";\n}\n.fa-clone:before {\n content: \"\\f24d\";\n}\n.fa-balance-scale:before {\n content: \"\\f24e\";\n}\n.fa-hourglass-o:before {\n content: \"\\f250\";\n}\n.fa-hourglass-1:before,\n.fa-hourglass-start:before {\n content: \"\\f251\";\n}\n.fa-hourglass-2:before,\n.fa-hourglass-half:before {\n content: \"\\f252\";\n}\n.fa-hourglass-3:before,\n.fa-hourglass-end:before {\n content: \"\\f253\";\n}\n.fa-hourglass:before {\n content: \"\\f254\";\n}\n.fa-hand-grab-o:before,\n.fa-hand-rock-o:before {\n content: \"\\f255\";\n}\n.fa-hand-stop-o:before,\n.fa-hand-paper-o:before {\n content: \"\\f256\";\n}\n.fa-hand-scissors-o:before {\n content: \"\\f257\";\n}\n.fa-hand-lizard-o:before {\n content: \"\\f258\";\n}\n.fa-hand-spock-o:before {\n content: \"\\f259\";\n}\n.fa-hand-pointer-o:before {\n content: \"\\f25a\";\n}\n.fa-hand-peace-o:before {\n content: \"\\f25b\";\n}\n.fa-trademark:before {\n content: \"\\f25c\";\n}\n.fa-registered:before {\n content: \"\\f25d\";\n}\n.fa-creative-commons:before {\n content: \"\\f25e\";\n}\n.fa-gg:before {\n content: \"\\f260\";\n}\n.fa-gg-circle:before {\n content: \"\\f261\";\n}\n.fa-tripadvisor:before {\n content: \"\\f262\";\n}\n.fa-odnoklassniki:before {\n content: \"\\f263\";\n}\n.fa-odnoklassniki-square:before {\n content: \"\\f264\";\n}\n.fa-get-pocket:before {\n content: \"\\f265\";\n}\n.fa-wikipedia-w:before {\n content: \"\\f266\";\n}\n.fa-safari:before {\n content: \"\\f267\";\n}\n.fa-chrome:before {\n content: \"\\f268\";\n}\n.fa-firefox:before {\n content: \"\\f269\";\n}\n.fa-opera:before {\n content: \"\\f26a\";\n}\n.fa-internet-explorer:before {\n content: \"\\f26b\";\n}\n.fa-tv:before,\n.fa-television:before {\n content: \"\\f26c\";\n}\n.fa-contao:before {\n content: \"\\f26d\";\n}\n.fa-500px:before {\n content: \"\\f26e\";\n}\n.fa-amazon:before {\n content: \"\\f270\";\n}\n.fa-calendar-plus-o:before {\n content: \"\\f271\";\n}\n.fa-calendar-minus-o:before {\n content: \"\\f272\";\n}\n.fa-calendar-times-o:before {\n content: \"\\f273\";\n}\n.fa-calendar-check-o:before {\n content: \"\\f274\";\n}\n.fa-industry:before {\n content: \"\\f275\";\n}\n.fa-map-pin:before {\n content: \"\\f276\";\n}\n.fa-map-signs:before {\n content: \"\\f277\";\n}\n.fa-map-o:before {\n content: \"\\f278\";\n}\n.fa-map:before {\n content: \"\\f279\";\n}\n.fa-commenting:before {\n content: \"\\f27a\";\n}\n.fa-commenting-o:before {\n content: \"\\f27b\";\n}\n.fa-houzz:before {\n content: \"\\f27c\";\n}\n.fa-vimeo:before {\n content: \"\\f27d\";\n}\n.fa-black-tie:before {\n content: \"\\f27e\";\n}\n.fa-fonticons:before {\n content: \"\\f280\";\n}\n.fa-reddit-alien:before {\n content: \"\\f281\";\n}\n.fa-edge:before {\n content: \"\\f282\";\n}\n.fa-credit-card-alt:before {\n content: \"\\f283\";\n}\n.fa-codiepie:before {\n content: \"\\f284\";\n}\n.fa-modx:before {\n content: \"\\f285\";\n}\n.fa-fort-awesome:before {\n content: \"\\f286\";\n}\n.fa-usb:before {\n content: \"\\f287\";\n}\n.fa-product-hunt:before {\n content: \"\\f288\";\n}\n.fa-mixcloud:before {\n content: \"\\f289\";\n}\n.fa-scribd:before {\n content: \"\\f28a\";\n}\n.fa-pause-circle:before {\n content: \"\\f28b\";\n}\n.fa-pause-circle-o:before {\n content: \"\\f28c\";\n}\n.fa-stop-circle:before {\n content: \"\\f28d\";\n}\n.fa-stop-circle-o:before {\n content: \"\\f28e\";\n}\n.fa-shopping-bag:before {\n content: \"\\f290\";\n}\n.fa-shopping-basket:before {\n content: \"\\f291\";\n}\n.fa-hashtag:before {\n content: \"\\f292\";\n}\n.fa-bluetooth:before {\n content: \"\\f293\";\n}\n.fa-bluetooth-b:before {\n content: \"\\f294\";\n}\n.fa-percent:before {\n content: \"\\f295\";\n}\n.fa-gitlab:before {\n content: \"\\f296\";\n}\n.fa-wpbeginner:before {\n content: \"\\f297\";\n}\n.fa-wpforms:before {\n content: \"\\f298\";\n}\n.fa-envira:before {\n content: \"\\f299\";\n}\n.fa-universal-access:before {\n content: \"\\f29a\";\n}\n.fa-wheelchair-alt:before {\n content: \"\\f29b\";\n}\n.fa-question-circle-o:before {\n content: \"\\f29c\";\n}\n.fa-blind:before {\n content: \"\\f29d\";\n}\n.fa-audio-description:before {\n content: \"\\f29e\";\n}\n.fa-volume-control-phone:before {\n content: \"\\f2a0\";\n}\n.fa-braille:before {\n content: \"\\f2a1\";\n}\n.fa-assistive-listening-systems:before {\n content: \"\\f2a2\";\n}\n.fa-asl-interpreting:before,\n.fa-american-sign-language-interpreting:before {\n content: \"\\f2a3\";\n}\n.fa-deafness:before,\n.fa-hard-of-hearing:before,\n.fa-deaf:before {\n content: \"\\f2a4\";\n}\n.fa-glide:before {\n content: \"\\f2a5\";\n}\n.fa-glide-g:before {\n content: \"\\f2a6\";\n}\n.fa-signing:before,\n.fa-sign-language:before {\n content: \"\\f2a7\";\n}\n.fa-low-vision:before {\n content: \"\\f2a8\";\n}\n.fa-viadeo:before {\n content: \"\\f2a9\";\n}\n.fa-viadeo-square:before {\n content: \"\\f2aa\";\n}\n.fa-snapchat:before {\n content: \"\\f2ab\";\n}\n.fa-snapchat-ghost:before {\n content: \"\\f2ac\";\n}\n.fa-snapchat-square:before {\n content: \"\\f2ad\";\n}\n.fa-pied-piper:before {\n content: \"\\f2ae\";\n}\n.fa-first-order:before {\n content: \"\\f2b0\";\n}\n.fa-yoast:before {\n content: \"\\f2b1\";\n}\n.fa-themeisle:before {\n content: \"\\f2b2\";\n}\n.fa-google-plus-circle:before,\n.fa-google-plus-official:before {\n content: \"\\f2b3\";\n}\n.fa-fa:before,\n.fa-font-awesome:before {\n content: \"\\f2b4\";\n}\n.fa-handshake-o:before {\n content: \"\\f2b5\";\n}\n.fa-envelope-open:before {\n content: \"\\f2b6\";\n}\n.fa-envelope-open-o:before {\n content: \"\\f2b7\";\n}\n.fa-linode:before {\n content: \"\\f2b8\";\n}\n.fa-address-book:before {\n content: \"\\f2b9\";\n}\n.fa-address-book-o:before {\n content: \"\\f2ba\";\n}\n.fa-vcard:before,\n.fa-address-card:before {\n content: \"\\f2bb\";\n}\n.fa-vcard-o:before,\n.fa-address-card-o:before {\n content: \"\\f2bc\";\n}\n.fa-user-circle:before {\n content: \"\\f2bd\";\n}\n.fa-user-circle-o:before {\n content: \"\\f2be\";\n}\n.fa-user-o:before {\n content: \"\\f2c0\";\n}\n.fa-id-badge:before {\n content: \"\\f2c1\";\n}\n.fa-drivers-license:before,\n.fa-id-card:before {\n content: \"\\f2c2\";\n}\n.fa-drivers-license-o:before,\n.fa-id-card-o:before {\n content: \"\\f2c3\";\n}\n.fa-quora:before {\n content: \"\\f2c4\";\n}\n.fa-free-code-camp:before {\n content: \"\\f2c5\";\n}\n.fa-telegram:before {\n content: \"\\f2c6\";\n}\n.fa-thermometer-4:before,\n.fa-thermometer:before,\n.fa-thermometer-full:before {\n content: \"\\f2c7\";\n}\n.fa-thermometer-3:before,\n.fa-thermometer-three-quarters:before {\n content: \"\\f2c8\";\n}\n.fa-thermometer-2:before,\n.fa-thermometer-half:before {\n content: \"\\f2c9\";\n}\n.fa-thermometer-1:before,\n.fa-thermometer-quarter:before {\n content: \"\\f2ca\";\n}\n.fa-thermometer-0:before,\n.fa-thermometer-empty:before {\n content: \"\\f2cb\";\n}\n.fa-shower:before {\n content: \"\\f2cc\";\n}\n.fa-bathtub:before,\n.fa-s15:before,\n.fa-bath:before {\n content: \"\\f2cd\";\n}\n.fa-podcast:before {\n content: \"\\f2ce\";\n}\n.fa-window-maximize:before {\n content: \"\\f2d0\";\n}\n.fa-window-minimize:before {\n content: \"\\f2d1\";\n}\n.fa-window-restore:before {\n content: \"\\f2d2\";\n}\n.fa-times-rectangle:before,\n.fa-window-close:before {\n content: \"\\f2d3\";\n}\n.fa-times-rectangle-o:before,\n.fa-window-close-o:before {\n content: \"\\f2d4\";\n}\n.fa-bandcamp:before {\n content: \"\\f2d5\";\n}\n.fa-grav:before {\n content: \"\\f2d6\";\n}\n.fa-etsy:before {\n content: \"\\f2d7\";\n}\n.fa-imdb:before {\n content: \"\\f2d8\";\n}\n.fa-ravelry:before {\n content: \"\\f2d9\";\n}\n.fa-eercast:before {\n content: \"\\f2da\";\n}\n.fa-microchip:before {\n content: \"\\f2db\";\n}\n.fa-snowflake-o:before {\n content: \"\\f2dc\";\n}\n.fa-superpowers:before {\n content: \"\\f2dd\";\n}\n.fa-wpexplorer:before {\n content: \"\\f2de\";\n}\n.fa-meetup:before {\n content: \"\\f2e0\";\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n","@charset \"UTF-8\";\n/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%; }\n\nbody {\n margin: 0; }\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block; }\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline; }\n\naudio:not([controls]) {\n display: none;\n height: 0; }\n\n[hidden],\ntemplate {\n display: none; }\n\na {\n background-color: transparent; }\n\na:active,\na:hover {\n outline: 0; }\n\nabbr[title] {\n border-bottom: 1px dotted; }\n\nb,\nstrong {\n font-weight: bold; }\n\ndfn {\n font-style: italic; }\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0; }\n\nmark {\n background: #ff0;\n color: #000; }\n\nsmall {\n font-size: 80%; }\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline; }\n\nsup {\n top: -0.5em; }\n\nsub {\n bottom: -0.25em; }\n\nimg {\n border: 0; }\n\nsvg:not(:root) {\n overflow: hidden; }\n\nfigure {\n margin: 1em 40px; }\n\nhr {\n box-sizing: content-box;\n height: 0; }\n\npre {\n overflow: auto; }\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em; }\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0; }\n\nbutton {\n overflow: visible; }\n\nbutton,\nselect {\n text-transform: none; }\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer; }\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default; }\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0; }\n\ninput {\n line-height: normal; }\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0; }\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto; }\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box; }\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none; }\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em; }\n\nlegend {\n border: 0;\n padding: 0; }\n\ntextarea {\n overflow: auto; }\n\noptgroup {\n font-weight: bold; }\n\ntable {\n border-collapse: collapse;\n border-spacing: 0; }\n\ntd,\nth {\n padding: 0; }\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important; }\n a,\n a:visited {\n text-decoration: underline; }\n a[href]:after {\n content: \" (\" attr(href) \")\"; }\n abbr[title]:after {\n content: \" (\" attr(title) \")\"; }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\"; }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid; }\n thead {\n display: table-header-group; }\n tr,\n img {\n page-break-inside: avoid; }\n img {\n max-width: 100% !important; }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3; }\n h2,\n h3 {\n page-break-after: avoid; }\n .navbar {\n display: none; }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important; }\n .label {\n border: 1px solid #000; }\n .table {\n border-collapse: collapse !important; }\n .table td,\n .table th {\n background-color: #fff !important; }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important; } }\n\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\"); }\n\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n.glyphicon-asterisk:before {\n content: \"\\002a\"; }\n\n.glyphicon-plus:before {\n content: \"\\002b\"; }\n\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\"; }\n\n.glyphicon-minus:before {\n content: \"\\2212\"; }\n\n.glyphicon-cloud:before {\n content: \"\\2601\"; }\n\n.glyphicon-envelope:before {\n content: \"\\2709\"; }\n\n.glyphicon-pencil:before {\n content: \"\\270f\"; }\n\n.glyphicon-glass:before {\n content: \"\\e001\"; }\n\n.glyphicon-music:before {\n content: \"\\e002\"; }\n\n.glyphicon-search:before {\n content: \"\\e003\"; }\n\n.glyphicon-heart:before {\n content: \"\\e005\"; }\n\n.glyphicon-star:before {\n content: \"\\e006\"; }\n\n.glyphicon-star-empty:before {\n content: \"\\e007\"; }\n\n.glyphicon-user:before {\n content: \"\\e008\"; }\n\n.glyphicon-film:before {\n content: \"\\e009\"; }\n\n.glyphicon-th-large:before {\n content: \"\\e010\"; }\n\n.glyphicon-th:before {\n content: \"\\e011\"; }\n\n.glyphicon-th-list:before {\n content: \"\\e012\"; }\n\n.glyphicon-ok:before {\n content: \"\\e013\"; }\n\n.glyphicon-remove:before {\n content: \"\\e014\"; }\n\n.glyphicon-zoom-in:before {\n content: \"\\e015\"; }\n\n.glyphicon-zoom-out:before {\n content: \"\\e016\"; }\n\n.glyphicon-off:before {\n content: \"\\e017\"; }\n\n.glyphicon-signal:before {\n content: \"\\e018\"; }\n\n.glyphicon-cog:before {\n content: \"\\e019\"; }\n\n.glyphicon-trash:before {\n content: \"\\e020\"; }\n\n.glyphicon-home:before {\n content: \"\\e021\"; }\n\n.glyphicon-file:before {\n content: \"\\e022\"; }\n\n.glyphicon-time:before {\n content: \"\\e023\"; }\n\n.glyphicon-road:before {\n content: \"\\e024\"; }\n\n.glyphicon-download-alt:before {\n content: \"\\e025\"; }\n\n.glyphicon-download:before {\n content: \"\\e026\"; }\n\n.glyphicon-upload:before {\n content: \"\\e027\"; }\n\n.glyphicon-inbox:before {\n content: \"\\e028\"; }\n\n.glyphicon-play-circle:before {\n content: \"\\e029\"; }\n\n.glyphicon-repeat:before {\n content: \"\\e030\"; }\n\n.glyphicon-refresh:before {\n content: \"\\e031\"; }\n\n.glyphicon-list-alt:before {\n content: \"\\e032\"; }\n\n.glyphicon-lock:before {\n content: \"\\e033\"; }\n\n.glyphicon-flag:before {\n content: \"\\e034\"; }\n\n.glyphicon-headphones:before {\n content: \"\\e035\"; }\n\n.glyphicon-volume-off:before {\n content: \"\\e036\"; }\n\n.glyphicon-volume-down:before {\n content: \"\\e037\"; }\n\n.glyphicon-volume-up:before {\n content: \"\\e038\"; }\n\n.glyphicon-qrcode:before {\n content: \"\\e039\"; }\n\n.glyphicon-barcode:before {\n content: \"\\e040\"; }\n\n.glyphicon-tag:before {\n content: \"\\e041\"; }\n\n.glyphicon-tags:before {\n content: \"\\e042\"; }\n\n.glyphicon-book:before {\n content: \"\\e043\"; }\n\n.glyphicon-bookmark:before {\n content: \"\\e044\"; }\n\n.glyphicon-print:before {\n content: \"\\e045\"; }\n\n.glyphicon-camera:before {\n content: \"\\e046\"; }\n\n.glyphicon-font:before {\n content: \"\\e047\"; }\n\n.glyphicon-bold:before {\n content: \"\\e048\"; }\n\n.glyphicon-italic:before {\n content: \"\\e049\"; }\n\n.glyphicon-text-height:before {\n content: \"\\e050\"; }\n\n.glyphicon-text-width:before {\n content: \"\\e051\"; }\n\n.glyphicon-align-left:before {\n content: \"\\e052\"; }\n\n.glyphicon-align-center:before {\n content: \"\\e053\"; }\n\n.glyphicon-align-right:before {\n content: \"\\e054\"; }\n\n.glyphicon-align-justify:before {\n content: \"\\e055\"; }\n\n.glyphicon-list:before {\n content: \"\\e056\"; }\n\n.glyphicon-indent-left:before {\n content: \"\\e057\"; }\n\n.glyphicon-indent-right:before {\n content: \"\\e058\"; }\n\n.glyphicon-facetime-video:before {\n content: \"\\e059\"; }\n\n.glyphicon-picture:before {\n content: \"\\e060\"; }\n\n.glyphicon-map-marker:before {\n content: \"\\e062\"; }\n\n.glyphicon-adjust:before {\n content: \"\\e063\"; }\n\n.glyphicon-tint:before {\n content: \"\\e064\"; }\n\n.glyphicon-edit:before {\n content: \"\\e065\"; }\n\n.glyphicon-share:before {\n content: \"\\e066\"; }\n\n.glyphicon-check:before {\n content: \"\\e067\"; }\n\n.glyphicon-move:before {\n content: \"\\e068\"; }\n\n.glyphicon-step-backward:before {\n content: \"\\e069\"; }\n\n.glyphicon-fast-backward:before {\n content: \"\\e070\"; }\n\n.glyphicon-backward:before {\n content: \"\\e071\"; }\n\n.glyphicon-play:before {\n content: \"\\e072\"; }\n\n.glyphicon-pause:before {\n content: \"\\e073\"; }\n\n.glyphicon-stop:before {\n content: \"\\e074\"; }\n\n.glyphicon-forward:before {\n content: \"\\e075\"; }\n\n.glyphicon-fast-forward:before {\n content: \"\\e076\"; }\n\n.glyphicon-step-forward:before {\n content: \"\\e077\"; }\n\n.glyphicon-eject:before {\n content: \"\\e078\"; }\n\n.glyphicon-chevron-left:before {\n content: \"\\e079\"; }\n\n.glyphicon-chevron-right:before {\n content: \"\\e080\"; }\n\n.glyphicon-plus-sign:before {\n content: \"\\e081\"; }\n\n.glyphicon-minus-sign:before {\n content: \"\\e082\"; }\n\n.glyphicon-remove-sign:before {\n content: \"\\e083\"; }\n\n.glyphicon-ok-sign:before {\n content: \"\\e084\"; }\n\n.glyphicon-question-sign:before {\n content: \"\\e085\"; }\n\n.glyphicon-info-sign:before {\n content: \"\\e086\"; }\n\n.glyphicon-screenshot:before {\n content: \"\\e087\"; }\n\n.glyphicon-remove-circle:before {\n content: \"\\e088\"; }\n\n.glyphicon-ok-circle:before {\n content: \"\\e089\"; }\n\n.glyphicon-ban-circle:before {\n content: \"\\e090\"; }\n\n.glyphicon-arrow-left:before {\n content: \"\\e091\"; }\n\n.glyphicon-arrow-right:before {\n content: \"\\e092\"; }\n\n.glyphicon-arrow-up:before {\n content: \"\\e093\"; }\n\n.glyphicon-arrow-down:before {\n content: \"\\e094\"; }\n\n.glyphicon-share-alt:before {\n content: \"\\e095\"; }\n\n.glyphicon-resize-full:before {\n content: \"\\e096\"; }\n\n.glyphicon-resize-small:before {\n content: \"\\e097\"; }\n\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\"; }\n\n.glyphicon-gift:before {\n content: \"\\e102\"; }\n\n.glyphicon-leaf:before {\n content: \"\\e103\"; }\n\n.glyphicon-fire:before {\n content: \"\\e104\"; }\n\n.glyphicon-eye-open:before {\n content: \"\\e105\"; }\n\n.glyphicon-eye-close:before {\n content: \"\\e106\"; }\n\n.glyphicon-warning-sign:before {\n content: \"\\e107\"; }\n\n.glyphicon-plane:before {\n content: \"\\e108\"; }\n\n.glyphicon-calendar:before {\n content: \"\\e109\"; }\n\n.glyphicon-random:before {\n content: \"\\e110\"; }\n\n.glyphicon-comment:before {\n content: \"\\e111\"; }\n\n.glyphicon-magnet:before {\n content: \"\\e112\"; }\n\n.glyphicon-chevron-up:before {\n content: \"\\e113\"; }\n\n.glyphicon-chevron-down:before {\n content: \"\\e114\"; }\n\n.glyphicon-retweet:before {\n content: \"\\e115\"; }\n\n.glyphicon-shopping-cart:before {\n content: \"\\e116\"; }\n\n.glyphicon-folder-close:before {\n content: \"\\e117\"; }\n\n.glyphicon-folder-open:before {\n content: \"\\e118\"; }\n\n.glyphicon-resize-vertical:before {\n content: \"\\e119\"; }\n\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\"; }\n\n.glyphicon-hdd:before {\n content: \"\\e121\"; }\n\n.glyphicon-bullhorn:before {\n content: \"\\e122\"; }\n\n.glyphicon-bell:before {\n content: \"\\e123\"; }\n\n.glyphicon-certificate:before {\n content: \"\\e124\"; }\n\n.glyphicon-thumbs-up:before {\n content: \"\\e125\"; }\n\n.glyphicon-thumbs-down:before {\n content: \"\\e126\"; }\n\n.glyphicon-hand-right:before {\n content: \"\\e127\"; }\n\n.glyphicon-hand-left:before {\n content: \"\\e128\"; }\n\n.glyphicon-hand-up:before {\n content: \"\\e129\"; }\n\n.glyphicon-hand-down:before {\n content: \"\\e130\"; }\n\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\"; }\n\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\"; }\n\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\"; }\n\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\"; }\n\n.glyphicon-globe:before {\n content: \"\\e135\"; }\n\n.glyphicon-wrench:before {\n content: \"\\e136\"; }\n\n.glyphicon-tasks:before {\n content: \"\\e137\"; }\n\n.glyphicon-filter:before {\n content: \"\\e138\"; }\n\n.glyphicon-briefcase:before {\n content: \"\\e139\"; }\n\n.glyphicon-fullscreen:before {\n content: \"\\e140\"; }\n\n.glyphicon-dashboard:before {\n content: \"\\e141\"; }\n\n.glyphicon-paperclip:before {\n content: \"\\e142\"; }\n\n.glyphicon-heart-empty:before {\n content: \"\\e143\"; }\n\n.glyphicon-link:before {\n content: \"\\e144\"; }\n\n.glyphicon-phone:before {\n content: \"\\e145\"; }\n\n.glyphicon-pushpin:before {\n content: \"\\e146\"; }\n\n.glyphicon-usd:before {\n content: \"\\e148\"; }\n\n.glyphicon-gbp:before {\n content: \"\\e149\"; }\n\n.glyphicon-sort:before {\n content: \"\\e150\"; }\n\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\"; }\n\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\"; }\n\n.glyphicon-sort-by-order:before {\n content: \"\\e153\"; }\n\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\"; }\n\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\"; }\n\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\"; }\n\n.glyphicon-unchecked:before {\n content: \"\\e157\"; }\n\n.glyphicon-expand:before {\n content: \"\\e158\"; }\n\n.glyphicon-collapse-down:before {\n content: \"\\e159\"; }\n\n.glyphicon-collapse-up:before {\n content: \"\\e160\"; }\n\n.glyphicon-log-in:before {\n content: \"\\e161\"; }\n\n.glyphicon-flash:before {\n content: \"\\e162\"; }\n\n.glyphicon-log-out:before {\n content: \"\\e163\"; }\n\n.glyphicon-new-window:before {\n content: \"\\e164\"; }\n\n.glyphicon-record:before {\n content: \"\\e165\"; }\n\n.glyphicon-save:before {\n content: \"\\e166\"; }\n\n.glyphicon-open:before {\n content: \"\\e167\"; }\n\n.glyphicon-saved:before {\n content: \"\\e168\"; }\n\n.glyphicon-import:before {\n content: \"\\e169\"; }\n\n.glyphicon-export:before {\n content: \"\\e170\"; }\n\n.glyphicon-send:before {\n content: \"\\e171\"; }\n\n.glyphicon-floppy-disk:before {\n content: \"\\e172\"; }\n\n.glyphicon-floppy-saved:before {\n content: \"\\e173\"; }\n\n.glyphicon-floppy-remove:before {\n content: \"\\e174\"; }\n\n.glyphicon-floppy-save:before {\n content: \"\\e175\"; }\n\n.glyphicon-floppy-open:before {\n content: \"\\e176\"; }\n\n.glyphicon-credit-card:before {\n content: \"\\e177\"; }\n\n.glyphicon-transfer:before {\n content: \"\\e178\"; }\n\n.glyphicon-cutlery:before {\n content: \"\\e179\"; }\n\n.glyphicon-header:before {\n content: \"\\e180\"; }\n\n.glyphicon-compressed:before {\n content: \"\\e181\"; }\n\n.glyphicon-earphone:before {\n content: \"\\e182\"; }\n\n.glyphicon-phone-alt:before {\n content: \"\\e183\"; }\n\n.glyphicon-tower:before {\n content: \"\\e184\"; }\n\n.glyphicon-stats:before {\n content: \"\\e185\"; }\n\n.glyphicon-sd-video:before {\n content: \"\\e186\"; }\n\n.glyphicon-hd-video:before {\n content: \"\\e187\"; }\n\n.glyphicon-subtitles:before {\n content: \"\\e188\"; }\n\n.glyphicon-sound-stereo:before {\n content: \"\\e189\"; }\n\n.glyphicon-sound-dolby:before {\n content: \"\\e190\"; }\n\n.glyphicon-sound-5-1:before {\n content: \"\\e191\"; }\n\n.glyphicon-sound-6-1:before {\n content: \"\\e192\"; }\n\n.glyphicon-sound-7-1:before {\n content: \"\\e193\"; }\n\n.glyphicon-copyright-mark:before {\n content: \"\\e194\"; }\n\n.glyphicon-registration-mark:before {\n content: \"\\e195\"; }\n\n.glyphicon-cloud-download:before {\n content: \"\\e197\"; }\n\n.glyphicon-cloud-upload:before {\n content: \"\\e198\"; }\n\n.glyphicon-tree-conifer:before {\n content: \"\\e199\"; }\n\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\"; }\n\n.glyphicon-cd:before {\n content: \"\\e201\"; }\n\n.glyphicon-save-file:before {\n content: \"\\e202\"; }\n\n.glyphicon-open-file:before {\n content: \"\\e203\"; }\n\n.glyphicon-level-up:before {\n content: \"\\e204\"; }\n\n.glyphicon-copy:before {\n content: \"\\e205\"; }\n\n.glyphicon-paste:before {\n content: \"\\e206\"; }\n\n.glyphicon-alert:before {\n content: \"\\e209\"; }\n\n.glyphicon-equalizer:before {\n content: \"\\e210\"; }\n\n.glyphicon-king:before {\n content: \"\\e211\"; }\n\n.glyphicon-queen:before {\n content: \"\\e212\"; }\n\n.glyphicon-pawn:before {\n content: \"\\e213\"; }\n\n.glyphicon-bishop:before {\n content: \"\\e214\"; }\n\n.glyphicon-knight:before {\n content: \"\\e215\"; }\n\n.glyphicon-baby-formula:before {\n content: \"\\e216\"; }\n\n.glyphicon-tent:before {\n content: \"\\26fa\"; }\n\n.glyphicon-blackboard:before {\n content: \"\\e218\"; }\n\n.glyphicon-bed:before {\n content: \"\\e219\"; }\n\n.glyphicon-apple:before {\n content: \"\\f8ff\"; }\n\n.glyphicon-erase:before {\n content: \"\\e221\"; }\n\n.glyphicon-hourglass:before {\n content: \"\\231b\"; }\n\n.glyphicon-lamp:before {\n content: \"\\e223\"; }\n\n.glyphicon-duplicate:before {\n content: \"\\e224\"; }\n\n.glyphicon-piggy-bank:before {\n content: \"\\e225\"; }\n\n.glyphicon-scissors:before {\n content: \"\\e226\"; }\n\n.glyphicon-bitcoin:before {\n content: \"\\e227\"; }\n\n.glyphicon-btc:before {\n content: \"\\e227\"; }\n\n.glyphicon-xbt:before {\n content: \"\\e227\"; }\n\n.glyphicon-yen:before {\n content: \"\\00a5\"; }\n\n.glyphicon-jpy:before {\n content: \"\\00a5\"; }\n\n.glyphicon-ruble:before {\n content: \"\\20bd\"; }\n\n.glyphicon-rub:before {\n content: \"\\20bd\"; }\n\n.glyphicon-scale:before {\n content: \"\\e230\"; }\n\n.glyphicon-ice-lolly:before {\n content: \"\\e231\"; }\n\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\"; }\n\n.glyphicon-education:before {\n content: \"\\e233\"; }\n\n.glyphicon-option-horizontal:before {\n content: \"\\e234\"; }\n\n.glyphicon-option-vertical:before {\n content: \"\\e235\"; }\n\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\"; }\n\n.glyphicon-modal-window:before {\n content: \"\\e237\"; }\n\n.glyphicon-oil:before {\n content: \"\\e238\"; }\n\n.glyphicon-grain:before {\n content: \"\\e239\"; }\n\n.glyphicon-sunglasses:before {\n content: \"\\e240\"; }\n\n.glyphicon-text-size:before {\n content: \"\\e241\"; }\n\n.glyphicon-text-color:before {\n content: \"\\e242\"; }\n\n.glyphicon-text-background:before {\n content: \"\\e243\"; }\n\n.glyphicon-object-align-top:before {\n content: \"\\e244\"; }\n\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\"; }\n\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\"; }\n\n.glyphicon-object-align-left:before {\n content: \"\\e247\"; }\n\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\"; }\n\n.glyphicon-object-align-right:before {\n content: \"\\e249\"; }\n\n.glyphicon-triangle-right:before {\n content: \"\\e250\"; }\n\n.glyphicon-triangle-left:before {\n content: \"\\e251\"; }\n\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\"; }\n\n.glyphicon-triangle-top:before {\n content: \"\\e253\"; }\n\n.glyphicon-console:before {\n content: \"\\e254\"; }\n\n.glyphicon-superscript:before {\n content: \"\\e255\"; }\n\n.glyphicon-subscript:before {\n content: \"\\e256\"; }\n\n.glyphicon-menu-left:before {\n content: \"\\e257\"; }\n\n.glyphicon-menu-right:before {\n content: \"\\e258\"; }\n\n.glyphicon-menu-down:before {\n content: \"\\e259\"; }\n\n.glyphicon-menu-up:before {\n content: \"\\e260\"; }\n\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: transparent; }\n\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857;\n color: #333333;\n background-color: #fff; }\n\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit; }\n\na {\n color: #337ab7;\n text-decoration: none; }\n a:hover, a:focus {\n color: #23527c;\n text-decoration: underline; }\n a:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n\nfigure {\n margin: 0; }\n\nimg {\n vertical-align: middle; }\n\n.img-responsive, main img {\n display: block;\n max-width: 100%;\n height: auto; }\n\n.img-rounded {\n border-radius: 6px; }\n\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto; }\n\n.img-circle {\n border-radius: 50%; }\n\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee; }\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto; }\n\n[role=\"button\"] {\n cursor: pointer; }\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit; }\n h1 small,\n h1 .small, h2 small,\n h2 .small, h3 small,\n h3 .small, h4 small,\n h4 .small, h5 small,\n h5 .small, h6 small,\n h6 .small,\n .h1 small,\n .h1 .small, .h2 small,\n .h2 .small, .h3 small,\n .h3 .small, .h4 small,\n .h4 .small, .h5 small,\n .h5 .small, .h6 small,\n .h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777; }\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: 20px;\n margin-bottom: 10px; }\n h1 small,\n h1 .small, .h1 small,\n .h1 .small,\n h2 small,\n h2 .small, .h2 small,\n .h2 .small,\n h3 small,\n h3 .small, .h3 small,\n .h3 .small {\n font-size: 65%; }\n\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: 10px;\n margin-bottom: 10px; }\n h4 small,\n h4 .small, .h4 small,\n .h4 .small,\n h5 small,\n h5 .small, .h5 small,\n .h5 .small,\n h6 small,\n h6 .small, .h6 small,\n .h6 .small {\n font-size: 75%; }\n\nh1, .h1 {\n font-size: 36px; }\n\nh2, .h2 {\n font-size: 30px; }\n\nh3, .h3 {\n font-size: 24px; }\n\nh4, .h4 {\n font-size: 18px; }\n\nh5, .h5 {\n font-size: 14px; }\n\nh6, .h6 {\n font-size: 12px; }\n\np {\n margin: 0 0 10px; }\n\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4; }\n @media (min-width: 768px) {\n .lead {\n font-size: 21px; } }\n\nsmall,\n.small {\n font-size: 85%; }\n\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em; }\n\n.text-left {\n text-align: left; }\n\n.text-right {\n text-align: right; }\n\n.text-center {\n text-align: center; }\n\n.text-justify {\n text-align: justify; }\n\n.text-nowrap {\n white-space: nowrap; }\n\n.text-lowercase {\n text-transform: lowercase; }\n\n.text-uppercase, .initialism {\n text-transform: uppercase; }\n\n.text-capitalize {\n text-transform: capitalize; }\n\n.text-muted {\n color: #777777; }\n\n.text-primary {\n color: #337ab7; }\n\na.text-primary:hover,\na.text-primary:focus {\n color: #286090; }\n\n.text-success {\n color: #3c763d; }\n\na.text-success:hover,\na.text-success:focus {\n color: #2b542c; }\n\n.text-info {\n color: #31708f; }\n\na.text-info:hover,\na.text-info:focus {\n color: #245269; }\n\n.text-warning {\n color: #8a6d3b; }\n\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c; }\n\n.text-danger {\n color: #a94442; }\n\na.text-danger:hover,\na.text-danger:focus {\n color: #843534; }\n\n.bg-primary {\n color: #fff; }\n\n.bg-primary {\n background-color: #337ab7; }\n\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090; }\n\n.bg-success {\n background-color: #dff0d8; }\n\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3; }\n\n.bg-info {\n background-color: #d9edf7; }\n\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee; }\n\n.bg-warning {\n background-color: #fcf8e3; }\n\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5; }\n\n.bg-danger {\n background-color: #f2dede; }\n\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9; }\n\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee; }\n\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px; }\n ul ul,\n ul ol,\n ol ul,\n ol ol {\n margin-bottom: 0; }\n\n.list-unstyled {\n padding-left: 0;\n list-style: none; }\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px; }\n .list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px; }\n\ndl {\n margin-top: 0;\n margin-bottom: 20px; }\n\ndt,\ndd {\n line-height: 1.42857; }\n\ndt {\n font-weight: bold; }\n\ndd {\n margin-left: 0; }\n\n.dl-horizontal dd:before, .dl-horizontal dd:after {\n content: \" \";\n display: table; }\n\n.dl-horizontal dd:after {\n clear: both; }\n\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .dl-horizontal dd {\n margin-left: 180px; } }\n\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777; }\n\n.initialism {\n font-size: 90%; }\n\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee; }\n blockquote p:last-child,\n blockquote ul:last-child,\n blockquote ol:last-child {\n margin-bottom: 0; }\n blockquote footer,\n blockquote small,\n blockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857;\n color: #777777; }\n blockquote footer:before,\n blockquote small:before,\n blockquote .small:before {\n content: '\\2014 \\00A0'; }\n\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right; }\n .blockquote-reverse footer:before,\n .blockquote-reverse small:before,\n .blockquote-reverse .small:before,\n blockquote.pull-right footer:before,\n blockquote.pull-right small:before,\n blockquote.pull-right .small:before {\n content: ''; }\n .blockquote-reverse footer:after,\n .blockquote-reverse small:after,\n .blockquote-reverse .small:after,\n blockquote.pull-right footer:after,\n blockquote.pull-right small:after,\n blockquote.pull-right .small:after {\n content: '\\00A0 \\2014'; }\n\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857; }\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; }\n\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px; }\n\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }\n kbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none; }\n\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px; }\n pre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0; }\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll; }\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px; }\n .container:before, .container:after {\n content: \" \";\n display: table; }\n .container:after {\n clear: both; }\n @media (min-width: 768px) {\n .container {\n width: 750px; } }\n @media (min-width: 992px) {\n .container {\n width: 970px; } }\n @media (min-width: 1200px) {\n .container {\n width: 1170px; } }\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px; }\n .container-fluid:before, .container-fluid:after {\n content: \" \";\n display: table; }\n .container-fluid:after {\n clear: both; }\n\n.row {\n margin-left: -15px;\n margin-right: -15px; }\n .row:before, .row:after {\n content: \" \";\n display: table; }\n .row:after {\n clear: both; }\n\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px; }\n\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left; }\n\n.col-xs-1 {\n width: 8.33333%; }\n\n.col-xs-2 {\n width: 16.66667%; }\n\n.col-xs-3 {\n width: 25%; }\n\n.col-xs-4 {\n width: 33.33333%; }\n\n.col-xs-5 {\n width: 41.66667%; }\n\n.col-xs-6 {\n width: 50%; }\n\n.col-xs-7 {\n width: 58.33333%; }\n\n.col-xs-8 {\n width: 66.66667%; }\n\n.col-xs-9 {\n width: 75%; }\n\n.col-xs-10 {\n width: 83.33333%; }\n\n.col-xs-11 {\n width: 91.66667%; }\n\n.col-xs-12 {\n width: 100%; }\n\n.col-xs-pull-0 {\n right: auto; }\n\n.col-xs-pull-1 {\n right: 8.33333%; }\n\n.col-xs-pull-2 {\n right: 16.66667%; }\n\n.col-xs-pull-3 {\n right: 25%; }\n\n.col-xs-pull-4 {\n right: 33.33333%; }\n\n.col-xs-pull-5 {\n right: 41.66667%; }\n\n.col-xs-pull-6 {\n right: 50%; }\n\n.col-xs-pull-7 {\n right: 58.33333%; }\n\n.col-xs-pull-8 {\n right: 66.66667%; }\n\n.col-xs-pull-9 {\n right: 75%; }\n\n.col-xs-pull-10 {\n right: 83.33333%; }\n\n.col-xs-pull-11 {\n right: 91.66667%; }\n\n.col-xs-pull-12 {\n right: 100%; }\n\n.col-xs-push-0 {\n left: auto; }\n\n.col-xs-push-1 {\n left: 8.33333%; }\n\n.col-xs-push-2 {\n left: 16.66667%; }\n\n.col-xs-push-3 {\n left: 25%; }\n\n.col-xs-push-4 {\n left: 33.33333%; }\n\n.col-xs-push-5 {\n left: 41.66667%; }\n\n.col-xs-push-6 {\n left: 50%; }\n\n.col-xs-push-7 {\n left: 58.33333%; }\n\n.col-xs-push-8 {\n left: 66.66667%; }\n\n.col-xs-push-9 {\n left: 75%; }\n\n.col-xs-push-10 {\n left: 83.33333%; }\n\n.col-xs-push-11 {\n left: 91.66667%; }\n\n.col-xs-push-12 {\n left: 100%; }\n\n.col-xs-offset-0 {\n margin-left: 0%; }\n\n.col-xs-offset-1 {\n margin-left: 8.33333%; }\n\n.col-xs-offset-2 {\n margin-left: 16.66667%; }\n\n.col-xs-offset-3 {\n margin-left: 25%; }\n\n.col-xs-offset-4 {\n margin-left: 33.33333%; }\n\n.col-xs-offset-5 {\n margin-left: 41.66667%; }\n\n.col-xs-offset-6 {\n margin-left: 50%; }\n\n.col-xs-offset-7 {\n margin-left: 58.33333%; }\n\n.col-xs-offset-8 {\n margin-left: 66.66667%; }\n\n.col-xs-offset-9 {\n margin-left: 75%; }\n\n.col-xs-offset-10 {\n margin-left: 83.33333%; }\n\n.col-xs-offset-11 {\n margin-left: 91.66667%; }\n\n.col-xs-offset-12 {\n margin-left: 100%; }\n\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left; }\n .col-sm-1 {\n width: 8.33333%; }\n .col-sm-2 {\n width: 16.66667%; }\n .col-sm-3 {\n width: 25%; }\n .col-sm-4 {\n width: 33.33333%; }\n .col-sm-5 {\n width: 41.66667%; }\n .col-sm-6 {\n width: 50%; }\n .col-sm-7 {\n width: 58.33333%; }\n .col-sm-8 {\n width: 66.66667%; }\n .col-sm-9 {\n width: 75%; }\n .col-sm-10 {\n width: 83.33333%; }\n .col-sm-11 {\n width: 91.66667%; }\n .col-sm-12 {\n width: 100%; }\n .col-sm-pull-0 {\n right: auto; }\n .col-sm-pull-1 {\n right: 8.33333%; }\n .col-sm-pull-2 {\n right: 16.66667%; }\n .col-sm-pull-3 {\n right: 25%; }\n .col-sm-pull-4 {\n right: 33.33333%; }\n .col-sm-pull-5 {\n right: 41.66667%; }\n .col-sm-pull-6 {\n right: 50%; }\n .col-sm-pull-7 {\n right: 58.33333%; }\n .col-sm-pull-8 {\n right: 66.66667%; }\n .col-sm-pull-9 {\n right: 75%; }\n .col-sm-pull-10 {\n right: 83.33333%; }\n .col-sm-pull-11 {\n right: 91.66667%; }\n .col-sm-pull-12 {\n right: 100%; }\n .col-sm-push-0 {\n left: auto; }\n .col-sm-push-1 {\n left: 8.33333%; }\n .col-sm-push-2 {\n left: 16.66667%; }\n .col-sm-push-3 {\n left: 25%; }\n .col-sm-push-4 {\n left: 33.33333%; }\n .col-sm-push-5 {\n left: 41.66667%; }\n .col-sm-push-6 {\n left: 50%; }\n .col-sm-push-7 {\n left: 58.33333%; }\n .col-sm-push-8 {\n left: 66.66667%; }\n .col-sm-push-9 {\n left: 75%; }\n .col-sm-push-10 {\n left: 83.33333%; }\n .col-sm-push-11 {\n left: 91.66667%; }\n .col-sm-push-12 {\n left: 100%; }\n .col-sm-offset-0 {\n margin-left: 0%; }\n .col-sm-offset-1 {\n margin-left: 8.33333%; }\n .col-sm-offset-2 {\n margin-left: 16.66667%; }\n .col-sm-offset-3 {\n margin-left: 25%; }\n .col-sm-offset-4 {\n margin-left: 33.33333%; }\n .col-sm-offset-5 {\n margin-left: 41.66667%; }\n .col-sm-offset-6 {\n margin-left: 50%; }\n .col-sm-offset-7 {\n margin-left: 58.33333%; }\n .col-sm-offset-8 {\n margin-left: 66.66667%; }\n .col-sm-offset-9 {\n margin-left: 75%; }\n .col-sm-offset-10 {\n margin-left: 83.33333%; }\n .col-sm-offset-11 {\n margin-left: 91.66667%; }\n .col-sm-offset-12 {\n margin-left: 100%; } }\n\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left; }\n .col-md-1 {\n width: 8.33333%; }\n .col-md-2 {\n width: 16.66667%; }\n .col-md-3 {\n width: 25%; }\n .col-md-4 {\n width: 33.33333%; }\n .col-md-5 {\n width: 41.66667%; }\n .col-md-6 {\n width: 50%; }\n .col-md-7 {\n width: 58.33333%; }\n .col-md-8 {\n width: 66.66667%; }\n .col-md-9 {\n width: 75%; }\n .col-md-10 {\n width: 83.33333%; }\n .col-md-11 {\n width: 91.66667%; }\n .col-md-12 {\n width: 100%; }\n .col-md-pull-0 {\n right: auto; }\n .col-md-pull-1 {\n right: 8.33333%; }\n .col-md-pull-2 {\n right: 16.66667%; }\n .col-md-pull-3 {\n right: 25%; }\n .col-md-pull-4 {\n right: 33.33333%; }\n .col-md-pull-5 {\n right: 41.66667%; }\n .col-md-pull-6 {\n right: 50%; }\n .col-md-pull-7 {\n right: 58.33333%; }\n .col-md-pull-8 {\n right: 66.66667%; }\n .col-md-pull-9 {\n right: 75%; }\n .col-md-pull-10 {\n right: 83.33333%; }\n .col-md-pull-11 {\n right: 91.66667%; }\n .col-md-pull-12 {\n right: 100%; }\n .col-md-push-0 {\n left: auto; }\n .col-md-push-1 {\n left: 8.33333%; }\n .col-md-push-2 {\n left: 16.66667%; }\n .col-md-push-3 {\n left: 25%; }\n .col-md-push-4 {\n left: 33.33333%; }\n .col-md-push-5 {\n left: 41.66667%; }\n .col-md-push-6 {\n left: 50%; }\n .col-md-push-7 {\n left: 58.33333%; }\n .col-md-push-8 {\n left: 66.66667%; }\n .col-md-push-9 {\n left: 75%; }\n .col-md-push-10 {\n left: 83.33333%; }\n .col-md-push-11 {\n left: 91.66667%; }\n .col-md-push-12 {\n left: 100%; }\n .col-md-offset-0 {\n margin-left: 0%; }\n .col-md-offset-1 {\n margin-left: 8.33333%; }\n .col-md-offset-2 {\n margin-left: 16.66667%; }\n .col-md-offset-3 {\n margin-left: 25%; }\n .col-md-offset-4 {\n margin-left: 33.33333%; }\n .col-md-offset-5 {\n margin-left: 41.66667%; }\n .col-md-offset-6 {\n margin-left: 50%; }\n .col-md-offset-7 {\n margin-left: 58.33333%; }\n .col-md-offset-8 {\n margin-left: 66.66667%; }\n .col-md-offset-9 {\n margin-left: 75%; }\n .col-md-offset-10 {\n margin-left: 83.33333%; }\n .col-md-offset-11 {\n margin-left: 91.66667%; }\n .col-md-offset-12 {\n margin-left: 100%; } }\n\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left; }\n .col-lg-1 {\n width: 8.33333%; }\n .col-lg-2 {\n width: 16.66667%; }\n .col-lg-3 {\n width: 25%; }\n .col-lg-4 {\n width: 33.33333%; }\n .col-lg-5 {\n width: 41.66667%; }\n .col-lg-6 {\n width: 50%; }\n .col-lg-7 {\n width: 58.33333%; }\n .col-lg-8 {\n width: 66.66667%; }\n .col-lg-9 {\n width: 75%; }\n .col-lg-10 {\n width: 83.33333%; }\n .col-lg-11 {\n width: 91.66667%; }\n .col-lg-12 {\n width: 100%; }\n .col-lg-pull-0 {\n right: auto; }\n .col-lg-pull-1 {\n right: 8.33333%; }\n .col-lg-pull-2 {\n right: 16.66667%; }\n .col-lg-pull-3 {\n right: 25%; }\n .col-lg-pull-4 {\n right: 33.33333%; }\n .col-lg-pull-5 {\n right: 41.66667%; }\n .col-lg-pull-6 {\n right: 50%; }\n .col-lg-pull-7 {\n right: 58.33333%; }\n .col-lg-pull-8 {\n right: 66.66667%; }\n .col-lg-pull-9 {\n right: 75%; }\n .col-lg-pull-10 {\n right: 83.33333%; }\n .col-lg-pull-11 {\n right: 91.66667%; }\n .col-lg-pull-12 {\n right: 100%; }\n .col-lg-push-0 {\n left: auto; }\n .col-lg-push-1 {\n left: 8.33333%; }\n .col-lg-push-2 {\n left: 16.66667%; }\n .col-lg-push-3 {\n left: 25%; }\n .col-lg-push-4 {\n left: 33.33333%; }\n .col-lg-push-5 {\n left: 41.66667%; }\n .col-lg-push-6 {\n left: 50%; }\n .col-lg-push-7 {\n left: 58.33333%; }\n .col-lg-push-8 {\n left: 66.66667%; }\n .col-lg-push-9 {\n left: 75%; }\n .col-lg-push-10 {\n left: 83.33333%; }\n .col-lg-push-11 {\n left: 91.66667%; }\n .col-lg-push-12 {\n left: 100%; }\n .col-lg-offset-0 {\n margin-left: 0%; }\n .col-lg-offset-1 {\n margin-left: 8.33333%; }\n .col-lg-offset-2 {\n margin-left: 16.66667%; }\n .col-lg-offset-3 {\n margin-left: 25%; }\n .col-lg-offset-4 {\n margin-left: 33.33333%; }\n .col-lg-offset-5 {\n margin-left: 41.66667%; }\n .col-lg-offset-6 {\n margin-left: 50%; }\n .col-lg-offset-7 {\n margin-left: 58.33333%; }\n .col-lg-offset-8 {\n margin-left: 66.66667%; }\n .col-lg-offset-9 {\n margin-left: 75%; }\n .col-lg-offset-10 {\n margin-left: 83.33333%; }\n .col-lg-offset-11 {\n margin-left: 91.66667%; }\n .col-lg-offset-12 {\n margin-left: 100%; } }\n\ntable {\n background-color: transparent; }\n\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left; }\n\nth {\n text-align: left; }\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px; }\n .table > thead > tr > th,\n .table > thead > tr > td,\n .table > tbody > tr > th,\n .table > tbody > tr > td,\n .table > tfoot > tr > th,\n .table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857;\n vertical-align: top;\n border-top: 1px solid #ddd; }\n .table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd; }\n .table > caption + thead > tr:first-child > th,\n .table > caption + thead > tr:first-child > td,\n .table > colgroup + thead > tr:first-child > th,\n .table > colgroup + thead > tr:first-child > td,\n .table > thead:first-child > tr:first-child > th,\n .table > thead:first-child > tr:first-child > td {\n border-top: 0; }\n .table > tbody + tbody {\n border-top: 2px solid #ddd; }\n .table .table {\n background-color: #fff; }\n\n.table-condensed > thead > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > th,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > th,\n.table-condensed > tfoot > tr > td {\n padding: 5px; }\n\n.table-bordered {\n border: 1px solid #ddd; }\n .table-bordered > thead > tr > th,\n .table-bordered > thead > tr > td,\n .table-bordered > tbody > tr > th,\n .table-bordered > tbody > tr > td,\n .table-bordered > tfoot > tr > th,\n .table-bordered > tfoot > tr > td {\n border: 1px solid #ddd; }\n .table-bordered > thead > tr > th,\n .table-bordered > thead > tr > td {\n border-bottom-width: 2px; }\n\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9; }\n\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5; }\n\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column; }\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell; }\n\n.table > thead > tr > td.active,\n.table > thead > tr > th.active,\n.table > thead > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr > td.active,\n.table > tbody > tr > th.active,\n.table > tbody > tr.active > td,\n.table > tbody > tr.active > th,\n.table > tfoot > tr > td.active,\n.table > tfoot > tr > th.active,\n.table > tfoot > tr.active > td,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5; }\n\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8; }\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8; }\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6; }\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7; }\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3; }\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3; }\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc; }\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede; }\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc; }\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; }\n @media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd; }\n .table-responsive > .table {\n margin-bottom: 0; }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap; }\n .table-responsive > .table-bordered {\n border: 0; }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0; }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0; }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0; } }\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0; }\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5; }\n\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold; }\n\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal; }\n\ninput[type=\"file\"] {\n display: block; }\n\ninput[type=\"range\"] {\n display: block;\n width: 100%; }\n\nselect[multiple],\nselect[size] {\n height: auto; }\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857;\n color: #555555; }\n\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }\n .form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }\n .form-control::-moz-placeholder {\n color: #999;\n opacity: 1; }\n .form-control:-ms-input-placeholder {\n color: #999; }\n .form-control::-webkit-input-placeholder {\n color: #999; }\n .form-control::-ms-expand {\n border: 0;\n background-color: transparent; }\n .form-control[disabled], .form-control[readonly],\n fieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1; }\n .form-control[disabled],\n fieldset[disabled] .form-control {\n cursor: not-allowed; }\n\ntextarea.form-control {\n height: auto; }\n\ninput[type=\"search\"] {\n -webkit-appearance: none; }\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px; }\n input[type=\"date\"].input-sm, .input-group-sm > input[type=\"date\"].form-control,\n .input-group-sm > input[type=\"date\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"date\"].btn,\n .input-group-sm input[type=\"date\"],\n input[type=\"time\"].input-sm,\n .input-group-sm > input[type=\"time\"].form-control,\n .input-group-sm > input[type=\"time\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"time\"].btn,\n .input-group-sm\n input[type=\"time\"],\n input[type=\"datetime-local\"].input-sm,\n .input-group-sm > input[type=\"datetime-local\"].form-control,\n .input-group-sm > input[type=\"datetime-local\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"datetime-local\"].btn,\n .input-group-sm\n input[type=\"datetime-local\"],\n input[type=\"month\"].input-sm,\n .input-group-sm > input[type=\"month\"].form-control,\n .input-group-sm > input[type=\"month\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"month\"].btn,\n .input-group-sm\n input[type=\"month\"] {\n line-height: 30px; }\n input[type=\"date\"].input-lg, .input-group-lg > input[type=\"date\"].form-control,\n .input-group-lg > input[type=\"date\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"date\"].btn,\n .input-group-lg input[type=\"date\"],\n input[type=\"time\"].input-lg,\n .input-group-lg > input[type=\"time\"].form-control,\n .input-group-lg > input[type=\"time\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"time\"].btn,\n .input-group-lg\n input[type=\"time\"],\n input[type=\"datetime-local\"].input-lg,\n .input-group-lg > input[type=\"datetime-local\"].form-control,\n .input-group-lg > input[type=\"datetime-local\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"datetime-local\"].btn,\n .input-group-lg\n input[type=\"datetime-local\"],\n input[type=\"month\"].input-lg,\n .input-group-lg > input[type=\"month\"].form-control,\n .input-group-lg > input[type=\"month\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"month\"].btn,\n .input-group-lg\n input[type=\"month\"] {\n line-height: 46px; } }\n\n.form-group {\n margin-bottom: 15px; }\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px; }\n .radio label,\n .checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer; }\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9; }\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; }\n\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer; }\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; }\n\ninput[type=\"radio\"][disabled], input[type=\"radio\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled]\ninput[type=\"checkbox\"] {\n cursor: not-allowed; }\n\n.radio-inline.disabled,\nfieldset[disabled] .radio-inline,\n.checkbox-inline.disabled,\nfieldset[disabled]\n.checkbox-inline {\n cursor: not-allowed; }\n\n.radio.disabled label,\nfieldset[disabled] .radio label,\n.checkbox.disabled label,\nfieldset[disabled]\n.checkbox label {\n cursor: not-allowed; }\n\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px; }\n .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,\n .input-group-lg > .form-control-static.input-group-addon,\n .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,\n .input-group-sm > .form-control-static.input-group-addon,\n .input-group-sm > .input-group-btn > .form-control-static.btn {\n padding-left: 0;\n padding-right: 0; }\n\n.input-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\nselect.input-sm, .input-group-sm > select.form-control,\n.input-group-sm > select.input-group-addon,\n.input-group-sm > .input-group-btn > select.btn {\n height: 30px;\n line-height: 30px; }\n\ntextarea.input-sm, .input-group-sm > textarea.form-control,\n.input-group-sm > textarea.input-group-addon,\n.input-group-sm > .input-group-btn > textarea.btn,\nselect[multiple].input-sm,\n.input-group-sm > select[multiple].form-control,\n.input-group-sm > select[multiple].input-group-addon,\n.input-group-sm > .input-group-btn > select[multiple].btn {\n height: auto; }\n\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px; }\n\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto; }\n\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5; }\n\n.input-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333;\n border-radius: 6px; }\n\nselect.input-lg, .input-group-lg > select.form-control,\n.input-group-lg > select.input-group-addon,\n.input-group-lg > .input-group-btn > select.btn {\n height: 46px;\n line-height: 46px; }\n\ntextarea.input-lg, .input-group-lg > textarea.form-control,\n.input-group-lg > textarea.input-group-addon,\n.input-group-lg > .input-group-btn > textarea.btn,\nselect[multiple].input-lg,\n.input-group-lg > select[multiple].form-control,\n.input-group-lg > select[multiple].input-group-addon,\n.input-group-lg > .input-group-btn > select[multiple].btn {\n height: auto; }\n\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333;\n border-radius: 6px; }\n\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px; }\n\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto; }\n\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.33333; }\n\n.has-feedback {\n position: relative; }\n .has-feedback .form-control {\n padding-right: 42.5px; }\n\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none; }\n\n.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,\n.input-group-lg > .input-group-addon + .form-control-feedback,\n.input-group-lg > .input-group-btn > .btn + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px; }\n\n.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,\n.input-group-sm > .input-group-addon + .form-control-feedback,\n.input-group-sm > .input-group-btn > .btn + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px; }\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d; }\n\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n .has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }\n\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8; }\n\n.has-success .form-control-feedback {\n color: #3c763d; }\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b; }\n\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n .has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; }\n\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3; }\n\n.has-warning .form-control-feedback {\n color: #8a6d3b; }\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442; }\n\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n .has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }\n\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede; }\n\n.has-error .form-control-feedback {\n color: #a94442; }\n\n.has-feedback label ~ .form-control-feedback {\n top: 25px; }\n\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0; }\n\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373; }\n\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle; }\n .form-inline .form-control-static {\n display: inline-block; }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle; }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto; }\n .form-inline .input-group > .form-control {\n width: 100%; }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0; }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0; }\n .form-inline .has-feedback .form-control-feedback {\n top: 0; } }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px; }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px; }\n\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px; }\n .form-horizontal .form-group:before, .form-horizontal .form-group:after {\n content: \" \";\n display: table; }\n .form-horizontal .form-group:after {\n clear: both; }\n\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px; } }\n\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px; }\n\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px; } }\n\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px; } }\n\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none; }\n .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n .btn:hover, .btn:focus, .btn.focus {\n color: #333;\n text-decoration: none; }\n .btn:active, .btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n .btn.disabled, .btn[disabled],\n fieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none; }\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none; }\n\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc; }\n .btn-default:focus, .btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c; }\n .btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad; }\n .btn-default:active, .btn-default.active,\n .open > .btn-default.dropdown-toggle {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad; }\n .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,\n .open > .btn-default.dropdown-toggle:hover,\n .open > .btn-default.dropdown-toggle:focus,\n .open > .btn-default.dropdown-toggle.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c; }\n .btn-default:active, .btn-default.active,\n .open > .btn-default.dropdown-toggle {\n background-image: none; }\n .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,\n fieldset[disabled] .btn-default:hover,\n fieldset[disabled] .btn-default:focus,\n fieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc; }\n .btn-default .badge {\n color: #fff;\n background-color: #333; }\n\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4; }\n .btn-primary:focus, .btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40; }\n .btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74; }\n .btn-primary:active, .btn-primary.active,\n .open > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #286090;\n border-color: #204d74; }\n .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,\n .open > .btn-primary.dropdown-toggle:hover,\n .open > .btn-primary.dropdown-toggle:focus,\n .open > .btn-primary.dropdown-toggle.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40; }\n .btn-primary:active, .btn-primary.active,\n .open > .btn-primary.dropdown-toggle {\n background-image: none; }\n .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,\n fieldset[disabled] .btn-primary:hover,\n fieldset[disabled] .btn-primary:focus,\n fieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4; }\n .btn-primary .badge {\n color: #337ab7;\n background-color: #fff; }\n\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c; }\n .btn-success:focus, .btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625; }\n .btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439; }\n .btn-success:active, .btn-success.active,\n .open > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #449d44;\n border-color: #398439; }\n .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,\n .open > .btn-success.dropdown-toggle:hover,\n .open > .btn-success.dropdown-toggle:focus,\n .open > .btn-success.dropdown-toggle.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625; }\n .btn-success:active, .btn-success.active,\n .open > .btn-success.dropdown-toggle {\n background-image: none; }\n .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,\n fieldset[disabled] .btn-success:hover,\n fieldset[disabled] .btn-success:focus,\n fieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c; }\n .btn-success .badge {\n color: #5cb85c;\n background-color: #fff; }\n\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da; }\n .btn-info:focus, .btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85; }\n .btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc; }\n .btn-info:active, .btn-info.active,\n .open > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc; }\n .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,\n .open > .btn-info.dropdown-toggle:hover,\n .open > .btn-info.dropdown-toggle:focus,\n .open > .btn-info.dropdown-toggle.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85; }\n .btn-info:active, .btn-info.active,\n .open > .btn-info.dropdown-toggle {\n background-image: none; }\n .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,\n fieldset[disabled] .btn-info:hover,\n fieldset[disabled] .btn-info:focus,\n fieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da; }\n .btn-info .badge {\n color: #5bc0de;\n background-color: #fff; }\n\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236; }\n .btn-warning:focus, .btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d; }\n .btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512; }\n .btn-warning:active, .btn-warning.active,\n .open > .btn-warning.dropdown-toggle {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512; }\n .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,\n .open > .btn-warning.dropdown-toggle:hover,\n .open > .btn-warning.dropdown-toggle:focus,\n .open > .btn-warning.dropdown-toggle.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d; }\n .btn-warning:active, .btn-warning.active,\n .open > .btn-warning.dropdown-toggle {\n background-image: none; }\n .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,\n fieldset[disabled] .btn-warning:hover,\n fieldset[disabled] .btn-warning:focus,\n fieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236; }\n .btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff; }\n\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a; }\n .btn-danger:focus, .btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19; }\n .btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925; }\n .btn-danger:active, .btn-danger.active,\n .open > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925; }\n .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,\n .open > .btn-danger.dropdown-toggle:hover,\n .open > .btn-danger.dropdown-toggle:focus,\n .open > .btn-danger.dropdown-toggle.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19; }\n .btn-danger:active, .btn-danger.active,\n .open > .btn-danger.dropdown-toggle {\n background-image: none; }\n .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,\n fieldset[disabled] .btn-danger:hover,\n fieldset[disabled] .btn-danger:focus,\n fieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a; }\n .btn-danger .badge {\n color: #d9534f;\n background-color: #fff; }\n\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0; }\n .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],\n fieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none; }\n .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {\n border-color: transparent; }\n .btn-link:hover, .btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent; }\n .btn-link[disabled]:hover, .btn-link[disabled]:focus,\n fieldset[disabled] .btn-link:hover,\n fieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none; }\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333;\n border-radius: 6px; }\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.btn-xs, .btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.btn-block {\n display: block;\n width: 100%; }\n\n.btn-block + .btn-block {\n margin-top: 5px; }\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%; }\n\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear; }\n .fade.in {\n opacity: 1; }\n\n.collapse {\n display: none; }\n .collapse.in {\n display: block; }\n\ntr.collapse.in {\n display: table-row; }\n\ntbody.collapse.in {\n display: table-row-group; }\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease; }\n\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent; }\n\n.dropup,\n.dropdown {\n position: relative; }\n\n.dropdown-toggle:focus {\n outline: 0; }\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box; }\n .dropdown-menu.pull-right {\n right: 0;\n left: auto; }\n .dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5; }\n .dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857;\n color: #333333;\n white-space: nowrap; }\n\n.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5; }\n\n.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7; }\n\n.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n color: #777777; }\n\n.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed; }\n\n.open > .dropdown-menu {\n display: block; }\n\n.open > a {\n outline: 0; }\n\n.dropdown-menu-right {\n left: auto;\n right: 0; }\n\n.dropdown-menu-left {\n left: 0;\n right: auto; }\n\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857;\n color: #777777;\n white-space: nowrap; }\n\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990; }\n\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto; }\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\"; }\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px; }\n\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto; }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto; } }\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; }\n .btn-group > .btn,\n .btn-group-vertical > .btn {\n position: relative;\n float: left; }\n .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n .btn-group-vertical > .btn:hover,\n .btn-group-vertical > .btn:focus,\n .btn-group-vertical > .btn:active,\n .btn-group-vertical > .btn.active {\n z-index: 2; }\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px; }\n\n.btn-toolbar {\n margin-left: -5px; }\n .btn-toolbar:before, .btn-toolbar:after {\n content: \" \";\n display: table; }\n .btn-toolbar:after {\n clear: both; }\n .btn-toolbar .btn,\n .btn-toolbar .btn-group,\n .btn-toolbar .input-group {\n float: left; }\n .btn-toolbar > .btn,\n .btn-toolbar > .btn-group,\n .btn-toolbar > .input-group {\n margin-left: 5px; }\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0; }\n\n.btn-group > .btn:first-child {\n margin-left: 0; }\n .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0; }\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0; }\n\n.btn-group > .btn-group {\n float: left; }\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0; }\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0; }\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0; }\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0; }\n\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px; }\n\n.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px; }\n\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n .btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none; }\n\n.btn .caret {\n margin-left: 0; }\n\n.btn-lg .caret, .btn-group-lg > .btn .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0; }\n\n.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {\n border-width: 0 5px 5px; }\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%; }\n\n.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after {\n content: \" \";\n display: table; }\n\n.btn-group-vertical > .btn-group:after {\n clear: both; }\n\n.btn-group-vertical > .btn-group > .btn {\n float: none; }\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0; }\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0; }\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px; }\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0; }\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0; }\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate; }\n .btn-group-justified > .btn,\n .btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%; }\n .btn-group-justified > .btn-group .btn {\n width: 100%; }\n .btn-group-justified > .btn-group .dropdown-menu {\n left: auto; }\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none; }\n\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate; }\n .input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0; }\n .input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0; }\n .input-group .form-control:focus {\n z-index: 3; }\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell; }\n .input-group-addon:not(:first-child):not(:last-child),\n .input-group-btn:not(:first-child):not(:last-child),\n .input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0; }\n\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; }\n\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px; }\n .input-group-addon.input-sm,\n .input-group-sm > .input-group-addon,\n .input-group-sm > .input-group-btn > .input-group-addon.btn {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px; }\n .input-group-addon.input-lg,\n .input-group-lg > .input-group-addon,\n .input-group-lg > .input-group-btn > .input-group-addon.btn {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px; }\n .input-group-addon input[type=\"radio\"],\n .input-group-addon input[type=\"checkbox\"] {\n margin-top: 0; }\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0; }\n\n.input-group-addon:first-child {\n border-right: 0; }\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0; }\n\n.input-group-addon:last-child {\n border-left: 0; }\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap; }\n .input-group-btn > .btn {\n position: relative; }\n .input-group-btn > .btn + .btn {\n margin-left: -1px; }\n .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {\n z-index: 2; }\n .input-group-btn:first-child > .btn,\n .input-group-btn:first-child > .btn-group {\n margin-right: -1px; }\n .input-group-btn:last-child > .btn,\n .input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px; }\n\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none; }\n .nav:before, .nav:after {\n content: \" \";\n display: table; }\n .nav:after {\n clear: both; }\n .nav > li {\n position: relative;\n display: block; }\n .nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px; }\n .nav > li > a:hover, .nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee; }\n .nav > li.disabled > a {\n color: #777777; }\n .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed; }\n .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7; }\n .nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5; }\n .nav > li > a > img {\n max-width: none; }\n\n.nav-tabs {\n border-bottom: 1px solid #ddd; }\n .nav-tabs > li {\n float: left;\n margin-bottom: -1px; }\n .nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0; }\n .nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd; }\n .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default; }\n\n.nav-pills > li {\n float: left; }\n .nav-pills > li > a {\n border-radius: 4px; }\n .nav-pills > li + li {\n margin-left: 2px; }\n .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7; }\n\n.nav-stacked > li {\n float: none; }\n .nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0; }\n\n.nav-justified, .nav-tabs.nav-justified {\n width: 100%; }\n .nav-justified > li, .nav-tabs.nav-justified > li {\n float: none; }\n .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px; }\n .nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto; }\n @media (min-width: 768px) {\n .nav-justified > li, .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%; }\n .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n margin-bottom: 0; } }\n\n.nav-tabs-justified, .nav-tabs.nav-justified {\n border-bottom: 0; }\n .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px; }\n .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd; }\n @media (min-width: 768px) {\n .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0; }\n .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff; } }\n\n.tab-content > .tab-pane {\n display: none; }\n\n.tab-content > .active {\n display: block; }\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0; }\n\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent; }\n .navbar:before, .navbar:after {\n content: \" \";\n display: table; }\n .navbar:after {\n clear: both; }\n @media (min-width: 768px) {\n .navbar {\n border-radius: 4px; } }\n\n.navbar-header:before, .navbar-header:after {\n content: \" \";\n display: table; }\n\n.navbar-header:after {\n clear: both; }\n\n@media (min-width: 768px) {\n .navbar-header {\n float: left; } }\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch; }\n .navbar-collapse:before, .navbar-collapse:after {\n content: \" \";\n display: table; }\n .navbar-collapse:after {\n clear: both; }\n .navbar-collapse.in {\n overflow-y: auto; }\n @media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none; }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important; }\n .navbar-collapse.in {\n overflow-y: visible; }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0; } }\n\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px; }\n @media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px; } }\n\n.container > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-header,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px; }\n @media (min-width: 768px) {\n .container > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-header,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0; } }\n\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px; }\n @media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0; } }\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030; }\n @media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0; } }\n\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px; }\n\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0; }\n\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px; }\n .navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none; }\n .navbar-brand > img {\n display: block; }\n @media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px; } }\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px; }\n .navbar-toggle:focus {\n outline: 0; }\n .navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px; }\n .navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px; }\n @media (min-width: 768px) {\n .navbar-toggle {\n display: none; } }\n\n.navbar-nav {\n margin: 7.5px -15px; }\n .navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px; }\n @media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none; }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px; }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px; }\n .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none; } }\n @media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0; }\n .navbar-nav > li {\n float: left; }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px; } }\n\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px; }\n @media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle; }\n .navbar-form .form-control-static {\n display: inline-block; }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle; }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto; }\n .navbar-form .input-group > .form-control {\n width: 100%; }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0; }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0; }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0; } }\n @media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px; }\n .navbar-form .form-group:last-child {\n margin-bottom: 0; } }\n @media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none; } }\n\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0; }\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0; }\n\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px; }\n .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {\n margin-top: 10px;\n margin-bottom: 10px; }\n .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {\n margin-top: 14px;\n margin-bottom: 14px; }\n\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px; }\n @media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px; } }\n\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important; }\n .navbar-right {\n float: right !important;\n margin-right: -15px; }\n .navbar-right ~ .navbar-right {\n margin-right: 0; } }\n\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7; }\n .navbar-default .navbar-brand {\n color: #777; }\n .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent; }\n .navbar-default .navbar-text {\n color: #777; }\n .navbar-default .navbar-nav > li > a {\n color: #777; }\n .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent; }\n .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7; }\n .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent; }\n .navbar-default .navbar-toggle {\n border-color: #ddd; }\n .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {\n background-color: #ddd; }\n .navbar-default .navbar-toggle .icon-bar {\n background-color: #888; }\n .navbar-default .navbar-collapse,\n .navbar-default .navbar-form {\n border-color: #e7e7e7; }\n .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555; }\n @media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777; }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent; }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7; }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent; } }\n .navbar-default .navbar-link {\n color: #777; }\n .navbar-default .navbar-link:hover {\n color: #333; }\n .navbar-default .btn-link {\n color: #777; }\n .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {\n color: #333; }\n .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,\n fieldset[disabled] .navbar-default .btn-link:hover,\n fieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc; }\n\n.navbar-inverse {\n background-color: #222;\n border-color: #090909; }\n .navbar-inverse .navbar-brand {\n color: #9d9d9d; }\n .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-text {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #090909; }\n .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent; }\n .navbar-inverse .navbar-toggle {\n border-color: #333; }\n .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {\n background-color: #333; }\n .navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff; }\n .navbar-inverse .navbar-collapse,\n .navbar-inverse .navbar-form {\n border-color: #101010; }\n .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #090909;\n color: #fff; }\n @media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent; } }\n .navbar-inverse .navbar-link {\n color: #9d9d9d; }\n .navbar-inverse .navbar-link:hover {\n color: #fff; }\n .navbar-inverse .btn-link {\n color: #9d9d9d; }\n .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {\n color: #fff; }\n .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,\n fieldset[disabled] .navbar-inverse .btn-link:hover,\n fieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444; }\n\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px; }\n .breadcrumb > li {\n display: inline-block; }\n .breadcrumb > li + li:before {\n content: \"/ \";\n padding: 0 5px;\n color: #ccc; }\n .breadcrumb > .active {\n color: #777777; }\n\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px; }\n .pagination > li {\n display: inline; }\n .pagination > li > a,\n .pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px; }\n .pagination > li:first-child > a,\n .pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px; }\n .pagination > li:last-child > a,\n .pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px; }\n .pagination > li > a:hover, .pagination > li > a:focus,\n .pagination > li > span:hover,\n .pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd; }\n .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,\n .pagination > .active > span,\n .pagination > .active > span:hover,\n .pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default; }\n .pagination > .disabled > span,\n .pagination > .disabled > span:hover,\n .pagination > .disabled > span:focus,\n .pagination > .disabled > a,\n .pagination > .disabled > a:hover,\n .pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed; }\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333; }\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px; }\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px; }\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5; }\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px; }\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px; }\n\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center; }\n .pager:before, .pager:after {\n content: \" \";\n display: table; }\n .pager:after {\n clear: both; }\n .pager li {\n display: inline; }\n .pager li > a,\n .pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px; }\n .pager li > a:hover,\n .pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee; }\n .pager .next > a,\n .pager .next > span {\n float: right; }\n .pager .previous > a,\n .pager .previous > span {\n float: left; }\n .pager .disabled > a,\n .pager .disabled > a:hover,\n .pager .disabled > a:focus,\n .pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed; }\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em; }\n .label:empty {\n display: none; }\n .btn .label {\n position: relative;\n top: -1px; }\n\na.label:hover, a.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer; }\n\n.label-default {\n background-color: #777777; }\n .label-default[href]:hover, .label-default[href]:focus {\n background-color: #5e5e5e; }\n\n.label-primary {\n background-color: #337ab7; }\n .label-primary[href]:hover, .label-primary[href]:focus {\n background-color: #286090; }\n\n.label-success {\n background-color: #5cb85c; }\n .label-success[href]:hover, .label-success[href]:focus {\n background-color: #449d44; }\n\n.label-info {\n background-color: #5bc0de; }\n .label-info[href]:hover, .label-info[href]:focus {\n background-color: #31b0d5; }\n\n.label-warning {\n background-color: #f0ad4e; }\n .label-warning[href]:hover, .label-warning[href]:focus {\n background-color: #ec971f; }\n\n.label-danger {\n background-color: #d9534f; }\n .label-danger[href]:hover, .label-danger[href]:focus {\n background-color: #c9302c; }\n\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px; }\n .badge:empty {\n display: none; }\n .btn .badge {\n position: relative;\n top: -1px; }\n .btn-xs .badge, .btn-group-xs > .btn .badge,\n .btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px; }\n .list-group-item.active > .badge,\n .nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff; }\n .list-group-item > .badge {\n float: right; }\n .list-group-item > .badge + .badge {\n margin-right: 5px; }\n .nav-pills > li > a > .badge {\n margin-left: 3px; }\n\na.badge:hover, a.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer; }\n\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee; }\n .jumbotron h1,\n .jumbotron .h1 {\n color: inherit; }\n .jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200; }\n .jumbotron > hr {\n border-top-color: #d5d5d5; }\n .container .jumbotron,\n .container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px; }\n .jumbotron .container {\n max-width: 100%; }\n @media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px; }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px; }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px; } }\n\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out; }\n .thumbnail > img,\n .thumbnail a > img {\n display: block;\n max-width: 100%;\n height: auto;\n margin-left: auto;\n margin-right: auto; }\n .thumbnail .caption {\n padding: 9px;\n color: #333333; }\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7; }\n\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px; }\n .alert h4 {\n margin-top: 0;\n color: inherit; }\n .alert .alert-link {\n font-weight: bold; }\n .alert > p,\n .alert > ul {\n margin-bottom: 0; }\n .alert > p + p {\n margin-top: 5px; }\n\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px; }\n .alert-dismissable .close,\n .alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit; }\n\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d; }\n .alert-success hr {\n border-top-color: #c9e2b3; }\n .alert-success .alert-link {\n color: #2b542c; }\n\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f; }\n .alert-info hr {\n border-top-color: #a6e1ec; }\n .alert-info .alert-link {\n color: #245269; }\n\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b; }\n .alert-warning hr {\n border-top-color: #f7e1b5; }\n .alert-warning .alert-link {\n color: #66512c; }\n\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442; }\n .alert-danger hr {\n border-top-color: #e4b9c0; }\n .alert-danger .alert-link {\n color: #843534; }\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0; }\n to {\n background-position: 0 0; } }\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0; }\n to {\n background-position: 0 0; } }\n\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); }\n\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease; }\n\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px; }\n\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite; }\n\n.progress-bar-success {\n background-color: #5cb85c; }\n .progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }\n\n.progress-bar-info {\n background-color: #5bc0de; }\n .progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }\n\n.progress-bar-warning {\n background-color: #f0ad4e; }\n .progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }\n\n.progress-bar-danger {\n background-color: #d9534f; }\n .progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }\n\n.media {\n margin-top: 15px; }\n .media:first-child {\n margin-top: 0; }\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden; }\n\n.media-body {\n width: 10000px; }\n\n.media-object {\n display: block; }\n .media-object.img-thumbnail {\n max-width: none; }\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px; }\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px; }\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top; }\n\n.media-middle {\n vertical-align: middle; }\n\n.media-bottom {\n vertical-align: bottom; }\n\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px; }\n\n.media-list {\n padding-left: 0;\n list-style: none; }\n\n.list-group {\n margin-bottom: 20px;\n padding-left: 0; }\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd; }\n .list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px; }\n .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px; }\n\na.list-group-item,\nbutton.list-group-item {\n color: #555; }\n a.list-group-item .list-group-item-heading,\n button.list-group-item .list-group-item-heading {\n color: #333; }\n a.list-group-item:hover, a.list-group-item:focus,\n button.list-group-item:hover,\n button.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5; }\n\nbutton.list-group-item {\n width: 100%;\n text-align: left; }\n\n.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed; }\n .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {\n color: inherit; }\n .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {\n color: #777777; }\n\n.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7; }\n .list-group-item.active .list-group-item-heading,\n .list-group-item.active .list-group-item-heading > small,\n .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,\n .list-group-item.active:hover .list-group-item-heading > small,\n .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,\n .list-group-item.active:focus .list-group-item-heading > small,\n .list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit; }\n .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {\n color: #c7ddef; }\n\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8; }\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d; }\n a.list-group-item-success .list-group-item-heading,\n button.list-group-item-success .list-group-item-heading {\n color: inherit; }\n a.list-group-item-success:hover, a.list-group-item-success:focus,\n button.list-group-item-success:hover,\n button.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6; }\n a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,\n button.list-group-item-success.active,\n button.list-group-item-success.active:hover,\n button.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d; }\n\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7; }\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f; }\n a.list-group-item-info .list-group-item-heading,\n button.list-group-item-info .list-group-item-heading {\n color: inherit; }\n a.list-group-item-info:hover, a.list-group-item-info:focus,\n button.list-group-item-info:hover,\n button.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3; }\n a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,\n button.list-group-item-info.active,\n button.list-group-item-info.active:hover,\n button.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f; }\n\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3; }\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b; }\n a.list-group-item-warning .list-group-item-heading,\n button.list-group-item-warning .list-group-item-heading {\n color: inherit; }\n a.list-group-item-warning:hover, a.list-group-item-warning:focus,\n button.list-group-item-warning:hover,\n button.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc; }\n a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,\n button.list-group-item-warning.active,\n button.list-group-item-warning.active:hover,\n button.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b; }\n\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede; }\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442; }\n a.list-group-item-danger .list-group-item-heading,\n button.list-group-item-danger .list-group-item-heading {\n color: inherit; }\n a.list-group-item-danger:hover, a.list-group-item-danger:focus,\n button.list-group-item-danger:hover,\n button.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc; }\n a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,\n button.list-group-item-danger.active,\n button.list-group-item-danger.active:hover,\n button.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442; }\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px; }\n\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3; }\n\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }\n\n.panel-body {\n padding: 15px; }\n .panel-body:before, .panel-body:after {\n content: \" \";\n display: table; }\n .panel-body:after {\n clear: both; }\n\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px; }\n .panel-heading > .dropdown .dropdown-toggle {\n color: inherit; }\n\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit; }\n .panel-title > a,\n .panel-title > small,\n .panel-title > .small,\n .panel-title > small > a,\n .panel-title > .small > a {\n color: inherit; }\n\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px; }\n\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0; }\n .panel > .list-group .list-group-item,\n .panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0; }\n .panel > .list-group:first-child .list-group-item:first-child,\n .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px; }\n .panel > .list-group:last-child .list-group-item:last-child,\n .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px; }\n\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0; }\n\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0; }\n\n.list-group + .panel-footer {\n border-top-width: 0; }\n\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0; }\n .panel > .table caption,\n .panel > .table-responsive > .table caption,\n .panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px; }\n\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px; }\n\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px; }\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd; }\n\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0; }\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0; }\n .panel > .table-bordered > thead > tr > th:first-child,\n .panel > .table-bordered > thead > tr > td:first-child,\n .panel > .table-bordered > tbody > tr > th:first-child,\n .panel > .table-bordered > tbody > tr > td:first-child,\n .panel > .table-bordered > tfoot > tr > th:first-child,\n .panel > .table-bordered > tfoot > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0; }\n .panel > .table-bordered > thead > tr > th:last-child,\n .panel > .table-bordered > thead > tr > td:last-child,\n .panel > .table-bordered > tbody > tr > th:last-child,\n .panel > .table-bordered > tbody > tr > td:last-child,\n .panel > .table-bordered > tfoot > tr > th:last-child,\n .panel > .table-bordered > tfoot > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0; }\n .panel > .table-bordered > thead > tr:first-child > td,\n .panel > .table-bordered > thead > tr:first-child > th,\n .panel > .table-bordered > tbody > tr:first-child > td,\n .panel > .table-bordered > tbody > tr:first-child > th,\n .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0; }\n .panel > .table-bordered > tbody > tr:last-child > td,\n .panel > .table-bordered > tbody > tr:last-child > th,\n .panel > .table-bordered > tfoot > tr:last-child > td,\n .panel > .table-bordered > tfoot > tr:last-child > th,\n .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0; }\n\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0; }\n\n.panel-group {\n margin-bottom: 20px; }\n .panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px; }\n .panel-group .panel + .panel {\n margin-top: 5px; }\n .panel-group .panel-heading {\n border-bottom: 0; }\n .panel-group .panel-heading + .panel-collapse > .panel-body,\n .panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd; }\n .panel-group .panel-footer {\n border-top: 0; }\n .panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd; }\n\n.panel-default {\n border-color: #ddd; }\n .panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd; }\n .panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd; }\n .panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333; }\n .panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd; }\n\n.panel-primary {\n border-color: #337ab7; }\n .panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7; }\n .panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7; }\n .panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff; }\n .panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7; }\n\n.panel-success {\n border-color: #d6e9c6; }\n .panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6; }\n .panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6; }\n .panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d; }\n .panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6; }\n\n.panel-info {\n border-color: #bce8f1; }\n .panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1; }\n .panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1; }\n .panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f; }\n .panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1; }\n\n.panel-warning {\n border-color: #faebcc; }\n .panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc; }\n .panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc; }\n .panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b; }\n .panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc; }\n\n.panel-danger {\n border-color: #ebccd1; }\n .panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1; }\n .panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1; }\n .panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442; }\n .panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1; }\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden; }\n .embed-responsive .embed-responsive-item,\n .embed-responsive iframe,\n .embed-responsive embed,\n .embed-responsive object,\n .embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0; }\n\n.embed-responsive-16by9 {\n padding-bottom: 56.25%; }\n\n.embed-responsive-4by3 {\n padding-bottom: 75%; }\n\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }\n .well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15); }\n\n.well-lg {\n padding: 24px;\n border-radius: 6px; }\n\n.well-sm {\n padding: 9px;\n border-radius: 3px; }\n\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20); }\n .close:hover, .close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50); }\n\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none; }\n\n.modal-open {\n overflow: hidden; }\n\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0; }\n .modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out; }\n .modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0); }\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto; }\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px; }\n\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0; }\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000; }\n .modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0); }\n .modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50); }\n\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5; }\n .modal-header:before, .modal-header:after {\n content: \" \";\n display: table; }\n .modal-header:after {\n clear: both; }\n\n.modal-header .close {\n margin-top: -2px; }\n\n.modal-title {\n margin: 0;\n line-height: 1.42857; }\n\n.modal-body {\n position: relative;\n padding: 15px; }\n\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5; }\n .modal-footer:before, .modal-footer:after {\n content: \" \";\n display: table; }\n .modal-footer:after {\n clear: both; }\n .modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; }\n .modal-footer .btn-group .btn + .btn {\n margin-left: -1px; }\n .modal-footer .btn-block + .btn-block {\n margin-left: 0; }\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll; }\n\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto; }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }\n .modal-sm {\n width: 300px; } }\n\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px; } }\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0); }\n .tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90); }\n .tooltip.top {\n margin-top: -3px;\n padding: 5px 0; }\n .tooltip.right {\n margin-left: 3px;\n padding: 0 5px; }\n .tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0; }\n .tooltip.left {\n margin-left: -3px;\n padding: 0 5px; }\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px; }\n\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid; }\n\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000; }\n\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000; }\n\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }\n .popover.top {\n margin-top: -10px; }\n .popover.right {\n margin-left: 10px; }\n .popover.bottom {\n margin-top: 10px; }\n .popover.left {\n margin-left: -10px; }\n\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0; }\n\n.popover-content {\n padding: 9px 14px; }\n\n.popover > .arrow, .popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid; }\n\n.popover > .arrow {\n border-width: 11px; }\n\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\"; }\n\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px; }\n .popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff; }\n\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25); }\n .popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff; }\n\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px; }\n .popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff; }\n\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25); }\n .popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px; }\n\n.carousel {\n position: relative; }\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%; }\n .carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left; }\n .carousel-inner > .item > img,\n .carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n line-height: 1; }\n @media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px; }\n .carousel-inner > .item.next, .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0; }\n .carousel-inner > .item.prev, .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0; }\n .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0; } }\n .carousel-inner > .active,\n .carousel-inner > .next,\n .carousel-inner > .prev {\n display: block; }\n .carousel-inner > .active {\n left: 0; }\n .carousel-inner > .next,\n .carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%; }\n .carousel-inner > .next {\n left: 100%; }\n .carousel-inner > .prev {\n left: -100%; }\n .carousel-inner > .next.left,\n .carousel-inner > .prev.right {\n left: 0; }\n .carousel-inner > .active.left {\n left: -100%; }\n .carousel-inner > .active.right {\n left: 100%; }\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: transparent; }\n .carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); }\n .carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }\n .carousel-control:hover, .carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90); }\n .carousel-control .icon-prev,\n .carousel-control .icon-next,\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block; }\n .carousel-control .icon-prev,\n .carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px; }\n .carousel-control .icon-next,\n .carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px; }\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif; }\n .carousel-control .icon-prev:before {\n content: '\\2039'; }\n .carousel-control .icon-next:before {\n content: '\\203a'; }\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center; }\n .carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: transparent; }\n .carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff; }\n\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }\n .carousel-caption .btn {\n text-shadow: none; }\n\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px; }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px; }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px; }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px; }\n .carousel-indicators {\n bottom: 20px; } }\n\n.clearfix:before, .clearfix:after {\n content: \" \";\n display: table; }\n\n.clearfix:after {\n clear: both; }\n\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto; }\n\n.pull-right {\n float: right !important; }\n\n.pull-left {\n float: left !important; }\n\n.hide {\n display: none !important; }\n\n.show {\n display: block !important; }\n\n.invisible {\n visibility: hidden; }\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0; }\n\n.hidden {\n display: none !important; }\n\n.affix {\n position: fixed; }\n\n@-ms-viewport {\n width: device-width; }\n\n.visible-xs {\n display: none !important; }\n\n.visible-sm {\n display: none !important; }\n\n.visible-md {\n display: none !important; }\n\n.visible-lg {\n display: none !important; }\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important; }\n\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important; }\n table.visible-xs {\n display: table !important; }\n tr.visible-xs {\n display: table-row !important; }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important; }\n table.visible-sm {\n display: table !important; }\n tr.visible-sm {\n display: table-row !important; }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important; }\n table.visible-md {\n display: table !important; }\n tr.visible-md {\n display: table-row !important; }\n th.visible-md,\n td.visible-md {\n display: table-cell !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important; }\n table.visible-lg {\n display: table !important; }\n tr.visible-lg {\n display: table-row !important; }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important; } }\n\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important; } }\n\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important; } }\n\n.visible-print {\n display: none !important; }\n\n@media print {\n .visible-print {\n display: block !important; }\n table.visible-print {\n display: table !important; }\n tr.visible-print {\n display: table-row !important; }\n th.visible-print,\n td.visible-print {\n display: table-cell !important; } }\n\n.visible-print-block {\n display: none !important; }\n @media print {\n .visible-print-block {\n display: block !important; } }\n\n.visible-print-inline {\n display: none !important; }\n @media print {\n .visible-print-inline {\n display: inline !important; } }\n\n.visible-print-inline-block {\n display: none !important; }\n @media print {\n .visible-print-inline-block {\n display: inline-block !important; } }\n\n@media print {\n .hidden-print {\n display: none !important; } }\n\n.bg-red {\n background: red; }\n\nbody {\n padding-top: 60px; }\n\nmain a:link,\nmain a:hover {\n border-bottom: 1px solid;\n text-decoration: none; }\n\nmain p img {\n margin: 1.5em 0; }\n\n.embed-container {\n padding: 56.25% 0 0;\n position: relative;\n width: 100%; }\n .embed-container iframe,\n .embed-container embed {\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n width: 100%; }\n\n.is-centered {\n margin: 0 auto; }\n\n.is-flex {\n display: flex; }\n\n.is-half {\n width: 50%; }\n\n.flex {\n flex: 1; }\n\n.flex-wrap {\n flex-wrap: wrap; }\n\n.list-style-none {\n list-style: none; }\n\n.display-block {\n display: block; }\n\n.display-inline {\n display: inline; }\n\n.display-inline-block {\n display: inline-block; }\n\n.text-left {\n text-align: left; }\n\n.text-center {\n text-align: center; }\n\n.text-right {\n text-align: right; }\n\n.availability p:last-of-type {\n margin-bottom: 0; }\n\n.badges > * {\n display: block;\n margin: 0 auto 10px; }\n .badges > *:last-child {\n margin-bottom: 0; }\n\n.badges img {\n max-width: 100%; }\n\n.copyright {\n border-top: 1px solid #CCC;\n margin-top: 1em;\n padding-top: 1em; }\n\n.meetups:before, .meetups:after {\n content: \" \";\n display: table; }\n\n.meetups:after {\n clear: both; }\n\n.meetups ul {\n list-style: none;\n padding-left: 0;\n margin-left: 0; }\n\n.meetups li {\n display: inline-block;\n padding: 5px 0;\n margin: 0 5px 5px 0; }\n\n.meetups a {\n display: block; }\n\n.meetups img {\n max-height: 40px;\n width: auto; }\n\n.skills-list {\n margin: 1em 0;\n padding: 0; }\n\n.skill {\n margin: 0 10px 15px 0; }\n\n.skill-image {\n height: 40px;\n width: auto; }\n","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n// Core variables and mixins\n@import \"bootstrap/variables\";\n@import \"bootstrap/mixins\";\n\n// Reset and dependencies\n@import \"bootstrap/normalize\";\n@import \"bootstrap/print\";\n@import \"bootstrap/glyphicons\";\n\n// Core CSS\n@import \"bootstrap/scaffolding\";\n@import \"bootstrap/type\";\n@import \"bootstrap/code\";\n@import \"bootstrap/grid\";\n@import \"bootstrap/tables\";\n@import \"bootstrap/forms\";\n@import \"bootstrap/buttons\";\n\n// Components\n@import \"bootstrap/component-animations\";\n@import \"bootstrap/dropdowns\";\n@import \"bootstrap/button-groups\";\n@import \"bootstrap/input-groups\";\n@import \"bootstrap/navs\";\n@import \"bootstrap/navbar\";\n@import \"bootstrap/breadcrumbs\";\n@import \"bootstrap/pagination\";\n@import \"bootstrap/pager\";\n@import \"bootstrap/labels\";\n@import \"bootstrap/badges\";\n@import \"bootstrap/jumbotron\";\n@import \"bootstrap/thumbnails\";\n@import \"bootstrap/alerts\";\n@import \"bootstrap/progress-bars\";\n@import \"bootstrap/media\";\n@import \"bootstrap/list-group\";\n@import \"bootstrap/panels\";\n@import \"bootstrap/responsive-embed\";\n@import \"bootstrap/wells\";\n@import \"bootstrap/close\";\n\n// Components w/ JavaScript\n@import \"bootstrap/modals\";\n@import \"bootstrap/tooltip\";\n@import \"bootstrap/popovers\";\n@import \"bootstrap/carousel\";\n\n// Utility classes\n@import \"bootstrap/utilities\";\n@import \"bootstrap/responsive-utilities\";\n","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star \n\n@at-root {\n // Import the fonts\n @font-face {\n font-family: 'Glyphicons Halflings';\n src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));\n src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),\n url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),\n url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),\n url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),\n url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');\n }\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n @include box-sizing(border-box);\n}\n*:before,\n*:after {\n @include box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: $font-family-base;\n font-size: $font-size-base;\n line-height: $line-height-base;\n color: $text-color;\n background-color: $body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus {\n @include tab-focus;\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n @include img-responsive;\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: $border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: $thumbnail-padding;\n line-height: $line-height-base;\n background-color: $thumbnail-bg;\n border: 1px solid $thumbnail-border;\n border-radius: $thumbnail-border-radius;\n @include transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n @include img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: $line-height-computed;\n margin-bottom: $line-height-computed;\n border: 0;\n border-top: 1px solid $hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n@mixin animation($animation) {\n -webkit-animation: $animation;\n -o-animation: $animation;\n animation: $animation;\n}\n@mixin animation-name($name) {\n -webkit-animation-name: $name;\n animation-name: $name;\n}\n@mixin animation-duration($duration) {\n -webkit-animation-duration: $duration;\n animation-duration: $duration;\n}\n@mixin animation-timing-function($timing-function) {\n -webkit-animation-timing-function: $timing-function;\n animation-timing-function: $timing-function;\n}\n@mixin animation-delay($delay) {\n -webkit-animation-delay: $delay;\n animation-delay: $delay;\n}\n@mixin animation-iteration-count($iteration-count) {\n -webkit-animation-iteration-count: $iteration-count;\n animation-iteration-count: $iteration-count;\n}\n@mixin animation-direction($direction) {\n -webkit-animation-direction: $direction;\n animation-direction: $direction;\n}\n@mixin animation-fill-mode($fill-mode) {\n -webkit-animation-fill-mode: $fill-mode;\n animation-fill-mode: $fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n@mixin backface-visibility($visibility) {\n -webkit-backface-visibility: $visibility;\n -moz-backface-visibility: $visibility;\n backface-visibility: $visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n@mixin box-shadow($shadow...) {\n -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n box-shadow: $shadow;\n}\n\n// Box sizing\n@mixin box-sizing($boxmodel) {\n -webkit-box-sizing: $boxmodel;\n -moz-box-sizing: $boxmodel;\n box-sizing: $boxmodel;\n}\n\n// CSS3 Content Columns\n@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {\n -webkit-column-count: $column-count;\n -moz-column-count: $column-count;\n column-count: $column-count;\n -webkit-column-gap: $column-gap;\n -moz-column-gap: $column-gap;\n column-gap: $column-gap;\n}\n\n// Optional hyphenation\n@mixin hyphens($mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: $mode;\n -moz-hyphens: $mode;\n -ms-hyphens: $mode; // IE10+\n -o-hyphens: $mode;\n hyphens: $mode;\n}\n\n// Placeholder text\n@mixin placeholder($color: $input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: $color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: $color; } // Safari and Chrome\n}\n\n// Transformations\n@mixin scale($ratio...) {\n -webkit-transform: scale($ratio);\n -ms-transform: scale($ratio); // IE9 only\n -o-transform: scale($ratio);\n transform: scale($ratio);\n}\n\n@mixin scaleX($ratio) {\n -webkit-transform: scaleX($ratio);\n -ms-transform: scaleX($ratio); // IE9 only\n -o-transform: scaleX($ratio);\n transform: scaleX($ratio);\n}\n@mixin scaleY($ratio) {\n -webkit-transform: scaleY($ratio);\n -ms-transform: scaleY($ratio); // IE9 only\n -o-transform: scaleY($ratio);\n transform: scaleY($ratio);\n}\n@mixin skew($x, $y) {\n -webkit-transform: skewX($x) skewY($y);\n -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX($x) skewY($y);\n transform: skewX($x) skewY($y);\n}\n@mixin translate($x, $y) {\n -webkit-transform: translate($x, $y);\n -ms-transform: translate($x, $y); // IE9 only\n -o-transform: translate($x, $y);\n transform: translate($x, $y);\n}\n@mixin translate3d($x, $y, $z) {\n -webkit-transform: translate3d($x, $y, $z);\n transform: translate3d($x, $y, $z);\n}\n@mixin rotate($degrees) {\n -webkit-transform: rotate($degrees);\n -ms-transform: rotate($degrees); // IE9 only\n -o-transform: rotate($degrees);\n transform: rotate($degrees);\n}\n@mixin rotateX($degrees) {\n -webkit-transform: rotateX($degrees);\n -ms-transform: rotateX($degrees); // IE9 only\n -o-transform: rotateX($degrees);\n transform: rotateX($degrees);\n}\n@mixin rotateY($degrees) {\n -webkit-transform: rotateY($degrees);\n -ms-transform: rotateY($degrees); // IE9 only\n -o-transform: rotateY($degrees);\n transform: rotateY($degrees);\n}\n@mixin perspective($perspective) {\n -webkit-perspective: $perspective;\n -moz-perspective: $perspective;\n perspective: $perspective;\n}\n@mixin perspective-origin($perspective) {\n -webkit-perspective-origin: $perspective;\n -moz-perspective-origin: $perspective;\n perspective-origin: $perspective;\n}\n@mixin transform-origin($origin) {\n -webkit-transform-origin: $origin;\n -moz-transform-origin: $origin;\n -ms-transform-origin: $origin; // IE9 only\n transform-origin: $origin;\n}\n\n\n// Transitions\n\n@mixin transition($transition...) {\n -webkit-transition: $transition;\n -o-transition: $transition;\n transition: $transition;\n}\n@mixin transition-property($transition-property...) {\n -webkit-transition-property: $transition-property;\n transition-property: $transition-property;\n}\n@mixin transition-delay($transition-delay) {\n -webkit-transition-delay: $transition-delay;\n transition-delay: $transition-delay;\n}\n@mixin transition-duration($transition-duration...) {\n -webkit-transition-duration: $transition-duration;\n transition-duration: $transition-duration;\n}\n@mixin transition-timing-function($timing-function) {\n -webkit-transition-timing-function: $timing-function;\n transition-timing-function: $timing-function;\n}\n@mixin transition-transform($transition...) {\n -webkit-transition: -webkit-transform $transition;\n -moz-transition: -moz-transform $transition;\n -o-transition: -o-transform $transition;\n transition: transform $transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n@mixin user-select($select) {\n -webkit-user-select: $select;\n -moz-user-select: $select;\n -ms-user-select: $select; // IE10+\n user-select: $select;\n}\n","$bootstrap-sass-asset-helper: false !default;\n//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n$gray-base: #000 !default;\n$gray-darker: lighten($gray-base, 13.5%) !default; // #222\n$gray-dark: lighten($gray-base, 20%) !default; // #333\n$gray: lighten($gray-base, 33.5%) !default; // #555\n$gray-light: lighten($gray-base, 46.7%) !default; // #777\n$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee\n\n$brand-primary: darken(#428bca, 6.5%) !default; // #337ab7\n$brand-success: #5cb85c !default;\n$brand-info: #5bc0de !default;\n$brand-warning: #f0ad4e !default;\n$brand-danger: #d9534f !default;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for ``.\n$body-bg: #fff !default;\n//** Global text color on ``.\n$text-color: $gray-dark !default;\n\n//** Global textual link color.\n$link-color: $brand-primary !default;\n//** Link hover color set via `darken()` function.\n$link-hover-color: darken($link-color, 15%) !default;\n//** Link hover decoration.\n$link-hover-decoration: underline !default;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif: Georgia, \"Times New Roman\", Times, serif !default;\n//** Default monospace fonts for ``, ``, and ``.\n$font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n\n$font-size-base: 14px !default;\n$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px\n\n$font-size-h1: floor(($font-size-base * 2.6)) !default; // ~36px\n$font-size-h2: floor(($font-size-base * 2.15)) !default; // ~30px\n$font-size-h3: ceil(($font-size-base * 1.7)) !default; // ~24px\n$font-size-h4: ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-h5: $font-size-base !default;\n$font-size-h6: ceil(($font-size-base * 0.85)) !default; // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n$line-height-base: 1.428571429 !default; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n$line-height-computed: floor(($font-size-base * $line-height-base)) !default; // ~20px\n\n//** By default, this inherits from the ``.\n$headings-font-family: inherit !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n\n// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.\n// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.\n$icon-font-path: if($bootstrap-sass-asset-helper, \"bootstrap/\", \"../fonts/bootstrap/\") !default;\n\n//** File name for all font files.\n$icon-font-name: \"glyphicons-halflings-regular\" !default;\n//** Element ID within SVG icon file.\n$icon-font-svg-id: \"glyphicons_halflingsregular\" !default;\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n$padding-base-vertical: 6px !default;\n$padding-base-horizontal: 12px !default;\n\n$padding-large-vertical: 10px !default;\n$padding-large-horizontal: 16px !default;\n\n$padding-small-vertical: 5px !default;\n$padding-small-horizontal: 10px !default;\n\n$padding-xs-vertical: 1px !default;\n$padding-xs-horizontal: 5px !default;\n\n$line-height-large: 1.3333333 !default; // extra decimals for Win 8.1 Chrome\n$line-height-small: 1.5 !default;\n\n$border-radius-base: 4px !default;\n$border-radius-large: 6px !default;\n$border-radius-small: 3px !default;\n\n//** Global color for active items (e.g., navs or dropdowns).\n$component-active-color: #fff !default;\n//** Global background color for active items (e.g., navs or dropdowns).\n$component-active-bg: $brand-primary !default;\n\n//** Width of the `border` for generating carets that indicate dropdowns.\n$caret-width-base: 4px !default;\n//** Carets increase slightly in size for larger components.\n$caret-width-large: 5px !default;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ` `s.\n$table-cell-padding: 8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding: 5px !default;\n\n//** Default background color used for all tables.\n$table-bg: transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent: #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover: #f5f5f5 !default;\n$table-bg-active: $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color: #ddd !default;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$btn-font-weight: normal !default;\n\n$btn-default-color: #333 !default;\n$btn-default-bg: #fff !default;\n$btn-default-border: #ccc !default;\n\n$btn-primary-color: #fff !default;\n$btn-primary-bg: $brand-primary !default;\n$btn-primary-border: darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color: #fff !default;\n$btn-success-bg: $brand-success !default;\n$btn-success-border: darken($btn-success-bg, 5%) !default;\n\n$btn-info-color: #fff !default;\n$btn-info-bg: $brand-info !default;\n$btn-info-border: darken($btn-info-bg, 5%) !default;\n\n$btn-warning-color: #fff !default;\n$btn-warning-bg: $brand-warning !default;\n$btn-warning-border: darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color: #fff !default;\n$btn-danger-bg: $brand-danger !default;\n$btn-danger-border: darken($btn-danger-bg, 5%) !default;\n\n$btn-link-disabled-color: $gray-light !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius-base: $border-radius-base !default;\n$btn-border-radius-large: $border-radius-large !default;\n$btn-border-radius-small: $border-radius-small !default;\n\n\n//== Forms\n//\n//##\n\n//** ` ` background color\n$input-bg: #fff !default;\n//** ` ` background color\n$input-bg-disabled: $gray-lighter !default;\n\n//** Text color for ` `s\n$input-color: $gray !default;\n//** ` ` border color\n$input-border: #ccc !default;\n\n// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on ``s in some browsers, due to the limited stylability of ``s in CSS.\n$input-border-radius: $border-radius-base !default;\n//** Large `.form-control` border radius\n$input-border-radius-large: $border-radius-large !default;\n//** Small `.form-control` border radius\n$input-border-radius-small: $border-radius-small !default;\n\n//** Border color for inputs on focus\n$input-border-focus: #66afe9 !default;\n\n//** Placeholder text color\n$input-color-placeholder: #999 !default;\n\n//** Default `.form-control` height\n$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n//** Large `.form-control` height\n$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n//** Small `.form-control` height\n$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n//** `.form-group` margin\n$form-group-margin-bottom: 15px !default;\n\n$legend-color: $gray-dark !default;\n$legend-border-color: #e5e5e5 !default;\n\n//** Background color for textual input addons\n$input-group-addon-bg: $gray-lighter !default;\n//** Border color for textual input addons\n$input-group-addon-border-color: $input-border !default;\n\n//** Disabled cursor for form controls and buttons.\n$cursor-disabled: not-allowed !default;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n$dropdown-bg: #fff !default;\n//** Dropdown menu `border-color`.\n$dropdown-border: rgba(0,0,0,.15) !default;\n//** Dropdown menu `border-color` **for IE8**.\n$dropdown-fallback-border: #ccc !default;\n//** Divider color for between dropdown items.\n$dropdown-divider-bg: #e5e5e5 !default;\n\n//** Dropdown link text color.\n$dropdown-link-color: $gray-dark !default;\n//** Hover color for dropdown links.\n$dropdown-link-hover-color: darken($gray-dark, 5%) !default;\n//** Hover background for dropdown links.\n$dropdown-link-hover-bg: #f5f5f5 !default;\n\n//** Active dropdown menu item text color.\n$dropdown-link-active-color: $component-active-color !default;\n//** Active dropdown menu item background color.\n$dropdown-link-active-bg: $component-active-bg !default;\n\n//** Disabled dropdown menu item background color.\n$dropdown-link-disabled-color: $gray-light !default;\n\n//** Text color for headers within dropdown menus.\n$dropdown-header-color: $gray-light !default;\n\n//** Deprecated `$dropdown-caret-color` as of v3.1.0\n$dropdown-caret-color: #000 !default;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n$zindex-navbar: 1000 !default;\n$zindex-dropdown: 1000 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n$zindex-navbar-fixed: 1030 !default;\n$zindex-modal-background: 1040 !default;\n$zindex-modal: 1050 !default;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs: 480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min: $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone: $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm: 768px !default;\n$screen-sm-min: $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet: $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md: 992px !default;\n$screen-md-min: $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop: $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg: 1200px !default;\n$screen-lg-min: $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop: $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max: ($screen-sm-min - 1) !default;\n$screen-sm-max: ($screen-md-min - 1) !default;\n$screen-md-max: ($screen-lg-min - 1) !default;\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n$grid-columns: 12 !default;\n//** Padding between columns. Gets divided in half for the left and right.\n$grid-gutter-width: 30px !default;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n$grid-float-breakpoint: $screen-sm-min !default;\n//** Point at which the navbar begins collapsing.\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n$container-tablet: (720px + $grid-gutter-width) !default;\n//** For `$screen-sm-min` and up.\n$container-sm: $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop: (940px + $grid-gutter-width) !default;\n//** For `$screen-md-min` and up.\n$container-md: $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop: (1140px + $grid-gutter-width) !default;\n//** For `$screen-lg-min` and up.\n$container-lg: $container-large-desktop !default;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n$navbar-height: 50px !default;\n$navbar-margin-bottom: $line-height-computed !default;\n$navbar-border-radius: $border-radius-base !default;\n$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;\n$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;\n$navbar-collapse-max-height: 340px !default;\n\n$navbar-default-color: #777 !default;\n$navbar-default-bg: #f8f8f8 !default;\n$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color: #777 !default;\n$navbar-default-link-hover-color: #333 !default;\n$navbar-default-link-hover-bg: transparent !default;\n$navbar-default-link-active-color: #555 !default;\n$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color: #ccc !default;\n$navbar-default-link-disabled-bg: transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color: $navbar-default-link-color !default;\n$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg: transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg: #ddd !default;\n$navbar-default-toggle-icon-bar-bg: #888 !default;\n$navbar-default-toggle-border-color: #ddd !default;\n\n\n//=== Inverted navbar\n// Reset inverted navbar basics\n$navbar-inverse-color: lighten($gray-light, 15%) !default;\n$navbar-inverse-bg: #222 !default;\n$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color: lighten($gray-light, 15%) !default;\n$navbar-inverse-link-hover-color: #fff !default;\n$navbar-inverse-link-hover-bg: transparent !default;\n$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color: #444 !default;\n$navbar-inverse-link-disabled-bg: transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color: $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color: #fff !default;\n$navbar-inverse-brand-hover-bg: transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg: #333 !default;\n$navbar-inverse-toggle-icon-bar-bg: #fff !default;\n$navbar-inverse-toggle-border-color: #333 !default;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n$nav-link-padding: 10px 15px !default;\n$nav-link-hover-bg: $gray-lighter !default;\n\n$nav-disabled-link-color: $gray-light !default;\n$nav-disabled-link-hover-color: $gray-light !default;\n\n//== Tabs\n$nav-tabs-border-color: #ddd !default;\n\n$nav-tabs-link-hover-border-color: $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg: $body-bg !default;\n$nav-tabs-active-link-hover-color: $gray !default;\n$nav-tabs-active-link-hover-border-color: #ddd !default;\n\n$nav-tabs-justified-link-border-color: #ddd !default;\n$nav-tabs-justified-active-link-border-color: $body-bg !default;\n\n//== Pills\n$nav-pills-border-radius: $border-radius-base !default;\n$nav-pills-active-link-hover-bg: $component-active-bg !default;\n$nav-pills-active-link-hover-color: $component-active-color !default;\n\n\n//== Pagination\n//\n//##\n\n$pagination-color: $link-color !default;\n$pagination-bg: #fff !default;\n$pagination-border: #ddd !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-lighter !default;\n$pagination-hover-border: #ddd !default;\n\n$pagination-active-color: #fff !default;\n$pagination-active-bg: $brand-primary !default;\n$pagination-active-border: $brand-primary !default;\n\n$pagination-disabled-color: $gray-light !default;\n$pagination-disabled-bg: #fff !default;\n$pagination-disabled-border: #ddd !default;\n\n\n//== Pager\n//\n//##\n\n$pager-bg: $pagination-bg !default;\n$pager-border: $pagination-border !default;\n$pager-border-radius: 15px !default;\n\n$pager-hover-bg: $pagination-hover-bg !default;\n\n$pager-active-bg: $pagination-active-bg !default;\n$pager-active-color: $pagination-active-color !default;\n\n$pager-disabled-color: $pagination-disabled-color !default;\n\n\n//== Jumbotron\n//\n//##\n\n$jumbotron-padding: 30px !default;\n$jumbotron-color: inherit !default;\n$jumbotron-bg: $gray-lighter !default;\n$jumbotron-heading-color: inherit !default;\n$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;\n$jumbotron-heading-font-size: ceil(($font-size-base * 4.5)) !default;\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text: #3c763d !default;\n$state-success-bg: #dff0d8 !default;\n$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text: #31708f !default;\n$state-info-bg: #d9edf7 !default;\n$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text: #8a6d3b !default;\n$state-warning-bg: #fcf8e3 !default;\n$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text: #a94442 !default;\n$state-danger-bg: #f2dede !default;\n$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n$tooltip-max-width: 200px !default;\n//** Tooltip text color\n$tooltip-color: #fff !default;\n//** Tooltip background color\n$tooltip-bg: #000 !default;\n$tooltip-opacity: .9 !default;\n\n//** Tooltip arrow width\n$tooltip-arrow-width: 5px !default;\n//** Tooltip arrow color\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n$popover-bg: #fff !default;\n//** Popover maximum width\n$popover-max-width: 276px !default;\n//** Popover border color\n$popover-border-color: rgba(0,0,0,.2) !default;\n//** Popover fallback border color\n$popover-fallback-border-color: #ccc !default;\n\n//** Popover title background color\n$popover-title-bg: darken($popover-bg, 3%) !default;\n\n//** Popover arrow width\n$popover-arrow-width: 10px !default;\n//** Popover arrow color\n$popover-arrow-color: $popover-bg !default;\n\n//** Popover outer arrow width\n$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;\n//** Popover outer arrow color\n$popover-arrow-outer-color: fade_in($popover-border-color, 0.05) !default;\n//** Popover outer arrow fallback color\n$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n$label-default-bg: $gray-light !default;\n//** Primary label background color\n$label-primary-bg: $brand-primary !default;\n//** Success label background color\n$label-success-bg: $brand-success !default;\n//** Info label background color\n$label-info-bg: $brand-info !default;\n//** Warning label background color\n$label-warning-bg: $brand-warning !default;\n//** Danger label background color\n$label-danger-bg: $brand-danger !default;\n\n//** Default label text color\n$label-color: #fff !default;\n//** Default text color of a linked label\n$label-link-hover-color: #fff !default;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n$modal-inner-padding: 15px !default;\n\n//** Padding applied to the modal title\n$modal-title-padding: 15px !default;\n//** Modal title line-height\n$modal-title-line-height: $line-height-base !default;\n\n//** Background color of modal content area\n$modal-content-bg: #fff !default;\n//** Modal content border color\n$modal-content-border-color: rgba(0,0,0,.2) !default;\n//** Modal content border color **for IE8**\n$modal-content-fallback-border-color: #999 !default;\n\n//** Modal backdrop background color\n$modal-backdrop-bg: #000 !default;\n//** Modal backdrop opacity\n$modal-backdrop-opacity: .5 !default;\n//** Modal header border color\n$modal-header-border-color: #e5e5e5 !default;\n//** Modal footer border color\n$modal-footer-border-color: $modal-header-border-color !default;\n\n$modal-lg: 900px !default;\n$modal-md: 600px !default;\n$modal-sm: 300px !default;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n$alert-padding: 15px !default;\n$alert-border-radius: $border-radius-base !default;\n$alert-link-font-weight: bold !default;\n\n$alert-success-bg: $state-success-bg !default;\n$alert-success-text: $state-success-text !default;\n$alert-success-border: $state-success-border !default;\n\n$alert-info-bg: $state-info-bg !default;\n$alert-info-text: $state-info-text !default;\n$alert-info-border: $state-info-border !default;\n\n$alert-warning-bg: $state-warning-bg !default;\n$alert-warning-text: $state-warning-text !default;\n$alert-warning-border: $state-warning-border !default;\n\n$alert-danger-bg: $state-danger-bg !default;\n$alert-danger-text: $state-danger-text !default;\n$alert-danger-border: $state-danger-border !default;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n$progress-bg: #f5f5f5 !default;\n//** Progress bar text color\n$progress-bar-color: #fff !default;\n//** Variable for setting rounded corners on progress bar.\n$progress-border-radius: $border-radius-base !default;\n\n//** Default progress bar color\n$progress-bar-bg: $brand-primary !default;\n//** Success progress bar color\n$progress-bar-success-bg: $brand-success !default;\n//** Warning progress bar color\n$progress-bar-warning-bg: $brand-warning !default;\n//** Danger progress bar color\n$progress-bar-danger-bg: $brand-danger !default;\n//** Info progress bar color\n$progress-bar-info-bg: $brand-info !default;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n$list-group-bg: #fff !default;\n//** `.list-group-item` border color\n$list-group-border: #ddd !default;\n//** List group border radius\n$list-group-border-radius: $border-radius-base !default;\n\n//** Background color of single list items on hover\n$list-group-hover-bg: #f5f5f5 !default;\n//** Text color of active list items\n$list-group-active-color: $component-active-color !default;\n//** Background color of active list items\n$list-group-active-bg: $component-active-bg !default;\n//** Border color of active list elements\n$list-group-active-border: $list-group-active-bg !default;\n//** Text color for content within active list items\n$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;\n\n//** Text color of disabled list items\n$list-group-disabled-color: $gray-light !default;\n//** Background color of disabled list items\n$list-group-disabled-bg: $gray-lighter !default;\n//** Text color for content within disabled list items\n$list-group-disabled-text-color: $list-group-disabled-color !default;\n\n$list-group-link-color: #555 !default;\n$list-group-link-hover-color: $list-group-link-color !default;\n$list-group-link-heading-color: #333 !default;\n\n\n//== Panels\n//\n//##\n\n$panel-bg: #fff !default;\n$panel-body-padding: 15px !default;\n$panel-heading-padding: 10px 15px !default;\n$panel-footer-padding: $panel-heading-padding !default;\n$panel-border-radius: $border-radius-base !default;\n\n//** Border color for elements within panels\n$panel-inner-border: #ddd !default;\n$panel-footer-bg: #f5f5f5 !default;\n\n$panel-default-text: $gray-dark !default;\n$panel-default-border: #ddd !default;\n$panel-default-heading-bg: #f5f5f5 !default;\n\n$panel-primary-text: #fff !default;\n$panel-primary-border: $brand-primary !default;\n$panel-primary-heading-bg: $brand-primary !default;\n\n$panel-success-text: $state-success-text !default;\n$panel-success-border: $state-success-border !default;\n$panel-success-heading-bg: $state-success-bg !default;\n\n$panel-info-text: $state-info-text !default;\n$panel-info-border: $state-info-border !default;\n$panel-info-heading-bg: $state-info-bg !default;\n\n$panel-warning-text: $state-warning-text !default;\n$panel-warning-border: $state-warning-border !default;\n$panel-warning-heading-bg: $state-warning-bg !default;\n\n$panel-danger-text: $state-danger-text !default;\n$panel-danger-border: $state-danger-border !default;\n$panel-danger-heading-bg: $state-danger-bg !default;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n$thumbnail-padding: 4px !default;\n//** Thumbnail background color\n$thumbnail-bg: $body-bg !default;\n//** Thumbnail border color\n$thumbnail-border: #ddd !default;\n//** Thumbnail border radius\n$thumbnail-border-radius: $border-radius-base !default;\n\n//** Custom text color for thumbnail captions\n$thumbnail-caption-color: $text-color !default;\n//** Padding around the thumbnail caption\n$thumbnail-caption-padding: 9px !default;\n\n\n//== Wells\n//\n//##\n\n$well-bg: #f5f5f5 !default;\n$well-border: darken($well-bg, 7%) !default;\n\n\n//== Badges\n//\n//##\n\n$badge-color: #fff !default;\n//** Linked badge text color on hover\n$badge-link-hover-color: #fff !default;\n$badge-bg: $gray-light !default;\n\n//** Badge text color in active nav link\n$badge-active-color: $link-color !default;\n//** Badge background color in active nav link\n$badge-active-bg: #fff !default;\n\n$badge-font-weight: bold !default;\n$badge-line-height: 1 !default;\n$badge-border-radius: 10px !default;\n\n\n//== Breadcrumbs\n//\n//##\n\n$breadcrumb-padding-vertical: 8px !default;\n$breadcrumb-padding-horizontal: 15px !default;\n//** Breadcrumb background color\n$breadcrumb-bg: #f5f5f5 !default;\n//** Breadcrumb text color\n$breadcrumb-color: #ccc !default;\n//** Text color of current page in the breadcrumb\n$breadcrumb-active-color: $gray-light !default;\n//** Textual separator for between breadcrumb elements\n$breadcrumb-separator: \"/\" !default;\n\n\n//== Carousel\n//\n//##\n\n$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color: #fff !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-font-size: 20px !default;\n\n$carousel-indicator-active-bg: #fff !default;\n$carousel-indicator-border-color: #fff !default;\n\n$carousel-caption-color: #fff !default;\n\n\n//== Close\n//\n//##\n\n$close-font-weight: bold !default;\n$close-color: #000 !default;\n$close-text-shadow: 0 1px 0 #fff !default;\n\n\n//== Code\n//\n//##\n\n$code-color: #c7254e !default;\n$code-bg: #f9f2f4 !default;\n\n$kbd-color: #fff !default;\n$kbd-bg: #333 !default;\n\n$pre-bg: #f5f5f5 !default;\n$pre-color: $gray-dark !default;\n$pre-border-color: #ccc !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n$component-offset-horizontal: 180px !default;\n//** Text muted color\n$text-muted: $gray-light !default;\n//** Abbreviations and acronyms border color\n$abbr-border-color: $gray-light !default;\n//** Headings small color\n$headings-small-color: $gray-light !default;\n//** Blockquote small color\n$blockquote-small-color: $gray-light !default;\n//** Blockquote font size\n$blockquote-font-size: ($font-size-base * 1.25) !default;\n//** Blockquote border color\n$blockquote-border-color: $gray-lighter !default;\n//** Page header border color\n$page-header-border-color: $gray-lighter !default;\n//** Width of horizontal description list titles\n$dl-horizontal-offset: $component-offset-horizontal !default;\n//** Point at which .dl-horizontal becomes horizontal\n$dl-horizontal-breakpoint: $grid-float-breakpoint !default;\n//** Horizontal line color.\n$hr-border: $gray-lighter !default;\n","// WebKit-style focus\n\n@mixin tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n@mixin img-responsive($display: block) {\n display: $display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-1x}\"), \"#{$file-1x}\"));\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-2x}\"), \"#{$file-2x}\"));\n background-size: $width-1x $height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: $headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: $line-height-computed;\n margin-bottom: ($line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: ($line-height-computed / 2);\n margin-bottom: ($line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: $font-size-h1; }\nh2, .h2 { font-size: $font-size-h2; }\nh3, .h3 { font-size: $font-size-h3; }\nh4, .h4 { font-size: $font-size-h4; }\nh5, .h5 { font-size: $font-size-h5; }\nh6, .h6 { font-size: $font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 ($line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: $line-height-computed;\n font-size: floor(($font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: $screen-sm-min) {\n font-size: ($font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * $font-size-small / $font-size-base));\n}\n\nmark,\n.mark {\n background-color: $state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: $text-muted;\n}\n\n@include text-emphasis-variant('.text-primary', $brand-primary);\n\n@include text-emphasis-variant('.text-success', $state-success-text);\n\n@include text-emphasis-variant('.text-info', $state-info-text);\n\n@include text-emphasis-variant('.text-warning', $state-warning-text);\n\n@include text-emphasis-variant('.text-danger', $state-danger-text);\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n}\n@include bg-variant('.bg-primary', $brand-primary);\n\n@include bg-variant('.bg-success', $state-success-bg);\n\n@include bg-variant('.bg-info', $state-info-bg);\n\n@include bg-variant('.bg-warning', $state-warning-bg);\n\n@include bg-variant('.bg-danger', $state-danger-bg);\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: (($line-height-computed / 2) - 1);\n margin: ($line-height-computed * 2) 0 $line-height-computed;\n border-bottom: 1px solid $page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: ($line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// [converter] extracted from `.list-unstyled` for libsass compatibility\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n// [converter] extracted as `@mixin list-unstyled` for libsass compatibility\n.list-unstyled {\n @include list-unstyled;\n}\n\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: $line-height-computed;\n}\ndt,\ndd {\n line-height: $line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n @include clearfix; // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: $dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: ($dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n @include text-overflow;\n }\n dd {\n margin-left: $dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted $abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n @extend .text-uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: ($line-height-computed / 2) $line-height-computed;\n margin: 0 0 $line-height-computed;\n font-size: $blockquote-font-size;\n border-left: 5px solid $blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: $line-height-base;\n color: $blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid $blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: $line-height-computed;\n font-style: normal;\n line-height: $line-height-base;\n}\n","// Typography\n\n// [converter] $parent hack\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color;\n }\n a#{$parent}:hover,\n a#{$parent}:focus {\n color: darken($color, 10%);\n }\n}\n","// Contextual backgrounds\n\n// [converter] $parent hack\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color;\n }\n a#{$parent}:hover,\n a#{$parent}:focus {\n background-color: darken($color, 10%);\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n@mixin clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n@mixin text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: $code-color;\n background-color: $code-bg;\n border-radius: $border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: $kbd-color;\n background-color: $kbd-bg;\n border-radius: $border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: (($line-height-computed - 1) / 2);\n margin: 0 0 ($line-height-computed / 2);\n font-size: ($font-size-base - 1); // 14px to 13px\n line-height: $line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: $pre-color;\n background-color: $pre-bg;\n border: 1px solid $pre-border-color;\n border-radius: $border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n @include container-fixed;\n\n @media (min-width: $screen-sm-min) {\n width: $container-sm;\n }\n @media (min-width: $screen-md-min) {\n width: $container-md;\n }\n @media (min-width: $screen-lg-min) {\n width: $container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n @include container-fixed;\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n @include make-row;\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@include make-grid-columns;\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n@include make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: $screen-sm-min) {\n @include make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: $screen-md-min) {\n @include make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: $screen-lg-min) {\n @include make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n@mixin container-fixed($gutter: $grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor(($gutter / 2));\n padding-right: ceil(($gutter / 2));\n @include clearfix;\n}\n\n// Creates a wrapper for a series of columns\n@mixin make-row($gutter: $grid-gutter-width) {\n margin-left: ceil(($gutter / -2));\n margin-right: floor(($gutter / -2));\n @include clearfix;\n}\n\n// Generate the extra small columns\n@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage(($columns / $grid-columns));\n min-height: 1px;\n padding-left: ($gutter / 2);\n padding-right: ($gutter / 2);\n}\n@mixin make-xs-column-offset($columns) {\n margin-left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-push($columns) {\n left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-pull($columns) {\n right: percentage(($columns / $grid-columns));\n}\n\n// Generate the small columns\n@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: ($gutter / 2);\n padding-right: ($gutter / 2);\n\n @media (min-width: $screen-sm-min) {\n float: left;\n width: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-sm-column-offset($columns) {\n @media (min-width: $screen-sm-min) {\n margin-left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-sm-column-push($columns) {\n @media (min-width: $screen-sm-min) {\n left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-sm-column-pull($columns) {\n @media (min-width: $screen-sm-min) {\n right: percentage(($columns / $grid-columns));\n }\n}\n\n// Generate the medium columns\n@mixin make-md-column($columns, $gutter: $grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: ($gutter / 2);\n padding-right: ($gutter / 2);\n\n @media (min-width: $screen-md-min) {\n float: left;\n width: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-md-column-offset($columns) {\n @media (min-width: $screen-md-min) {\n margin-left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-md-column-push($columns) {\n @media (min-width: $screen-md-min) {\n left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-md-column-pull($columns) {\n @media (min-width: $screen-md-min) {\n right: percentage(($columns / $grid-columns));\n }\n}\n\n// Generate the large columns\n@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: ($gutter / 2);\n padding-right: ($gutter / 2);\n\n @media (min-width: $screen-lg-min) {\n float: left;\n width: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-lg-column-offset($columns) {\n @media (min-width: $screen-lg-min) {\n margin-left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-lg-column-push($columns) {\n @media (min-width: $screen-lg-min) {\n left: percentage(($columns / $grid-columns));\n }\n}\n@mixin make-lg-column-pull($columns) {\n @media (min-width: $screen-lg-min) {\n right: percentage(($columns / $grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin make-grid-columns($i: 1, $list: \".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\") {\n @for $i from (1 + 1) through $grid-columns {\n $list: \"#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\";\n }\n #{$list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil(($grid-gutter-width / 2));\n padding-right: floor(($grid-gutter-width / 2));\n }\n}\n\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin float-grid-columns($class, $i: 1, $list: \".col-#{$class}-#{$i}\") {\n @for $i from (1 + 1) through $grid-columns {\n $list: \"#{$list}, .col-#{$class}-#{$i}\";\n }\n #{$list} {\n float: left;\n }\n}\n\n\n@mixin calc-grid-column($index, $class, $type) {\n @if ($type == width) and ($index > 0) {\n .col-#{$class}-#{$index} {\n width: percentage(($index / $grid-columns));\n }\n }\n @if ($type == push) and ($index > 0) {\n .col-#{$class}-push-#{$index} {\n left: percentage(($index / $grid-columns));\n }\n }\n @if ($type == push) and ($index == 0) {\n .col-#{$class}-push-0 {\n left: auto;\n }\n }\n @if ($type == pull) and ($index > 0) {\n .col-#{$class}-pull-#{$index} {\n right: percentage(($index / $grid-columns));\n }\n }\n @if ($type == pull) and ($index == 0) {\n .col-#{$class}-pull-0 {\n right: auto;\n }\n }\n @if ($type == offset) {\n .col-#{$class}-offset-#{$index} {\n margin-left: percentage(($index / $grid-columns));\n }\n }\n}\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin loop-grid-columns($columns, $class, $type) {\n @for $i from 0 through $columns {\n @include calc-grid-column($i, $class, $type);\n }\n}\n\n\n// Create grid for specific class\n@mixin make-grid($class) {\n @include float-grid-columns($class);\n @include loop-grid-columns($grid-columns, $class, width);\n @include loop-grid-columns($grid-columns, $class, pull);\n @include loop-grid-columns($grid-columns, $class, push);\n @include loop-grid-columns($grid-columns, $class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: $table-bg;\n}\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: $line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: $table-cell-padding;\n line-height: $line-height-base;\n vertical-align: top;\n border-top: 1px solid $table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid $table-border-color;\n }\n\n // Nesting\n .table {\n background-color: $body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: $table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid $table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid $table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: $table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: $table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n@include table-row-variant('active', $table-bg-active);\n@include table-row-variant('success', $state-success-bg);\n@include table-row-variant('info', $state-info-bg);\n@include table-row-variant('warning', $state-warning-bg);\n@include table-row-variant('danger', $state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: $screen-xs-max) {\n width: 100%;\n margin-bottom: ($line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid $table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.#{$state},\n > th.#{$state},\n &.#{$state} > td,\n &.#{$state} > th {\n background-color: $background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.#{$state}:hover,\n > th.#{$state}:hover,\n &.#{$state}:hover > td,\n &:hover > .#{$state},\n &.#{$state}:hover > th {\n background-color: darken($background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: $line-height-computed;\n font-size: ($font-size-base * 1.5);\n line-height: inherit;\n color: $legend-color;\n border: 0;\n border-bottom: 1px solid $legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n @include box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n @include tab-focus;\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: ($padding-base-vertical + 1);\n font-size: $font-size-base;\n line-height: $line-height-base;\n color: $input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: $padding-base-vertical $padding-base-horizontal;\n font-size: $font-size-base;\n line-height: $line-height-base;\n color: $input-color;\n background-color: $input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid $input-border;\n border-radius: $input-border-radius; // Note: This has no effect on s in some browsers, due to the limited stylability of s in CSS.\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus;\n\n // Placeholder\n @include placeholder;\n\n // Unstyle the caret on ``s in IE10+.\n &::-ms-expand {\n border: 0;\n background-color: transparent;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: $input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: $cursor-disabled;\n }\n\n // [converter] extracted textarea& to textarea.form-control\n}\n\n// Reset height for `textarea`s\ntextarea.form-control {\n height: auto;\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 9.3, iOS doesn't support `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: $input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: $input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: $input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: $cursor-disabled;\n }\n}\n// These classes are used directly on s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: $cursor-disabled;\n }\n}\n// These classes are used on elements with descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: $cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: ($padding-base-vertical + 1);\n padding-bottom: ($padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: ($line-height-computed + $font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);\n.form-group-sm {\n .form-control {\n height: $input-height-small;\n padding: $padding-small-vertical $padding-small-horizontal;\n font-size: $font-size-small;\n line-height: $line-height-small;\n border-radius: $input-border-radius-small;\n }\n select.form-control {\n height: $input-height-small;\n line-height: $input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: $input-height-small;\n min-height: ($line-height-computed + $font-size-small);\n padding: ($padding-small-vertical + 1) $padding-small-horizontal;\n font-size: $font-size-small;\n line-height: $line-height-small;\n }\n}\n\n@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);\n.form-group-lg {\n .form-control {\n height: $input-height-large;\n padding: $padding-large-vertical $padding-large-horizontal;\n font-size: $font-size-large;\n line-height: $line-height-large;\n border-radius: $input-border-radius-large;\n }\n select.form-control {\n height: $input-height-large;\n line-height: $input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: $input-height-large;\n min-height: ($line-height-computed + $font-size-large);\n padding: ($padding-large-vertical + 1) $padding-large-horizontal;\n font-size: $font-size-large;\n line-height: $line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: ($input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: $input-height-base;\n height: $input-height-base;\n line-height: $input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: $input-height-large;\n height: $input-height-large;\n line-height: $input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: $input-height-small;\n height: $input-height-small;\n line-height: $input-height-small;\n}\n\n// Feedback states\n.has-success {\n @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);\n}\n.has-warning {\n @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);\n}\n.has-error {\n @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: ($line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten($text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n// [converter] extracted from `.form-inline` for libsass compatibility\n@mixin form-inline {\n\n // Kick in the inline\n @media (min-width: $screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n// [converter] extracted as `@mixin form-inline` for libsass compatibility\n.form-inline {\n @include form-inline;\n}\n\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: ($line-height-computed + ($padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n @include make-row;\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: $screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: ($padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor(($grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: $screen-sm-min) {\n .control-label {\n padding-top: ($padding-large-vertical + 1);\n font-size: $font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: $screen-sm-min) {\n .control-label {\n padding-top: ($padding-small-vertical + 1);\n font-size: $font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: $text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: $border-color;\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken($border-color, 10%);\n $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);\n @include box-shadow($shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: $text-color;\n border-color: $border-color;\n background-color: $background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: $text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus($color: $input-border-focus) {\n $color-rgba: rgba(red($color), green($color), blue($color), .6);\n &:focus {\n border-color: $color;\n outline: 0;\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. ``\n// element gets special love because it's special, and that's a fact!\n// [converter] $parent hack\n@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n #{$parent} {\n height: $input-height;\n padding: $padding-vertical $padding-horizontal;\n font-size: $font-size;\n line-height: $line-height;\n border-radius: $border-radius;\n }\n\n select#{$parent} {\n height: $input-height;\n line-height: $input-height;\n }\n\n textarea#{$parent},\n select[multiple]#{$parent} {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: $btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);\n @include user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n @include tab-focus;\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: $btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: $cursor-disabled;\n @include opacity(.65);\n @include box-shadow(none);\n }\n\n // [converter] extracted a& to a.btn\n}\n\na.btn {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);\n}\n.btn-primary {\n @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: $link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n @include box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: $btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n.btn-xs {\n @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($color, $background, $border) {\n color: $color;\n background-color: $background;\n border-color: $border;\n\n &:focus,\n &.focus {\n color: $color;\n background-color: darken($background, 10%);\n border-color: darken($border, 25%);\n }\n &:hover {\n color: $color;\n background-color: darken($background, 10%);\n border-color: darken($border, 12%);\n }\n &:active,\n &.active,\n .open > &.dropdown-toggle {\n color: $color;\n background-color: darken($background, 10%);\n border-color: darken($border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: $color;\n background-color: darken($background, 17%);\n border-color: darken($border, 25%);\n }\n }\n &:active,\n &.active,\n .open > &.dropdown-toggle {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: $background;\n border-color: $border;\n }\n }\n\n .badge {\n color: $background;\n background-color: $color;\n }\n}\n\n// Button sizes\n@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n padding: $padding-vertical $padding-horizontal;\n font-size: $font-size;\n line-height: $line-height;\n border-radius: $border-radius;\n}\n","// Opacity\n\n@mixin opacity($opacity) {\n opacity: $opacity;\n // IE8 filter\n $opacity-ie: ($opacity * 100);\n filter: alpha(opacity=$opacity-ie);\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n @include transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n // [converter] extracted tr&.in to tr.collapse.in\n // [converter] extracted tbody&.in to tbody.collapse.in\n}\n\ntr.collapse.in { display: table-row; }\n\ntbody.collapse.in { display: table-row-group; }\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition-property(height, visibility);\n @include transition-duration(.35s);\n @include transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: $caret-width-base dashed;\n border-top: $caret-width-base solid \\9; // IE8\n border-right: $caret-width-base solid transparent;\n border-left: $caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: $font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: $dropdown-bg;\n border: 1px solid $dropdown-fallback-border; // IE8 fallback\n border: 1px solid $dropdown-border;\n border-radius: $border-radius-base;\n @include box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n @include nav-divider($dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: $line-height-base;\n color: $dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: $dropdown-link-hover-color;\n background-color: $dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: $dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: $dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: $dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n @include reset-filter;\n cursor: $cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: $font-size-small;\n line-height: $line-height-base;\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: ($zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: $caret-width-base dashed;\n border-bottom: $caret-width-base solid \\9; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: $grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n right: 0; left: auto;\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n left: 0; right: auto;\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n height: 1px;\n margin: (($line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: $color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n@mixin reset-filter() {\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n @include clearfix;\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n @include border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n @include border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n @include border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n @include border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { @extend .btn-xs; }\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: $caret-width-large $caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 $caret-width-large $caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n @include clearfix;\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n @include border-top-radius($btn-border-radius-base);\n @include border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n @include border-top-radius(0);\n @include border-bottom-radius($btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n @include border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n @include border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n@mixin border-top-radius($radius) {\n border-top-right-radius: $radius;\n border-top-left-radius: $radius;\n}\n@mixin border-right-radius($radius) {\n border-bottom-right-radius: $radius;\n border-top-right-radius: $radius;\n}\n@mixin border-bottom-radius($radius) {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n}\n@mixin border-left-radius($radius) {\n border-bottom-left-radius: $radius;\n border-top-left-radius: $radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n @extend .input-lg;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n @extend .input-sm;\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: $padding-base-vertical $padding-base-horizontal;\n font-size: $font-size-base;\n font-weight: normal;\n line-height: 1;\n color: $input-color;\n text-align: center;\n background-color: $input-group-addon-bg;\n border: 1px solid $input-group-addon-border-color;\n border-radius: $input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: $padding-small-vertical $padding-small-horizontal;\n font-size: $font-size-small;\n border-radius: $input-border-radius-small;\n }\n &.input-lg {\n padding: $padding-large-vertical $padding-large-horizontal;\n font-size: $font-size-large;\n border-radius: $input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n @include clearfix;\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: $nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: $nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: $nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: $nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: $cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: $nav-link-hover-bg;\n border-color: $link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n @include nav-divider;\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid $nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: $line-height-base;\n border: 1px solid transparent;\n border-radius: $border-radius-base $border-radius-base 0 0;\n &:hover {\n border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: $nav-tabs-active-link-hover-color;\n background-color: $nav-tabs-active-link-hover-bg;\n border: 1px solid $nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n @extend .nav-justified;\n @extend .nav-tabs-justified;\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: $nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: $nav-pills-active-link-hover-color;\n background-color: $nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: $screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: $border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid $nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: $screen-sm-min) {\n > li > a {\n border-bottom: 1px solid $nav-tabs-justified-link-border-color;\n border-radius: $border-radius-base $border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: $nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: $navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n @include clearfix;\n\n @media (min-width: $grid-float-breakpoint) {\n border-radius: $navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n @include clearfix;\n\n @media (min-width: $grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: $navbar-padding-horizontal;\n padding-left: $navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n @include clearfix;\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: $grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: $navbar-collapse-max-height;\n\n @media (max-device-width: $screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -$navbar-padding-horizontal;\n margin-left: -$navbar-padding-horizontal;\n\n @media (min-width: $grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: $zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: $grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: $zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: $grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: $navbar-padding-vertical $navbar-padding-horizontal;\n font-size: $font-size-large;\n line-height: $line-height-computed;\n height: $navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: $grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -$navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: $navbar-padding-horizontal;\n padding: 9px 10px;\n @include navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: $border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: $grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: $line-height-computed;\n }\n\n @media (max-width: $grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: $line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: $grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: $navbar-padding-vertical;\n padding-bottom: $navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -$navbar-padding-horizontal;\n margin-right: -$navbar-padding-horizontal;\n padding: 10px $navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n @include box-shadow($shadow);\n\n // Mixin behavior for optimum display\n @include form-inline;\n\n .form-group {\n @media (max-width: $grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n @include navbar-vertical-align($input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: $grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n @include box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n @include border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n @include border-top-radius($navbar-border-radius);\n @include border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n @include navbar-vertical-align($input-height-base);\n\n &.btn-sm {\n @include navbar-vertical-align($input-height-small);\n }\n &.btn-xs {\n @include navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n @include navbar-vertical-align($line-height-computed);\n\n @media (min-width: $grid-float-breakpoint) {\n float: left;\n margin-left: $navbar-padding-horizontal;\n margin-right: $navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: $grid-float-breakpoint) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -$navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: $navbar-default-bg;\n border-color: $navbar-default-border;\n\n .navbar-brand {\n color: $navbar-default-brand-color;\n &:hover,\n &:focus {\n color: $navbar-default-brand-hover-color;\n background-color: $navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: $navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: $navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: $navbar-default-link-hover-color;\n background-color: $navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: $navbar-default-link-active-color;\n background-color: $navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: $navbar-default-link-disabled-color;\n background-color: $navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: $navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: $navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: $navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: $navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: $navbar-default-link-active-bg;\n color: $navbar-default-link-active-color;\n }\n }\n\n @media (max-width: $grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: $navbar-default-link-color;\n &:hover,\n &:focus {\n color: $navbar-default-link-hover-color;\n background-color: $navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: $navbar-default-link-active-color;\n background-color: $navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: $navbar-default-link-disabled-color;\n background-color: $navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: $navbar-default-link-color;\n &:hover {\n color: $navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: $navbar-default-link-color;\n &:hover,\n &:focus {\n color: $navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: $navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: $navbar-inverse-bg;\n border-color: $navbar-inverse-border;\n\n .navbar-brand {\n color: $navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: $navbar-inverse-brand-hover-color;\n background-color: $navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: $navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: $navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: $navbar-inverse-link-hover-color;\n background-color: $navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: $navbar-inverse-link-active-color;\n background-color: $navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: $navbar-inverse-link-disabled-color;\n background-color: $navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: $navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: $navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: $navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken($navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: $navbar-inverse-link-active-bg;\n color: $navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: $grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: $navbar-inverse-border;\n }\n .divider {\n background-color: $navbar-inverse-border;\n }\n > li > a {\n color: $navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: $navbar-inverse-link-hover-color;\n background-color: $navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: $navbar-inverse-link-active-color;\n background-color: $navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: $navbar-inverse-link-disabled-color;\n background-color: $navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: $navbar-inverse-link-color;\n &:hover {\n color: $navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: $navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: $navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: $navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n@mixin navbar-vertical-align($element-height) {\n margin-top: (($navbar-height - $element-height) / 2);\n margin-bottom: (($navbar-height - $element-height) / 2);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;\n margin-bottom: $line-height-computed;\n list-style: none;\n background-color: $breadcrumb-bg;\n border-radius: $border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n // [converter] Workaround for https://github.com/sass/libsass/issues/1115\n $nbsp: \"\\00a0\";\n content: \"#{$breadcrumb-separator}#{$nbsp}\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: $breadcrumb-color;\n }\n }\n\n > .active {\n color: $breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: $line-height-computed 0;\n border-radius: $border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: $padding-base-vertical $padding-base-horizontal;\n line-height: $line-height-base;\n text-decoration: none;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: 1px solid $pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n @include border-left-radius($border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n @include border-right-radius($border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: $pagination-hover-color;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: $pagination-disabled-color;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border;\n cursor: $cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);\n}\n\n// Small\n.pagination-sm {\n @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);\n}\n","// Pagination\n\n@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n > li {\n > a,\n > span {\n padding: $padding-vertical $padding-horizontal;\n font-size: $font-size;\n line-height: $line-height;\n }\n &:first-child {\n > a,\n > span {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: $line-height-computed 0;\n list-style: none;\n text-align: center;\n @include clearfix;\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: $pager-bg;\n border: 1px solid $pager-border;\n border-radius: $pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: $pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: $pager-disabled-color;\n background-color: $pager-bg;\n cursor: $cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: $label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // [converter] extracted a& to a.label\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Add hover effects, but only for links\na.label {\n &:hover,\n &:focus {\n color: $label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n @include label-variant($label-default-bg);\n}\n\n.label-primary {\n @include label-variant($label-primary-bg);\n}\n\n.label-success {\n @include label-variant($label-success-bg);\n}\n\n.label-info {\n @include label-variant($label-info-bg);\n}\n\n.label-warning {\n @include label-variant($label-warning-bg);\n}\n\n.label-danger {\n @include label-variant($label-danger-bg);\n}\n","// Labels\n\n@mixin label-variant($color) {\n background-color: $color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken($color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: $font-size-small;\n font-weight: $badge-font-weight;\n color: $badge-color;\n line-height: $badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: $badge-bg;\n border-radius: $badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // [converter] extracted a& to a.badge\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: $badge-active-color;\n background-color: $badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n\n// Hover state, but only for links\na.badge {\n &:hover,\n &:focus {\n color: $badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: $jumbotron-padding;\n padding-bottom: $jumbotron-padding;\n margin-bottom: $jumbotron-padding;\n color: $jumbotron-color;\n background-color: $jumbotron-bg;\n\n h1,\n .h1 {\n color: $jumbotron-heading-color;\n }\n\n p {\n margin-bottom: ($jumbotron-padding / 2);\n font-size: $jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken($jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: ($grid-gutter-width / 2);\n padding-right: ($grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: $screen-sm-min) {\n padding-top: ($jumbotron-padding * 1.6);\n padding-bottom: ($jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: ($jumbotron-padding * 2);\n padding-right: ($jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: $jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: $thumbnail-padding;\n margin-bottom: $line-height-computed;\n line-height: $line-height-base;\n background-color: $thumbnail-bg;\n border: 1px solid $thumbnail-border;\n border-radius: $thumbnail-border-radius;\n @include transition(border .2s ease-in-out);\n\n > img,\n a > img {\n @include img-responsive;\n margin-left: auto;\n margin-right: auto;\n }\n\n // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active\n\n // Image captions\n .caption {\n padding: $thumbnail-caption-padding;\n color: $thumbnail-caption-color;\n }\n}\n\n// Add a hover state for linked versions only\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: $link-color;\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: $alert-padding;\n margin-bottom: $line-height-computed;\n border: 1px solid transparent;\n border-radius: $alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing $headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: $alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: ($alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);\n}\n\n.alert-info {\n @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);\n}\n\n.alert-warning {\n @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);\n}\n\n.alert-danger {\n @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);\n}\n","// Alerts\n\n@mixin alert-variant($background, $border, $text-color) {\n background-color: $background;\n border-color: $border;\n color: $text-color;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n .alert-link {\n color: darken($text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: $line-height-computed;\n margin-bottom: $line-height-computed;\n background-color: $progress-bg;\n border-radius: $progress-border-radius;\n @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: $font-size-small;\n line-height: $line-height-computed;\n color: $progress-bar-color;\n text-align: center;\n background-color: $progress-bar-bg;\n @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n @include transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n @include gradient-striped;\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n @include animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n @include progress-bar-variant($progress-bar-success-bg);\n}\n\n.progress-bar-info {\n @include progress-bar-variant($progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n @include progress-bar-variant($progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n @include progress-bar-variant($progress-bar-danger-bg);\n}\n","// Gradients\n\n\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Opera 12\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12\n background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n}\n@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// Progress bars\n\n@mixin progress-bar-variant($color) {\n background-color: $color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n @include gradient-striped;\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on , , or .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: $list-group-bg;\n border: 1px solid $list-group-border;\n\n // Round the first and last items\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: $list-group-link-color;\n\n .list-group-item-heading {\n color: $list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: $list-group-link-hover-color;\n background-color: $list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: $list-group-disabled-bg;\n color: $list-group-disabled-color;\n cursor: $cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: $list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: $list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@include list-group-item-variant(success, $state-success-bg, $state-success-text);\n@include list-group-item-variant(info, $state-info-bg, $state-info-text);\n@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);\n@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}\n }\n\n a.list-group-item-#{$state},\n button.list-group-item-#{$state} {\n color: $color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: $color;\n background-color: darken($background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: $color;\n border-color: $color;\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: $line-height-computed;\n background-color: $panel-bg;\n border: 1px solid transparent;\n border-radius: $panel-border-radius;\n @include box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: $panel-body-padding;\n @include clearfix;\n}\n\n// Optional heading\n.panel-heading {\n padding: $panel-heading-padding;\n border-bottom: 1px solid transparent;\n @include border-top-radius(($panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil(($font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: $panel-footer-padding;\n background-color: $panel-footer-bg;\n border-top: 1px solid $panel-inner-border;\n @include border-bottom-radius(($panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n @include border-top-radius(($panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n @include border-bottom-radius(($panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n @include border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: $panel-body-padding;\n padding-right: $panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n @include border-top-radius(($panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: ($panel-border-radius - 1);\n border-top-right-radius: ($panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: ($panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: ($panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n @include border-bottom-radius(($panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: ($panel-border-radius - 1);\n border-bottom-right-radius: ($panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: ($panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: ($panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid $table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: $line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: $panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid $panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid $panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);\n}\n.panel-primary {\n @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);\n}\n.panel-success {\n @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);\n}\n.panel-info {\n @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);\n}\n.panel-warning {\n @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);\n}\n.panel-danger {\n @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);\n}\n","// Panels\n\n@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {\n border-color: $border;\n\n & > .panel-heading {\n color: $heading-text-color;\n background-color: $heading-bg-color;\n border-color: $heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: $border;\n }\n .badge {\n color: $heading-bg-color;\n background-color: $heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: $border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: $well-bg;\n border: 1px solid $well-border;\n border-radius: $border-radius-base;\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: $border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: $border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: ($font-size-base * 1.5);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n @include opacity(.2);\n\n &:hover,\n &:focus {\n color: $close-color;\n text-decoration: none;\n cursor: pointer;\n @include opacity(.5);\n }\n\n // [converter] extracted button& to button.close\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n @include translate(0, -25%);\n @include transition-transform(0.3s ease-out);\n }\n &.in .modal-dialog { @include translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: $modal-content-bg;\n border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid $modal-content-border-color;\n border-radius: $border-radius-large;\n @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal-background;\n background-color: $modal-backdrop-bg;\n // Fade for backdrop\n &.fade { @include opacity(0); }\n &.in { @include opacity($modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: $modal-title-padding;\n border-bottom: 1px solid $modal-header-border-color;\n @include clearfix;\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: $modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid $modal-footer-border-color;\n @include clearfix; // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: $screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: $modal-md;\n margin: 30px auto;\n }\n .modal-content {\n @include box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: $modal-sm; }\n}\n\n@media (min-width: $screen-md-min) {\n .modal-lg { width: $modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text;\n font-size: $font-size-small;\n\n @include opacity(0);\n\n &.in { @include opacity($tooltip-opacity); }\n &.top { margin-top: -3px; padding: $tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: 3px 8px;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n border-radius: $border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: $tooltip-arrow-width;\n margin-bottom: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: $tooltip-arrow-width;\n margin-bottom: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;\n border-right-color: $tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-left-color: $tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -$tooltip-arrow-width;\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: $tooltip-arrow-width;\n margin-top: -$tooltip-arrow-width;\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: $tooltip-arrow-width;\n margin-top: -$tooltip-arrow-width;\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n}\n","@mixin reset-text() {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: none;\n max-width: $popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text;\n font-size: $font-size-base;\n\n background-color: $popover-bg;\n background-clip: padding-box;\n border: 1px solid $popover-fallback-border-color;\n border: 1px solid $popover-border-color;\n border-radius: $border-radius-large;\n @include box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -$popover-arrow-width; }\n &.right { margin-left: $popover-arrow-width; }\n &.bottom { margin-top: $popover-arrow-width; }\n &.left { margin-left: -$popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: $font-size-base;\n background-color: $popover-title-bg;\n border-bottom: 1px solid darken($popover-title-bg, 5%);\n border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: $popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: $popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -$popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: $popover-arrow-outer-color;\n bottom: -$popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -$popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: $popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -$popover-arrow-outer-width;\n margin-top: -$popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: $popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -$popover-arrow-width;\n border-left-width: 0;\n border-right-color: $popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -$popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: $popover-arrow-outer-color;\n top: -$popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -$popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -$popover-arrow-outer-width;\n margin-top: -$popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: $popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: $popover-arrow-color;\n bottom: -$popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n @include transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n @include img-responsive;\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n @include transition-transform(0.6s ease-in-out);\n @include backface-visibility(hidden);\n @include perspective(1000px);\n\n &.next,\n &.active.right {\n @include translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n @include translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n @include translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: $carousel-control-width;\n @include opacity($carousel-control-opacity);\n font-size: $carousel-control-font-size;\n color: $carousel-control-color;\n text-align: center;\n text-shadow: $carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: $carousel-control-color;\n text-decoration: none;\n @include opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid $carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: $carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n text-shadow: $carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: $screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: ($carousel-control-font-size * 1.5);\n height: ($carousel-control-font-size * 1.5);\n margin-top: ($carousel-control-font-size / -2);\n font-size: ($carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: ($carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: ($carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n @include clearfix;\n}\n.center-block {\n @include center-block;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n @include text-hide;\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","// Center-align a block level element\n\n@mixin center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n@mixin hide-text() {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n@mixin text-hide() {\n @include hide-text;\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@at-root {\n @-ms-viewport {\n width: device-width;\n }\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n\n@include responsive-invisibility('.visible-xs');\n@include responsive-invisibility('.visible-sm');\n@include responsive-invisibility('.visible-md');\n@include responsive-invisibility('.visible-lg');\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n@media (max-width: $screen-xs-max) {\n @include responsive-visibility('.visible-xs');\n}\n.visible-xs-block {\n @media (max-width: $screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: $screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: $screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n @include responsive-visibility('.visible-sm');\n}\n.visible-sm-block {\n @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n @include responsive-visibility('.visible-md');\n}\n.visible-md-block {\n @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n display: inline-block !important;\n }\n}\n\n@media (min-width: $screen-lg-min) {\n @include responsive-visibility('.visible-lg');\n}\n.visible-lg-block {\n @media (min-width: $screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: $screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: $screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n@media (max-width: $screen-xs-max) {\n @include responsive-invisibility('.hidden-xs');\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n @include responsive-invisibility('.hidden-sm');\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n @include responsive-invisibility('.hidden-md');\n}\n\n@media (min-width: $screen-lg-min) {\n @include responsive-invisibility('.hidden-lg');\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n\n@include responsive-invisibility('.visible-print');\n\n@media print {\n @include responsive-visibility('.visible-print');\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n@media print {\n @include responsive-invisibility('.hidden-print');\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n// [converter] $parent hack\n@mixin responsive-visibility($parent) {\n #{$parent} {\n display: block !important;\n }\n table#{$parent} { display: table !important; }\n tr#{$parent} { display: table-row !important; }\n th#{$parent},\n td#{$parent} { display: table-cell !important; }\n}\n\n// [converter] $parent hack\n@mixin responsive-invisibility($parent) {\n #{$parent} {\n display: none !important;\n }\n}\n",".bg-red {\n background: red; }\n\nbody {\n padding-top: 60px; }\n\nmain {\n a:link,\n a:hover {\n border-bottom: 1px solid;\n text-decoration: none; }\n\n img {\n @extend .img-responsive; }\n\n p img {\n margin: 1.5em 0; } }\n\n.embed-container {\n padding: 56.25% 0 0;\n position: relative;\n width: 100%;\n\n iframe,\n embed {\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n width: 100%; } }\n",".is-centered {\n margin: 0 auto; }\n\n.is-flex {\n display: flex; }\n\n.is-half {\n width: 50%; }\n\n.flex {\n flex: 1; }\n\n.flex-wrap {\n flex-wrap: wrap; }\n\n.list-style-none {\n list-style: none; }\n\n@each $value in 'block' 'inline' 'inline-block' {\n .display-#{$value} {\n display: #{$value}; } }\n","@each $value in 'left' 'center' 'right' {\n .text-#{$value} {\n text-align: #{$value}; } }\n",".availability p:last-of-type {\n margin-bottom: 0; }\n",".badges > * {\n display: block;\n margin: 0 auto 10px;\n\n &:last-child {\n margin-bottom: 0; }\n\n // &[class$=\"da-member\"] img\n } // max-width: 152px\n\n.badges img {\n max-width: 100%; }\n",".copyright {\n border-top: 1px solid #CCC;\n margin-top: 1em;\n padding-top: 1em; }\n",".meetups {\n @include clearfix;\n\n ul {\n list-style: none;\n padding-left: 0;\n margin-left: 0; }\n\n li {\n display: inline-block;\n padding: 5px 0;\n margin: 0 5px 5px 0; }\n\n a {\n display: block; }\n\n img {\n max-height: 40px;\n width: auto; } }\n","@import '../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap';\n\n@import 'base';\n@import 'mixins';\n\n@import 'base/layout';\n@import 'base/typography';\n\n@import 'components/availability';\n@import 'components/badges';\n@import 'components/footer';\n@import 'components/meetups';\n\n.skills-list {\n margin: 1em 0;\n padding: 0; }\n\n.skill {\n margin: 0 10px 15px 0; }\n\n.skill-image {\n height: 40px;\n width: auto; }\n"]}
\ No newline at end of file
diff --git a/docs/assets/css/project.css b/docs/assets/css/project.css
new file mode 100644
index 00000000..c9649e0e
--- /dev/null
+++ b/docs/assets/css/project.css
@@ -0,0 +1,15 @@
+.project-company.has-logo a:link,
+.project-company.has-logo a:hover {
+ border-bottom: 0;
+ display: block; }
+
+.project-company.has-logo img {
+ max-width: 75%; }
+ @media screen and (min-width: 768px) {
+ .project-company.has-logo img {
+ max-width: 50%; } }
+ @media screen and (min-width: 992px) {
+ .project-company.has-logo img {
+ max-width: 33.3%; } }
+
+/*# sourceMappingURL=project.css.map */
diff --git a/docs/assets/css/project.css.map b/docs/assets/css/project.css.map
new file mode 100644
index 00000000..a2a6a067
--- /dev/null
+++ b/docs/assets/css/project.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["project.sass","_mixins.sass"],"names":[],"mappings":"AAGA;;EAIY,iBAAiB;EACjB,eAAe,EAAG;;AAL9B;EAQY,eAAe,EAMW;ECJlC;IDVJ;MAWgB,eAAe,EAGO,EAAA;ECQlC;IDtBJ;MAcgB,iBAAiB,EAAK,EAAA","file":"project.css","sourcesContent":["@import '../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/variables';\n@import 'mixins';\n\n.project-company {\n &.has-logo {\n a:link,\n a:hover {\n border-bottom: 0;\n display: block; }\n\n img {\n max-width: 75%;\n\n @include tablet {\n max-width: 50%; }\n\n @include desktop {\n max-width: 33.3%; } } } }\n","@mixin from($device) {\n @media screen and (min-width: $device) {\n @content; } }\n\n@mixin until($device) {\n @media screen and (max-width: $device - 1px) {\n @content; } }\n\n@mixin mobile {\n @media screen and (max-width: $screen-tablet - 1px) {\n @content; } }\n\n@mixin tablet {\n @media screen and (min-width: $screen-tablet) {\n @content; } }\n\n@mixin tablet-only {\n @media screen and (min-width: $screen-tablet) and (max-width: $screen-desktop - 1px) {\n @content; } }\n\n@mixin touch {\n @media screen and (max-width: $screen-desktop - 1px) {\n @content; } }\n\n@mixin desktop {\n @media screen and (min-width: $screen-desktop) {\n @content; } }\n\n@mixin desktop-only {\n @media screen and (min-width: $screen-desktop) and (max-width: $screen-lg - 1px) {\n @content; } }\n\n@mixin widescreen {\n @media screen and (min-width: $screen-lg) {\n @content; } }\n"]}
\ No newline at end of file
diff --git a/docs/assets/css/talk.css b/docs/assets/css/talk.css
new file mode 100644
index 00000000..155a0b01
--- /dev/null
+++ b/docs/assets/css/talk.css
@@ -0,0 +1,15 @@
+.talk-full h1 {
+ margin-bottom: 25px; }
+
+.presentation {
+ background: url("../images/loading.gif") no-repeat center;
+ min-height: 275px;
+ width: 100%; }
+ @media screen and (min-width: 768px) {
+ .presentation {
+ min-height: 460px; } }
+ @media screen and (min-width: 992px) {
+ .presentation {
+ min-height: 540px; } }
+
+/*# sourceMappingURL=talk.css.map */
diff --git a/docs/assets/css/talk.css.map b/docs/assets/css/talk.css.map
new file mode 100644
index 00000000..8ed8a3df
--- /dev/null
+++ b/docs/assets/css/talk.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["talk.sass","_mixins.sass"],"names":[],"mappings":"AAGA;EACI,oBAAoB,EAAG;;AAE3B;EACI,0DAAyD;EACzD,kBAAkB;EAClB,YAAY,EAIe;ECA3B;IDPJ;MAKQ,kBAAkB,EAEK,EAAA;ECY3B;IDnBJ;MAOQ,kBAAkB,EAAK,EAAA","file":"talk.css","sourcesContent":["@import '../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/variables';\n@import 'mixins';\n\n.talk-full h1 {\n margin-bottom: 25px; }\n\n.presentation {\n background: url('../images/loading.gif') no-repeat center;\n min-height: 275px;\n width: 100%;\n @include tablet {\n min-height: 460px; }\n @include desktop {\n min-height: 540px; } }\n","@mixin from($device) {\n @media screen and (min-width: $device) {\n @content; } }\n\n@mixin until($device) {\n @media screen and (max-width: $device - 1px) {\n @content; } }\n\n@mixin mobile {\n @media screen and (max-width: $screen-tablet - 1px) {\n @content; } }\n\n@mixin tablet {\n @media screen and (min-width: $screen-tablet) {\n @content; } }\n\n@mixin tablet-only {\n @media screen and (min-width: $screen-tablet) and (max-width: $screen-desktop - 1px) {\n @content; } }\n\n@mixin touch {\n @media screen and (max-width: $screen-desktop - 1px) {\n @content; } }\n\n@mixin desktop {\n @media screen and (min-width: $screen-desktop) {\n @content; } }\n\n@mixin desktop-only {\n @media screen and (min-width: $screen-desktop) and (max-width: $screen-lg - 1px) {\n @content; } }\n\n@mixin widescreen {\n @media screen and (min-width: $screen-lg) {\n @content; } }\n"]}
\ No newline at end of file
diff --git a/docs/assets/css/talks-table.css b/docs/assets/css/talks-table.css
new file mode 100644
index 00000000..9b4e4203
--- /dev/null
+++ b/docs/assets/css/talks-table.css
@@ -0,0 +1,20 @@
+.talk-event-table > thead > tr > th,
+.talk-event-table > tbody > tr > td {
+ vertical-align: middle; }
+
+.talk-event-table .column-date,
+.talk-event-table .column-event {
+ width: 200px; }
+
+.talk-event-table .column-feedback {
+ width: 125px; }
+
+.talk-type,
+.event-location {
+ display: block;
+ margin-top: 1px; }
+
+.talk-full .column-event {
+ width: auto; }
+
+/*# sourceMappingURL=talks-table.css.map */
diff --git a/docs/assets/css/talks-table.css.map b/docs/assets/css/talks-table.css.map
new file mode 100644
index 00000000..1d61947d
--- /dev/null
+++ b/docs/assets/css/talks-table.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["talks-table.sass"],"names":[],"mappings":"AAAA;;EAGQ,uBAAuB,EAAG;;AAHlC;;EAOQ,aAAa,EAAG;;AAPxB;EAUQ,aAAa,EAAG;;AAExB;;EAEI,eAAe;EACf,gBAAgB,EAAG;;AAEvB;EACI,YAAY,EAAG","file":"talks-table.css","sourcesContent":[".talk-event-table {\n & > thead > tr > th,\n & > tbody > tr > td {\n vertical-align: middle; }\n\n .column-date,\n .column-event {\n width: 200px; }\n\n .column-feedback {\n width: 125px; } }\n\n.talk-type,\n.event-location {\n display: block;\n margin-top: 1px; }\n\n.talk-full .column-event {\n width: auto; }\n"]}
\ No newline at end of file
diff --git a/docs/assets/css/testimonials.css b/docs/assets/css/testimonials.css
new file mode 100644
index 00000000..551eeff7
--- /dev/null
+++ b/docs/assets/css/testimonials.css
@@ -0,0 +1,19 @@
+.testimonial {
+ margin-bottom: 10px; }
+ .testimonial:before, .testimonial:after {
+ content: " ";
+ display: table; }
+ .testimonial:after {
+ clear: both; }
+ .testimonial__role {
+ color: #777; }
+ .testimonial__image {
+ height: 75px;
+ margin: 0 0 10px 10px;
+ width: 75px; }
+ @media screen and (max-width: 767px) {
+ .testimonial__image {
+ height: 90px;
+ width: 90px; } }
+
+/*# sourceMappingURL=testimonials.css.map */
diff --git a/docs/assets/css/testimonials.css.map b/docs/assets/css/testimonials.css.map
new file mode 100644
index 00000000..bd2713d1
--- /dev/null
+++ b/docs/assets/css/testimonials.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["testimonials.sass","../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_clearfix.scss","_mixins.sass"],"names":[],"mappings":"AAIA;EAEI,oBAAoB,EAYO;EAd/B;ICWI,aAAa;IACb,eAAe,EAChB;EDbH;ICeI,YAAY,EACb;EDhBH;IAKQ,YAAY,EAAG;EALvB;IAQQ,aAAa;IACb,sBAAsB;IACtB,YAAY,EAIS;IEbzB;MFDJ;QAaY,aAAa;QACb,YAAY,EAAK,EAAA","file":"testimonials.css","sourcesContent":["@import '../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/clearfix';\n@import '../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/variables';\n@import 'mixins';\n\n.testimonial {\n @include clearfix;\n margin-bottom: 10px;\n\n &__role {\n color: #777; }\n\n &__image {\n height: 75px;\n margin: 0 0 10px 10px;\n width: 75px;\n\n @include until($screen-sm) {\n height: 90px;\n width: 90px; } } }\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n@mixin clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","@mixin from($device) {\n @media screen and (min-width: $device) {\n @content; } }\n\n@mixin until($device) {\n @media screen and (max-width: $device - 1px) {\n @content; } }\n\n@mixin mobile {\n @media screen and (max-width: $screen-tablet - 1px) {\n @content; } }\n\n@mixin tablet {\n @media screen and (min-width: $screen-tablet) {\n @content; } }\n\n@mixin tablet-only {\n @media screen and (min-width: $screen-tablet) and (max-width: $screen-desktop - 1px) {\n @content; } }\n\n@mixin touch {\n @media screen and (max-width: $screen-desktop - 1px) {\n @content; } }\n\n@mixin desktop {\n @media screen and (min-width: $screen-desktop) {\n @content; } }\n\n@mixin desktop-only {\n @media screen and (min-width: $screen-desktop) and (max-width: $screen-lg - 1px) {\n @content; } }\n\n@mixin widescreen {\n @media screen and (min-width: $screen-lg) {\n @content; } }\n"]}
\ No newline at end of file
diff --git a/docs/assets/fonts/FontAwesome.otf b/docs/assets/fonts/FontAwesome.otf
new file mode 100644
index 00000000..401ec0f3
Binary files /dev/null and b/docs/assets/fonts/FontAwesome.otf differ
diff --git a/docs/assets/fonts/fontawesome-webfont.eot b/docs/assets/fonts/fontawesome-webfont.eot
new file mode 100644
index 00000000..e9f60ca9
Binary files /dev/null and b/docs/assets/fonts/fontawesome-webfont.eot differ
diff --git a/docs/assets/fonts/fontawesome-webfont.svg b/docs/assets/fonts/fontawesome-webfont.svg
new file mode 100644
index 00000000..855c845e
--- /dev/null
+++ b/docs/assets/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
+
+Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
+ By ,,,
+Copyright Dave Gandy 2016. All rights reserved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/assets/fonts/fontawesome-webfont.ttf b/docs/assets/fonts/fontawesome-webfont.ttf
new file mode 100644
index 00000000..35acda2f
Binary files /dev/null and b/docs/assets/fonts/fontawesome-webfont.ttf differ
diff --git a/docs/assets/fonts/fontawesome-webfont.woff b/docs/assets/fonts/fontawesome-webfont.woff
new file mode 100644
index 00000000..400014a4
Binary files /dev/null and b/docs/assets/fonts/fontawesome-webfont.woff differ
diff --git a/docs/assets/fonts/fontawesome-webfont.woff2 b/docs/assets/fonts/fontawesome-webfont.woff2
new file mode 100644
index 00000000..4d13fc60
Binary files /dev/null and b/docs/assets/fonts/fontawesome-webfont.woff2 differ
diff --git a/docs/assets/images/badges/acquia-certified-developer-drupal-8.png b/docs/assets/images/badges/acquia-certified-developer-drupal-8.png
new file mode 100644
index 00000000..8296cf0b
Binary files /dev/null and b/docs/assets/images/badges/acquia-certified-developer-drupal-8.png differ
diff --git a/docs/assets/images/badges/phpnw17.png b/docs/assets/images/badges/phpnw17.png
new file mode 100644
index 00000000..af9c7f94
Binary files /dev/null and b/docs/assets/images/badges/phpnw17.png differ
diff --git a/docs/assets/images/blog/custom-module-as-a-feature.png b/docs/assets/images/blog/custom-module-as-a-feature.png
new file mode 100644
index 00000000..72669173
Binary files /dev/null and b/docs/assets/images/blog/custom-module-as-a-feature.png differ
diff --git a/docs/assets/images/blog/drupal-meetups-twitterbot.png b/docs/assets/images/blog/drupal-meetups-twitterbot.png
new file mode 100644
index 00000000..6b2ac07a
Binary files /dev/null and b/docs/assets/images/blog/drupal-meetups-twitterbot.png differ
diff --git a/docs/assets/images/blog/drupalcamp-bristol-17-logo.jpg b/docs/assets/images/blog/drupalcamp-bristol-17-logo.jpg
new file mode 100644
index 00000000..4722c1cd
Binary files /dev/null and b/docs/assets/images/blog/drupalcamp-bristol-17-logo.jpg differ
diff --git a/docs/assets/images/blog/drupalvm-generate-example-2.gif b/docs/assets/images/blog/drupalvm-generate-example-2.gif
new file mode 100644
index 00000000..fc66f941
Binary files /dev/null and b/docs/assets/images/blog/drupalvm-generate-example-2.gif differ
diff --git a/docs/assets/images/blog/drupalvm-generate-example.gif b/docs/assets/images/blog/drupalvm-generate-example.gif
new file mode 100644
index 00000000..1975a233
Binary files /dev/null and b/docs/assets/images/blog/drupalvm-generate-example.gif differ
diff --git a/docs/assets/images/blog/drupalvm-generate-release.png b/docs/assets/images/blog/drupalvm-generate-release.png
new file mode 100644
index 00000000..498bb080
Binary files /dev/null and b/docs/assets/images/blog/drupalvm-generate-release.png differ
diff --git a/docs/assets/images/blog/drupalvm-generate-repo.png b/docs/assets/images/blog/drupalvm-generate-repo.png
new file mode 100644
index 00000000..42716804
Binary files /dev/null and b/docs/assets/images/blog/drupalvm-generate-repo.png differ
diff --git a/docs/assets/images/blog/forked-github-repo-commits.png b/docs/assets/images/blog/forked-github-repo-commits.png
new file mode 100644
index 00000000..1f3f372a
Binary files /dev/null and b/docs/assets/images/blog/forked-github-repo-commits.png differ
diff --git a/docs/assets/images/blog/git-format-patch.png b/docs/assets/images/blog/git-format-patch.png
new file mode 100644
index 00000000..fc4fdbca
Binary files /dev/null and b/docs/assets/images/blog/git-format-patch.png differ
diff --git a/docs/assets/images/blog/github-fork-rebase-phpstorm.png b/docs/assets/images/blog/github-fork-rebase-phpstorm.png
new file mode 100644
index 00000000..791a2fee
Binary files /dev/null and b/docs/assets/images/blog/github-fork-rebase-phpstorm.png differ
diff --git a/docs/assets/images/blog/minimum-drupal-version-d7.png b/docs/assets/images/blog/minimum-drupal-version-d7.png
new file mode 100644
index 00000000..b4cbce3d
Binary files /dev/null and b/docs/assets/images/blog/minimum-drupal-version-d7.png differ
diff --git a/docs/assets/images/blog/my-commit-to-the-rebased-branch.png b/docs/assets/images/blog/my-commit-to-the-rebased-branch.png
new file mode 100644
index 00000000..ea03595d
Binary files /dev/null and b/docs/assets/images/blog/my-commit-to-the-rebased-branch.png differ
diff --git a/docs/assets/images/blog/nginx-redirect-with-args.gif b/docs/assets/images/blog/nginx-redirect-with-args.gif
new file mode 100644
index 00000000..91c4910d
Binary files /dev/null and b/docs/assets/images/blog/nginx-redirect-with-args.gif differ
diff --git a/docs/assets/images/blog/oliverdavies-uk-jenkins-git-poll.png b/docs/assets/images/blog/oliverdavies-uk-jenkins-git-poll.png
new file mode 100644
index 00000000..a6ca489a
Binary files /dev/null and b/docs/assets/images/blog/oliverdavies-uk-jenkins-git-poll.png differ
diff --git a/docs/assets/images/blog/oliverdavies-uk-jenkins-git-repo.png b/docs/assets/images/blog/oliverdavies-uk-jenkins-git-repo.png
new file mode 100644
index 00000000..25aebb15
Binary files /dev/null and b/docs/assets/images/blog/oliverdavies-uk-jenkins-git-repo.png differ
diff --git a/docs/assets/images/blog/oliverdavies-uk-jenkins-git-timer.png b/docs/assets/images/blog/oliverdavies-uk-jenkins-git-timer.png
new file mode 100644
index 00000000..d1c9f880
Binary files /dev/null and b/docs/assets/images/blog/oliverdavies-uk-jenkins-git-timer.png differ
diff --git a/docs/assets/images/blog/oliverdavies-uk-jenkins-shell.png b/docs/assets/images/blog/oliverdavies-uk-jenkins-shell.png
new file mode 100644
index 00000000..92abe374
Binary files /dev/null and b/docs/assets/images/blog/oliverdavies-uk-jenkins-shell.png differ
diff --git a/docs/assets/images/blog/override-node-options-refactor-tests-new-passing.png b/docs/assets/images/blog/override-node-options-refactor-tests-new-passing.png
new file mode 100644
index 00000000..70f30d14
Binary files /dev/null and b/docs/assets/images/blog/override-node-options-refactor-tests-new-passing.png differ
diff --git a/docs/assets/images/da-individual-member.png b/docs/assets/images/da-individual-member.png
new file mode 100644
index 00000000..dd88817d
Binary files /dev/null and b/docs/assets/images/da-individual-member.png differ
diff --git a/docs/assets/images/drupal-8.jpg b/docs/assets/images/drupal-8.jpg
new file mode 100644
index 00000000..308ca012
Binary files /dev/null and b/docs/assets/images/drupal-8.jpg differ
diff --git a/docs/assets/images/drupal-association-become-member.png b/docs/assets/images/drupal-association-become-member.png
new file mode 100644
index 00000000..ecde6d79
Binary files /dev/null and b/docs/assets/images/drupal-association-become-member.png differ
diff --git a/docs/assets/images/drupalcon-barcelona.png b/docs/assets/images/drupalcon-barcelona.png
new file mode 100644
index 00000000..64552af9
Binary files /dev/null and b/docs/assets/images/drupalcon-barcelona.png differ
diff --git a/docs/assets/images/drupalcon-la-attending.png b/docs/assets/images/drupalcon-la-attending.png
new file mode 100644
index 00000000..87ed669b
Binary files /dev/null and b/docs/assets/images/drupalcon-la-attending.png differ
diff --git a/docs/assets/images/drupalcon-la-sprinter.png b/docs/assets/images/drupalcon-la-sprinter.png
new file mode 100644
index 00000000..b0f1dd0a
Binary files /dev/null and b/docs/assets/images/drupalcon-la-sprinter.png differ
diff --git a/docs/assets/images/experience/appnovation.png b/docs/assets/images/experience/appnovation.png
new file mode 100644
index 00000000..49e432cd
Binary files /dev/null and b/docs/assets/images/experience/appnovation.png differ
diff --git a/docs/assets/images/experience/cti-digital.png b/docs/assets/images/experience/cti-digital.png
new file mode 100644
index 00000000..2fd01322
Binary files /dev/null and b/docs/assets/images/experience/cti-digital.png differ
diff --git a/docs/assets/images/experience/drupal-association.png b/docs/assets/images/experience/drupal-association.png
new file mode 100644
index 00000000..c262743a
Binary files /dev/null and b/docs/assets/images/experience/drupal-association.png differ
diff --git a/docs/assets/images/experience/horse-and-country.jpg b/docs/assets/images/experience/horse-and-country.jpg
new file mode 100644
index 00000000..a445ebf6
Binary files /dev/null and b/docs/assets/images/experience/horse-and-country.jpg differ
diff --git a/docs/assets/images/experience/lab-class.png b/docs/assets/images/experience/lab-class.png
new file mode 100644
index 00000000..2d94fc82
Binary files /dev/null and b/docs/assets/images/experience/lab-class.png differ
diff --git a/docs/assets/images/experience/microserve.png b/docs/assets/images/experience/microserve.png
new file mode 100644
index 00000000..5c7438ee
Binary files /dev/null and b/docs/assets/images/experience/microserve.png differ
diff --git a/docs/assets/images/experience/nomensa.png b/docs/assets/images/experience/nomensa.png
new file mode 100644
index 00000000..cdb9bc33
Binary files /dev/null and b/docs/assets/images/experience/nomensa.png differ
diff --git a/docs/assets/images/experience/precedent.jpg b/docs/assets/images/experience/precedent.jpg
new file mode 100644
index 00000000..04c77f85
Binary files /dev/null and b/docs/assets/images/experience/precedent.jpg differ
diff --git a/docs/assets/images/experience/proctors.jpg b/docs/assets/images/experience/proctors.jpg
new file mode 100644
index 00000000..faaa79bb
Binary files /dev/null and b/docs/assets/images/experience/proctors.jpg differ
diff --git a/docs/assets/images/loading.gif b/docs/assets/images/loading.gif
new file mode 100644
index 00000000..7141e0dc
Binary files /dev/null and b/docs/assets/images/loading.gif differ
diff --git a/docs/assets/images/me-precedent.jpg b/docs/assets/images/me-precedent.jpg
new file mode 100644
index 00000000..4b3e0319
Binary files /dev/null and b/docs/assets/images/me-precedent.jpg differ
diff --git a/docs/assets/images/meetups/accessible-bristol.png b/docs/assets/images/meetups/accessible-bristol.png
new file mode 100644
index 00000000..2c1b2ab9
Binary files /dev/null and b/docs/assets/images/meetups/accessible-bristol.png differ
diff --git a/docs/assets/images/meetups/drupal-bristol.jpeg b/docs/assets/images/meetups/drupal-bristol.jpeg
new file mode 100644
index 00000000..2ec7e570
Binary files /dev/null and b/docs/assets/images/meetups/drupal-bristol.jpeg differ
diff --git a/docs/assets/images/meetups/drupalcamp-bristol.png b/docs/assets/images/meetups/drupalcamp-bristol.png
new file mode 100644
index 00000000..fed927e8
Binary files /dev/null and b/docs/assets/images/meetups/drupalcamp-bristol.png differ
diff --git a/docs/assets/images/meetups/nwdug.jpg b/docs/assets/images/meetups/nwdug.jpg
new file mode 100644
index 00000000..437625be
Binary files /dev/null and b/docs/assets/images/meetups/nwdug.jpg differ
diff --git a/docs/assets/images/meetups/phpnw.gif b/docs/assets/images/meetups/phpnw.gif
new file mode 100644
index 00000000..6c6343c1
Binary files /dev/null and b/docs/assets/images/meetups/phpnw.gif differ
diff --git a/docs/assets/images/meetups/phpnw.jpg b/docs/assets/images/meetups/phpnw.jpg
new file mode 100644
index 00000000..29d1b561
Binary files /dev/null and b/docs/assets/images/meetups/phpnw.jpg differ
diff --git a/docs/assets/images/meetups/phpsw.jpeg b/docs/assets/images/meetups/phpsw.jpeg
new file mode 100644
index 00000000..1347e7e4
Binary files /dev/null and b/docs/assets/images/meetups/phpsw.jpeg differ
diff --git a/docs/assets/images/meetups/swdug.png b/docs/assets/images/meetups/swdug.png
new file mode 100644
index 00000000..73a5593f
Binary files /dev/null and b/docs/assets/images/meetups/swdug.png differ
diff --git a/docs/assets/images/meetups/swlug.png b/docs/assets/images/meetups/swlug.png
new file mode 100644
index 00000000..785f1dae
Binary files /dev/null and b/docs/assets/images/meetups/swlug.png differ
diff --git a/docs/assets/images/meetups/unified-diff.png b/docs/assets/images/meetups/unified-diff.png
new file mode 100644
index 00000000..1c497526
Binary files /dev/null and b/docs/assets/images/meetups/unified-diff.png differ
diff --git a/docs/assets/images/projects/accessible-bristol.png b/docs/assets/images/projects/accessible-bristol.png
new file mode 100644
index 00000000..bc1f727c
Binary files /dev/null and b/docs/assets/images/projects/accessible-bristol.png differ
diff --git a/docs/assets/images/projects/aspira.png b/docs/assets/images/projects/aspira.png
new file mode 100644
index 00000000..ffeac508
Binary files /dev/null and b/docs/assets/images/projects/aspira.png differ
diff --git a/docs/assets/images/projects/avon-motorsport.png b/docs/assets/images/projects/avon-motorsport.png
new file mode 100644
index 00000000..50393e3a
Binary files /dev/null and b/docs/assets/images/projects/avon-motorsport.png differ
diff --git a/docs/assets/images/projects/cattery.png b/docs/assets/images/projects/cattery.png
new file mode 100644
index 00000000..9c33a307
Binary files /dev/null and b/docs/assets/images/projects/cattery.png differ
diff --git a/docs/assets/images/projects/daylight-photo-awards.png b/docs/assets/images/projects/daylight-photo-awards.png
new file mode 100644
index 00000000..4b752d33
Binary files /dev/null and b/docs/assets/images/projects/daylight-photo-awards.png differ
diff --git a/docs/assets/images/projects/digital-theatre-plus.png b/docs/assets/images/projects/digital-theatre-plus.png
new file mode 100644
index 00000000..830598c4
Binary files /dev/null and b/docs/assets/images/projects/digital-theatre-plus.png differ
diff --git a/docs/assets/images/projects/door-decor-more.png b/docs/assets/images/projects/door-decor-more.png
new file mode 100644
index 00000000..3cb8f94a
Binary files /dev/null and b/docs/assets/images/projects/door-decor-more.png differ
diff --git a/docs/assets/images/projects/drupal-org.png b/docs/assets/images/projects/drupal-org.png
new file mode 100644
index 00000000..0d99c259
Binary files /dev/null and b/docs/assets/images/projects/drupal-org.png differ
diff --git a/docs/assets/images/projects/drupal-vm-generator.png b/docs/assets/images/projects/drupal-vm-generator.png
new file mode 100644
index 00000000..40a93003
Binary files /dev/null and b/docs/assets/images/projects/drupal-vm-generator.png differ
diff --git a/docs/assets/images/projects/horse-and-country.png b/docs/assets/images/projects/horse-and-country.png
new file mode 100644
index 00000000..dfc8b89e
Binary files /dev/null and b/docs/assets/images/projects/horse-and-country.png differ
diff --git a/docs/assets/images/projects/hutch-paving.png b/docs/assets/images/projects/hutch-paving.png
new file mode 100644
index 00000000..a2826982
Binary files /dev/null and b/docs/assets/images/projects/hutch-paving.png differ
diff --git a/docs/assets/images/projects/ifoa.png b/docs/assets/images/projects/ifoa.png
new file mode 100644
index 00000000..7064c3e1
Binary files /dev/null and b/docs/assets/images/projects/ifoa.png differ
diff --git a/docs/assets/images/projects/my-favourite-voucher-codes.png b/docs/assets/images/projects/my-favourite-voucher-codes.png
new file mode 100644
index 00000000..ea726fb6
Binary files /dev/null and b/docs/assets/images/projects/my-favourite-voucher-codes.png differ
diff --git a/docs/assets/images/projects/road-cc.png b/docs/assets/images/projects/road-cc.png
new file mode 100644
index 00000000..a2f8fb07
Binary files /dev/null and b/docs/assets/images/projects/road-cc.png differ
diff --git a/docs/assets/images/projects/source-for-searches.png b/docs/assets/images/projects/source-for-searches.png
new file mode 100644
index 00000000..d0a1eebf
Binary files /dev/null and b/docs/assets/images/projects/source-for-searches.png differ
diff --git a/docs/assets/images/projects/vikisports.png b/docs/assets/images/projects/vikisports.png
new file mode 100644
index 00000000..058c4e17
Binary files /dev/null and b/docs/assets/images/projects/vikisports.png differ
diff --git a/docs/assets/images/projects/watts-tvc.png b/docs/assets/images/projects/watts-tvc.png
new file mode 100644
index 00000000..b806f0b0
Binary files /dev/null and b/docs/assets/images/projects/watts-tvc.png differ
diff --git a/docs/assets/images/projects/wlsquared.png b/docs/assets/images/projects/wlsquared.png
new file mode 100644
index 00000000..f9257f9c
Binary files /dev/null and b/docs/assets/images/projects/wlsquared.png differ
diff --git a/docs/assets/images/skills/acquia.png b/docs/assets/images/skills/acquia.png
new file mode 100644
index 00000000..b65c439b
Binary files /dev/null and b/docs/assets/images/skills/acquia.png differ
diff --git a/docs/assets/images/skills/amazon.png b/docs/assets/images/skills/amazon.png
new file mode 100644
index 00000000..12c4d550
Binary files /dev/null and b/docs/assets/images/skills/amazon.png differ
diff --git a/docs/assets/images/skills/ansible.png b/docs/assets/images/skills/ansible.png
new file mode 100644
index 00000000..1eba5a3b
Binary files /dev/null and b/docs/assets/images/skills/ansible.png differ
diff --git a/docs/assets/images/skills/apache.png b/docs/assets/images/skills/apache.png
new file mode 100644
index 00000000..6cd71a64
Binary files /dev/null and b/docs/assets/images/skills/apache.png differ
diff --git a/docs/assets/images/skills/behat.png b/docs/assets/images/skills/behat.png
new file mode 100644
index 00000000..3554dbe3
Binary files /dev/null and b/docs/assets/images/skills/behat.png differ
diff --git a/docs/assets/images/skills/bower.png b/docs/assets/images/skills/bower.png
new file mode 100644
index 00000000..bca97580
Binary files /dev/null and b/docs/assets/images/skills/bower.png differ
diff --git a/docs/assets/images/skills/centos.png b/docs/assets/images/skills/centos.png
new file mode 100644
index 00000000..04fafcf6
Binary files /dev/null and b/docs/assets/images/skills/centos.png differ
diff --git a/docs/assets/images/skills/compass.png b/docs/assets/images/skills/compass.png
new file mode 100644
index 00000000..ed3760c6
Binary files /dev/null and b/docs/assets/images/skills/compass.png differ
diff --git a/docs/assets/images/skills/composer.png b/docs/assets/images/skills/composer.png
new file mode 100644
index 00000000..f00bbc7f
Binary files /dev/null and b/docs/assets/images/skills/composer.png differ
diff --git a/docs/assets/images/skills/debian.png b/docs/assets/images/skills/debian.png
new file mode 100644
index 00000000..11399846
Binary files /dev/null and b/docs/assets/images/skills/debian.png differ
diff --git a/docs/assets/images/skills/docker.png b/docs/assets/images/skills/docker.png
new file mode 100644
index 00000000..3c4fb1f7
Binary files /dev/null and b/docs/assets/images/skills/docker.png differ
diff --git a/docs/assets/images/skills/drupal-commerce.png b/docs/assets/images/skills/drupal-commerce.png
new file mode 100644
index 00000000..88a5065d
Binary files /dev/null and b/docs/assets/images/skills/drupal-commerce.png differ
diff --git a/docs/assets/images/skills/drupal.png b/docs/assets/images/skills/drupal.png
new file mode 100644
index 00000000..225b774d
Binary files /dev/null and b/docs/assets/images/skills/drupal.png differ
diff --git a/docs/assets/images/skills/druplicon.png b/docs/assets/images/skills/druplicon.png
new file mode 100644
index 00000000..5d8f3bc6
Binary files /dev/null and b/docs/assets/images/skills/druplicon.png differ
diff --git a/docs/assets/images/skills/fabric.png b/docs/assets/images/skills/fabric.png
new file mode 100644
index 00000000..d7e3b1e3
Binary files /dev/null and b/docs/assets/images/skills/fabric.png differ
diff --git a/docs/assets/images/skills/git.png b/docs/assets/images/skills/git.png
new file mode 100644
index 00000000..d87a5c13
Binary files /dev/null and b/docs/assets/images/skills/git.png differ
diff --git a/docs/assets/images/skills/grunt.png b/docs/assets/images/skills/grunt.png
new file mode 100644
index 00000000..5e7e3d1f
Binary files /dev/null and b/docs/assets/images/skills/grunt.png differ
diff --git a/docs/assets/images/skills/gulp.png b/docs/assets/images/skills/gulp.png
new file mode 100644
index 00000000..36e27511
Binary files /dev/null and b/docs/assets/images/skills/gulp.png differ
diff --git a/docs/assets/images/skills/jekyll.png b/docs/assets/images/skills/jekyll.png
new file mode 100644
index 00000000..0b364c99
Binary files /dev/null and b/docs/assets/images/skills/jekyll.png differ
diff --git a/docs/assets/images/skills/jenkins.png b/docs/assets/images/skills/jenkins.png
new file mode 100644
index 00000000..fd5fd2fb
Binary files /dev/null and b/docs/assets/images/skills/jenkins.png differ
diff --git a/docs/assets/images/skills/jquery.gif b/docs/assets/images/skills/jquery.gif
new file mode 100644
index 00000000..875a21c6
Binary files /dev/null and b/docs/assets/images/skills/jquery.gif differ
diff --git a/docs/assets/images/skills/laravel.png b/docs/assets/images/skills/laravel.png
new file mode 100644
index 00000000..5d9e9ac7
Binary files /dev/null and b/docs/assets/images/skills/laravel.png differ
diff --git a/docs/assets/images/skills/less.png b/docs/assets/images/skills/less.png
new file mode 100644
index 00000000..83aea150
Binary files /dev/null and b/docs/assets/images/skills/less.png differ
diff --git a/docs/assets/images/skills/linode.png b/docs/assets/images/skills/linode.png
new file mode 100644
index 00000000..12867911
Binary files /dev/null and b/docs/assets/images/skills/linode.png differ
diff --git a/docs/assets/images/skills/linux.png b/docs/assets/images/skills/linux.png
new file mode 100644
index 00000000..25fb18f1
Binary files /dev/null and b/docs/assets/images/skills/linux.png differ
diff --git a/docs/assets/images/skills/lumen.png b/docs/assets/images/skills/lumen.png
new file mode 100644
index 00000000..bae6e8e3
Binary files /dev/null and b/docs/assets/images/skills/lumen.png differ
diff --git a/docs/assets/images/skills/mariadb.png b/docs/assets/images/skills/mariadb.png
new file mode 100644
index 00000000..bf0eef59
Binary files /dev/null and b/docs/assets/images/skills/mariadb.png differ
diff --git a/docs/assets/images/skills/mysql.png b/docs/assets/images/skills/mysql.png
new file mode 100644
index 00000000..899bf548
Binary files /dev/null and b/docs/assets/images/skills/mysql.png differ
diff --git a/docs/assets/images/skills/nginx.png b/docs/assets/images/skills/nginx.png
new file mode 100644
index 00000000..7975b655
Binary files /dev/null and b/docs/assets/images/skills/nginx.png differ
diff --git a/docs/assets/images/skills/npm.png b/docs/assets/images/skills/npm.png
new file mode 100644
index 00000000..cc078390
Binary files /dev/null and b/docs/assets/images/skills/npm.png differ
diff --git a/docs/assets/images/skills/originals/ansible.png b/docs/assets/images/skills/originals/ansible.png
new file mode 100644
index 00000000..b66283b7
Binary files /dev/null and b/docs/assets/images/skills/originals/ansible.png differ
diff --git a/docs/assets/images/skills/originals/apache.png b/docs/assets/images/skills/originals/apache.png
new file mode 100644
index 00000000..b20bb7fa
Binary files /dev/null and b/docs/assets/images/skills/originals/apache.png differ
diff --git a/docs/assets/images/skills/originals/behat.png b/docs/assets/images/skills/originals/behat.png
new file mode 100644
index 00000000..d2b54f9f
Binary files /dev/null and b/docs/assets/images/skills/originals/behat.png differ
diff --git a/docs/assets/images/skills/originals/bower.png b/docs/assets/images/skills/originals/bower.png
new file mode 100644
index 00000000..2e66d0f9
Binary files /dev/null and b/docs/assets/images/skills/originals/bower.png differ
diff --git a/docs/assets/images/skills/originals/centos.png b/docs/assets/images/skills/originals/centos.png
new file mode 100644
index 00000000..4699ed6a
Binary files /dev/null and b/docs/assets/images/skills/originals/centos.png differ
diff --git a/docs/assets/images/skills/originals/compass.png b/docs/assets/images/skills/originals/compass.png
new file mode 100644
index 00000000..a2f60d29
Binary files /dev/null and b/docs/assets/images/skills/originals/compass.png differ
diff --git a/docs/assets/images/skills/originals/composer.png b/docs/assets/images/skills/originals/composer.png
new file mode 100644
index 00000000..8d0d3b28
Binary files /dev/null and b/docs/assets/images/skills/originals/composer.png differ
diff --git a/docs/assets/images/skills/originals/debian.png b/docs/assets/images/skills/originals/debian.png
new file mode 100644
index 00000000..3ebc9ae8
Binary files /dev/null and b/docs/assets/images/skills/originals/debian.png differ
diff --git a/docs/assets/images/skills/originals/docker.png b/docs/assets/images/skills/originals/docker.png
new file mode 100644
index 00000000..68bd7d47
Binary files /dev/null and b/docs/assets/images/skills/originals/docker.png differ
diff --git a/docs/assets/images/skills/originals/drupal-commerce.png b/docs/assets/images/skills/originals/drupal-commerce.png
new file mode 100644
index 00000000..e91faf3e
Binary files /dev/null and b/docs/assets/images/skills/originals/drupal-commerce.png differ
diff --git a/docs/assets/images/skills/originals/drupal.png b/docs/assets/images/skills/originals/drupal.png
new file mode 100644
index 00000000..b49d89f9
Binary files /dev/null and b/docs/assets/images/skills/originals/drupal.png differ
diff --git a/docs/assets/images/skills/originals/druplicon.png b/docs/assets/images/skills/originals/druplicon.png
new file mode 100644
index 00000000..e42158db
Binary files /dev/null and b/docs/assets/images/skills/originals/druplicon.png differ
diff --git a/docs/assets/images/skills/originals/fabric.png b/docs/assets/images/skills/originals/fabric.png
new file mode 100644
index 00000000..bc76697e
Binary files /dev/null and b/docs/assets/images/skills/originals/fabric.png differ
diff --git a/docs/assets/images/skills/originals/git.png b/docs/assets/images/skills/originals/git.png
new file mode 100644
index 00000000..3888ded2
Binary files /dev/null and b/docs/assets/images/skills/originals/git.png differ
diff --git a/docs/assets/images/skills/originals/grunt.png b/docs/assets/images/skills/originals/grunt.png
new file mode 100644
index 00000000..312e8551
Binary files /dev/null and b/docs/assets/images/skills/originals/grunt.png differ
diff --git a/docs/assets/images/skills/originals/gulp.png b/docs/assets/images/skills/originals/gulp.png
new file mode 100644
index 00000000..2c2ccbe5
Binary files /dev/null and b/docs/assets/images/skills/originals/gulp.png differ
diff --git a/docs/assets/images/skills/originals/jekyll.png b/docs/assets/images/skills/originals/jekyll.png
new file mode 100644
index 00000000..a57c9d13
Binary files /dev/null and b/docs/assets/images/skills/originals/jekyll.png differ
diff --git a/docs/assets/images/skills/originals/jenkins.png b/docs/assets/images/skills/originals/jenkins.png
new file mode 100644
index 00000000..c3b99131
Binary files /dev/null and b/docs/assets/images/skills/originals/jenkins.png differ
diff --git a/docs/assets/images/skills/originals/jquery.gif b/docs/assets/images/skills/originals/jquery.gif
new file mode 100644
index 00000000..229cce09
Binary files /dev/null and b/docs/assets/images/skills/originals/jquery.gif differ
diff --git a/docs/assets/images/skills/originals/laravel.png b/docs/assets/images/skills/originals/laravel.png
new file mode 100644
index 00000000..3c83accd
Binary files /dev/null and b/docs/assets/images/skills/originals/laravel.png differ
diff --git a/docs/assets/images/skills/originals/less.png b/docs/assets/images/skills/originals/less.png
new file mode 100644
index 00000000..80cd74eb
Binary files /dev/null and b/docs/assets/images/skills/originals/less.png differ
diff --git a/docs/assets/images/skills/originals/linux.png b/docs/assets/images/skills/originals/linux.png
new file mode 100644
index 00000000..cd829a5d
Binary files /dev/null and b/docs/assets/images/skills/originals/linux.png differ
diff --git a/docs/assets/images/skills/originals/lumen.png b/docs/assets/images/skills/originals/lumen.png
new file mode 100644
index 00000000..6af79c3f
Binary files /dev/null and b/docs/assets/images/skills/originals/lumen.png differ
diff --git a/docs/assets/images/skills/originals/mariadb.png b/docs/assets/images/skills/originals/mariadb.png
new file mode 100644
index 00000000..152f5b59
Binary files /dev/null and b/docs/assets/images/skills/originals/mariadb.png differ
diff --git a/docs/assets/images/skills/originals/mysql.png b/docs/assets/images/skills/originals/mysql.png
new file mode 100644
index 00000000..5e570821
Binary files /dev/null and b/docs/assets/images/skills/originals/mysql.png differ
diff --git a/docs/assets/images/skills/originals/nginx.png b/docs/assets/images/skills/originals/nginx.png
new file mode 100644
index 00000000..8c32e4db
Binary files /dev/null and b/docs/assets/images/skills/originals/nginx.png differ
diff --git a/docs/assets/images/skills/originals/npm.png b/docs/assets/images/skills/originals/npm.png
new file mode 100644
index 00000000..f73190cd
Binary files /dev/null and b/docs/assets/images/skills/originals/npm.png differ
diff --git a/docs/assets/images/skills/originals/php.png b/docs/assets/images/skills/originals/php.png
new file mode 100644
index 00000000..4e11fb75
Binary files /dev/null and b/docs/assets/images/skills/originals/php.png differ
diff --git a/docs/assets/images/skills/originals/phpunit.png b/docs/assets/images/skills/originals/phpunit.png
new file mode 100644
index 00000000..ce47e7c1
Binary files /dev/null and b/docs/assets/images/skills/originals/phpunit.png differ
diff --git a/docs/assets/images/skills/originals/puppet.png b/docs/assets/images/skills/originals/puppet.png
new file mode 100644
index 00000000..2291e0d8
Binary files /dev/null and b/docs/assets/images/skills/originals/puppet.png differ
diff --git a/docs/assets/images/skills/originals/sass.png b/docs/assets/images/skills/originals/sass.png
new file mode 100644
index 00000000..4dddedfe
Binary files /dev/null and b/docs/assets/images/skills/originals/sass.png differ
diff --git a/docs/assets/images/skills/originals/sculpin.png b/docs/assets/images/skills/originals/sculpin.png
new file mode 100644
index 00000000..3fe09cc8
Binary files /dev/null and b/docs/assets/images/skills/originals/sculpin.png differ
diff --git a/docs/assets/images/skills/originals/silex.png b/docs/assets/images/skills/originals/silex.png
new file mode 100644
index 00000000..6e9a31d1
Binary files /dev/null and b/docs/assets/images/skills/originals/silex.png differ
diff --git a/docs/assets/images/skills/originals/simpletest.png b/docs/assets/images/skills/originals/simpletest.png
new file mode 100644
index 00000000..76c497c2
Binary files /dev/null and b/docs/assets/images/skills/originals/simpletest.png differ
diff --git a/docs/assets/images/skills/originals/solr.png b/docs/assets/images/skills/originals/solr.png
new file mode 100644
index 00000000..83a07ed5
Binary files /dev/null and b/docs/assets/images/skills/originals/solr.png differ
diff --git a/docs/assets/images/skills/originals/svn.jpg b/docs/assets/images/skills/originals/svn.jpg
new file mode 100644
index 00000000..b3389531
Binary files /dev/null and b/docs/assets/images/skills/originals/svn.jpg differ
diff --git a/docs/assets/images/skills/originals/symfony.png b/docs/assets/images/skills/originals/symfony.png
new file mode 100644
index 00000000..7691400c
Binary files /dev/null and b/docs/assets/images/skills/originals/symfony.png differ
diff --git a/docs/assets/images/skills/originals/twig.png b/docs/assets/images/skills/originals/twig.png
new file mode 100644
index 00000000..31b588c0
Binary files /dev/null and b/docs/assets/images/skills/originals/twig.png differ
diff --git a/docs/assets/images/skills/originals/ubercart.png b/docs/assets/images/skills/originals/ubercart.png
new file mode 100644
index 00000000..66a2feb8
Binary files /dev/null and b/docs/assets/images/skills/originals/ubercart.png differ
diff --git a/docs/assets/images/skills/originals/ubuntu.png b/docs/assets/images/skills/originals/ubuntu.png
new file mode 100644
index 00000000..11f600b7
Binary files /dev/null and b/docs/assets/images/skills/originals/ubuntu.png differ
diff --git a/docs/assets/images/skills/originals/vagrant.png b/docs/assets/images/skills/originals/vagrant.png
new file mode 100644
index 00000000..86362161
Binary files /dev/null and b/docs/assets/images/skills/originals/vagrant.png differ
diff --git a/docs/assets/images/skills/originals/wordpress.png b/docs/assets/images/skills/originals/wordpress.png
new file mode 100644
index 00000000..02674d29
Binary files /dev/null and b/docs/assets/images/skills/originals/wordpress.png differ
diff --git a/docs/assets/images/skills/pantheon.png b/docs/assets/images/skills/pantheon.png
new file mode 100644
index 00000000..c31e699b
Binary files /dev/null and b/docs/assets/images/skills/pantheon.png differ
diff --git a/docs/assets/images/skills/php.png b/docs/assets/images/skills/php.png
new file mode 100644
index 00000000..aa362374
Binary files /dev/null and b/docs/assets/images/skills/php.png differ
diff --git a/docs/assets/images/skills/phpunit.png b/docs/assets/images/skills/phpunit.png
new file mode 100644
index 00000000..e4590836
Binary files /dev/null and b/docs/assets/images/skills/phpunit.png differ
diff --git a/docs/assets/images/skills/platform.png b/docs/assets/images/skills/platform.png
new file mode 100644
index 00000000..629a054f
Binary files /dev/null and b/docs/assets/images/skills/platform.png differ
diff --git a/docs/assets/images/skills/puppet.png b/docs/assets/images/skills/puppet.png
new file mode 100644
index 00000000..69fed327
Binary files /dev/null and b/docs/assets/images/skills/puppet.png differ
diff --git a/docs/assets/images/skills/sass.png b/docs/assets/images/skills/sass.png
new file mode 100644
index 00000000..201fad8f
Binary files /dev/null and b/docs/assets/images/skills/sass.png differ
diff --git a/docs/assets/images/skills/sculpin.png b/docs/assets/images/skills/sculpin.png
new file mode 100644
index 00000000..cd98dee9
Binary files /dev/null and b/docs/assets/images/skills/sculpin.png differ
diff --git a/docs/assets/images/skills/silex.png b/docs/assets/images/skills/silex.png
new file mode 100644
index 00000000..6f1bdfb0
Binary files /dev/null and b/docs/assets/images/skills/silex.png differ
diff --git a/docs/assets/images/skills/simpletest.png b/docs/assets/images/skills/simpletest.png
new file mode 100644
index 00000000..77019c42
Binary files /dev/null and b/docs/assets/images/skills/simpletest.png differ
diff --git a/docs/assets/images/skills/solr.png b/docs/assets/images/skills/solr.png
new file mode 100644
index 00000000..35a42ac0
Binary files /dev/null and b/docs/assets/images/skills/solr.png differ
diff --git a/docs/assets/images/skills/svn.jpg b/docs/assets/images/skills/svn.jpg
new file mode 100644
index 00000000..08858243
Binary files /dev/null and b/docs/assets/images/skills/svn.jpg differ
diff --git a/docs/assets/images/skills/symfony.png b/docs/assets/images/skills/symfony.png
new file mode 100644
index 00000000..9cad2920
Binary files /dev/null and b/docs/assets/images/skills/symfony.png differ
diff --git a/docs/assets/images/skills/twig.png b/docs/assets/images/skills/twig.png
new file mode 100644
index 00000000..bf33bf1b
Binary files /dev/null and b/docs/assets/images/skills/twig.png differ
diff --git a/docs/assets/images/skills/ubercart.png b/docs/assets/images/skills/ubercart.png
new file mode 100644
index 00000000..b0e51473
Binary files /dev/null and b/docs/assets/images/skills/ubercart.png differ
diff --git a/docs/assets/images/skills/ubuntu.png b/docs/assets/images/skills/ubuntu.png
new file mode 100644
index 00000000..a29e370a
Binary files /dev/null and b/docs/assets/images/skills/ubuntu.png differ
diff --git a/docs/assets/images/skills/vagrant.png b/docs/assets/images/skills/vagrant.png
new file mode 100644
index 00000000..75f536d3
Binary files /dev/null and b/docs/assets/images/skills/vagrant.png differ
diff --git a/docs/assets/images/skills/wordpress.png b/docs/assets/images/skills/wordpress.png
new file mode 100644
index 00000000..b7ab6651
Binary files /dev/null and b/docs/assets/images/skills/wordpress.png differ
diff --git a/docs/assets/images/talks/dclondon16.png b/docs/assets/images/talks/dclondon16.png
new file mode 100644
index 00000000..51087743
Binary files /dev/null and b/docs/assets/images/talks/dclondon16.png differ
diff --git a/docs/assets/images/talks/deploying-php-fabric.png b/docs/assets/images/talks/deploying-php-fabric.png
new file mode 100644
index 00000000..00cd27df
Binary files /dev/null and b/docs/assets/images/talks/deploying-php-fabric.png differ
diff --git a/docs/assets/images/talks/drupal-vm-meet-symfony-console.png b/docs/assets/images/talks/drupal-vm-meet-symfony-console.png
new file mode 100644
index 00000000..020070d1
Binary files /dev/null and b/docs/assets/images/talks/drupal-vm-meet-symfony-console.png differ
diff --git a/docs/assets/images/talks/drush-make-is-dead-long-live-composer.png b/docs/assets/images/talks/drush-make-is-dead-long-live-composer.png
new file mode 100644
index 00000000..e68825c5
Binary files /dev/null and b/docs/assets/images/talks/drush-make-is-dead-long-live-composer.png differ
diff --git a/docs/assets/images/talks/getting-your-data-into-drupal-8.png b/docs/assets/images/talks/getting-your-data-into-drupal-8.png
new file mode 100644
index 00000000..f75df491
Binary files /dev/null and b/docs/assets/images/talks/getting-your-data-into-drupal-8.png differ
diff --git a/docs/assets/images/talks/logos/drupal-bristol.jpg b/docs/assets/images/talks/logos/drupal-bristol.jpg
new file mode 100644
index 00000000..26f9ebe3
Binary files /dev/null and b/docs/assets/images/talks/logos/drupal-bristol.jpg differ
diff --git a/docs/assets/images/talks/logos/drupalcamp-brighton-2015.png b/docs/assets/images/talks/logos/drupalcamp-brighton-2015.png
new file mode 100644
index 00000000..aeef43dd
Binary files /dev/null and b/docs/assets/images/talks/logos/drupalcamp-brighton-2015.png differ
diff --git a/docs/assets/images/talks/logos/drupalcamp-bristol-2016.png b/docs/assets/images/talks/logos/drupalcamp-bristol-2016.png
new file mode 100644
index 00000000..fed927e8
Binary files /dev/null and b/docs/assets/images/talks/logos/drupalcamp-bristol-2016.png differ
diff --git a/docs/assets/images/talks/logos/drupalcamp-london-2014.png b/docs/assets/images/talks/logos/drupalcamp-london-2014.png
new file mode 100644
index 00000000..18ef8fbb
Binary files /dev/null and b/docs/assets/images/talks/logos/drupalcamp-london-2014.png differ
diff --git a/docs/assets/images/talks/logos/drupalcamp-london-2015.png b/docs/assets/images/talks/logos/drupalcamp-london-2015.png
new file mode 100644
index 00000000..4d079b45
Binary files /dev/null and b/docs/assets/images/talks/logos/drupalcamp-london-2015.png differ
diff --git a/docs/assets/images/talks/logos/drupalcamp-london-2017.png b/docs/assets/images/talks/logos/drupalcamp-london-2017.png
new file mode 100644
index 00000000..24d36f81
Binary files /dev/null and b/docs/assets/images/talks/logos/drupalcamp-london-2017.png differ
diff --git a/docs/assets/images/talks/logos/drupalcamp-north-2015.png b/docs/assets/images/talks/logos/drupalcamp-north-2015.png
new file mode 100644
index 00000000..83161181
Binary files /dev/null and b/docs/assets/images/talks/logos/drupalcamp-north-2015.png differ
diff --git a/docs/assets/images/talks/logos/nomad-php.png b/docs/assets/images/talks/logos/nomad-php.png
new file mode 100644
index 00000000..ccb4fd81
Binary files /dev/null and b/docs/assets/images/talks/logos/nomad-php.png differ
diff --git a/docs/assets/images/talks/logos/nwdug.jpeg b/docs/assets/images/talks/logos/nwdug.jpeg
new file mode 100644
index 00000000..af06a2ec
Binary files /dev/null and b/docs/assets/images/talks/logos/nwdug.jpeg differ
diff --git a/docs/assets/images/talks/logos/php-south-coast-2016.png b/docs/assets/images/talks/logos/php-south-coast-2016.png
new file mode 100644
index 00000000..5f024905
Binary files /dev/null and b/docs/assets/images/talks/logos/php-south-coast-2016.png differ
diff --git a/docs/assets/images/talks/logos/phpsw.png b/docs/assets/images/talks/logos/phpsw.png
new file mode 100644
index 00000000..b9b92f88
Binary files /dev/null and b/docs/assets/images/talks/logos/phpsw.png differ
diff --git a/docs/assets/images/talks/logos/swdug.png b/docs/assets/images/talks/logos/swdug.png
new file mode 100644
index 00000000..73a5593f
Binary files /dev/null and b/docs/assets/images/talks/logos/swdug.png differ
diff --git a/docs/assets/images/talks/logos/umbristol.jpeg b/docs/assets/images/talks/logos/umbristol.jpeg
new file mode 100644
index 00000000..b1e0b4f0
Binary files /dev/null and b/docs/assets/images/talks/logos/umbristol.jpeg differ
diff --git a/docs/assets/images/talks/logos/unified-diff.png b/docs/assets/images/talks/logos/unified-diff.png
new file mode 100644
index 00000000..46808b28
Binary files /dev/null and b/docs/assets/images/talks/logos/unified-diff.png differ
diff --git a/docs/assets/images/talks/test-driven-drupal-development.png b/docs/assets/images/talks/test-driven-drupal-development.png
new file mode 100644
index 00000000..7044f4a6
Binary files /dev/null and b/docs/assets/images/talks/test-driven-drupal-development.png differ
diff --git a/docs/assets/images/testimonials/brian-healy.png b/docs/assets/images/testimonials/brian-healy.png
new file mode 100644
index 00000000..c2faca16
Binary files /dev/null and b/docs/assets/images/testimonials/brian-healy.png differ
diff --git a/docs/assets/images/testimonials/chris-jarvis.jpg b/docs/assets/images/testimonials/chris-jarvis.jpg
new file mode 100644
index 00000000..a302c0fe
Binary files /dev/null and b/docs/assets/images/testimonials/chris-jarvis.jpg differ
diff --git a/docs/assets/images/testimonials/ed-welsby.png b/docs/assets/images/testimonials/ed-welsby.png
new file mode 100644
index 00000000..f9989763
Binary files /dev/null and b/docs/assets/images/testimonials/ed-welsby.png differ
diff --git a/docs/assets/images/testimonials/holly-ross.png b/docs/assets/images/testimonials/holly-ross.png
new file mode 100644
index 00000000..9fa2353a
Binary files /dev/null and b/docs/assets/images/testimonials/holly-ross.png differ
diff --git a/docs/assets/images/testimonials/james-chapman.png b/docs/assets/images/testimonials/james-chapman.png
new file mode 100644
index 00000000..c94ebb61
Binary files /dev/null and b/docs/assets/images/testimonials/james-chapman.png differ
diff --git a/docs/assets/images/testimonials/josh-mitchell.png b/docs/assets/images/testimonials/josh-mitchell.png
new file mode 100644
index 00000000..c1e2c4c0
Binary files /dev/null and b/docs/assets/images/testimonials/josh-mitchell.png differ
diff --git a/docs/assets/images/testimonials/leonie-watson.jpg b/docs/assets/images/testimonials/leonie-watson.jpg
new file mode 100644
index 00000000..51cc7800
Binary files /dev/null and b/docs/assets/images/testimonials/leonie-watson.jpg differ
diff --git a/docs/assets/js/site.js b/docs/assets/js/site.js
new file mode 100644
index 00000000..c286d700
--- /dev/null
+++ b/docs/assets/js/site.js
@@ -0,0 +1,12411 @@
+/*!
+ * jQuery JavaScript Library v2.2.4
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-05-20T17:23Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//"use strict";
+var arr = [];
+
+var document = window.document;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ version = "2.2.4",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
+
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray( src ) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject( src ) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isFunction: function( obj ) {
+ return jQuery.type( obj ) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ // adding 1 corrects loss of precision from parseFloat (#15100)
+ var realStringObj = obj && obj.toString();
+ return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ var key;
+
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !hasOwn.call( obj, "constructor" ) &&
+ !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own
+ for ( key in obj ) {}
+
+ return key === undefined || hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android<4.0, iOS<6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf( "use strict" ) === 1 ) {
+ script = document.createElement( "script" );
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE9-11+
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+// JSHint would error on this code due to the Symbol not being defined in ES5.
+// Defining this global in .jshintrc would create a danger of using the global
+// unguarded in another place, it seems safer to just disable JSHint for these
+// three lines.
+/* jshint ignore: start */
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+/* jshint ignore: end */
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+ // Support: iOS 8.2 (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.1
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-10-17
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // http://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, nidselect, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+ // ID selector
+ if ( (m = match[1]) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( (elem = context.getElementById( m )) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && (elem = newContext.getElementById( m )) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !compilerCache[ selector + " " ] &&
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+ if ( nodeType !== 1 ) {
+ newContext = context;
+ newSelector = selector;
+
+ // qSA looks outside Element context, which is not what we want
+ // Thanks to Andrew Dupont for this workaround technique
+ // Support: IE <=8
+ // Exclude object elements
+ } else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( (nid = context.getAttribute( "id" )) ) {
+ nid = nid.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", (nid = expando) );
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
+ while ( i-- ) {
+ groups[i] = nidselect + " " + toSelector( groups[i] );
+ }
+ newSelector = groups.join( "," );
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, parent,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if ( (parent = document.defaultView) && parent.top !== parent ) {
+ // Support: IE 11
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( document.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var m = context.getElementById( id );
+ return m ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ docElem.appendChild( div ).innerHTML = "
" +
+ "
" +
+ " ";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !compilerCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if ( useCache ) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+ if ( (oldCache = uniqueCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari:
) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ if ( !context && elem.ownerDocument !== document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context || document, xml) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = " ";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = " ";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ // Support: Blackberry 4.6
+ // gEBID returns nodes no longer in the document (#6963)
+ if ( elem && elem.parentNode ) {
+
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[ 0 ] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( pos ?
+ pos.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnotwhite = ( /\S+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( jQuery.isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks( "memory" ) ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this === promise ? newDefer.promise() : this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add( function() {
+
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 ||
+ ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred.
+ // If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // Add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .progress( updateFunc( i, progressContexts, progressValues ) )
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // If we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+} );
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+} );
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called
+ // after the browser event has already occurred.
+ // Support: IE9-10 only
+ // Older IE sometimes signals "interactive" too soon
+ if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ register: function( owner, initial ) {
+ var value = initial || {};
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable, non-writable property
+ // configurability must be true to allow the property to be
+ // deleted with the delete operator
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ writable: true,
+ configurable: true
+ } );
+ }
+ return owner[ this.expando ];
+ },
+ cache: function( owner ) {
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( !acceptData( owner ) ) {
+ return {};
+ }
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+ owner[ this.expando ] && owner[ this.expando ][ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase( key ) );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key === undefined ) {
+ this.register( owner );
+
+ } else {
+
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <= 35-45+
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://code.google.com/p/chromium/issues/detail?id=378607
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data, camelKey;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = dataUser.get( elem, key ) ||
+
+ // Try to find dashed key if it exists (gh-2779)
+ // This is for 2.2.x only
+ dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() );
+
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ camelKey = jQuery.camelCase( key );
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = dataUser.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ camelKey = jQuery.camelCase( key );
+ this.each( function() {
+
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = dataUser.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ dataUser.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf( "-" ) > -1 && data !== undefined ) {
+ dataUser.set( this, key, value );
+ }
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" ||
+ !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted,
+ scale = 1,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() { return tween.cur(); } :
+ function() { return jQuery.css( elem, prop, "" ); },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ do {
+
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ initialInUnit = initialInUnit / scale;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // Break the loop if scale is unchanged or perfect, or if we've just had enough.
+ } while (
+ scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+ );
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([\w:-]+)/ );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // Support: IE9
+ option: [ 1, "", " " ],
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting or other required elements.
+ thead: [ 1, "" ],
+ col: [ 2, "" ],
+ tr: [ 2, "" ],
+ td: [ 3, "" ],
+
+ _default: [ 0, "", "" ]
+};
+
+// Support: IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+ // Support: IE9-11+
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret = typeof context.getElementsByTagName !== "undefined" ?
+ context.getElementsByTagName( tag || "*" ) :
+ typeof context.querySelectorAll !== "undefined" ?
+ context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+
+ // Support: Android<4.1, PhantomJS<2
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android<4.1, PhantomJS<2
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0-4.3, Safari<=5.1
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari<=5.1, Android<4.2
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<=11+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE9
+// See #13393 for more info
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = {};
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Support (at least): Chrome, IE9
+ // Find delegate handlers
+ // Black-hole SVG instance trees (#13180)
+ //
+ // Support: Firefox<=42+
+ // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
+ if ( delegateCount && cur.nodeType &&
+ ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push( { elem: cur, handlers: matches } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
+ "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split( " " ),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " +
+ "screenX screenY toElement" ).split( " " ),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX +
+ ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
+ ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY +
+ ( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
+ ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome<28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android<4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://code.google.com/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
+
+ // Support: IE 10-11, Edge 10240+
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /
+
+
+
+
+
diff --git a/docs/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio/index.html b/docs/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio/index.html
new file mode 100644
index 00000000..b38c1bb9
--- /dev/null
+++ b/docs/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio/index.html
@@ -0,0 +1,245 @@
+
+
+
+ Using ImageCache and ImageCrop for my Portfolio | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Using ImageCache and ImageCrop for my Portfolio
+
+28th April 2010
+
+ Whilst working on my own portfolio/testimonial website, I decided to have a portfolio page displaying the name of each site and a thumbnail image. For this Blog post, I'll be using a site called Popcorn Strips which I built for a friend earlier this year as an example.
+
+I created a content type called 'Project' with a CCK ImageField called 'Screenshot'. I created a project called Popcorn Strips , used the ScreenGrab add-on for Mozilla Firefox to take a screenshot of the website, and uploaded it to the project node.
+
+I created a View to display the published projects, and an ImageCache
+preset to create the thumbnail image by scaling and cropping the image
+to a size of 200x100 pixels.
+
+Although, this automatically focused the crop on the centre of the image, whereas I wanted to crop from the top and left of the image - showing the site's logo and header.
+
+I installed the ImageCrop module, which add a jQuery crop function to the standard ImageCache presents. I removed the original Scale and Crop action and replaced it with a Scale action with a width of 200px.
+
+I then added a new 'Javascript crop' action with the following settings:
+
+
+Width: 200px
+Height: 100px
+xoffset: Left
+yoffset: Top
+
+
+
+ Tags:
+ drupal , drupal-6 , cck , imagecache , imagecrop , imagefield
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/05/06/conditional-email-addresses-webform/index.html b/docs/blog/2010/05/06/conditional-email-addresses-webform/index.html
new file mode 100644
index 00000000..e9a20063
--- /dev/null
+++ b/docs/blog/2010/05/06/conditional-email-addresses-webform/index.html
@@ -0,0 +1,233 @@
+
+
+
+ Conditional Email Addresses in a Webform | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Conditional Email Addresses in a Webform
+
+6th May 2010
+
+ I created a new Webform to serve as a simple Contact form, but left the main configuration until after I created the form components. I added 'Name', 'Email', 'Subject' and 'Message' fields, as well as a 'Category' select list. Below 'Options', I entered each of my desired options in the following format:
+
+Email address|Visible name
+
+
+I went back to the form configuration page and expanded 'Conditional Email Recipients', and selected my Category. Note that the standard 'Email To' field above it needs to be empty. Originally, I made the mistake of leaving addresses in that field which resulted in people being sent emails regardles of which category was selected. I then configured the rest of the form.
+
+Then, when I went to the finished form, the category selection was available.
+
+
+ Tags:
+ drupal-planet , drupal-6 , conditional-email , webform
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile/index.html b/docs/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile/index.html
new file mode 100644
index 00000000..2c9e4bce
--- /dev/null
+++ b/docs/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile/index.html
@@ -0,0 +1,230 @@
+
+
+
+ Quickly Create Zen Subthemes Using Zenophile | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Quickly Create Zen Subthemes Using Zenophile
+
+10th May 2010
+
+ If you use the Zen theme, then you should also be using the Zenophile module!
+
+The Zenophile module allows you to very quickly create Zen subthemes from within your web browser, as well as editing options such as the site directory where it should be placed, the layout type (fixed or fluid), page wrapper and sidebar widths, and the placement of the sidebars.
+
+For more information about the Zenophile module, check out this video by Elliott Rothman .
+
+
+ Tags:
+ drupal-planet , drupal-6 , drupal-modules , drupal-theming , zen , zenophile
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide/index.html b/docs/blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide/index.html
new file mode 100644
index 00000000..e5513324
--- /dev/null
+++ b/docs/blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide/index.html
@@ -0,0 +1,239 @@
+
+
+
+ Create a Slideshow of Multiple Images Using Fancy Slide | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create a Slideshow of Multiple Images Using Fancy Slide
+
+25th May 2010
+
+ Whilst updating my About page, I thought about creating a slideshow of several images instead of just the one static image. When I looking on Drupal.org, the only slideshow modules were to create slideshows of images that were attached to different nodes - not multiple images attached to one node. Then, I found the Fancy Slide module. It's a jQuery Slideshow module with features that include integration with the CCK , ImageCache and Nodequeue modules.
+
+I added an CCK Image field to my Page content type, and set the number of values to 3, then uploaded my images to the Page.
+
+Once the Images were added, I went to the Fancy Slide settings page and created the slideshow.
+
+I added the dimensions of my images, the type of animation, specified the node that contained the images, the slideshow field, delay between slides and transition speed. With the slideshow created, it now needed embedding into the page.
+
+I added the following code into my About page, as described in the Fancy Slide readme.txt file - the number representing the ID of the slideshow.
+
+<?php print theme('fancy_slide', 1); ?>
+
+
+In my opinion, this adds a nice effect to the About page. I like it because it's easy to set up, and easy to add additional images later on if required.
+
+
+ Tags:
+ drupal-planet , drupal , drupal-6 , fancy-slide , slideshow
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module/index.html b/docs/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module/index.html
new file mode 100644
index 00000000..e24aa7e9
--- /dev/null
+++ b/docs/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module/index.html
@@ -0,0 +1,238 @@
+
+
+
+ Quickly Import Multiples Images Using the Imagefield_Import Module | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Quickly Import Multiples Images Using the Imagefield_Import Module
+
+29th May 2010
+
+ Thanks to Bob at Mustardseed Media for tweeting about this module. It's undoubtedly saved me hours of work today alone!
+
+I've recently started a personal project converting a website to Drupal. It's currently a static HTML/CSS site which also uses the Coppermine Photo Gallery . As part of building the new website, I wanted to move all the photos from the existing site onto the new one. However, with 1260 photos in 17 albums, this could have been a lengthy process!
+
+I created a new Drupal-powered Gallery as described in this screencast by Jeff Eaton - using the CCK and Imagefield modules, and re-created each of my existing Gallery nodes. Using the Imagefield_Import module, I was then able to quickly import the photos into the new Galleries.
+
+I downloaded all the photos from the previous Gallery via FTP, and installed and configured the Imagefield_Import module.
+
+I created an 'Import' folder, selected the target field and mode. In this case, I want each image to be imported into its own Photo node. I moved the photos for the first album into the Import folder, and loaded the 'Import Images' screen (admin/content/imagefield_import) .
+
+After clicking 'Import', a node is created for each photo, the image is uploaded, and added to the selected Gallery.
+
+Just another 1248 photos to go...
+
+
+ Tags:
+ drupal-planet , imagefield-import , drupal , drupal-6 , photo-gallery , cck , imagefield
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/06/02/improve-jpg-quality-imagecache-and-imageapi/index.html b/docs/blog/2010/06/02/improve-jpg-quality-imagecache-and-imageapi/index.html
new file mode 100644
index 00000000..7ad8e71c
--- /dev/null
+++ b/docs/blog/2010/06/02/improve-jpg-quality-imagecache-and-imageapi/index.html
@@ -0,0 +1,235 @@
+
+
+
+ Improve JPG Quality in Imagecache and ImageAPI | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Improve JPG Quality in Imagecache and ImageAPI
+
+2nd June 2010
+
+ Whilst uploading images for my Projects and Testimonials sections, I noticed that the Imagecache-scaled images weren't as high a quality the originals on my Mac. I did some searching online and found out that, by default, Drupal resamples uploaded jpgs to 75% of their original quality.
+
+To increase the quality of your images, change the setting in the two following places:
+
+
+admin/settings/imageapi/config
+admin/settings/image-toolkit
+
+
+The first one is for ImageAPI. Primarily, this means Imagecache presets. The second one is for core's image.inc. This is used for resizing profile pictures in core, and some contrib modules. Once changed, I did have to flush each of the Imagecache presets (admin/build/imagecache) for the changes to take effect.
+
+
+ Tags:
+ drupal-planet , drupal-6 , imagecache
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue/index.html b/docs/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue/index.html
new file mode 100644
index 00000000..6f9f33f6
--- /dev/null
+++ b/docs/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue/index.html
@@ -0,0 +1,236 @@
+
+
+
+ Create a Block of Social Media Icons using CCK, Views and Nodequeue | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create a Block of Social Media Icons using CCK, Views and Nodequeue
+
+23rd June 2010
+
+ I recently decided that I wanted to have a block displayed in a sidebar on my site containing icons and links to my social media profiles - Twitter , Facebook etc. I tried the Follow module, but it lacked the option to add extra networks such my Drupal.org account, and my RSS feed . I started to create my own version, and then found this Blog post by Hank Palan.
+
+I created a 'Social icon' content type with the body field removed, and with fields for a link and image - then downloaded the favicons from the appropriate websites to use.
+
+However, instead of using a custom template (node-custom.tpl.php) file, I used the Views module.
+
+I added fields for the node titles, and the link from the node's content. Both of these are excluded from being displayed on the site. I then re-wrote the output of the Icon field to create the link using the URL, and using the node's title as the image's alternative text and the link's title.
+
+I also used the Nodequeue module to create a nodequeue and arrange the icons in the order that I wanted them to be displayed. Once this was added as a relationship within my View, I was able to use node's position in the nodequeue as the sort criteria.
+
+To complete the process, I used the CSS Injector module to add some additional CSS styling to position and space out the icons.
+
+
+ Tags:
+ drupal-planet , drupal-6 , drupal , views , nodequeue , oliverdavies.co.uk
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/06/25/10-useful-drupal-6-modules/index.html b/docs/blog/2010/06/25/10-useful-drupal-6-modules/index.html
new file mode 100644
index 00000000..75d26a68
--- /dev/null
+++ b/docs/blog/2010/06/25/10-useful-drupal-6-modules/index.html
@@ -0,0 +1,241 @@
+
+
+
+ 10 Useful Drupal 6 Modules | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10 Useful Drupal 6 Modules
+
+25th June 2010
+
+ Aside from the obvious candidates such as Views, CCK etc, here are a list of 10 contributed modules that I currently use on each Drupal project.
+
+So, in no particular order:
+
+
+Admin : The admin module provides UI improvements to the standard Drupal admin interface. I've just upgraded to the new 6.x-2.0-beta4 version, and installed the newly-required Rubik /Tao themes. So far, so good!
+Better Permissions /Filter Permissions : Basic permissions is a basic module which enhances the Drupal Permissions page to support collapsing and expanding permission rows. Filter permissions provides filters at the top of the Permissions page for easier management when your site has a large amount of roles and/or permissions.
+Better Formats : Better formats is a module to add more flexibility to Drupal's core input format system.
+Clone module : Allows users to make a copy of an existing item of site content (a node) and then edit that copy.
+Vertical Tabs : Integrated into Drupal 7 core, this module adds vertical tabs to the node add and edit forms.
+Context : Context allows you to manage contextual conditions and reactions for different portions of your site. You can think of each context as representing a "section" of your site. For each context, you can choose the conditions that trigger this context to be active and choose different aspects of Drupal that should react to this active context.
+Node Picker : A rewrite of the module TinyMCE Node Picker . Allows you to easily create links to internal nodes.
+Module Filter : What this module aims to accomplish is the ability to quickly find the module you are looking for without having to rely on the browsers search feature which more times than not shows you the module name in the 'Required by' or 'Depends on' sections of the various modules or even some other location on the page like a menu item.
+Zenophile : Quickly create Zen subthemes.
+Add Another : Add another displays a message after a user creates a node, and/or displays an "Add another" tab on nodes allowing them to make another node of the same type. You can control what roles and node types see this feature.
+
+
+
+ Tags:
+ drupal-planet , drupal-6 , drupal , drupal-modules
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views/index.html b/docs/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views/index.html
new file mode 100644
index 00000000..c15bbd39
--- /dev/null
+++ b/docs/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views/index.html
@@ -0,0 +1,259 @@
+
+
+
+ Create a Flickr Photo Gallery Using Feeds, CCK and Views | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create a Flickr Photo Gallery Using Feeds, CCK and Views
+
+28th June 2010
+
+ In this tutorial, I'll show you how to create a photo gallery which uses photos imported from Flickr .
+
+The modules that I'll use to create the Gallery are:
+
+
+
+The first thing that I did was to create a content type to store my imported images. I named it 'Photo', removed the Body field, and added an Image field.
+
+Next, I installed and configured the Feeds and Image Grabber module. I used an overridden default Feed to import my photos from Flickr using the following settings:
+
+
+Basic settings: I changed the Refresh time to 15 minutes.
+Processor settings: I changed the content type to 'Photo', and the author's name from 'anonymous'.
+Processor mapping: I added a new mapping from 'Item URL (link)' to 'Photo (FIG)'. The Photo FIG target is added by the Image Grabber module.
+
+
+Next, I needed to create the actual Feed, which I did by clicking 'Import' within the Navigation menu, and clicking 'Feed'. I gave it a title, entered the URL to my RSS feed from Flickr, and enabled the Image Grabber for this feed.
+
+Once the Feed is created, the latest 20 images from the RSS feed are imported and 20 new Photos nodes are created. In the example below, the image with the 'Photo' label is the Image field mapped by the Image Grabber module. It is this image that I'll be displaying within my Gallery.
+
+With the new Photo nodes created, I then created the View to display them.
+
+The View selects the image within the Photo content type, and displays in it a grid using an ImageCache preset. The View is limited to 20 nodes per page, and uses a full pager if this is exceeded. The nodes are sorted by the descending post date, and filtered by whether or not they are published, and only to include Photo nodes.
+
+As an additional effect, I also included the 'Feeds Item - Item Link' field, which is basically the original link from the RSS feed. By checking the box the exclude the item from the display, it is not shown, but makes the link available to be used elsewhere. By checking the box 'Re-write the output for this field' on the 'Content: Photo' field, I was able to add the replacement token (in this case, [url]) as the path for a link around each image. This meant that when someone clicked a thumbnail of a photo, they were directed to the Flickr website instead of the node within my Drupal site.
+
+
+ Tags:
+ drupal-planet , drupal-6 , photo-gallery , views , cck , imagecache , feeds , filefield , flickr , imagefield
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/07/01/change-content-type-multiple-nodes-using-sql/index.html b/docs/blog/2010/07/01/change-content-type-multiple-nodes-using-sql/index.html
new file mode 100644
index 00000000..d4a61081
--- /dev/null
+++ b/docs/blog/2010/07/01/change-content-type-multiple-nodes-using-sql/index.html
@@ -0,0 +1,238 @@
+
+
+
+ Change the Content Type of Multiple Nodes Using SQL | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Change the Content Type of Multiple Nodes Using SQL
+
+1st July 2010
+
+ In this post, I will be changing values within my Drupal 6 site's database to quickly change the content type of multiple nodes. I will be using a test development site with the core Blog module installed, and converting Blog posts to a custom content type called 'News article'.
+
+Before changing any values within the database, ensure that you have an up-to-date backup which you can restore if you encounter a problem!
+
+To begin with, I created the 'News article' content type, and then used the Devel Generate module to generate some Blog nodes.
+
+Using Sequel Pro , I can query the database to view the Blog posts (you can also do this via the Terminal in a Mac OS X/Linux, Oracle SQL Developer on Windows, or directly within phpMyAdmin ):
+
+Using an SQL 'Update' command, I can change the type value from 'blog' to 'article'. This will change every occurance of the value 'blog'. If I wanted to only change certain nodes, I could add a 'Where' clause to only affect nodes with a certain nid or title.
+
+Now, when I query the database, the type is shown as 'article'.
+
+Now, when I go back into the administration section of my site and view the content, the content type now shows at 'News article'.
+
+
+ Tags:
+ drupal-planet , drupal-6 , drupal , sql , sequel-pro , database , content-types
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx/index.html b/docs/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx/index.html
new file mode 100644
index 00000000..235e4666
--- /dev/null
+++ b/docs/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx/index.html
@@ -0,0 +1,238 @@
+
+
+
+ Create Virtual Hosts on Mac OS X Using VirtualHostX | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create Virtual Hosts on Mac OS X Using VirtualHostX
+
+2nd July 2010
+
+ This isn't a Drupal related topic per se, but it is a walk-through of one of the applications that I use whilst doing Drupal development work. I assume, like most Mac OS X users, I use MAMP to run Apache, MySQL and PHP locally whilst developing. I also use virtual hosts in Apache to create local .dev domains which are as close as possible to the actual live domains. For example, if I was developing a site called mysite.com, my local development version would be mysite.dev.
+
+Normally, I would have to edit the hosts file and Apache's httpd.conf file to create a virtual host. The first to set the domain and it's associated IP address, and the other to configure the domain's directory, default index file etc. However, using VirtualHostX , I can quickly create a virtual host without having to edt any files. Enter the virtual domain name, the local path and the port, and apply the settings. VirtualHostX automatically restarts Apache, so the domain is ready to work straight away. You can also enter custom directives from within the GUI.
+
+There's also an option to share the host over the local network. Next, I intend on configuring a virtual Windows PC within VMware Fusion to view these domains so that I can do cross-browser testing before putting a site live.
+
+I ensured that my Apache configuration within MAMP was set to port 80, and that VirtualHostX was using Apache from MAMP instead of Apple's built-in Apache.
+
+Note: One problem that I had after setting this up, was that I was receving an error when attempting to open a Drupal website which said 'No such file or directory'.
+
+After some troubleshooting, I found out that Web Sharing on my Mac had become enabled (I don't know why, I've never enabled it), and that this was causing a conflict with Apache. Once I opened my System Preferences and disabled it, everything worked fine!
+
+This, along with MAMP , Coda , Sequel Pro , and Transmit , has become an essential tool within my development environment.
+
+
+ Tags:
+ drupal-planet , drupal-6 , mamp , virtual-hosts , virtualhostx
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql/index.html b/docs/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql/index.html
new file mode 100644
index 00000000..b763a837
--- /dev/null
+++ b/docs/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql/index.html
@@ -0,0 +1,260 @@
+
+
+
+ Add a Taxonomy Term to Multiple Nodes Using SQL | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Add a Taxonomy Term to Multiple Nodes Using SQL
+
+7th July 2010
+
+ Update: This can also be done using the Views Bulk Operations module.
+
+In preparation for my Blog posts being added to Drupal Planet , I needed to create a new Taxonomy term (or, in this case, tag) called 'Drupal Planet', and assign it to new content to imported into their aggregator. After taking a quick look though my previous posts, I decided that 14 of my previous posts were relevant, and thought that it would be useful to also assign these the 'Drupal Planet' tag.
+
+I didn't want to manually open each post and add the new tag, so I decided to make the changes myself directly into the database using SQL, and as a follow-up to a previous post - Quickly Change the Content Type of Multiple Nodes using SQL .
+
+Again, before changing any values within the database, ensure that you have an up-to-date backup which you can restore if you encounter a problem!
+
+The first thing I did was create the 'Drupal Planet' term in my Tags vocabulary. I decided to do this via the administration area of my site, and not via the database. Then, using Sequel Pro , I ran the following SQL query to give me a list of Blog posts on my site - showing just their titles and nid values.
+
+SELECT title, nid FROM node WHERE TYPE = 'blog' ORDER BY title ASC;
+
+
+I made a note of the nid's of the returned nodes, and kept them for later. I then ran a similar query against the term_data table. This returned a list of Taxonomy terms - showing the term's name, and it's unique tid value.
+
+SELECT NAME, tid FROM term_data ORDER BY NAME ASC;
+
+
+The term that I was interested in, Drupal Planet, had the tid of 84. To confirm that no nodes were already assigned a taxonomy term with this tid, I ran another query against the database. I'm using aliases within this query to link the node, term_node and term_data tables. For more information on SQL aliases, take a look at http://w3schools.com/sql/sql_alias.asp .
+
+SELECT * FROM node n, term_data td, term_node tn WHERE td.tid = 84 AND n.nid = tn.nid AND tn.tid = td.tid;
+
+
+As expected, it returned no rows.
+
+The table that links node and term_data is called term_node, and is made up of the nid and vid columns from the node table, as well as the tid column from the term_data table. Is it is here that the additional rows would need to be entered.
+
+To confirm everything, I ran a simple query against an old post. I know that the only taxonomy term associated with this post is 'Personal', which has a tid value of 44.
+
+SELECT nid, tid FROM term_node WHERE nid = 216;
+
+
+Once the query had confirmed the correct tid value, I began to write the SQL Insert statement that would be needed to add the new term to the required nodes. The nid and vid values were the same on each node, and the value of my taxonomy term would need to be 84.
+
+Once this had completed with no errors, I returned to the administration area of my Drupal site to confirm whether or not the nodes had been assigned the new term.
+
+
+ Tags:
+ taxonomy , drupal-planet , drupal-6 , sql , sequal-pro , database
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/07/12/review-teleport-module/index.html b/docs/blog/2010/07/12/review-teleport-module/index.html
new file mode 100644
index 00000000..a1935e96
--- /dev/null
+++ b/docs/blog/2010/07/12/review-teleport-module/index.html
@@ -0,0 +1,238 @@
+
+
+
+ Review of the Teleport Module | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Review of the Teleport Module
+
+12th July 2010
+
+ As a heavily-reliant Quicksilver user on my MacBook Pro, I was glad when I found the Teleport module for Drupal (due to Elliott Rothman's tweet ) .
+
+When you press a configurable hot-key, a jQuery dialog box appears where you can search for nodes by title or path, or directly enter the path that you want to navigate to. This will greatly reduce the number of clicks that I need to perform to get to my desired page - even compared to the Admin and Administration Menu modules.
+
+Although it's not a new module (the first commits were 2 years ago), I hope that they are still planning on achieving the list of future directions listed on their Drupal.org project page:
+
+
+Make interface act more like Quicksilver (i.e. you should only have to press Enter once to launch)
+'Actions' like Quicksilver: if you select a node, a second input should appear with options to go to the View page, Edit page, (un)publish, etc. Same with users.
+Hook into more non-node content, like taxonomy terms and functions in the API module.
+
+
+Personally, this will make navigation around both the front-end and administration area of my Drupal sites so much easier.
+
+
+ Tags:
+ drupal-planet , drupal-6 , drupal-modules , teleport
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/08/10/review-adminhover-module/index.html b/docs/blog/2010/08/10/review-adminhover-module/index.html
new file mode 100644
index 00000000..3bb1417c
--- /dev/null
+++ b/docs/blog/2010/08/10/review-adminhover-module/index.html
@@ -0,0 +1,259 @@
+
+
+
+ Review of the Admin:hover Module | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Review of the Admin:hover Module
+
+10th August 2010
+
+ Sorry for the lack of Blog posts lately, but my new job that I started a few weeks ago has certainly been keeping me busy! I've got a few more posts that I'm preparing content for, and I'll hopefully be back into my weekly-post routine before too long!
+
+Today, I'd like to just give a quick overview of the Admin:hover module. It basically adds an administrative menu that pops up when you hover over a node or block within your Drupal website - the kind of functionality that was present within previous versions of the Admin module . It also integrates well with the Devel and Clone modules.
+
+I've found this to be extremely useful whilst working on photo galleries etc. where multiple nodes are displayed in a grid format and I quickly need to publish or unpublish something for testing purposes. No longer do I need to open each node, or go into the administration area to perform the required actions.
+
+It is also possible to customise which links are available from within the adminstration area. The possible selections that I currently have on this site are as follows:
+
+Node links:
+
+
+Edit
+Publish
+Unpublish
+Promote
+Unpromote
+Make sticky
+Make unsticky
+Delete
+Clone
+Dev load
+View author
+Edit author
+Add
+
+
+Block links:
+
+
+Configure block
+Add block
+
+
+Although, as I have additional contributed modules installed, some of these may not neccassaily be available out of the box.
+
+
+ Tags:
+ drupal-planet , drupal-6 , drupal-modules , admin:hover , administration
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/08/11/create-better-photo-gallery-drupal-part-1/index.html b/docs/blog/2010/08/11/create-better-photo-gallery-drupal-part-1/index.html
new file mode 100644
index 00000000..20db1159
--- /dev/null
+++ b/docs/blog/2010/08/11/create-better-photo-gallery-drupal-part-1/index.html
@@ -0,0 +1,325 @@
+
+
+
+ Create a Better Photo Gallery in Drupal - Part 1 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create a Better Photo Gallery in Drupal - Part 1
+
+11th August 2010
+
+ Recently, I converted a client's static HTML website, along with their Coppermine Photo Gallery, into a Drupal-powered website.
+
+Over the next few posts, I'll be replicating the process that I used during the conversion, and how I added some additional features to my Drupal gallery.
+
+To begin with, I created my photo gallery as described by Jeff Eaton in this screencast , downloaded all my client's previous photos via FTP, and quickly added them into the new gallery using the Imagefield Import module (which I mentioned previously ).
+
+When I compare this to the previous gallery, I can see several differences which I'd like to include. The first of which is the number of photos in each gallery, and the date that the most recent photo was added.
+
+To do this, I'd need to query my website's database. To begin with, I wanted to have a list of all the galleries on my site which are published, and what they're unique node ID values are. To do this, I opened Sequel Pro and entered the following code:
+
+SELECT title
+AS title, nid
+AS gallery_idFROM node
+WHERE type = 'gallery'
+AND status = 1;
+
+
+As the nid value of each gallery corresponds with the 'field_gallery_nid' field within the content_type_photo field, I can now query the database and retrieve information about each specific gallery.
+
+For example, using aliasing within my SQL statement, I can retrieve a list of all the published photos within the 'British Squad 2008' gallery by using the following code:
+
+SELECT n.title, n.nid, p.field_gallery_nid
+FROM node n, content_type_photo p
+WHERE p.field_gallery_nid = 105
+AND n.status = 1
+AND n.nid = p.nid;
+
+
+I can easily change this to count the number of published nodes by changing the first line of the query to read SELECT COUNT(*).
+
+SELECT COUNT(*)
+FROM node n, content_type_photo p
+WHERE p.field_gallery_nid = 105
+AND n.status = 1
+AND n.nid = p.nid;
+
+
+As I've used the Views Attach module, and I'm embedding the photos directly into the Gallery nodes, I easily add this to each gallery by creating a custom node-gallery.tpl.php file within my theme. I can then use the following PHP code to retrieve the node ID for that specific gallery:
+
+<?php
+$selected_gallery = db_result(db_query("
+SELECT nid
+FROM {node}
+WHERE type = 'gallery'
+AND title = '$title'
+"));
+?>
+
+
+I can then use this variable as part of my next query to count the number of photos within that gallery, similar to what I did earlier.
+
+<?php
+$gallery_total = db_result(db_query("
+SELECT COUNT(*)
+FROM {content_type_photo}
+WHERE field_gallery_nid = $selected_gallery
+"));
+?>
+
+
+Next, I wanted to display the date that the last photo was displayed within each album. This was done by using a similar query that also sorted the results in a descending order, and limited it to one result - effectively only returning the created date for the newest photo.
+
+<?php
+$latest_photo = db_result(db_query("
+SELECT n.created
+FROM {node} n, {content_type_photo} p
+WHERE p.field_gallery_nid = $selected_gallery
+AND n.nid = p.nid
+ORDER BY n.created DESC LIMIT 1
+"));
+?>
+
+
+This was all then added into a 'print' statement which displayed it into the page.
+
+<?php
+if ($selected_gallery_total != 0) {
+ $output = '<i>There are currently ' . $selected_gallery_total . ' photos in this gallery.';
+ $output .= 'Last one added on ' . $latest_photo . '</i>';
+ print $output;
+}
+?>
+
+
+OK, so let's take a look at the Gallery so far:
+
+You will notice that the returned date value for the latest photo added is displaying the UNIX timestamp instead of in a more readable format. This can be changed by altering the 'print' statement to include a PHP 'date' function:
+
+<?php
+if ($selected_gallery_total != 0) {
+ $output = '<i>There are currently ' . $selected_gallery_total . ' photos in this gallery.';
+ $output .= 'Last one added on ' . date("l, jS F, Y", $latest_photo) . '.</i>';
+ print $output;
+}
+?>
+
+
+The values that I've entered are from this page on PHP.net, and can be changed according on how you want the date to be displayed.
+
+As I've added all of these photos today, then the correct dates are being displayed. However, on the client's original website, the majority of these photos were pubished several months or years ago, and I'd like the new website to still reflect the original created dates. As opposed to modifying each individual photograph, I'll be doing this in bulk in my next post.
+
+
+ Tags:
+ drupal-planet , drupal-6 , photo-gallery , sql , views , sequel-pro , cck , views-attach , drupal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/08/17/create-better-photo-gallery-drupal-part-2/index.html b/docs/blog/2010/08/17/create-better-photo-gallery-drupal-part-2/index.html
new file mode 100644
index 00000000..b4fc7528
--- /dev/null
+++ b/docs/blog/2010/08/17/create-better-photo-gallery-drupal-part-2/index.html
@@ -0,0 +1,253 @@
+
+
+
+ Create a Better Photo Gallery in Drupal - Part 2 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create a Better Photo Gallery in Drupal - Part 2
+
+17th August 2010
+
+ At the end of my last post, I'd finished creating the first part of the new photo gallery, but I wanted to change the dates of the published photos to reflect the ones on the client's original website.
+
+Firstly, I'll refer to the previous list of published galleries that I created before, and create something different that also displays the created and modified dates. Picking the node ID of the required gallery, I used the following SQL query to display a list of photos.
+
+SELECT n.title, n.nid, n.created, n.changed, p.field_gallery_nid
+FROM node n, content_type_photo pWHERE n.type = 'photo'
+AND p.field_gallery_nid = 103AND n.nid = p.nid
+ORDER BY n.nid ASC;
+
+
+When I look back at the old photo gallery, I can see that the previous 'last added' date was June 27, 2008. So, how do I update my new photos to reflect that date? Using http://www.onlineconversion.com/unix_time.htm , I can enter the required date in its readable format, and it will give me the equivilent UNIX timestamp. To keep things relatively simple, I'll set all photos within this gallery to the same time.
+
+The result that I'm given is '1217149200'. I can now use an UPDATE statement within another SQL query to update the created and modified dates.
+
+UPDATE node
+INNER JOIN content_type_photo
+ON node.nid = content_type_photo.nid
+SET
+ node.created = 1217149200,
+ node.changed = 1217149200
+WHERE content_type_photo.field_gallery_nid = 103
+
+
+Now when I query the database, both the created and modified databases have been updated, and when I return to the new photo gallery, the updated value is being displayed.
+
+Once the changes have been applied, it's a case of repeating the above process for each of the required galleries.
+
+In the next post, I'll explain how to add a count of published galleries and photos on the main photo gallery page, as well as how to install and configure the Shadowbox module.
+
+
+ Tags:
+ drupal-planet , drupal-6 , photo-gallery , sql , sequel-pro
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/08/20/review-image-caption-module/index.html b/docs/blog/2010/08/20/review-image-caption-module/index.html
new file mode 100644
index 00000000..8c0b4208
--- /dev/null
+++ b/docs/blog/2010/08/20/review-image-caption-module/index.html
@@ -0,0 +1,238 @@
+
+
+
+ Review of the Image Caption Module | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Review of the Image Caption Module
+
+20th August 2010
+
+ Up until as recent as last week, whenever I added an image into one of my Blog posts, I was manually adding the caption below each image and styling it accordingly. That was until I installed the Image Caption module.
+
+The Image Caption module uses jQuery to dynamically add captions to images. Here is a walkthrough of the process that I followed to install and configure the module. As always, I used Drush to download and enable the module, then visited the Image Caption Settings page (admin/settings/image_caption). Here, I select which node types should be included in image captioning. In my case, I only wanted this to apply to Blog posts.
+
+As I use the FileField , ImageField and Insert modules to add images to my posts, as opposed to via a WYSIWYG editor, I'm able to add the CSS class of 'caption' to my images.
+
+Now, all images inserted this way will have the CSS class of 'caption'.
+
+As the Image Caption module uses the image's title tag to create the displayed caption, I enabled the custom title text for my Image field so that when I upload an image, I'm prompted to enter text for the caption.
+
+This results in a span called image-caption-container
around the inserted image, and a caption below it called image-caption
containing the text.
+
+All that's left is to style these classes within your CSS stylesheet.
+
+
+ Tags:
+ drupal-planet , drupal , drupal-6 , imagefield , image-caption
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/09/26/south-wales-drupal-user-group/index.html b/docs/blog/2010/09/26/south-wales-drupal-user-group/index.html
new file mode 100644
index 00000000..462dc13c
--- /dev/null
+++ b/docs/blog/2010/09/26/south-wales-drupal-user-group/index.html
@@ -0,0 +1,235 @@
+
+
+
+ The Inaugural Meetup for the South Wales Drupal User Group | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The Inaugural Meetup for the South Wales Drupal User Group
+
+26th September 2010
+
+ If you do Drupal, and you're in the area, come and join us for the first South Wales Drupal User Group Meetup!
+
+We'll be meeting in the communal area just outside of the SubHub HQ, at:
+
+4, The Studios
+3 Burt Street
+Cardiff
+CF10 5FZ
+
+For more information and to signup, visit http://groups.drupal.org/node/95104 .
+
+
+ Tags:
+ drupal , drupal-planet , swdug , meetups
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/10/10/create-and-apply-patches/index.html b/docs/blog/2010/10/10/create-and-apply-patches/index.html
new file mode 100644
index 00000000..ee242e8a
--- /dev/null
+++ b/docs/blog/2010/10/10/create-and-apply-patches/index.html
@@ -0,0 +1,245 @@
+
+
+
+ How to Create and Apply Patches | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ How to Create and Apply Patches
+
+10th October 2010
+
+ To begin with, a download a fresh copy of Drupal 6.19 and created a copy of the original user.pages.inc file. Within the duplicate file, I made the same changes to the function that I did in earlier code, and saved the changes. Now, within my Terminal, I can navigate to Drupal's root directory and create the patch.
+
+diff -rup modules/user/user.pages.inc modules/user/user.pages2.inc > /Users/oliver/Desktop/different_messages_for_blocked_users.patch
+
+
+This command compares the differences between the two files, and creates the specified patch file.
+
+To apply the patch to my Drupal installation, I go back to Terminal and run the following code:
+
+patch -p0 < /Users/oliver/Desktop/different_messages_for_blocked_users.patch
+
+
+If, for some reason, I need to reverse the patch, I can run this code:
+
+patch -p0 -R < /Users/oliver/Desktop/different_messages_for_blocked_users.patch
+
+
+And that's it!
+
+There is also a Git patch creation workflow, which is described at http://groups.drupal.org/node/91424 . Thanks to Randy Fay for making me aware of this, and suggesting a slight change to my original patch creation command.
+
+
+ Tags:
+ drupal-planet , drupal-6 , modules , patches
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/10/13/create-better-photo-gallery-drupal-part-3/index.html b/docs/blog/2010/10/13/create-better-photo-gallery-drupal-part-3/index.html
new file mode 100644
index 00000000..17b0a957
--- /dev/null
+++ b/docs/blog/2010/10/13/create-better-photo-gallery-drupal-part-3/index.html
@@ -0,0 +1,249 @@
+
+
+
+ Create a Better Photo Gallery in Drupal - Part 3 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create a Better Photo Gallery in Drupal - Part 3
+
+13th October 2010
+
+ The next part of the new gallery that I want to implement is to group the galleries by their respective categories. The first step is to edit my original photo_gallery view and add an additional display.
+
+I've called it 'Taxonomy', and it's similar to the original 'All Galleries' view. The differences are that I've added the taxonomy term as an argument, removed the header, and updated the path to be gallery/%
. The other thing that I need to do is overwrite the output of the original 'All Galleries' View by creating a file called views-view--photo-gallery--page-1.tpl.php
and placing it within my theme directory.
+
+Within that file, I can remove the standard content output. This still outputs the heading information from the original View. I can now use the function called 'views_embed_view' to embed my taxonomy display onto the display. The views_embed_view function is as follows:
+
+<?php views_embed_view('my_view', 'block_1', $arg1, $arg2); ?>
+
+
+So, to display the galleries that are assigned the taxonomy of 'tournaments', I can use the following:
+
+<?php print views_embed_view('photo_gallery', 'page_2', 'tournaments'); ?>
+
+
+To reduce the amount of code needed, I can use the following 'while' loop to generate the same code for each taxonomy term. It dynamically retrieves the relevant taxonomy terms from the database, and uses each name as the argument for the view.
+
+<?php
+$terms = db_query("SELECT * FROM {term_data} WHERE vid = 1");
+while ($term = db_fetch_array($terms)) {
+ print '<h3>' . $term['name'] . '</h3>';
+ print views_embed_view('gallery', 'page_2', $term['name']);
+}
+?>
+
+
+
+ Tags:
+ drupal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/10/22/create-better-photo-gallery-drupal-part-21/index.html b/docs/blog/2010/10/22/create-better-photo-gallery-drupal-part-21/index.html
new file mode 100644
index 00000000..d223e610
--- /dev/null
+++ b/docs/blog/2010/10/22/create-better-photo-gallery-drupal-part-21/index.html
@@ -0,0 +1,273 @@
+
+
+
+ Create a Better Photo Gallery in Drupal - Part 2.1 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create a Better Photo Gallery in Drupal - Part 2.1
+
+22nd October 2010
+
+ Today, I realised that I hadn't published the code that I used to create the total figures of galleries and photos at the top of the gallery (I said at the end of Part 2 that I'd include it in Part 3 , but I forgot). So, here it is:
+
+<?php
+
+// Queries the database and returns a list of nids of published galleries.
+$galleries = db_query("SELECT nid FROM {node} WHERE type = 'gallery' AND status = 1");
+// Resets the number of photos.
+$output = 0;
+// Prints a list of nids of published galleries.
+while($gallery = db_fetch_array($galleries)) {
+ $gallery_id = $gallery['nid'];
+ $photos = $photos + db_result(db_query("SELECT COUNT(*) FROM node n, content_type_photo ctp WHERE n.status = 1 AND n.type = 'photo' AND ctp.field_gallery_nid = $gallery_id AND n.nid = ctp.nid"));
+}
+
+// Prints the output.
+print 'There ';
+if($photos == 1) {
+ print 'is';
+}
+else {
+ print 'are';
+}
+print ' currently ';
+print $photos . ' ';
+if($photos == 1) {
+ print 'photo';
+}
+else {
+ print 'photos';
+}
+print ' in ';
+
+// Counts the number of published galleries on the site.
+$galleries = db_result(db_query("SELECT COUNT(*) FROM {node} WHERE TYPE = 'gallery' AND STATUS = 1"));
+
+// Prints the number of published galleries.
+print $galleries;
+if ($galleries == 1) {
+ print ' gallery';
+}
+else {
+ print ' galleries';
+}
+print '.';
+?>
+
+
+It was applied to the view as a header which had the input format set to PHP code.
+
+
+ Tags:
+ drupal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate/index.html b/docs/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate/index.html
new file mode 100644
index 00000000..98f4c0b6
--- /dev/null
+++ b/docs/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate/index.html
@@ -0,0 +1,249 @@
+
+
+
+ Use Regular Expressions to Search and Replace in Coda or TextMate | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Use Regular Expressions to Search and Replace in Coda or TextMate
+
+4th November 2010
+
+ As in the original post , I'd generated a list of node ID values, and needed to add structure the SQL update statment formatted in a certain way. However, I changed my inital query slightly to out put the same nid value twice.
+
+SELECT nid, nid FROM node WHERE TYPE = 'blog' ORDER BY nid ASC;
+
+
+Then, I could select all of the returned rows, copy the values, and paste them into Coda:
+
+As before, I needed my SQL update statement to be in the following format:
+
+INSERT INTO term_node VALUE (nid, vid, tid), (nid2, vid2, tid);
+
+
+As I mentioned previously, the nid and vid values are the same for each node, and the tid will remain constant. In this case, the tid value that I needed to use was '63'.
+
+So, using the 'Find and Replace' function within Coda, combined with regular expressions (regex), I can easily format the values as needed. To begin with, I need to ensure that the RegEx search option is enabled, and that I'm using the correct escape character.
+
+The first thing that I wanted to do was add the seperating comma between the two values. To do this, I
+perform a search for \s*\t
. This searches for everything that is whitespace AND is a tab value. I can then add the comma as the replacement for each result.
+
+All 31 lines have been changed.
+
+Next, I can use \n
to target the lines between the rows. I'll replace it with the next comma, the number 63 (the tid value), the closing bracket, another comma, re-add the line and add the opening bracket.
+
+The only two lines that aren't changed are the first and last, as they don't have any line breaks following them. I can complete these lines manually. Now all I need to do is add the beginning of the SQL update statement, then copy and paste it into Sequel Pro.
+
+
+ Tags:
+ taxonomy , sequel-pro , database , coda , regular-expression , textmate
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website/index.html b/docs/blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website/index.html
new file mode 100644
index 00000000..4f0bdc54
--- /dev/null
+++ b/docs/blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website/index.html
@@ -0,0 +1,236 @@
+
+
+
+ Easily Embed TypeKit Fonts into your Drupal Website | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Easily Embed TypeKit Fonts into your Drupal Website
+
+14th February 2011
+
+ To begin with, you will need to register for a TypeKit account - there is a free version if you just want to try it out.
+
+Next, you'll need to create a kit that contains the fonts that you want to use on your website. I've used FF Tisa Web Pro .
+
+Under 'Kit Settings', ensure that your website domain (e.g. mysite.com) is listed under 'Domains'.
+
+Download and install the @font-your-face module onto your Drupal site, and to go admin/settings/fontyourface to configure it. Enter your TypeKit API key , and click 'Import Typekit' to import your kits and fonts.
+
+Go to admin/build/themes/fontyourface, and click 'Browse fonts to enable'. Click on the name of the font that you want to enable, check 'Enabled', and click 'Edit font' to save your changes.
+
+With the font enabled, you can now use it in your CSS.
+
+
+ Tags:
+ drupal-planet , drupal-6 , typekit
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2011/03/15/display-number-facebook-fans-php/index.html b/docs/blog/2011/03/15/display-number-facebook-fans-php/index.html
new file mode 100644
index 00000000..99eb99bd
--- /dev/null
+++ b/docs/blog/2011/03/15/display-number-facebook-fans-php/index.html
@@ -0,0 +1,238 @@
+
+
+
+ Display the Number of Facebook fans in PHP | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Display the Number of Facebook fans in PHP
+
+15th March 2011
+
+ Replace the $page_id value with your Page ID number (unless you want to show the number of fans for this site).You can find your Page ID by logging into your Facebook account, going to 'Adverts and Pages', clicking 'Edit page', and looking at the URL.
+
+For example, mine is https://www.facebook.com/pages/edit/?id=143394365692197&sk=basic .
+
+I've also wrapped the output in a number_format() function so that it properly formatted with commas etc - like where I've used it within the Gold Event listing on the Horse & Country TV website.
+
+$page_id = "143394365692197";
+$xml = @simplexml_load_file("http://api.facebook.com/restserver.php?method=facebook.fql.query&query=SELECT%20fan_count%20FROM%20page%20WHERE%20page_id=".$page_id."") or die ("a lot");
+$fans = $xml->page->fan_count;
+print number_format($fans);
+
+
+This code was originally found at http://wp-snippets.com/display-number-facebook-fans .
+
+
+ Tags:
+ php
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2011/03/31/proctor-stevenson/index.html b/docs/blog/2011/03/31/proctor-stevenson/index.html
new file mode 100644
index 00000000..b6101f4a
--- /dev/null
+++ b/docs/blog/2011/03/31/proctor-stevenson/index.html
@@ -0,0 +1,228 @@
+
+
+
+ Proctor & Stevenson | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Proctor & Stevenson
+
+31st March 2011
+
+ 2 weeks ago, I handed in my notice of resignation to Horse & Country TV because I've been offered a new role at Proctor & Stevenson - a Marketing Design and Communications agency in Bristol.
+
+Proctors have an extensive client list - including BMW , Panasonic , the Open University and VOSA , and it's going to be a fantastic opportunity for me to continue expanding my skillset whilst gaining vital experience.
+
+
+ Tags:
+ personal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2011/05/20/proctors-hosting-next-drupal-meetup/index.html b/docs/blog/2011/05/20/proctors-hosting-next-drupal-meetup/index.html
new file mode 100644
index 00000000..494283e5
--- /dev/null
+++ b/docs/blog/2011/05/20/proctors-hosting-next-drupal-meetup/index.html
@@ -0,0 +1,228 @@
+
+
+
+ Proctors Hosting the next Drupal Meetup | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Proctors Hosting the next Drupal Meetup
+
+20th May 2011
+
+ My employer, Proctor & Stevenson , are going to be hosting the next Bristol & South West Drupal meetup on the 25th May at our offices.
+
+You can view more details , or register on our website .
+
+
+ Tags:
+ meetups , drupal-bristol
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2011/05/23/imagefield-import-archive/index.html b/docs/blog/2011/05/23/imagefield-import-archive/index.html
new file mode 100644
index 00000000..55715cc4
--- /dev/null
+++ b/docs/blog/2011/05/23/imagefield-import-archive/index.html
@@ -0,0 +1,232 @@
+
+
+
+ Imagefield Import Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Imagefield Import Archive
+
+23rd May 2011
+
+ I've finally uploaded my first module onto Drupal.org!
+
+I've written many custom modules, although the vast majority of them are either small tweaks for my own sites, or company/site-specific modules that wouldn't be good to anyone else, so there would be nothing achieved by contributing them back to the community. Previously, I've blogged about the Imagefield Import module - a module that I use on a number of sites, both personal and for clients - and what I've looked for lately is for a way to speed up the process again. Gathering my images together and manually copying them into the import directory takes time - especially if I'm working somewhere with a slow Internet connection and I'm FTP-ing the images into the directory. Also, it's not always the easiest solution for site users - especially non-technical ones.
+
+So, I wrote the Imagefield Import Archive module. Including comments, the module contains 123 lines, and builds upon the existing functionality of the Imagefield Import module by adding the ability for the user to upload a .zip archive of images. The archive is then moved into the specified import directory and unzipped before being deleted, and the user is directed straight to the standard Imagefield Import page where their images are waiting to be imported, just as usual.
+
+The module is currently a sandbox project on Drupal.org, although I have applied for full project access so that I can be added as a fully-fledged downloadable module.
+
+
+ Tags:
+ drupal-planet , imagefield-import
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections/index.html b/docs/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections/index.html
new file mode 100644
index 00000000..3fb7bf43
--- /dev/null
+++ b/docs/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections/index.html
@@ -0,0 +1,242 @@
+
+
+
+ Create Multigroups in Drupal 7 using Field Collections | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create Multigroups in Drupal 7 using Field Collections
+
+28th August 2011
+
+ One of my favourite things lately in Drupal 6 has been CCK 3, and more specifically, the Content Multigroups sub-module. Basically this allows you to create a fieldset of various CCK fields, and then repeat that multiple times. For example, I use it on this site whist creating invoices for clients. I have a fieldset called 'Line Item', containing 'Description', 'Quantity' and 'Price' fields. With a standard fieldset, I could only have one instance of each field - however, using a multigroup, I can create multiple groups of line items which I then use within the invoice.
+
+But at the time of writing this, there is no CCK 3 version for Drupal 7. So, I created the same thing using Field Collection and Entity modules.
+
+With the modules uploaded and enabled, go to admin/structure/field-collections and create a field collection.
+
+With the module enabled, you can go to your content type and add a Field Collection field. By default, the only available Widget type is 'Hidden'.
+
+Next, go to admin/structure/field-collections and add some fields to the field collection - the same way that you would for a content type. For this collection is going to contain two node reference fields - Image and Link.
+
+With the Field Collection created, I can now add it as a field within my content type.
+
+Whilst this works perfectly, the field collection is not editable from the node edit form. You need to load the node, and the collection is displayed here with add, edit, and delete buttons. This wasn't an ideal solution, and I wanted to be able to edit the fields within the collection from the node edit form - the same way as I can using multigroups in Drupal 6.
+
+After some searching I found a link to a patch which when applied adds a 'subform' widget type to the field collection field and allows for it to be embedded into, and editable from within the node form. Going back to the content type fields page, and clicking on 'Hidden' (the name of the current widget), I can change it to subform and save my changes.
+
+With this change applied, when I go back to add or edit a node within this content type, my field collection will be easily editable directly within the form.
+
+
+ Tags:
+ drupal-7 , drupal-planet , cck , fields , field-collection , entity-api , multigroup
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu/index.html b/docs/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu/index.html
new file mode 100644
index 00000000..f337dd5d
--- /dev/null
+++ b/docs/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu/index.html
@@ -0,0 +1,349 @@
+
+
+
+ How to Install and Configure Subversion (SVN) Server on Ubuntu | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ How to Install and Configure Subversion (SVN) Server on Ubuntu
+
+19th October 2011
+
+ Recently, I needed to set up a Subversion (SVN) server on a Ubuntu Linux server. This post is going to outline the steps taken, and the commands used, to install and configure the service.
+
+Note: As I was using Ubuntu, I was using the 'apt-get' command to download and install the software packages. If you're using a different distribution of Linux, then this command may be different. I'm also assuming that Apache is already installed.
+
+Firstly, I'm going to ensure that all of my installed packages are up to date, and install any available updates.
+
+$ sudo apt-get update
+
+
+Now, I need to download the subversion, subversion-tools and libapache2 packages.
+
+$ sudo apt-get install subversion subversion-tools libapache2-svn
+
+
+These are all of the packages that are needed to run a Subversion server.
+
+Create subversion directory
+
+Now, I need to create the directory where my repositories are going to sit. I've chosen this directory as I know that it's one that is accessible to my managed backup service.
+
+$ sudo mkdir /home/svn
+
+
+Create a test repository
+
+First, I'll create a new folder in which I'll create my test project, and then I'll create a repository for it.
+
+$ sudo mkdir ~/test
+$ sudo svnadmin create /home/svn/test -m 'initial project structure'
+
+
+This will create a new repository containing the base file structure.
+
+Adding files into the test project
+
+$ cd ~/test
+$ mkdir trunk tags branches
+
+
+I can now import these new directories into the test repository.
+
+$ sudo svn import ~/test file:///home/svn/test -m 'Initial project directories'
+
+
+This both adds and commits these new directories into the repository.
+
+In order for Apache to access the SVN repositories, the /home/svn
directory needs to be owned by the same user and group that Apache runs as. In Ubuntu, this is usually www-data. To change the owner of a directory, use the chown command.
+
+$ sudo chown -R www-data:www-data /home/svn
+
+
+Configuring Apache
+
+The first thing that I need to do is enable the dav_svn Apache module, using the a2enmod command.
+
+$ sudo a2enmod dav_svn
+
+
+With this enabled, now I need to modify the Apache configuration file.
+
+$ cd /etc/apache2
+$ sudo nano apache2.conf
+
+
+At the bottom of the file, add the following lines, and then save the file by pressing Ctrl+X.
+
+<Location "/svn">
+ DAV svn
+ SVNParentPath /home/svn
+</Location>
+
+
+With this saved, restart the Apache service for the changes to be applied.
+
+sudo service apache2 restart
+
+
+I can now browse through my test repository by opening Firefox, and navigating to http://127.0.0.1/svn/test
. Here, I can now see my three directories, although they are currently all empty.
+
+
+
+Securing my SVN repositories
+
+Before I start committing any files to the test repository, I want to ensure that only authorised users can view it - currently anyone can view the repository and it's contents, as well as being able to checkout and commit files. To do this, I'm going to require the user to enter a username and a password before viewing or performing any actions with the repository.
+
+Re-open apache2.conf, and replace the SVN Location information with this:
+
+<Location "/svn">
+ DAV svn
+ SVNParentPath /home/svn
+ AuthType Basic
+ AuthName "My SVN Repositories"
+ AuthUserFile /etc/svn-auth
+ Require valid-user
+</Location>
+
+
+Now I need to create the password file.
+
+$ htpasswd -cm /etc/svn-auth oliver
+
+
+I'm prompted to enter and confirm my password, and then my details are saved. The Apache service will need to be restarted again, and then the user will need to authenticate themselves before viewing the repositories.
+
+
+
+Checking out the repository and commiting files
+
+For example, now want to checkout the files within my repository into a new directory called 'test2' within my home directory. Firstly, I need to create the new directory, and then I can issue the checkout command.
+
+$ cd ~
+$ mkdir test2
+$ svn checkout http://127.0.0.1/svn/test/trunk test2
+
+
+I'm passing the command two arguments - the first is the URL of the repository's trunk directory, and the second is the directory where the files are to be placed. As no files have been commited yet into the trunk, it appears to be empty - but if you perform an ls -la command, you'll see that there is a hidden .svn directory.
+
+Now you can start adding files into the directory. Once you've created your files, perform a svn add command, passing in individual filenames as further arguments.
+
+$ svn add index.php
+$ svn add *
+
+
+With all the required files added, they can be committed using svn commit -m 'commit message'
command, and the server can be updated using the svn up command.
+
+
+ Tags:
+ svn , ubuntu , version-control
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/01/04/site-upgraded-drupal-7/index.html b/docs/blog/2012/01/04/site-upgraded-drupal-7/index.html
new file mode 100644
index 00000000..61cfd4b7
--- /dev/null
+++ b/docs/blog/2012/01/04/site-upgraded-drupal-7/index.html
@@ -0,0 +1,227 @@
+
+
+
+ Site Upgraded to Drupal 7 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Site Upgraded to Drupal 7
+
+4th January 2012
+
+ As the vast majority of the Drupal websites that I currently work on are built on Drupal 7, I thought that it was time that I upgraded this site. Following the core upgrade process and the CCK migration process , everything was upgraded smoothly without any issues.
+
+I've upgraded a handful of essential contrib modules to the latest stable version, Administration Menu , Views etc., and will continue upgrading the other modules on the site as time allows.
+
+I also prefer Bartik to Garland - but I will be creating a new custom theme when I get a chance.
+
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/02/01/use-authorized-keys-create-passwordless-ssh-connection/index.html b/docs/blog/2012/02/01/use-authorized-keys-create-passwordless-ssh-connection/index.html
new file mode 100644
index 00000000..2e6cb7c5
--- /dev/null
+++ b/docs/blog/2012/02/01/use-authorized-keys-create-passwordless-ssh-connection/index.html
@@ -0,0 +1,249 @@
+
+
+
+ How to use Authorized Keys to Create a Passwordless SSH Connection | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ How to use Authorized Keys to Create a Passwordless SSH Connection
+
+1st February 2012
+
+ If you're accessing Linux servers or automating tasks between servers, rather than having to enter your user password every time, you can also use SSH public key authentication. This is a simple process that involves creating a local key and storing it within the authorized_keys file on the remote server.
+
+
+Check if you already have a SSH key.
+$ ssh-add -L
+If you don't have one, create one.
+$ ssh-keygen
+Upload the key onto the server. Replace myserver with the hostname or IP address of your remote server.
+$ ssh-copy-id myserver
+
+
+If you're using Mac OS X and you don't have ssh-copy-id installed, download and install Homebrew and run the brew install ssh-copy-id
command.
+
+If successful, you should now see a message like:
+
+
+ Now try logging into the machine, with "ssh 'myserver'", and check in:
+
+ ~/.ssh/authorized_keys
+
+ to make sure we haven't added extra keys that you weren't expecting.
+
+
+Now the next time that you SSH onto the server, it should log you in without prompting you for your password.
+
+
+ Tags:
+ linux , ssh
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush/index.html b/docs/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush/index.html
new file mode 100644
index 00000000..9b17b48a
--- /dev/null
+++ b/docs/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush/index.html
@@ -0,0 +1,251 @@
+
+
+
+ Create an Omega Subtheme with LESS CSS Preprocessor using Omega Tools and Drush | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create an Omega Subtheme with LESS CSS Preprocessor using Omega Tools and Drush
+
+16th April 2012
+
+ In this tutorial I'll be showing how to create an Omega subtheme using the Omega Tools module, and have it working with the LESS CSS preprocessor .
+
+The first thing that I need to do is download the Omega theme and the Omega Tools and LESS modules, and then to enable both modules. I'm doing this using Drush, but you can of course do this via the admin interface at admin/modules.
+
+$ drush dl less omega omega_tools;
+$ drush en -y less omega_tools
+
+
+With the Omega Tools module enabled I get the drush omega-subtheme command that creates my Omega subtheme programatically. Using this command, I'm creating a new subtheme, enabling it and setting it as the default theme on my site.
+
+$ drush omega-subtheme "Oliver Davies" --machine_name="oliverdavies" --enable --set-default
+
+
+By default, four stylesheets are created within the subtheme's css directory. The first thing that I'm going to do is rename global.css
to global.less
.
+
+$ mv css/global.css css/global.less
+
+
+Now I need to find all references to global.css within my oliverdavies.info file. I did this using $ nano oliverdavies.info
, pressing Ctrl+W
to search, then Ctrl+R
to replace, entering global.css
as the search phrase, and then global.less
as the replacement text. After making any changes to oliverdavies.info, I need to clear Drupal's caches for the changes to be applied.
+
+$ drush cc all
+
+
+I tested my changes by making some quick additions to my global.less file and reloading the page.
+
+If your changes aren't applied, then confirm that your global.less file is enabled within your theme's configuration. I did this by going to admin/appearance/settings/oliverdavies, clicking on the Toggle styles tab within Layout configuration and finding global.less at the bottom of Enable optional stylesheets .
+
+
+ Tags:
+ drupal-7 , omega , theming , less , drupal-planet , drupal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/04/17/installing-nagios-centos/index.html b/docs/blog/2012/04/17/installing-nagios-centos/index.html
new file mode 100644
index 00000000..6e076620
--- /dev/null
+++ b/docs/blog/2012/04/17/installing-nagios-centos/index.html
@@ -0,0 +1,228 @@
+
+
+
+ Installing Nagios on CentOS | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Installing Nagios on CentOS
+
+17th April 2012
+
+ A great post details that details the steps needed to install Nagios - a popular open source system and network monitoring software application - on CentOS.
+
+http://saylinux.net/story/009506/how-install-nagios-centos-55
+
+
+ Tags:
+ nagios , centos , linux
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/04/19/adding-custom-theme-templates-drupal-7/index.html b/docs/blog/2012/04/19/adding-custom-theme-templates-drupal-7/index.html
new file mode 100644
index 00000000..37b65e3c
--- /dev/null
+++ b/docs/blog/2012/04/19/adding-custom-theme-templates-drupal-7/index.html
@@ -0,0 +1,276 @@
+
+
+
+ Adding Custom Theme Templates in Drupal 7 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Adding Custom Theme Templates in Drupal 7
+
+19th April 2012
+
+ Today, I had a situation where I was displaying a list of teasers for news article nodes. The article content type had several different fields assigned to it, including main and thumbnail images. In this case, I wanted to have different output and fields displayed when a teaser was displayed compared to when a complete node was displayed.
+
+I have previously seen it done this way by adding this into in a node.tpl.php file:
+
+if ($teaser) {
+ // The teaser output.
+}
+else {
+ // The whole node output.
+}
+
+
+However, I decided to do something different and create a separate template file just for teasers. This is done using the hook_preprocess_HOOK function that I can add into my theme's template.php file.
+
+The function requires the node variables as an argument - one of which is theme_hook_suggestions. This is an array of suggested template files that Drupal looks for and attempts to use when displaying a node, and this is where I'll be adding a new suggestion for my teaser-specific template. Using the debug()
function, I can easily see what's already there.
+
+array (
+ 0 => 'node__article',
+ 1 => 'node__343',
+ 2 => 'node__view__latest_news',
+ 3 => 'node__view__latest_news__page',
+)
+
+
+So, within my theme's template.php file:
+
+/**
+ * Implementation of hook_preprocess_HOOK().
+ */
+function mytheme_preprocess_node(&$variables) {
+ $node = $variables['node'];
+
+ if ($variables['teaser']) {
+ // Add a new item into the theme_hook_suggestions array.
+ $variables['theme_hook_suggestions'][] = 'node__' . $node->type . '_teaser';
+ }
+}
+
+
+After adding the new suggestion:
+
+array (
+ 0 => 'node__article',
+ 1 => 'node__343',
+ 2 => 'node__view__latest_news',
+ 3 => 'node__view__latest_news__page',
+ 4 => 'node__article_teaser',
+)
+
+
+Now, within my theme I can create a new node--article-teaser.tpl.php template file and this will get called instead of the node--article.tpl.php when a teaser is loaded. As I'm not specifying the node type specifically and using the dynamic $node->type value within my suggestion, this will also apply for all other content types on my site and not just news articles.
+
+
+ Tags:
+ drupal-planet , drupal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/05/23/add-date-popup-calendar-custom-form/index.html b/docs/blog/2012/05/23/add-date-popup-calendar-custom-form/index.html
new file mode 100644
index 00000000..a118430c
--- /dev/null
+++ b/docs/blog/2012/05/23/add-date-popup-calendar-custom-form/index.html
@@ -0,0 +1,248 @@
+
+
+
+ How to add a date popup calendar onto a custom form | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ How to add a date popup calendar onto a custom form
+
+23rd May 2012
+
+ First, I need to download the Date module, and make my module dependent on date_popup by adding the following line into my module's .info file.
+
+dependencies[] = date_popup
+
+
+Within my form builder function:
+
+$form['date'] = array(
+ '#title' => t('Arrival date'),
+
+ // Provided by the date_popup module
+ '#type' => 'date_popup',
+
+ // Uses the PHP date() format - http://php.net/manual/en/function.date.php
+ '#date_format' => 'j F Y',
+
+ // Limits the year range to the next two upcoming years
+ '#date_year_range' => '0:+2',
+
+ // Default value must be in 'Y-m-d' format.
+ '#default_value' => date('Y-m-d', time()),
+);
+
+
+
+ Tags:
+ forms , form-api , date , calendar , drupal-7 , drupal-planet , drupal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/05/23/checkout-specific-revision-svn-command-line/index.html b/docs/blog/2012/05/23/checkout-specific-revision-svn-command-line/index.html
new file mode 100644
index 00000000..9880676c
--- /dev/null
+++ b/docs/blog/2012/05/23/checkout-specific-revision-svn-command-line/index.html
@@ -0,0 +1,234 @@
+
+
+
+ Checkout a specific revision from SVN from the command line | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Checkout a specific revision from SVN from the command line
+
+23rd May 2012
+
+ If you're checking out the repository for the first time:
+
+$ svn checkout -r 1234 url://repository/path
+
+
+If you already have the repository checked out:
+
+$ svn up -r 1234
+
+
+
+ Tags:
+ svn , version-control
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess/index.html b/docs/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess/index.html
new file mode 100644
index 00000000..0bd28550
--- /dev/null
+++ b/docs/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess/index.html
@@ -0,0 +1,241 @@
+
+
+
+ Forward one domain to another using mod_rewrite and .htaccess | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forward one domain to another using mod_rewrite and .htaccess
+
+23rd May 2012
+
+ Within the mod_rewrite section of your .htaccess file, add the following lines:
+
+RewriteCond %{HTTP_HOST} ^yoursite\.co\.uk$
+RewriteRule (.*) http://yoursite.com/$1 [R=301,L]
+
+
+This automatically forwards any users from http://yoursite.co.uk to http://yoursite.com. This can also be used to forward multiple domains:
+
+RewriteCond %{HTTP_HOST} ^yoursite\.co\.uk$ [OR]
+RewriteCond %{HTTP_HOST} ^yoursite\.info$ [OR]
+RewriteCond %{HTTP_HOST} ^yoursite\.biz$ [OR]
+RewriteCond %{HTTP_HOST} ^yoursite\.eu$
+RewriteRule (.*) http://yoursite.com/$1 [R=301,L]
+
+
+If any of the RewriteCond conditions apply, then the RewriteRule is executed.
+
+
+ Tags:
+ .htaccess , code , drupal , apache , mod_rewrite
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser/index.html b/docs/blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser/index.html
new file mode 100644
index 00000000..6eede7f0
--- /dev/null
+++ b/docs/blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser/index.html
@@ -0,0 +1,236 @@
+
+
+
+ Prevent Apache from displaying text files within a web browser | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Prevent Apache from displaying text files within a web browser
+
+23rd May 2012
+
+ When you download Drupal , there are several text files that are placed in the root of your installation. You don't want or need these to be visible to anyone attempting to view them in a browser - especially CHANGELOG.txt
as that includes the exact version of Drupal you are running and could therefore have security implications.
+
+Rather than delete these files or change the file permissions manually for each file, I can add the following lines into my VirtualHost configuration:
+
+<Files ~ "\.txt$">
+ Order deny,allow
+ Deny from all
+</Files>
+
+
+This prevents any files with a .txt extension from being accessed and rendered in a web browser.
+
+
+ Tags:
+ apache , code , drupal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/05/23/writing-info-file-drupal-7-theme/index.html b/docs/blog/2012/05/23/writing-info-file-drupal-7-theme/index.html
new file mode 100644
index 00000000..c74b31d5
--- /dev/null
+++ b/docs/blog/2012/05/23/writing-info-file-drupal-7-theme/index.html
@@ -0,0 +1,253 @@
+
+
+
+ Writing a .info file for a Drupal 7 theme | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Writing a .info file for a Drupal 7 theme
+
+23rd May 2012
+
+ name = My Theme
+description = A description of my theme
+core = 7.x
+
+# Add a base theme, if you want to use one.
+base = mybasetheme
+
+# Define regions, otherwise the default regions will be used.
+regions[header] = Header
+regions[navigation] = Navigation
+regions[content] = Content
+regions[sidebar] = Sidebar
+regions[footer] = Footer
+
+# Define which features are available. If none are specified, all the default
+# features will be available.
+features[] = logo
+features[] = name
+features[] = favicon
+
+# Add stylesheets
+stylesheets[all][] = css/reset.css
+stylesheets[all][] = css/mytheme.css
+stylesheets[print][] = css/print.css
+
+# Add javascript files
+styles[] = js/mytheme.js
+
+
+
+ Tags:
+ theming , drupal-theming , drupal , code
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files/index.html b/docs/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files/index.html
new file mode 100644
index 00000000..b17ea3b5
--- /dev/null
+++ b/docs/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files/index.html
@@ -0,0 +1,295 @@
+
+
+
+ Dividing Drupal's process and preprocess functions into separate files | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dividing Drupal's process and preprocess functions into separate files
+
+24th May 2012
+
+ If you use a lot of process and preprocess functions within your Drupal theme, then your template.php can get very long and it can become difficult to find a certain piece of code. Following the example of the Omega theme , I've started separating my process and preprocess functions into their own files. For example, mytheme_preprocess_node can be placed within a preprocess/node.inc file, and mytheme_process_page can be placed within process/page.inc.
+
+The first step is to use the default mytheme_process() and mytheme_preprocess() functions to utilise my custom function. So within my template.php file:
+
+<?php
+
+/**
+ * Implements hook_preprocess().
+ *
+ * Initialises the mytheme_invoke() function for the preprocess hook.
+ */
+function mytheme_preprocess(&$variables, $hook) {
+ mytheme_invoke('preprocess', $hook, $variables);
+}
+
+/**
+ * Implements hook_process().
+ *
+ * Initialises the mytheme_invoke() function for the process hook.
+ */
+function mytheme_process(&$variables, $hook) {
+ mytheme_invoke('process', $hook, $variables);
+}
+
+
+Now, to write the mytheme_invoke()
function:
+
+<?php
+
+/**
+ * Invokes custom process and preprocess functions.
+ *
+ * @param string $type
+ * The type of function we are trying to include (i.e. process or preprocess).
+ *
+ * @param array $variables
+ * The variables array.
+ *
+ * @param string $hook
+ * The name of the hook.
+ *
+ * @see mytheme_preprocess()
+ * @see mytheme_process()
+ */
+function mytheme_invoke($type, $hook, &$variables) {
+ global $theme_key;
+
+ // The name of the function to look for (e.g. mytheme_process_node).
+ $function = $theme_key . '_' . $type . '_' . $hook;
+
+ // If the function doesn't exist within template.php, look for the
+ // appropriate include file.
+ if (!function_exists($function)) {
+ // The file to search for (e.g. process/node.inc).
+ $file = drupal_get_path('theme', $theme_key) . '/' . $type . '/' . $type . '-' . str_replace('_', '-', $hook) . '.inc';
+
+ // If the file exists, include it.
+ if (is_file($file)) {
+ include($file);
+ }
+ }
+
+ // Try to call the function again.
+ if (function_exists($function)) {
+ $function($variables);
+ }
+}
+
+
+As mytheme_invoke()
checks to see if the function already exists before searching for checking the include files, I could still add the functions into template.php as normal and this would override any corresponding include file.
+
+
+ Tags:
+ drupal , code , theming , preprocessing
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/07/12/my-new-drupal-modules/index.html b/docs/blog/2012/07/12/my-new-drupal-modules/index.html
new file mode 100644
index 00000000..a3440275
--- /dev/null
+++ b/docs/blog/2012/07/12/my-new-drupal-modules/index.html
@@ -0,0 +1,233 @@
+
+
+
+ My new Drupal modules | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ My new Drupal modules
+
+12th July 2012
+
+ After a busy few days, I've released two new contrib Drupal modules:
+
+
+
+Documentation for both to follow shortly on Drupal.org.
+
+
+ Tags:
+ drupal , drupal-modules , drupal-6 , drupal-7 , drupal-planet , accessibility
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/07/14/install-nomensa-media-player-drupal/index.html b/docs/blog/2012/07/14/install-nomensa-media-player-drupal/index.html
new file mode 100644
index 00000000..0d6a43a8
--- /dev/null
+++ b/docs/blog/2012/07/14/install-nomensa-media-player-drupal/index.html
@@ -0,0 +1,288 @@
+
+
+
+ Install and Configure the Nomensa Accessible Media Player in Drupal | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Install and Configure the Nomensa Accessible Media Player in Drupal
+
+14th July 2012
+
+ The official documentation for this module is now located at https://www.drupal.org/node/2383447 . This post was accurate at the time of writing, whereas the documentation page will be kept up to date with any future changes.
+
+This week I released the first version of the Nomensa Accessible Media Player module for Drupal 7. Here's some instructions of how to install and configure it.
+
+Initial configuration
+
+Download the Library
+
+The library can be downloaded directly from GitHub, and should be placed within you sites/all/libraries/nomensa_amp directory.
+
+drush dl libraries nomensa_amp
+git clone https://github.com/nomensa/Accessible-Media-Player sites/all/libraries/nomensa_amp
+cd sites/all/libraries/nomensa_amp
+rm -rf Accessible-media-player_2.0_documentation.pdf example/ README.md
+drush en -y nomensa_amp
+
+
+
+
+Configure the module at admin/config/media/nomensa-amp and enable the players that you want to use.
+
+Adding videos
+
+Within your content add links to your videos. For example:
+
+YouTube
+
+<a href="http://www.youtube.com/watch?v=Zi31YMGmQC4">Checking colour contrast</a>
+
+
+Vimeo
+
+<a href="http://vimeo.com/33729937">Screen readers are strange, when you're a stranger by Leonie Watson</a>
+
+
+Adding captions
+
+The best way that I can suggest to do this is to use a File field to upload your captions file:
+
+
+Add a File field to your content type;
+On your page upload the captions file.
+Right-click the uploaded file, copy the link location, and use this for the path to your captions file.
+
+
+For example:
+
+<a href="http://www.youtube.com/watch?v=Zi31YMGmQC4">Checking colour contrast</a> <a class="captions" href="http://oliverdavies.co.uk/sites/default/files/checking-colour-contrast-captions.xml">Captions for Checking Colour Contrast</a>
+
+
+Screencast
+
+
+
+
+
+
+ Tags:
+ accessibility , drupal , drupal-planet , nomensa
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/07/27/writing-article-linux-journal/index.html b/docs/blog/2012/07/27/writing-article-linux-journal/index.html
new file mode 100644
index 00000000..e8af30b9
--- /dev/null
+++ b/docs/blog/2012/07/27/writing-article-linux-journal/index.html
@@ -0,0 +1,228 @@
+
+
+
+ Writing an Article for Linux Journal | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Writing an Article for Linux Journal
+
+27th July 2012
+
+ I'm absolutely delighted to announce that I'm going to be writing an article for Linux Journal magazine's upcoming Drupal special. The article is going to be entitled "Speeding Up Your Drupal Development Using Installation Profiles and Distributions" and will be mentioning existing distributions available on Drupal.org, but mainly focussing on the steps needed to create your own custom distribution. Needless to say, I'm quite excited about it!
+
+The article is expected to be published in October.
+
+
+ Tags:
+ drupal , distributions , installation-profiles , writing , linux-journal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/07/nomensa-accessible-media-player-drupal/index.html b/docs/blog/2012/07/nomensa-accessible-media-player-drupal/index.html
new file mode 100644
index 00000000..54353281
--- /dev/null
+++ b/docs/blog/2012/07/nomensa-accessible-media-player-drupal/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file/index.html b/docs/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file/index.html
new file mode 100644
index 00000000..f4cb2211
--- /dev/null
+++ b/docs/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file/index.html
@@ -0,0 +1,238 @@
+
+
+
+ Display a Custom Menu in a Drupal 7 Theme Template File | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Display a Custom Menu in a Drupal 7 Theme Template File
+
+18th August 2012
+
+ For reference, this is the code needed to display a menu in a Drupal 7 template file, including the navigation ARIA role.
+
+$menu_name = 'menu-footer-menu';
+$menu_id = 'footer-menu';
+print theme('links', array(
+ 'links' => menu_navigation_links($menu_name),
+ 'attributes' => array(
+ 'id' => $menu_id,
+ 'role' => 'navigation',
+ 'class'=> array('links', 'inline')
+ )
+));
+
+
+
+ Tags:
+ drupal , drupal-7 , drupal-planet , php , aria
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/09/06/reflections-speaking-unifieddiff/index.html b/docs/blog/2012/09/06/reflections-speaking-unifieddiff/index.html
new file mode 100644
index 00000000..e28e0c95
--- /dev/null
+++ b/docs/blog/2012/09/06/reflections-speaking-unifieddiff/index.html
@@ -0,0 +1,232 @@
+
+
+
+ Reflections on speaking at UnifiedDiff | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reflections on speaking at UnifiedDiff
+
+6th September 2012
+
+ Yesterday evening I went along and spoke at the UnifiedDiff meetup in Cardiff, having offered previously to do a presentation providing an introduction to Drupal.
+
+I'm an experienced Drupal Developer, but not an experienced public speaker (although I have done several user training sessions and Drupal demonstrations for clients previously), and I think that some of the nerves that I had beforehand were apparent during the presentation, and being the first speaker for the evening probably didn't help, although I did get a nice tweet mid-way through.
+
+Initially, after aiming for a 20-minute presentation plus Q&A, I think I wrapped up the presentation in around 14 minutes, although I did about 6 minutes of answering questions afterwards including the apparently mandatory "Why use Drupal compared to WordPress or Joomla?" question, some Drupal 8 and Symfony questions, as well as an interesting question about the White House development project after I'd listed it within a list of example sites. Next time, I think that some more detailed presenter notes are needed. Typically, as soon as it sat back in my seat, the majority of things that I'd managed to remember beforehand all came flooding back to me and I thought "I should have said that whilst I was up speaking".
+
+Overall, considering my inexperience at speaking to this type of audience, I was fairly happy with my presentation, although I'm sure that I'll change my mind once I've watched the video of it on the UnifiedDiff website. Regardless, I think that it was a great experience and I enjoyed doing it, and I'd like to thank the organisers of UnifiedDiff for having me speak at their meetup. It was great to have a more relaxed conversation with some people after the other speakers had been up, and having introduced Drupal I would be more than happy to come back and do a more in-depth presentation if there is an interest for me to do so.
+
+
+ Tags:
+ talks
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/10/25/my-sublime-text-2-settings/index.html b/docs/blog/2012/10/25/my-sublime-text-2-settings/index.html
new file mode 100644
index 00000000..ca272714
--- /dev/null
+++ b/docs/blog/2012/10/25/my-sublime-text-2-settings/index.html
@@ -0,0 +1,315 @@
+
+
+
+ My Sublime Text 2 settings | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ My Sublime Text 2 settings
+
+25th October 2012
+
+ Sublime Text 2 has been my text editor of choice for the past few months, and I use it at home, in work, and on any virtual machines that I run. So rather than having to manually re-enter my settings each time, I thought that I'd document them here for future reference. These preferences ensure that the code is compliant with Drupal coding standards - using two spaces instead of a tab, no trailing whitespace, blank line at the end of a file etc.
+
+Preferences
+
+These can be changed by going to Preferences > Settings - User.
+
+{
+ "color_scheme": "Packages/Theme - Aqua/Color Schemes/Tomorrow Night Aqua.tmTheme",
+ "default_line_ending": "unix",
+ "ensure_newline_at_eof_on_save": true,
+ "fallback_encoding": "UTF-8",
+ "file_exclude_patterns":
+ [
+ "*.pyc",
+ "*.pyo",
+ "*.exe",
+ "*.dll",
+ "*.obj",
+ "*.o",
+ "*.a",
+ "*.lib",
+ "*.so",
+ "*.dylib",
+ "*.ncb",
+ "*.sdf",
+ "*.suo",
+ "*.pdb",
+ "*.idb",
+ ".DS_Store",
+ "*.class",
+ "*.psd",
+ "*.db",
+ "*.sublime*"
+ ],
+ "folder_exclude_patterns":
+ [
+ ".svn",
+ ".git",
+ ".hg",
+ "CVS",
+ "FirePHPCore"
+ ],
+ "font_options":
+ [
+ "no_bold",
+ "no_italic"
+ ],
+ "font_size": 16.0,
+ "highlight_line": true,
+ "ignored_packages":
+ [
+ ],
+ "line_padding_bottom": 1,
+ "rulers":
+ [
+ 80
+ ],
+ "save_on_focus_lost": true,
+ "shift_tab_unindent": true,
+ "tab_size": 2,
+ "theme": "Soda Light.sublime-theme",
+ "translate_tabs_to_spaces": true,
+ "trim_automatic_white_space": true,
+ "trim_trailing_white_space_on_save": true,
+ "word_wrap": false
+}
+
+
+Key bindings
+
+These can be changed by going to Preferences > Key Bindings - User.
+
+[
+ { "keys": ["alt+s"], "command": "toggle_side_bar" },
+ { "keys": ["alt+r"], "command": "reindent" }
+]
+
+
+Packages
+
+These are the packages that I currently have installed.
+
+
+
+
+ Tags:
+ sublime-text
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/11/15/accessible-bristol-site-launched/index.html b/docs/blog/2012/11/15/accessible-bristol-site-launched/index.html
new file mode 100644
index 00000000..54be6a71
--- /dev/null
+++ b/docs/blog/2012/11/15/accessible-bristol-site-launched/index.html
@@ -0,0 +1,228 @@
+
+
+
+ Accessible Bristol site launched | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Accessible Bristol site launched
+
+15th November 2012
+
+ I'm happy to announce that the Accessible Bristol website was launched this week, on Drupal 7. The site has been developed over the past few months, and uses the User Relationships and Privatemsg modules to provide a community-based platform where people with an interest in accessibility can register and network with each other.
+
+The group is hosting a launch event on the 28th November at the Council House, College Green, Bristol. Interested? More information is available at http://www.accessiblebristol.org.uk/events/accessible-bristol-launch or go to http://buytickets.at/accessiblebristol/6434 to register.
+
+
+ Tags:
+ accessibility , accessible-bristol , nomensa
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line/index.html b/docs/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line/index.html
new file mode 100644
index 00000000..e5b7fabe
--- /dev/null
+++ b/docs/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line/index.html
@@ -0,0 +1,233 @@
+
+
+
+ Open Sublime Text 2 from the Mac OS X Command Line | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Open Sublime Text 2 from the Mac OS X Command Line
+
+17th November 2012
+
+ Paste the following code into the Mac OS X Terminal, assuming that you've installed Sublime Text 2 into the /Applications folder.
+
+$ ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/sublime
+
+
+Now you can type sublime <filename>
open a file or directory in Sublime Text, or sublime .
to open the current directory.
+
+You can also type sublime --help
to see a list of the available commands.
+
+
+ Tags:
+ sublime-text , mac-os-x , terminal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy/index.html b/docs/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy/index.html
new file mode 100644
index 00000000..267a42df
--- /dev/null
+++ b/docs/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy/index.html
@@ -0,0 +1,274 @@
+
+
+
+ How to use SASS and Compass in Drupal 7 using Sassy | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ How to use SASS and Compass in Drupal 7 using Sassy
+
+6th December 2012
+
+ I've recently started using SASS rather than LESS to do my CSS preprocessing - namely due to its integration with Compass and it's built-in CSS3 mixins. There are three modules that provide the ability to use SASS within Drupal:
+
+
+
+Alternatively, you could use a base theme like Sasson that includes a SASS compiler.
+
+Download the PHPSass Library
+
+The first thing to do is download the PHPSass library from GitHub , as this is a requirement of the Sassy module and we can't enable it without the library. So, in a Terminal window:
+
+$ mkdir -p sites/all/libraries;
+$ cd sites/all/libraries;
+$ wget https://github.com/richthegeek/phpsass/archive/master.tar.gz;
+$ tar zxf master.tar.gz;
+$ rm master.tar.gz;
+$ mv phpsass-master/ phpsass
+
+
+Or, if you're using Drush Make files:
+
+libraries[phpsass][download][type] = "get"
+libraries[phpsass][download][url] = "https://github.com/richthegeek/phpsass/archive/master.tar.gz"
+
+
+The PHPSass library should now be located at sites/all/libraries/phpsass
.
+
+Download and enable the Drupal modules
+
+This is easy if you use Drush :
+
+$ drush dl libraries prepro sassy
+$ drush en -y libraries prepro sassy sassy_compass
+
+
+Otherwise, download the each module from it's respective project page and place it within your sites/all/modules
or sites/all/modules/contrib
directory.
+
+Configuring the Prepro module
+
+The Prepro module provides various settings that can be changed for each preprocessor. Go to admin/config/media/prepro
to configure the module as required.
+
+Personally, in development, I'd set caching to 'uncached' and the error reporting method to 'show on page'. In production, I'd change these to "cached" and "watchdog" respectively. I'd also set the output style to "compressed",
+
+Adding SASS files into your theme
+
+With this done, you can now add SASS and SCSS files by adding a line like stylesheets[all][] = css/base.scss
in your theme's .info file.
+
+
+ Tags:
+ compass , css , drupal , drupal-7 , drupal-planet , less , preprocessing , sass
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/01/09/checking-if-user-logged-drupal-right-way/index.html b/docs/blog/2013/01/09/checking-if-user-logged-drupal-right-way/index.html
new file mode 100644
index 00000000..9fdc43a0
--- /dev/null
+++ b/docs/blog/2013/01/09/checking-if-user-logged-drupal-right-way/index.html
@@ -0,0 +1,267 @@
+
+
+
+ Checking if a user is logged into Drupal (the right way) | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Checking if a user is logged into Drupal (the right way)
+
+9th January 2013
+
+ I see this regularly when working on Drupal sites when someone wants to check whether the current user is logged in to Drupal (authenticated) or not (anonymous):
+
+global $user;
+if ($user->uid) {
+ // The user is logged in.
+}
+
+
+or
+
+global $user;
+if (!$user->uid) {
+ // The user is not logged in.
+}
+
+
+The better way to do this is to use the user_is_logged_in() function.
+
+if (user_is_logged_in()) {
+ // Do something.
+}
+
+
+This returns a boolean (TRUE or FALSE) depending or not the user is logged in. Essentially, it does the same thing as the first example, but there's no need to load the global variable.
+
+A great use case for this is within a hook_menu()
implementation within a custom module.
+
+/**
+ * Implements hook_menu().
+ */
+function mymodule_menu() {
+ $items['foo'] = array(
+ 'title' => 'Foo',
+ 'page callback' => 'mymodule_foo',
+ 'access callback' => 'user_is_logged_in',
+ );
+
+ return $items;
+}
+
+
+There is also a user_is_anonymous() function if you want the opposite result. Both of these functions are available in Drupal 6 and higher.
+
+
+ Tags:
+ drupal , drupal-6 , drupal-7 , drupal-planet , php
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7/index.html b/docs/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7/index.html
new file mode 100644
index 00000000..52c136e0
--- /dev/null
+++ b/docs/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7/index.html
@@ -0,0 +1,352 @@
+
+
+
+ Creating and using custom tokens in Drupal 7 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Creating and using custom tokens in Drupal 7
+
+16th February 2013
+
+ This post outlines the steps required to create your own custom tokens in Drupal.
+
+When writing the recent releases of the Copyright Block module, I used tokens to allow the user to edit and customise their copyright message and place the copyright_message:dates token in the desired position. When the block is rendered, the token is replaced by the necessary dates.
+
+We will be using the fictional foo module to demonstrate this.
+
+Requirements
+
+
+
+Recommended
+
+
+
+Implementing hook_token_info()
+
+The first thing that we need to do is define the new token type and/or the token itself, along with it's descriptive text. To view the existing tokens and types, use dpm(token_get_info());
, assuming that you have the Devel module installed.
+
+/**
+ * Implements hook_token_info().
+ */
+function foo_token_info() {
+ $info = array();
+
+ // Add any new tokens.
+ $info['tokens']['foo']['bar'] = t('This is my new bar token within the foo type.');
+
+ // Return them.
+ return $info;
+}
+
+
+In this case, the token called bar resides within the foo group.
+
+If I needed to add a new token within an existing token type, such as 'node', the syntax would be $info['tokens']['node']['bar']
.
+
+Implementing hook_tokens()
+
+Now that the Token module is aware of our new token, we now need to determine what the token is replaced with. This is done using hook_tokens()
. Here is the basic code needed for an implementation:
+
+/**
+ * Implements hook_tokens().
+ */
+function foo_tokens($type, $tokens, array $data = array(), array $options = array()) {
+ $replacements = array();
+
+ // Code goes here...
+
+ // Return the replacements.
+ return $replacements;
+}
+
+
+The first thing to check for is the type of token using an if()
function, as this could be an existing type like 'node', 'user' or 'site', or a custom token type like 'foo'. Once we're sure that we're looking at the right type(s), we can use foreach ($tokens as $name => $original)
to loop through each of the available tokens using a switch()
. For each token, you can perform some logic to work out the replacement text and then add it into the replacements array using $replacements[$original] = $new;
.
+
+/**
+ * Implements hook_tokens().
+ */
+function foo_tokens($type, $tokens, array $data = array(), array $options = array()) {
+ $replacements = array();
+
+ // The first thing that we're going to check for is the type of token - node,
+ // user etc...
+ if ($type == 'foo') {
+ // Loop through each of the available tokens.
+ foreach ($tokens as $name => $original) {
+ // Find the desired token by name
+ switch ($name) {
+ case 'bar':
+ $new = '';
+
+ // Work out the value of $new...
+
+ // Add the new value into the replacements array.
+ $replacements[$original] = $new;
+ break;
+ }
+ }
+ }
+
+ // Return the replacements.
+ return $replacements;
+}
+
+
+Example
+
+An example from Copyright Block module:
+
+/**
+ * Implements hook_tokens().
+ */
+function copyright_block_tokens($type, $tokens, array $data = array(), array $options = array()) {
+ $replacements = array();
+
+ if ($type == 'copyright_statement') {
+ foreach ($tokens as $name => $original) {
+ switch ($name) {
+ case 'dates':
+ $start_year = variable_get('copyright_block_start_year', date('Y'));
+ $current_year = date('Y');
+
+ $replacements[$original] = $start_year < $current_year ? $start_year . '-' . $current_year : $start_year;
+ break;
+ }
+ }
+ }
+
+ return $replacements;
+}
+
+
+Using token_replace()
+
+With everything defined, all that we now need to do is pass some text through the token_replace()
function to replace it with the values defined within hook_token()
.
+
+$a = t('Something');
+// This would use any token type - node, user etc.
+$b = token_replace($a);
+// This would only use foo tokens.
+$c = token_replace($a, array('foo'));
+
+
+
+ Tags:
+ drupal , drupal-planet , drupal-7 , tokens
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu/index.html b/docs/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu/index.html
new file mode 100644
index 00000000..7ecf8b21
--- /dev/null
+++ b/docs/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu/index.html
@@ -0,0 +1,233 @@
+
+
+
+ The Quickest way to Install Sublime Text 2 in Ubuntu | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The Quickest way to Install Sublime Text 2 in Ubuntu
+
+2nd March 2013
+
+ After reading numerous blog posts about how to install Sublime Text 2 in Ubuntu , this is definitely the quickest way! Just paste the following lines into your Terminal:
+
+$ sudo add-apt-repository ppa:webupd8team/sublime-text-2
+$ sudo apt-get update
+$ sudo apt-get install sublime-text
+
+
+After running this, Sublime Text 2 has been installed within the /usr/lib/sublime-text-2 directory and can be launched from the Dashboard, or by typing subl
, sublime-text
or sublime-text-2
into a Terminal window.
+
+
+ Tags:
+ linux , sublime-text , ubuntu
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/04/20/leaving-nomensa-joining-precedent/index.html b/docs/blog/2013/04/20/leaving-nomensa-joining-precedent/index.html
new file mode 100644
index 00000000..4247786b
--- /dev/null
+++ b/docs/blog/2013/04/20/leaving-nomensa-joining-precedent/index.html
@@ -0,0 +1,230 @@
+
+
+
+ Leaving Nomensa, Joining Precedent | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Leaving Nomensa, Joining Precedent
+
+20th April 2013
+
+ Yesterday was my last day working at Nomensa . Next week, I'll be starting as a Senior Developer at Precedent .
+
+The last 14 months that I've been working at Nomensa have been absolutely fantastic, and had allowed me to work on some great projects for great clients - mainly unionlearn and Digital Theatre Plus . I've learned so much about accessibility and web standards, and have pretty much changed my whole approach to front-end development to accommodate best practices. I've also been involved with the Drupal Accessibility group since starting at Nomensa, and have written several accessibility-focused Drupal modules, including the Nomensa Accessible Media Player module and the Accessibility Checklist . I'll definitely be continuing my interest in accessibility, championing best practices, and incorporating it into my future work wherever possible.
+
+With that all said, I'm really looking forward to starting my new role at Precedent, tackling some new challenges, and I'm sure that it'll be as great a place to work as Nomensa was.
+
+
+ Tags:
+ nomensa , precedent , personal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt/index.html b/docs/blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt/index.html
new file mode 100644
index 00000000..c758f55c
--- /dev/null
+++ b/docs/blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt/index.html
@@ -0,0 +1,271 @@
+
+
+
+ Display Git Branch or Tag Names in your Bash Prompt | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Display Git Branch or Tag Names in your Bash Prompt
+
+27th April 2013
+
+ Whilst watching Drupalize.me 's recent Introduction to Git series , I thought it was useful the way that the current Git branch or tag name was displayed in the bash prompt.
+
+For example (with some slight modifications):
+
+oliver@oliver-mbp:~/Development/drupal(master) $
+oliver@oliver-mbp:~/Development/a11y_checklist(7.x-1.0) $
+
+
+Here's how to do it.
+
+To begin with, create a new file to contain the functions,
+
+vim ~/.bash/git-prompt
+
+
+Paste the following code into the file, and save it.
+
+parse_git_branch () {
+ git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
+}
+
+parse_git_tag () {
+ git describe --tags 2> /dev/null
+}
+
+parse_git_branch_or_tag() {
+ local OUT="$(parse_git_branch)"
+ if [ "$OUT" == " ((no branch))" ]; then
+ OUT="($(parse_git_tag))";
+ fi
+ echo $OUT
+}
+
+
+Edit your .bashrc
or .bash_profile
file to override the PS1 value.
+
+vim ~/.bashrc
+
+
+Add the following code at the bottom of the file, and save it.
+
+source ~/.bash/git-prompt
+PS1="\u@\h:\w\$(parse_git_branch_or_tag) $ "
+
+
+Restart your Terminal or type source ~/.bashrc
to see your changes.
+
+
+ Tags:
+ drupal , drupal-planet , git , terminal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/06/13/some-useful-links-using-simpletest-drupal/index.html b/docs/blog/2013/06/13/some-useful-links-using-simpletest-drupal/index.html
new file mode 100644
index 00000000..397c468e
--- /dev/null
+++ b/docs/blog/2013/06/13/some-useful-links-using-simpletest-drupal/index.html
@@ -0,0 +1,235 @@
+
+
+
+ Some useful links for using SimpleTest in Drupal | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some useful links for using SimpleTest in Drupal
+
+13th June 2013
+
+ Here are some useful links that I've found when researching about unit testing in Drupal using SimpleTest:
+
+
+
+
+ Tags:
+ simpletest , tdd , test-driven-development , drupal-planet , drupal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled/index.html b/docs/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled/index.html
new file mode 100644
index 00000000..4ad14066
--- /dev/null
+++ b/docs/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled/index.html
@@ -0,0 +1,253 @@
+
+
+
+ Creating Local and Staging sites with Drupal's Domain Module Enabled | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Creating Local and Staging sites with Drupal's Domain Module Enabled
+
+17th July 2013
+
+ The Domain Access project is a suite of modules that provide tools for running a group of affiliated sites from one Drupal installation and a single shared database. The issue is that the domains are stored within the database so these are copied across when the data is migrated between environments, whereas the domains are obviously going to change.
+
+Rather than changing the domain settings within the Domain module itself, the best solution I think is to use table prefixes and create a different domain table per environment. With a live, staging and local domains, the tables would be named as follows:
+
+live_domain
+local_domain
+staging_domain
+
+
+Within each site's settings.php file, define the prefix for the domain table within the databases array so that each site is looking at the correct table for its environment.
+
+$databases['default']['default'] = array(
+ 'driver' => 'mysql',
+ 'database' => 'foobar',
+ 'username' => 'foo',
+ 'password' => 'bar',
+ 'host' => 'localhost',
+ 'prefix' => array(
+ 'default' => '',
+ 'domain' => 'local_', // This will use the local_domain table.
+ // Add any other prefixed tables here.
+ ),
+);
+
+
+Within each environment-specific domain table, update the subdomain column to contain the appropriate domain names.
+
+Update: I've just found out about the Domain Alias sub-module, which you can enable and add aliases to each domain, so you could add the aliases in this way also.
+
+
+ Tags:
+ drupal , drupal-planet , databases , domain , table-prefixing
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/07/26/going-drupalcon/index.html b/docs/blog/2013/07/26/going-drupalcon/index.html
new file mode 100644
index 00000000..4182b4a4
--- /dev/null
+++ b/docs/blog/2013/07/26/going-drupalcon/index.html
@@ -0,0 +1,230 @@
+
+
+
+ Going to DrupalCon | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Going to DrupalCon
+
+26th July 2013
+
+ Precedent are sending myself and two of our other Drupal Developers to Drupalcon Prague .
+
+Having wanted to attend the last few Drupalcons (London, especially) but not being able to, I'm definitely looking forward to this one.
+
+See you there!
+
+
+ Tags:
+ drupalcon , precedent
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/09/06/create-a-zen-sub-theme-using-drush/index.html b/docs/blog/2013/09/06/create-a-zen-sub-theme-using-drush/index.html
new file mode 100644
index 00000000..74177b4b
--- /dev/null
+++ b/docs/blog/2013/09/06/create-a-zen-sub-theme-using-drush/index.html
@@ -0,0 +1,247 @@
+
+
+
+ Create a Zen Sub-theme Using Drush | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create a Zen Sub-theme Using Drush
+
+6th September 2013
+
+ First, download the Zen theme if you haven't already done so.
+
+$ drush dl zen
+
+
+This will now enable you to use the "drush zen" command.
+
+$ drush zen "Oliver Davies" oliverdavies --description="A Zen sub-theme for oliverdavies.co.uk" --without-rtl
+
+
+The parameters that I'm passing it are:
+
+
+The human-readable name of the theme.
+The machine-readable name of the theme.
+The description of the theme (optional).
+A flag telling Drush not to include any right-to-left elements within my sub-theme as these aren't needed (optional).
+
+
+This will create a new theme in sites/all/themes/oliverdavies.
+
+For further help, type $ drush help zen
to see the Drush help page for the zen command.
+
+
+ Tags:
+ drupal , drupal-planet , drush , zen , theming
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/11/19/dont-bootstrap-drupal-use-drush/index.html b/docs/blog/2013/11/19/dont-bootstrap-drupal-use-drush/index.html
new file mode 100644
index 00000000..8a015088
--- /dev/null
+++ b/docs/blog/2013/11/19/dont-bootstrap-drupal-use-drush/index.html
@@ -0,0 +1,263 @@
+
+
+
+ Don't Bootstrap Drupal, Use Drush | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Don't Bootstrap Drupal, Use Drush
+
+19th November 2013
+
+ There are times when doing Drupal development when you need to run a custom PHP script, maybe moving data from one field to another, that doesn't warrant the time and effort to create a custom module. In this scenario, it would be quicker to write a .php script and bootstrap Drupal to gain access to functions like node_load()
and db_query()
.
+
+To bootstrap Drupal, you would need to add some additional lines of code to the stop of your script. Something like:
+
+<?php
+
+// Bootstrap Drupal.
+$drupal_path = $_SERVER['DOCUMENT_ROOT'];
+define('DRUPAL_ROOT', $drupal_path);
+require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+// Do stuff.
+$node = node_load(1);
+
+
+The script would need be placed in the root of your Drupal directory, and you would then have had to open a browser window and visit http://example.com/foo.php to execute it. This is where the "drush php-script" command (or "drush scr" for short) is useful, and can be used to execute the script from the command line.
+
+$ drush scr foo.php
+
+
+It also means that I no longer need to manually bootstrap Drupal, so my script is much cleaner.
+
+// Just do stuff.
+$node = node_load(1);
+
+
+I prefer to keep these scripts outside of my Drupal directory in a separate "scripts" directory (with Drupal in a "drupal" directory on the same level). This makes it easier to update Drupal as I don't need to worry about accidentally deleting the additional files. From within the drupal directory, I can now run the following command to go up one level, into the scripts directory and then execute the script. Note that you do not need to include the file extension.
+
+$ drush scr ../scripts/foo
+
+
+Or, if you're using Drush aliases :
+
+$ drush @mysite.local scr foo
+
+
+If you commonly use the same scripts for different projects, you could also store these within a separate Git repository and checkout the scripts directory using a Git submodule .
+
+
+ Tags:
+ drush , drupal-planet , php
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/11/27/useful-vagrant-commands/index.html b/docs/blog/2013/11/27/useful-vagrant-commands/index.html
new file mode 100644
index 00000000..0cb45edc
--- /dev/null
+++ b/docs/blog/2013/11/27/useful-vagrant-commands/index.html
@@ -0,0 +1,271 @@
+
+
+
+ Useful Vagrant Commands | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Useful Vagrant Commands
+
+27th November 2013
+
+ Vagrant is a tool for managing virtual machines within VirtualBox from the command line. Here are some useful commands to know when using Vagrant:
+
+
+
+
+ Command
+ Description
+
+
+
+
+ vagrant init {box}
+ Initialise a new VM in the current working directory. Specify a box name, or "base" will be used by default.
+
+
+ vagrant status
+ Shows the status of the Vagrant box(es) within the current working directory tree.
+
+
+ vagrant up (--provision)
+ Boots the Vagrant box. Including "–provision" also runs the "vagrant provision" command.
+
+
+ vagrant reload (--provision)
+ Reloads the Vagrant box. Including "--provision" also runs the "vagrant provision" command.
+
+
+ vagrant provision
+ Provision the Vagrant box using Puppet.
+
+
+ vagrant suspend
+ Suspend the Vagrant box. Use "vagrant up" to start the box again.
+
+
+ vagrant halt (-f)
+ Halt the Vagrant box. Use -f to forcefully shut down the box without prompting for confirmation.
+
+
+ vagrant destroy (-f)
+ Destroys a Vagrant box. Use -f to forcefully shut down the box without prompting for confirmation.
+
+
+
+
+The full Vagrant documentation can be found at http://docs.vagrantup.com/v2/ .
+
+
+ Tags:
+ vagrant
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/12/24/quickly-apply-patches-using-git-and-curl-or-wget/index.html b/docs/blog/2013/12/24/quickly-apply-patches-using-git-and-curl-or-wget/index.html
new file mode 100644
index 00000000..ae0e228f
--- /dev/null
+++ b/docs/blog/2013/12/24/quickly-apply-patches-using-git-and-curl-or-wget/index.html
@@ -0,0 +1,240 @@
+
+
+
+ Quickly Apply Patches Using Git and curl or wget | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Quickly Apply Patches Using Git and curl or wget
+
+24th December 2013
+
+ Testing a patch file is usually a two-step process. First you download the patch file from the source, and then you run a separate command to apply it.
+
+You can save time and typing by running the two commands on one line:
+
+$ curl http://drupal.org/files/[patch-name].patch | git apply -v
+
+
+Or, if you don't have curl installed, you can use wget:
+
+$ wget -q -O - http://drupal.org/files/[patch-name].patch | git apply -v
+
+
+These commands need to be run within the root of your Git repository (i.e. where the .git directory is).
+
+These snippets were taken from Applying Patches with Git on Drupal.org.
+
+
+ Tags:
+ git , drupal-planet
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2013/12/31/download-different-versions-drupal-drush/index.html b/docs/blog/2013/12/31/download-different-versions-drupal-drush/index.html
new file mode 100644
index 00000000..3f3e51c1
--- /dev/null
+++ b/docs/blog/2013/12/31/download-different-versions-drupal-drush/index.html
@@ -0,0 +1,252 @@
+
+
+
+ Download Different Versions of Drupal with Drush | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Download Different Versions of Drupal with Drush
+
+31st December 2013
+
+ I still maintain a number of Drupal 6 sites and occassionally need to download Drupal 6 core as opposed to Drupal 7. I'm also experimenting with Drupal 8 so I need to download that as well.
+
+By declarding the core version of Drupal, such as "drupal-6", Drush will download that instead.
+
+$ drush dl drupal-6
+
+
+This downloads the most recent stable version of Drupal 6. If you don't want that, you can add the --select and additionally the --all options to be presented with an entire list to chose from.
+
+$ drush dl drupal-6 --select
+$ drush dl drupal-6 --select --all
+
+
+If you want the most recent development version, just type:
+
+$ drush dl drupal-6.x
+
+
+The same can be done for other core versions of Drupal, from Drupal 5 upwards.
+
+# This will download Drupal 5
+$ drush dl drupal-5
+# This will download Drupal 8
+$ drush dl drupal-8
+
+
+For a full list of the available options, type "drush help pm-download" into a Terminal window or take a look at the entry on drush.ws .
+
+
+ Tags:
+ drupal , drupal-planet , drush
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/01/15/some-useful-git-aliases/index.html b/docs/blog/2014/01/15/some-useful-git-aliases/index.html
new file mode 100644
index 00000000..80d2dff4
--- /dev/null
+++ b/docs/blog/2014/01/15/some-useful-git-aliases/index.html
@@ -0,0 +1,247 @@
+
+
+
+ Some Useful Git Aliases | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some Useful Git Aliases
+
+15th January 2014
+
+ Here are some bash aliases that I use and find helpful for quickly writing Git and Git Flow commands. These should be placed within your ~/.bashrc
or ~/.bash_profile
file:
+
+alias gi="git init"
+alias gcl="git clone"
+alias gco="git checkout"
+alias gs="git status"
+alias ga="git add"
+alias gaa="git add --all"
+alias gc="git commit"
+alias gcm="git commit -m"
+alias gca="git commit -am"
+alias gm="git merge"
+alias gr="git rebase"
+alias gps="git push"
+alias gpl="git pull"
+alias gd="git diff"
+alias gl="git log"
+alias gfi="git flow init"
+alias gff="git flow feature"
+alias gfr="git flow release"
+alias gfh="git flow hotfix"
+
+
+
+ Tags:
+ git
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/02/09/drupalcamp-london-2014/index.html b/docs/blog/2014/02/09/drupalcamp-london-2014/index.html
new file mode 100644
index 00000000..9211069f
--- /dev/null
+++ b/docs/blog/2014/02/09/drupalcamp-london-2014/index.html
@@ -0,0 +1,234 @@
+
+
+
+ DrupalCamp London 2014 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DrupalCamp London 2014
+
+9th February 2014
+
+ It's all booked, I'm going to be attending DrupalCamp London this year, my first DrupalCamp!
+
+I'm going as a volunteer, so I'm going to be helping with the registrations on the Saturday morning and for another couple hours elsewhere over the weekend. I've also offered to help organise and oversee some code sprints, although I'm definitely wanting to do some sprinting of my own and attend a few sessions.
+
+I'm looking forward to meeting some new people as well as catching up with some people that I met at DrupalCon Prague .
+
+If you're also coming, see you there!
+
+Update: I've just found out that my session, What is Git Flow? , has been accepted and will take place on the Sunday morning. It's going to be a busy weekend!
+
+
+ Tags:
+ drupal , drupalcamp-london , git , git-flow
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/03/03/what-git-flow/index.html b/docs/blog/2014/03/03/what-git-flow/index.html
new file mode 100644
index 00000000..77744693
--- /dev/null
+++ b/docs/blog/2014/03/03/what-git-flow/index.html
@@ -0,0 +1,281 @@
+
+
+
+ DrupalCamp London: What is Git Flow? | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DrupalCamp London: What is Git Flow?
+
+3rd March 2014
+
+ Here are my slides from my "What is Git Flow?" session at DrupalCamp London .
+
+
+
+
+Take aways
+
+The main take aways are:
+
+
+Git Flow adds various commands into Git to enhance its native functionality, which creates a branching model to separate your stable production code from your unstable development code.
+Never commit directly to the master branch - this is for production code only!
+You can commit directly to the develop branch, but this should be done sparingly.
+Use feature branches as much as possible - one per feature, user story or bug.
+Commit early and often, and push to a remote often to encourage collaboration as well as to provide a backup of your code.
+You can use settings within services like GitHub and Bitbucket to only allow certain users to push to the master and develop branches, and restrict other Developers to only commit and push to feature branches. Changes can then be committed and pushed, then reviewed as part of a peer code review, and merged back into the develop branch.
+
+
+Feedback
+
+If you've got any questions, please feel free to tweet at me or fill in the session evaluation form that you can complete on the DrupalCamp London website.
+
+I've had some great feedback via Twitter:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tags:
+ git , git-flow , drupalcamp-london , talks
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/05/03/drupal-association/index.html b/docs/blog/2014/05/03/drupal-association/index.html
new file mode 100644
index 00000000..428f9d13
--- /dev/null
+++ b/docs/blog/2014/05/03/drupal-association/index.html
@@ -0,0 +1,236 @@
+
+
+
+ Drupal Association | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Drupal Association
+
+3rd May 2014
+
+ Today was my last day working at Precedent . Next week, I'll be starting my new job at the Drupal Association working on Drupal's home - Drupal.org .
+
+I was at Precedent for just over a year and had the opportunity to work on several Drupal projects from project leading to ad-hoc module and theme development, including my largest Drupal build to date.
+
+I was also lucky enough to go to DrupalCon Prague as well as DrupalCamp London .
+
+I was able to contribute some code back into the community and encourage other team members to do the same.
+
+It was good to be able to introduce some new tools like Vagrant , Puppet , SASS and Compass into the team. I was pleased to introduce and champion the Git Flow branching model, which them became the standard approach for all Drupal projects, and hopefully soon all development projects.
+
+Working for the Drupal Association and on Drupal.org was an opportunity that I couldn't refuse, and is certainly going to be a fun and interesting challenge. I can't wait to get started!
+
+
+ Tags:
+ drupal , personal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/05/06/thanks/index.html b/docs/blog/2014/05/06/thanks/index.html
new file mode 100644
index 00000000..9bcd294a
--- /dev/null
+++ b/docs/blog/2014/05/06/thanks/index.html
@@ -0,0 +1,226 @@
+
+
+
+ Thanks | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Thanks
+
+6th May 2014
+
+ This is just a quick post to thank everyone for their comments and congratulations after my previous post about joining the Drupal Association . I’m looking forward to my first day in the job tomorrow.
+
+
+ Tags:
+ drupal , drupal-association , personal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/05/21/git-format-patch/index.html b/docs/blog/2014/05/21/git-format-patch/index.html
new file mode 100644
index 00000000..fa6eb522
--- /dev/null
+++ b/docs/blog/2014/05/21/git-format-patch/index.html
@@ -0,0 +1,311 @@
+
+
+
+ git format-patch is your Friend | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ git format-patch is your Friend
+
+21st May 2014
+
+ The Problem
+
+As an active contributor to the Drupal project, I spend a lot of time working with other peoples’ modules and themes, and occassionally have to fix a bug or add some new functionality.
+
+In the Drupal community, we use a patch based workflow where any changes that I make get exported to a file detailing the differences. The patch file (*.patch) is attached to an item in an issue queue on Drupal.org, applied by the maintainer to their local copy of the code and reviewed, and hopefully committed.
+
+There is an option that the maintainer can add to the end of their commit message.
+
+For example:
+
+--author="opdavies <opdavies@381388.no-reply.drupal.org>"
+
+
+This differs slightly different for each Drupal user, and the code can be found on their Drupal.org profile page.
+
+If this is added to the end of the commit message, the resulting commit will show that it was committed by the maintainer but authored by a different user. This will then display on Drupal.org that you’ve made a commit to that project.
+
+
+
+The problem is that some project maintainers either don’t know about this option or occasionally forget to add it. Dreditor can suggest a commit message and assign an author, but it is optional and, of course, not all maintainers use Dreditor (although they probably should).
+
+The git format-patch
command seems to be the answer, and will be my preferred method for generating patch files in the future rather than git diff
.
+
+What does it do Differently?
+
+From the manual page :
+
+
+ Prepare each commit with its patch in one file per commit, formatted to resemble UNIX mailbox format. The output of this command is convenient for e-mail submission or for use with git am.
+
+
+Here is a section of a patch that I created for the Metatag module using git format-patch
:
+
+From 80c8fa14de7f4a83c2e70367aab0aedcadf4f3b0 Mon Sep 17 00:00:00 2001
+From: Oliver Davies <oliver@oliverdavies.co.uk>
+Date: Mon, 12 May 2014 14:53:55 +0100
+Subject: [PATCH] Exclude comment entities when checking if this is the page,
+ otherwise comment_fragment.module will break metatag
+
+---
+
+
+As mentioned above, the patch is structured in an email format. The commit message is used as the subject line, and the date that the commit was made locally is used for the date. What we’re interested in is the “From” value. This contains your name and email address from your ~/.gitconfig
file and is used to author the patch automatically.
+
+Everything below this is the same as a standard patch file, the same as if was generated with git diff
.
+
+The full patch file can be found at https://drupal.org/files/issues/metatag-comment-fragment-conflict-2265447-4.patch .
+
+The Process
+
+How did I create this patch? Here are the steps that I took:
+
+
+Clone the source repository using $ git clone --branch 7.x-1.x http://git.drupal.org/project/metatag.git
and move into that directory.
+Create a branch for this patch using $ git checkout -b 2265447-comment-fragment-conflict
.
+Add and commit any changes as normal.
+Generate the patch file using $ git format-patch 7.x-1.x --stdout > metatag-comment-fragment-conflict-2265447-4.patch
.
+
+
+Note: I am defining 7.x-1.x in the last step as the original branch to compare (i.e. the original branch that we forked to make our issue branch). This will change depending on the project that you are patching, and it’s version number. Also, commits should always be made against the development branch and not the stable release.
+
+By default, a separate patch file will be created for each commit that we’ve made. This is overridden by the --stdout
option which combines all of the patches into a single file. This is the recommended approach when uploading to Drupal.org.
+
+The resulting patch file can be uploaded onto a Drupal.org issue queue, reviewed by the Testbot and applied by a module maintainer, and you automatically get the commit attributed. Problem solved.
+
+Committing the Patch
+
+If you need to commit a patch that was created using git format-patch
, the best command to do this with is the git am
command.
+
+For example, within your repository, run:
+
+$ git am /path/to/file
+$ git am ~/Code/metatag-comment-fragment-conflict-2265447-4.patch
+
+
+You should end up with some output similar to the following:
+
+Applying: #2272799 Added supporters section
+Applying: #2272799 Added navigation tabs
+Applying: #2272799 Fixed indentation
+Applying: #2272799 Replaced URL
+
+
+Each line is the commit message associated with that patch.
+
+Assuming that there are no errors, you can go ahead and push your updated code into your remote repository.
+
+
+ Tags:
+ patches , drupal , drupal-planet , git
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/07/02/drush-make-drupalbristol/index.html b/docs/blog/2014/07/02/drush-make-drupalbristol/index.html
new file mode 100644
index 00000000..c9ce5934
--- /dev/null
+++ b/docs/blog/2014/07/02/drush-make-drupalbristol/index.html
@@ -0,0 +1,229 @@
+
+
+
+ drush make drupalbristol | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ drush make drupalbristol
+
+2nd July 2014
+
+ Here are my slides from this month's talk night at the Drupal Bristol user group .
+
+
+
+
+
+ Tags:
+ drupal , drush , drush-make , drupal-bristol , talks
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine/index.html b/docs/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine/index.html
new file mode 100644
index 00000000..8937b046
--- /dev/null
+++ b/docs/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine/index.html
@@ -0,0 +1,236 @@
+
+
+
+ How to fix Vagrant Loading the Wrong Virtual Machine | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ How to fix Vagrant Loading the Wrong Virtual Machine
+
+6th October 2014
+
+ A few times recently, I've had instances where Vagrant seems to have forgotten which virtual machine it's supposed to load, probably due to renaming a project directory or the .vagrant directory being moved accidentally.
+
+Here are the steps that I took to fix this and point Vagrant back at the correct VM.
+
+
+Stop the machine from running using the $ vagrant halt
command.
+Use the $ VBoxManage list vms
command to view a list of the virtual machines on your system. Note the ID of the correct VM that should be loading. For example, "foo_default_1405481857614_74478" {e492bfc3-cac2-4cde-a396-e81e37e421e2}
. The number within the curly brackets is the ID of the virtual machine.
+Within the .vagrant directory in your project (it is hidden by default), update the ID within the machines/default/virtualbox/id file.
+Start the new VM with $ vagrant up
.
+
+
+
+ Tags:
+ vagrant , virtualbox
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/10/21/updating-features-and-adding-components-using-drush/index.html b/docs/blog/2014/10/21/updating-features-and-adding-components-using-drush/index.html
new file mode 100644
index 00000000..e40c8d97
--- /dev/null
+++ b/docs/blog/2014/10/21/updating-features-and-adding-components-using-drush/index.html
@@ -0,0 +1,269 @@
+
+
+
+ Updating Features and Adding Components Using Drush | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Updating Features and Adding Components Using Drush
+
+21st October 2014
+
+ If you use the Features module to manage your Drupal configuration, it can be time consuming to update features through the UI, especially if you are working on a remote server and need to keep downloading and uploading files.
+
+If you re-create a feature through the UI, you'll be prompted to download a new archive of the feature in its entirety onto your local computer. You could either commit this into a local repository and then pull it remotely, or use a tool such as SCP to upload the archive onto the server and commit it from there. You can simplify this process by using Drush .
+
+Finding Components
+
+To search for a component, use the drush features-components
command. This will display a list of all components on the site. As we're only interested in components that haven't been exported yet, add the --not-exported
option to filter the results.
+
+To filter further, you can also use the grep
command to filter the results. For example, drush features-components --not-exported field_base | grep foo
, would only return non-exported field bases containing the word "foo".
+
+The result is a source and a component, separated by a colon. For example, field_base:field_foo
.
+
+Exporting the Feature
+
+Once you have a list of the components that you need to add, you can export the feature. This is done using the drush features-export
command, along with the feature name and the component names.
+
+For example:
+
+$ drush features-export -y myfeature field_base:field_foo field_instance:user-field_foo
+
+
+In this example, the base for field_boo and it's instance on the user object is being added to the "myfeature" feature.
+
+If you are updating an existing feature, you'll get a message informing you that the module already exists and asking if you want to continue. This is fine, and is automatically accepted by including -y
within the command. If a feature with the specified name doesn't exist, it will be created.
+
+If you're creating a new feature, you can define where the feature will be created using the --destination
option.
+
+Once complete, you will see a confirmation message.
+
+
+ Created module: my feature in sites/default/modules/custom/features/myfeature
+
+
+The Result
+
+Once finished, the feature is updated in it's original location, so there's no download of the feature and then needing to re-upload it. You can add and commit your changes into Git or continue with your standard workflow straight away.
+
+Useful Links
+
+
+
+
+ Tags:
+ drupal , drupal-planet , drush , features
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/11/18/include-css-fonts-using-sass-each-loop/index.html b/docs/blog/2014/11/18/include-css-fonts-using-sass-each-loop/index.html
new file mode 100644
index 00000000..66cce552
--- /dev/null
+++ b/docs/blog/2014/11/18/include-css-fonts-using-sass-each-loop/index.html
@@ -0,0 +1,270 @@
+
+
+
+ Include CSS Fonts by Using a SASS each Loop | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Include CSS Fonts by Using a SASS each Loop
+
+18th November 2014
+
+ Using a file structure similar to this, organise your font files into directories, using the the font name for both the directory name and for the file names.
+
+.
+├── FuturaBold
+│ ├── FuturaBold.eot
+│ ├── FuturaBold.svg
+│ ├── FuturaBold.ttf
+│ └── FuturaBold.woff
+├── FuturaBoldItalic
+│ ├── FuturaBoldItalic.eot
+│ ├── FuturaBoldItalic.svg
+│ ├── FuturaBoldItalic.ttf
+│ └── FuturaBoldItalic.woff
+├── FuturaBook
+│ ├── FuturaBook.eot
+│ ├── FuturaBook.svg
+│ ├── FuturaBook.ttf
+│ └── FuturaBook.woff
+├── FuturaItalic
+│ ├── FuturaItalic.eot
+│ ├── FuturaItalic.svg
+│ ├── FuturaItalic.ttf
+│ └── FuturaItalic.woff
+
+
+Within your SASS file, start an @each
loop, listing the names of the fonts. In the same way as PHP's foreach
loop, each font name will get looped through using the $family
variable and then compiled into CSS.
+
+@each $family in FuturaBook, FuturaBold, FuturaBoldItalic, FuturaItalic {
+ @font-face {
+ font-family: #{$family};
+ src: url('../fonts/#{$family}/#{$family}.eot');
+ src: url('../fonts/#{$family}/#{$family}.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/#{$family}/#{$family}.woff') format('woff'),
+ url('../fonts/#{$family}/#{$family}.ttf') format('truetype'),
+ url('../fonts/#{$family}/#{$family}.svg##{$family}') format('svg');
+ font-weight: normal;
+ font-style: normal;
+ }
+}
+
+
+When the CSS has been compiled, you can then use in your CSS in the standard way.
+
+font-family: "FuturaBook";
+
+
+
+ Tags:
+ compass , drupal-planet , fonts , sass
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module/index.html b/docs/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module/index.html
new file mode 100644
index 00000000..62a5e882
--- /dev/null
+++ b/docs/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module/index.html
@@ -0,0 +1,243 @@
+
+
+
+ Using Remote Files when Developing Locally with Stage File Proxy Module | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Using Remote Files when Developing Locally with Stage File Proxy Module
+
+20th November 2014
+
+ Download the Stage File Proxy module from Drupal.org and enable it on your site.
+
+As this module is only going to be needed on pre-production sites, it would be better to configure this within your settings.php or settings.local.php file. We do this using the $conf
array which removes the need to configure the module through the UI and store the values in the database.
+
+// File proxy to the live site.
+$conf['stage_file_proxy_origin'] = 'http://www.example.com';
+
+// Don't copy the files, just link to them.
+$conf['stage_file_proxy_hotlink'] = TRUE;
+
+// Image style images are the wrong size otherwise.
+$conf['stage_file_proxy_use_imagecache_root'] = FALSE;
+
+
+If the origin site is not publicly accessible yet, maybe it's a pre-live or staging site, and protected with a basic access authentication, you can include the username and password within the origin URL.
+
+$conf['stage_file_proxy_origin'] = 'http://user:password@prelive.example.com';
+
+
+
+ Tags:
+ drupal , drupal-planet , servers
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/11/27/pantheon-settings-files/index.html b/docs/blog/2014/11/27/pantheon-settings-files/index.html
new file mode 100644
index 00000000..665bf38c
--- /dev/null
+++ b/docs/blog/2014/11/27/pantheon-settings-files/index.html
@@ -0,0 +1,293 @@
+
+
+
+ Include environment-specific settings files on Pantheon | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Include environment-specific settings files on Pantheon
+
+27th November 2014
+
+ I was recently doing some work on a site hosted on Pantheon and came across an issue, for which part of the suggested fix was to ensure that the $base_url
variable was explicitly defined within settings.php (this is also best practice on all Drupal sites).
+
+The way that was recommended was by using a switch()
function based on Pantheon's environment variable. For example:
+
+switch ($_SERVER['PANTHEON_ENVIRONMENT']) {
+ case 'dev':
+ // Development environment.
+ $base_url = 'dev-my-site.gotpantheon.com';
+ break;
+
+
+ case 'test':
+ // Testing environment.
+ $base_url = 'test-my-site.gotpantheon.com';
+ break;
+
+
+ case 'live':
+ // Production environment.
+ $base_url = 'live-my-site.gotpantheon.com';
+ break;
+}
+
+
+Whilst this works, it doesn't conform to the DRY (don't repeat yourself) principle and means that you also might get a rather long and complicated settings file, especially when you start using multiple switches and checking for the value of the environment multiple times.
+
+My alternative solution to this is to include an environment-specific settings file.
+
+To do this, add the following code to the bottom of settings.php:
+
+if (isset($_SERVER['PANTHEON_ENVIRONMENT'])) {
+ if ($_SERVER['PANTHEON_ENVIRONMENT'] != 'live') {
+ // You can still add things here, for example to apply to all sites apart
+ // from production. Mail reroutes, caching settings etc.
+ }
+
+ // Include an environment-specific settings file, for example
+ // settings.dev.php, if one exists.
+ $environment_settings = __DIR__ . '/settings.' . $_SERVER['PANTHEON_ENVIRONMENT'] . '.php';
+ if (file_exists($environment_settings)) {
+ include $environment_settings;
+ }
+}
+
+
+This means that rather than having one long file, each environment has it's own dedicated settings file that contains it's own additional configuration. This is much easier to read and make changes to, and also means that less code is loaded and parsed by PHP. Settings that apply to all environments are still added to settings.php.
+
+Below this, I also include a similar piece of code to include a settings.local.php file. The settings.php file then gets committed into the Git repository.
+
+Within the sites/default directory, I also include an example file (example.settings.env.php) for reference. This is duplicated, renamed and populated accordingly.
+
+<?php
+
+/**
+ * This is a specific settings file, just for the x environment. Any settings
+ * defined here will be included after those in settings.php.
+ *
+ * If you have also added a settings.local.php file, that will override any
+ * settings stored here.
+ *
+ * No database credentials should be stored in this file as these are included
+ * automatically by Pantheon.
+ */
+
+$base_url = '';
+
+
+The environment specific files are also committed into Git and pushed to Pantheon, and are then included automatically on each environment.
+
+
+ Tags:
+ drupal , drupal-planet , pantheon , settings.php
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides/index.html b/docs/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides/index.html
new file mode 100644
index 00000000..7872921c
--- /dev/null
+++ b/docs/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides/index.html
@@ -0,0 +1,253 @@
+
+
+
+ Include a Local Drupal Settings file for Environment Configuration and Overrides | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Include a Local Drupal Settings file for Environment Configuration and Overrides
+
+20th December 2014
+
+ At the bottom of settings.php, add the following code:
+
+$local_settings = __DIR__ . '/settings.local.php';
+if (file_exists($local_settings)) {
+ include $local_settings;
+}
+
+
+This allows for you to create a new file called settings.local.php within a sites/* directory (the same place as settings.php), and this will be included as an extension of settings.php. You can see the same technique being used within Drupal 8's default.settings.php file.
+
+Environment specific settings like $databases
and $base_url
can be placed within the local settings file. Other settings like $conf['locale_custom_strings_en']
(string overrides) and $conf['allow_authorize_operations']
that would apply to all environments can still be placed in settings.php.
+
+settings.php though is ignored by default by Git by a .gitignore file, so it won't show up as a file available to be committed. There are two ways to fix this. The first is to use the --force
option when adding the file which overrides the ignore file:
+
+git add --force sites/default/settings.php
+
+
+The other option is to update the .gitignore file itself so that settings.php is no longer ignored. An updated .gitignore file could look like:
+
+# Ignore configuration files that may contain sensitive information.
+sites/*/settings.local*.php
+
+# Ignore paths that contain user-generated content.
+sites/*/files
+sites/*/private
+
+
+This will allow for settings.php to be added to Git and committed, but not settings.local.php.
+
+
+ Tags:
+ drupal , drupal-6 , drupal-7 , drupal-8 , drupal-planet , settings.php
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2015/03/20/2014/index.html b/docs/blog/2015/03/20/2014/index.html
new file mode 100644
index 00000000..614ffd84
--- /dev/null
+++ b/docs/blog/2015/03/20/2014/index.html
@@ -0,0 +1,272 @@
+
+
+
+ 2014 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2014
+
+20th March 2015
+
+ A lot happened in 2014. Here are some of the main things that I'd like to highlight:
+
+Joined the Drupal Association
+
+This was the main thing for me this year, in May I left Precedent and joined the Drupal Association . I work on the Engineering team, focused mainly on Drupal.org but I've also done some theming work on the DrupalCon Amsterdam and Latin America websites, and some pre-launch work on Drupal Jobs .
+
+Some of the tasks that I've worked on so far are:
+
+
+Fixing remaining issues from the Drupal.org Drupal 7 upgrade.
+Improving pages for Supporting Partners , Technology Supporters and Hosting Partners . These previously were manually updated pages using HTML tables, which are now dynamic pages built with Views using organisation nodes.
+Configuring human-readable paths for user profiles using Pathauto . Only a small change, but made a big difference to end-users.
+Migration of user data from profile values to fields, and various user profile improvements. This was great because now we can do things like reference mentors by their username and display their picture on your profile, as well as show lists of peope listing a user as their mentor. This, I think, adds a more personal element to Drupal.org because we can see the actual people and not just a list of names on a page.
+
+
+I've started keeping a list of tasks that I've been involved with on my Work page, and will be adding more things as I work on them.
+
+Portland
+
+I was able to travel to Portland, Oregon twice last year to meet with the rest of the Association staff. Both times I met new people and it was great to spend some work and social time with everyone, and it was great to have everyone together as a team.
+
+My First DrupalCamp
+
+In February, I attended DrupalCamp London . This was my first time attending a Camp, and I managed to attend some great sessions as well as meet people who I'd never previously met in person. I was also a volunteer and speaker, where I talked about Git Flow - a workflow for managing your Git projects.
+
+
+
+
+
+
+I was also able to do a little bit of sprinting whilst I was there, reviewing other people's modules and patches.
+
+Attending this and DrupalCon Prague in 2013 have really opened my eyes to the face-to-face side of the Drupal community, and I plan on attending a lot more Camps and Cons in the future.
+
+DrupalCon Amsterdam
+
+I was also able to travel to Holland and attend DrupalCon Amsterdam along with other members of Association staff.
+
+DrupalCamp Bristol
+
+In October, we started planning for DrupalCamp Bristol . I'm one of the founding Committee members,
+
+
+ Tags:
+ drupal-association , drupalcamp-london , personal
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version/index.html b/docs/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version/index.html
new file mode 100644
index 00000000..f14b601f
--- /dev/null
+++ b/docs/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version/index.html
@@ -0,0 +1,290 @@
+
+
+
+ How to Define a Minimum Drupal Core Version | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ How to Define a Minimum Drupal Core Version
+
+3rd April 2015
+
+ This week, my first code patch was committed to Drupal core . The patch adds the user_has_role()
function to the user module, to simplify the way to check whether a user in Drupal has been assigned a specific role. This is something that I normally write a custom function for each project, but it's now available in Drupal core as of 7.36 .
+
+But what if someone is using a core version less than 7.36 and tries using the function? The site would return an error because that function wouldn't exist.
+
+If you're building a new Drupal site, then I'd assume that you're using a latest version of core, or you have the opportunity to update it when needed. But what if you're writing a contrib module? How can you be sure that the correct minimum version of core?
+
+Setting Dependencies
+
+What I'm going to be doing for my contrib projects is defining a minimum version of Drupal core that the module is compatible with. If this dependency isn't met, the module won't be able to be enabled. This is done within your module's .info file.
+
+Adding a Simple Dependency
+
+You can define a simple dependency for your module by adding a line this this to your project's .info file:
+
+dependencies[] = views
+
+
+This would make your module dependant on having the Views module present and enabled, which you'd need if you were including views as part of your module, for example.
+
+Adding a Complex Dependency
+
+In the previous example, our module would enable if any version of Views was enabled, but we need to specify a specific version. We can do this by including version numbers within the dependencies field in the following format:
+
+dependencies[] = modulename (major.minor)
+
+
+This can be a for a specific module release or a branch name:
+
+dependencies[] = modulename (1.0)
+dependencies[] = modulename (1.x)
+
+
+We can also use the following as part of the field for extra granularity:
+
+
+= or == equals (this is the default)
+> greater than
+< lesser than
+>= greater than or equal to
+<= lesser than or equal to
+!= not equal to
+
+
+In the original scenario, we want to specify that the module can only be enabled on Drupal core 7.36 or later. To do this, we can use the "greater than or equal to" option.
+
+dependencies[] = system (>=7.36)
+
+
+Because we need to check for Drupal's core version, we're using the system module as the dependency and specifying that it needs to be either equal to or greater than 7.36. If this dependency is not met, e.g. Drupal 7.35 is being used, then the module cannot be enabled rather than showing a function not found error for user_has_role()
when it is called.
+
+
+
+External Links
+
+
+
+
+ Tags:
+ drupal , drupal-7 , drupal-planet
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2015/06/18/updating-forked-repositories-on-github/index.html b/docs/blog/2015/06/18/updating-forked-repositories-on-github/index.html
new file mode 100644
index 00000000..d030aa4e
--- /dev/null
+++ b/docs/blog/2015/06/18/updating-forked-repositories-on-github/index.html
@@ -0,0 +1,298 @@
+
+
+
+ Updating Forked Repositories on GitHub | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Updating Forked Repositories on GitHub
+
+18th June 2015
+
+ Sculpin
+
+People may or may not know, but this site runs on Sculpin , a PHP based static site generator (this may be the first time that I've mentioned it on this site). The source code is hosted on GitHub , and I've listed the site on the Community page on the Sculpin website.
+
+To get it there, I forked the main sculpin.io repository so that I had my own copy , created a branch, made my additions and submitted a pull request. Easy enough!
+
+New Domain
+
+In the last week or so, I've changed this site URL from .co.uk to just .uk, and also updated the GitHub repo URL to match, so I wanted to update the Community page to use the correct URL.
+
+There had been commits to the main repo since my pull request was merged, I didn't want to delete my repo and fork again, and making any changes against and old codebase isn't best practice, so I wanted to merge the latest changes into my forked repo before I did anything else - just to check that I didn't break anything!
+
+Updating my Local Repo
+
+I had a quick look for a Update my fork button or something, but couldn't see one to I added the main repository as an additional remote called upstream
and fetched the changes.
+
+$ git remote add upstream https://github.com/sculpin/sculpin.io.git
+
+$ git fetch upstream
+remote: Counting objects: 33, done.
+remote: Total 33 (delta 6), reused 6 (delta 6), pack-reused 27
+Unpacking objects: 100% (33/33), done.
+From https://github.com/sculpin/sculpin.io
+* [new branch] master -> upstream/master
+* [new branch] pr/4 -> upstream/pr/4
+
+
+Now my local site knows about the upstream repo, and I could rebase the changes (git pull upstream master
should have worked too) and push them back to origin.
+
+$ git rebase upstream/master
+First, rewinding head to replay your work on top of it...
+...
+Fast-forwarded master to upstream/master.
+
+$ git push origin master
+
+
+This seems to have worked OK - the commits are still authored by the correct people and at the correct date and time - and I went ahead and created a new feature branch and pull request based on that master branch.
+
+
+
+ The commits on my forked master branch after rebasing and pushing. All good!
+
+
+
+
+ The new feature branch with the new commit.
+
+
+Is There a Better Way?
+
+Did I miss something? Is there a recommended and/or better way to update your forked repos, maybe through the UI? Please send me a tweet with any comments.
+
+Update: Rebasing in PhpStorm
+
+December 2015: I’ve found that PhpStorm has an option available to rebase a fork from within the IDE. This is within the VCS > Git menu.
+
+I believe that it will use an existing "upstream" remote if it exists, otherwise it will add one automatically for you, linking to the repository that you forked from.
+
+Once you’ve completed the rebase, you can then push your updated branch either from the terminal, or using the Push command from the same menu.
+
+
+
+It would be great to see something similar added to hub too (I’ve created an issue )!
+
+Resources
+
+
+
+
+ Tags:
+ git , github , phpstorm , sculpin
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2015/07/19/sculpin-twig-resources/index.html b/docs/blog/2015/07/19/sculpin-twig-resources/index.html
new file mode 100644
index 00000000..e8cb645a
--- /dev/null
+++ b/docs/blog/2015/07/19/sculpin-twig-resources/index.html
@@ -0,0 +1,271 @@
+
+
+
+ Sculpin and Twig Resources | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sculpin and Twig Resources
+
+19th July 2015
+
+ Here’s a list of resources that I compiled whilst preparing for my Sculpin and Twig talk at DrupalCamp North .
+
+
+
+
+
+Where to Get Sculpin
+
+
+
+Source Code Examples
+
+
+
+Videos
+
+
+
+Twig
+
+
+
+
+ Tags:
+ sculpin , drupalcamp , drupalcamp-north , twig
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2015/07/21/automating-sculpin-jenkins/index.html b/docs/blog/2015/07/21/automating-sculpin-jenkins/index.html
new file mode 100644
index 00000000..c516b80a
--- /dev/null
+++ b/docs/blog/2015/07/21/automating-sculpin-jenkins/index.html
@@ -0,0 +1,340 @@
+
+
+
+ Automating Sculpin Builds with Jenkins CI | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Automating Sculpin Builds with Jenkins CI
+
+21st July 2015
+
+ As part of re-building this site with Sculpin , I wanted to automate the deployments, as in I wouldn't need to run a script like publish.sh locally and have that deploy my code onto my server. Not only did that mean that my local workflow was simpler (update, commit and push, rather than update, commit, push and deploy), but if I wanted to make a quick edit or hotfix, I could log into GitHub or Bitbucket (wherever I decided to host the source code) from any computer or my phone, make the change and have it deployed for me.
+
+I'd started using Jenkins CI during my time at the Drupal Association, and had since built my own Jenkins server to handle deployments of Drupal websites, so that was the logical choice to use.
+
+Installing Jenkins and Sculpin
+
+If you don’t already have Jenkins installed and configured, I'd suggest using Jeff Geerling (aka geerlingguy)'s Ansible role for Jenkins CI .
+
+I've also released an Ansible role for Sculpin that installs the executable so that the Jenkins server can run Sculpin commands.
+
+Triggering a Build from a Git Commit
+
+I created a new Jenkins item for this task, and restricted where it could be run to master
(i.e. the Jenkins server rather than any of the nodes).
+
+Polling from Git
+
+I entered the url to the GitHub repo into the Source Code Management section (the Git option may have been added by the Git plugin that I have installed).
+
+As we don’t need any write access back to the repo, using the HTTP URL rather than the SSH one was fine, and I didn’t need to provide any additional credentials.
+
+Also, as I knew that I’d be working a lot with feature branches, I entered */master
as the only branch to build. This meant that pushing changes or making edits on any other branches would not trigger a build.
+
+
+
+I also checked the Poll SCM option so that Jenkins would be routinely checking for updated code. This essentially uses the same syntax as cron, specifying minutes, hours etc. I entered * * * * *
so that Jenkins would poll each minute, knowing that I could make this less frequent if needed.
+
+This now that Jenkins would be checking for any updates to the repo each minute, and could execute tasks if needed.
+
+Building and Deploying
+
+Within the Builds section of the item, I added an Execute Shell step, where I could enter a command to execute. Here, I pasted a modified version of the original publish.sh script.
+
+#!/bin/bash
+
+set -uex
+
+sculpin generate --env=prod --quiet
+if [ $? -ne 0 ]; then echo "Could not generate the site"; exit 1; fi
+
+rsync -avze 'ssh' --delete output_prod/ prodwww2:/var/www/html/oliverdavies.uk/htdocs
+if [ $? -ne 0 ]; then echo "Could not publish the site"; exit 1; fi
+
+
+This essentially is the same as the original file, in that Sculpin generates the site, and uses rsync to deploy it somewhere else. In my case, prodwww2
is a Jenkins node (this alias is configured in /var/lib/jenkins/.ssh/config
), and /var/www/html/oliverdavies.uk/htdocs
is the directory from where my site is served.
+
+Building Periodically
+
+There is some dynamic content on my site, specifically on the Talks page. Each talk has a date assigned to it, and within the Twig template, the talk is positoned within upcoming or previous talks based on whether this date is less or greater than the time of the build.
+
+The YAML front matter:
+
+---
+...
+talks:
+ - title: Test Drive Twig with Sculpin
+ date: 2015-07-24
+ location: DrupalCamp North
+---
+
+
+The Twig layout:
+
+{% for talk in talks|reverse if talk.date >= now %}
+ {# Upcoming talks #}
+{% endfor %}
+
+{% for talk in talks if talk.date < now %}
+ {# Previous talks #}
+{% endfor%}
+
+
+I also didn’t want to have to push an empty commit or manually trigger a job in Jenkins after doing a talk in order for it to be positioned in the correct place on the page, so I also wanted Jenkins to schedule a regular build regardless of whether or not code had been pushed, so ensure that my talks page would be up to date.
+
+After originally thinking that I'd have to split the build steps into a separate item and trigger that from a scheduled item, and amend my git commit item accordingly, I found a Build periodically option that I could use within the same item, leaving it intact and not having to make amends.
+
+I set this to @daily
(the same H H * * *
- H
is a Jenkins thing), so that the build would be triggered automatically each day without a commit, and deploy any updates to the site.
+
+
+
+Next Steps
+
+This workflow works great for one site, but as I roll out more Sculpin sites, I'd like to reduce duplication. I see this mainly as I’ll end up creating a separate sculpin_build
item that’s decoupled from the site that it’s building, and instead passing variables such as environment, server name and docroot path as parameters in a parameterized build.
+
+I'll probably also take the raw shell script out of Jenkins and save it in a text file that's stored locally on the server, and execute that via Jenkins. This means that I’d be able to store this file in a separate Git repository with my other Jenkins scripts and get the standard advantages of using version control.
+
+Update
+
+Since publishing this post, I've added some more items to the original build script.
+
+Updating Composer
+
+if [ -f composer.json ]; then
+ /usr/local/bin/composer install
+fi
+
+
+Updates project dependencies via Composer if composer.json exists.
+
+Updating Sculpin Dependencies
+
+if [ -f sculpin.json ]; then
+ sculpin install
+fi
+
+
+Runs sculpin install
on each build if the sculpin.json file exists, to ensure that the required custom bundles and dependencies are installed.
+
+Managing Redirects
+
+if [ -f scripts/redirects.php ]; then
+ /usr/bin/php scripts/redirects.php
+fi
+
+
+I've been working on a redirects.php
script that generates redirects from a .csv file, after seeing similar things in the Pantheon Documentation and That Podcast repositories. This checks if that file exists, and if so, runs it and generates the source file containing each redirect.
+
+
+ Tags:
+ sculpin , jenkins
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7/index.html b/docs/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7/index.html
new file mode 100644
index 00000000..508569b9
--- /dev/null
+++ b/docs/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7/index.html
@@ -0,0 +1,262 @@
+
+
+
+ Programmatically Load an Entityform in Drupal 7 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Programmatically Load an Entityform in Drupal 7
+
+22nd December 2015
+
+ I recently had my first experience using the Entityform module in a project. It was quite easy to configure with different form types, but then I needed to embed the form into an overlay. I was expecting to use the drupal_get_form()
function and render it, but this didn’t work.
+
+Here are the steps that I took to be able to load, render and embed the form.
+
+
+
+The first thing that I needed to do to render the form was to load an empty instance of the entityform using entityform_empty_load()
. In this example, newsletter
is the name of my form type.
+
+$form = entityform_empty_load('newsletter');
+
+
+This returns an instance of a relevant Entityform
object.
+
+
+
+The next step was to be able to render the form. I did this using the entity_form_wrapper()
function.
+
+As this function is within the entityform.admin.inc
file and not autoloaded by Drupal, I needed to include it using module_load_include()
so that the function was available.
+
+module_load_include('inc', 'entityform', 'entityform.admin');
+
+$output = entityform_form_wrapper($form, 'submit', 'embedded'),
+
+
+The first argument is the Entityform
object that was created in the previous step (I’ve submitted a patch to type hint this within entityform so that it’s clearer what is expected), which is required.
+
+The other two arguments are optional. The second argument is the mode (submit
is the default value), and the last is the form context. page
is the default value, for use on the submit page, however I changed this to embedded
.
+
+I could then pass this result into my theme function to render it successfully within the relevant template file.
+
+Resources
+
+
+
+
+ Tags:
+ drupal , drupal-7 , drupal-planet , entityform
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2016/02/15/announcing-the-drupal-vm-generator/index.html b/docs/blog/2016/02/15/announcing-the-drupal-vm-generator/index.html
new file mode 100644
index 00000000..49418913
--- /dev/null
+++ b/docs/blog/2016/02/15/announcing-the-drupal-vm-generator/index.html
@@ -0,0 +1,270 @@
+
+
+
+ Announcing the Drupal VM Generator | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Announcing the Drupal VM Generator
+
+15th February 2016
+
+ For the past few weeks I’ve been working on a personal side project, based on Drupal VM. It’s called the Drupal VM Generator , and over the weekend I’ve added the final features and fixed the remaining issues, and tagged the 1.0.0 release.
+
+
+
+What is Drupal VM?
+
+Drupal VM is a project created and maintained by Jeff Geerling . It’s a Vagrant virtual machine for Drupal development that is provisioned using Ansible .
+
+What is different to a regular Vagrant VM is that uses a file called config.yml
to configure the machine. Settings such as vagrant_hostname
, drupalvm_webserver
and drupal_core_path
are stored as YAML and passed into the Vagrantfile
and the playbook.yml
file which is used when the Ansible provisioner runs.
+
+In addition to some essential Ansible roles for installing and configuring packages such as Git, MySQL, PHP and Drush, there are also some roles that are conditional and only installed based on the value of other settings. These include Apache, Nginx, Solr, Varnish and Drupal Console.
+
+What does the Drupal VM Generator do?
+
+
+ The Drupal VM Generator is a Symfony application that allows you to quickly create configuration files that are minimal and use-case specific.
+
+
+Drupal VM comes with an example.config.yml file that shows all of the default variables and their values. When I first started using it, I’d make a copy of example.config.yml
, rename it to config.yml
and edit it as needed, but a lot of the examples aren’t needed for every use case. If you’re using Nginx as your webserver, then you don’t need the Apache virtual hosts. If you are not using Solr on this project, then you don’t need the Solr variables.
+
+For a few months, I’ve kept and used boilerplace versions of config.yml
- one for Apache and one for Nginx. These are minimal, so have most of the comments removed and only the variables that I regularly need, but these can still be quite time consuming to edit each time, and if there are additions or changes upstream, then I have two versions to maintain.
+
+The Drupal VM Generator is a Symfony application that allows you to quickly create configuration files that are minimal and use-case specific. It uses the Console component to collect input from the user, Twig to generate the file, the Filesystem component to write it.
+
+Based on the options passed to it and/or answers that you provide, it generates a custom, minimal config.yml
file for your project.
+
+Here’s an example of it in action:
+
+
+
+You can also define options when calling the command and skip any or all questions. Running the following would bypass all of the questions and create a new file with no interaction or additional steps.
+
+Where do I get it?
+
+The project is hosted on GitHub , and there are installation instructions within the README .
+
+
+
+The recommended method is via downloading the phar file (the same as Composer and Drupal Console). You can also clone the GitHub repository and run the command from there. I’m also wanting to upload it to Packagist so that it can be included if you manage your projects with Composer.
+
+Please log any bugs or feature requests in the GitHub issue tracker , and I’m more than happy to receive pull requests.
+
+If you’re interested in contributing, please feel free to fork the repository and start doing so, or contact me with any questions.
+
+Update 17/02/16: The autoloading issue is now fixed if you require the package via Composer, and this has been tagged as the 1.0.1 release
+
+
+ Tags:
+ drupal , drupal-planet , drupal-vm , drupal-vm-generator , symfony
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload/index.html b/docs/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload/index.html
new file mode 100644
index 00000000..ef63254a
--- /dev/null
+++ b/docs/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload/index.html
@@ -0,0 +1,317 @@
+
+
+
+ Simplifying Drupal Migrations with xautoload | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Simplifying Drupal Migrations with xautoload
+
+3rd May 2016
+
+ What is xautoload?
+
+xautoload is a Drupal module that enables the autoloading of PHP classes, in the same way that you would do so in a Composer based project such as Drupal 8 or Symfony.
+
+It supports both the PSR-0 and PSR-4 standards, as well as providing a wildcard syntax for Drupal’s file[]
syntax in .info files.
+
+To use it, download and enable it from Drupal.org as you would for any other module, and then add it as a dependency within your module. The xautoload project page suggests including a minimum version in this format:
+
+dependencies[] = xautoload (>= 7.x-5.0)
+
+
+This will ensure that the version of xautoload is 7.x-5.0 or newer.
+
+How to use it
+
+Wildcard syntax for .info files
+
+Here is an example .info file for a migrate module.
+
+; foo_migrate.info
+
+name = Foo Migration
+core = 7.x
+package = Foo
+
+files[] = includes/user.inc
+files[] = includes/nodes/article.inc
+files[] = includes/nodes/page.inc
+
+
+In this example, each custom migration class is stored in it’s own file within the includes
directory, and each class needs to be loaded separately using the files[] = filename
syntax.
+
+One thing that the xautoload module does to enable for the use of wildcards within this syntax. By using wildcards, the module file can be simplified as follows:
+
+files[] = includes/**/*.inc
+
+
+This will load any .inc files within the includes
directory as well as any sub-directories, like 'node' in the original example.
+
+This means that any new migration classes that are added will be automatically loaded, so you don’t need to declare each include separately within foo_migrate.info again. The great thing about this approach is that it works with the existing directory and file structure.
+
+Use the PSR-4 structure
+
+If you want to use the PSR-4 approach, you can do that too.
+
+In order to do so, you’ll need to complete the following steps:
+
+
+Rename the includes
directory to src
.
+Ensure that there is one PHP class per file, and that the file extension is .php
rather than .inc
.
+Ensure that the name of the file matches the name of the class - FooArticleNodeMigration
would be in a file called FooArticleNodeMigration.php
.
+Add a namespace to each PHP file. This uses the same format as Drupal 8, including the machine name of the module. For example, Drupal\foo_migrate
.
+
+
+If the class is within a sub-directory, then this will also need to be included within the namespace - e.g. Drupal\foo_migrate\Node
.
+You’ll also need to import any class names that you are referencing, including class names that are you extending, by adding use
statements at the top of the file. You may be able to prefix it with \
instead (e.g. \DrupalNode6Migration
), but I prefer to use imports.
+
+
+
+Now your class may look something like this:
+
+<?php
+
+namespace Drupal\foo_migrate\Node;
+
+use DrupalNode6Migration;
+
+class FooArticleNodeMigration extends DrupalNode6Migration {
+ ...
+}
+
+
+With these steps completed, any imports within your .info file can be removed as they are no longer needed and any classes will be loaded automatically.
+
+Within foo_migrate.migrate.inc
, I can now reference any class names using their full namespace:
+
+$node_arguments['ArticleNode'] = array(
+ 'class_name' => 'Drupal\foo_migrate\Node\FooArticleNodeMigration',
+ 'source_type' => 'story',
+ 'destination_type' => 'article',
+);
+
+
+Resources
+
+
+
+
+ Tags:
+ autoloading , drupal , drupal-planet , drupal-7 , php
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2016/07/15/building-gmail-filters-with-php/index.html b/docs/blog/2016/07/15/building-gmail-filters-with-php/index.html
new file mode 100644
index 00000000..d78cfbf4
--- /dev/null
+++ b/docs/blog/2016/07/15/building-gmail-filters-with-php/index.html
@@ -0,0 +1,290 @@
+
+
+
+ Building Gmail Filters with PHP | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Building Gmail Filters with PHP
+
+15th July 2016
+
+ Earlier this week I wrote a small PHP library called GmailFilterBuilder that allows you to write Gmail filters in PHP and export them to XML.
+
+I was already aware of a Ruby library called gmail-britta that does the same thing, but a) I’m not that familiar with Ruby so the syntax wasn’t that natural to me - it’s been a while since I wrote any Puppet manifests, and b) it seemed like a interesting little project to work on one evening.
+
+The library contains two classes - GmailFilter
which is used to create each filter, and GmailFilterBuilder
that parses the filters and generates the XML using a Twig template.
+
+Usage
+
+For example:
+
+# test.php
+
+require __DIR__ '/vendor/autoload.php';
+
+use Opdavies\GmailFilterBuilder\Builder;
+use Opdavies\GmailFilterBuilder\Filter;
+
+$filters = [];
+
+$filters[] = Filter::create()
+ ->has('from:example@test.com')
+ ->labelAndArchive('Test')
+ ->neverSpam();
+
+new Builder($filters);
+
+
+In this case, an email from example@test.com
would be archived, never marked as spam, and have a label of "Test" added to it.
+
+With this code written, and the GmailFilterBuilder library installed via Composer, I can run php test.php
and have the XML written to the screen.
+
+This can also be written to a file - php test.php > filters.xml
- which can then be imported into Gmail.
+
+Twig Extensions
+
+I also added a custom Twig extension that I moved into a separate twig-extensions library so that I and other people can re-use it in other projects.
+
+It’s a simple filter that accepts a boolean and returns true
or false
as a string, but meant that I could remove three ternary operators from the template and replace them with the boolean_string
filter.
+
+Before:
+
+{{ filter.isArchive ? 'true' : 'false' }}
+
+
+After:
+
+{{ filter.isArchive|boolean_string }}
+
+
+This can then be used to generate output like this, whereas having blank values would have resulted in errors when importing to Gmail.
+
+<apps:property name='shouldArchive' value='true'/>
+
+
+Example
+
+For a working example, see my personal gmail-filters repository on GitHub.
+
+Resources
+
+
+
+
+ Tags:
+ php , gmail
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2016/12/30/drupal-vm-generator-291-released/index.html b/docs/blog/2016/12/30/drupal-vm-generator-291-released/index.html
new file mode 100644
index 00000000..33d94533
--- /dev/null
+++ b/docs/blog/2016/12/30/drupal-vm-generator-291-released/index.html
@@ -0,0 +1,240 @@
+
+
+
+ Drupal VM Generator 2.9.1 Released | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Drupal VM Generator 2.9.1 Released
+
+30th December 2016
+
+ I spent some time yesterday working on the Drupal VM Generator , and have released versions 2.8.1, 2.9.0 and 2.9.1.
+
+The main updates are:
+
+
+Fixed an InvalidResponseException
that was thrown from within the boolean_as_string
Twig filter from the opdavies/twig-extensions library when the config:generate
command was run in non-interactive mode.
+Adding a working test suite for the existing commands, using PhpUnit and Symfony’s Process component. This is now linked to Travis CI , and the tests are run on each commit and pull request.
+The version requirements have been changed to allow 2.7 versions of the used Symfony Components, as well as the 3.x versions. This was done to resolve a conflict when also installing Drush globally with Composer.
+
+
+Next Steps
+
+Currently the project is based on Drupal VM 3.0.0 which is an outdated version (4.1.0 was released today). Adding updates and supporting the newer versions is a high priority, as well as keeping in sync with new releases. This will be easier with the test suite in place.
+
+My initial thoughts are that version 2.10.0 will support Drupal VM 4.0.0, and if needed, 2.11.0 will ship shortly afterwards and support Drupal VM 4.1.0.
+
+
+ Tags:
+ drupal-vm-generator , releases
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts/index.html b/docs/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts/index.html
new file mode 100644
index 00000000..d64ccc24
--- /dev/null
+++ b/docs/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts/index.html
@@ -0,0 +1,268 @@
+
+
+
+ Easier Sculpin Commands with Composer and NPM Scripts | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Easier Sculpin Commands with Composer and NPM Scripts
+
+7th January 2017
+
+ My website includes several various command line tools - e.g. Sculpin , Gulp and Behat - each needing different arguments and options, depending on the command being run. For example, for Sculpin, I normally include several additional options when viewing the site locally - the full command that I use is ./vendor/bin/sculpin generate --watch --server --clean --no-interaction
. Typing this repeatedly is time consuming and could be easily mis-typed, forgotten or confused with other commands.
+
+In this video, I show you how I've simplied my Sculpin and Gulp workflow using custom Composer and NPM scripts.
+
+
+ VIDEO
+
+
+Scripts
+
+Here are the scripts that I’m using - they are slightly different from those in the video. I use the --generate
and --watch
options for Sculpin and the gulp watch
command for NPM. I had to change these before the recording as I was using the demo magic script to run the commands, and existing from a watch session was also ending the script process.
+
+composer.json
+
+"scripts": {
+ "clean": "rm -rf output_*/",
+ "dev": "sculpin generate --clean --no-interaction --server --watch",
+ "production": "sculpin generate --clean --no-interaction --env='prod' --quiet"
+}
+
+
+Run with composer run <name>
, e.g. composer run dev
.
+
+package.json
+
+"scripts": {
+ "init": "yarn && bower install",
+ "dev": "gulp watch",
+ "production": "gulp --production"
+}
+
+
+Run with npm run <name>
, e.g. npm run production
.
+
+You can also take a look at the full composer.json and package.json files within my site repository on GitHub .
+
+Resources
+
+
+
+
+ Tags:
+ composer , gulp , sculpin
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2017/01/31/nginx-redirects-with-query-string-arguments/index.html b/docs/blog/2017/01/31/nginx-redirects-with-query-string-arguments/index.html
new file mode 100644
index 00000000..a7d420d5
--- /dev/null
+++ b/docs/blog/2017/01/31/nginx-redirects-with-query-string-arguments/index.html
@@ -0,0 +1,264 @@
+
+
+
+ Nginx Redirects With Query String Arguments | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nginx Redirects With Query String Arguments
+
+31st January 2017
+
+ This is an example of how my Nginx configuration looked to redirect from an old domain to a new one, and also to redirect from the root example.com
domain to the canonical www
subdomain.
+
+server {
+ listen 80;
+
+ server_name example.com;
+ server_name my-old-domain.com;
+ server_name www.my-old-domain.com;
+
+ return 301 https://www.example.com$uri;
+}
+
+
+It also redirects the URI value, e.g. from http://example.com/test
to http://example.com/test
, but I noticed recently though that any the query string would be lost - e.g. http://example.com/?test
would redirect to http://www.example.com
and the ?test
would be dropped. The application that I built references images based on the query string, so I wanted these to be included within the redirect.
+
+This was fixed by making a small change to my return
statement.
+
+Before:
+
+return 301 https://www.example.com$uri;
+
+
+After:
+
+return 301 https://www.example.com$uri$is_args$args;
+
+
+$is_args
is an empty string if there are no arguments, or a ?
to signify the start of the query string. $args
then adds the arguments ($query_string
could also be used with the same result).
+
+Here is an demo of it working on this website:
+
+
+
+Resources
+
+
+
+
+ Tags:
+ nginx
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2017/05/05/fixing-drupal-simpletest-docker/index.html b/docs/blog/2017/05/05/fixing-drupal-simpletest-docker/index.html
new file mode 100644
index 00000000..a7b410c4
--- /dev/null
+++ b/docs/blog/2017/05/05/fixing-drupal-simpletest-docker/index.html
@@ -0,0 +1,280 @@
+
+
+
+ Fixing Drupal SimpleTest issues inside Docker Containers | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fixing Drupal SimpleTest issues inside Docker Containers
+
+5th May 2017
+
+ TL;DR You need to include the name of your web server container as the --url
option to run-scripts.php
.
+
+I’ve been a Drupal VM user for a long time, but lately I’ve been using a combination Drupal VM and Docker for my local development environment. There were a couple of issues preventing me from completely switching to Docker - one of which being that when I tried running of my Simpletest tests, a lot of them would fail where they would pass when run within Drupal VM.
+
+Here’s an excerpt from my docker-compose.yml
file:
+
+services:
+ php:
+ image: wodby/drupal-php:5.6
+ volumes:
+ - ./repo:/var/www/html
+
+ nginx:
+ image: wodby/drupal-nginx:7-1.10
+ environment:
+ NGINX_BACKEND_HOST: php
+ NGINX_SERVER_ROOT: /var/www/html/web
+ ports:
+ - "80:80"
+ volumes_from:
+ - php
+...
+
+
+Nginx and PHP-FPM are running in separate containers, the volumes are shared across both and the Nginx backend is set to use the php
container.
+
+This is the command that I was using to run the tests:
+
+$ docker-compose run --rm \
+ -w /var/www/html/web \
+ php \
+ php scripts/run-tests.sh \
+ --php /usr/local/bin/php \
+ --class OverrideNodeOptionsTestCase
+
+
+This creates a new instance of the php
container, sets the working directory to my Drupal root and runs Drupal’s run-tests.sh
script with some arguments. In this case, I'm running the OverrideNodeOptionsTestCase
class for the override_node_options tests. Once complete, the container is deleted because of the --rm
option.
+
+This resulted in 60 of the 112 tests failing, whereas they all passed when run within a Drupal VM instance.
+
+Test summary
+------------
+
+Override node options 62 passes, 60 fails, 29 exceptions, and 17 debug messages
+
+Test run duration: 2 min 25 sec
+
+
+Running the tests again with the--verbose
option, I saw this message appear in the output below some of the failing tests:
+
+
+ simplexml_import_dom(): Invalid Nodetype to import
+
+
+Update: I later found that https://www.drupal.org/docs/7/testing/running-tests-through-command-line#troubleshooting references this error message, but I didn’t see this page within my original search.
+
+After checking that I had all of the required PHP extensions installed, I ran docker-compose exec php bash
to connect to the php
container and ran curl http://localhost
to check the output. Rather than seeing the HTML for the site, I got this error message:
+
+
+ curl: (7) Failed to connect to localhost port 80: Connection refused
+
+
+Whereas curl http://nginx
returns the HTML for the page, so included it with the --url
option to run-tests.sh
, and this resulted in my tests all passing.
+
+$ docker-compose run --rm \
+ -w /var/www/html/web \
+ php \
+ php scripts/run-tests.sh \
+ --php /usr/local/bin/php \
+ --url http://nginx \
+ --class OverrideNodeOptionsTestCase
+
+
+Test summary
+------------
+
+Override node options 121 passes, 0 fails, 0 exceptions, and 34 debug messages
+
+Test run duration: 2 min 31 sec
+
+
+Note: In this example I have separate nginx
and php
containers, but I've tried and had the same issue when running Nginx and PHP-FPM in the same container - e.g. called app
- and still needed to add --url http://app
in order for the tests to run successfully.
+
+I don’t know if this issue is macOS specfic (I know that Drupal CI is based on Docker, and I don’t know if it’s an issue) but I’m going to test also on my Ubuntu Desktop environment and investigate further and also compare the test run times for Docker in macOS, Docker in Ubuntu and within Drupal VM. I’m also going to test this with PHPUnit tests with Drupal 8.
+
+
+ Tags:
+ docker , drupal , drupal-planet , simpletest , testing
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2017/05/05/fixing-drupal-simpletest-issues-inside-docker-containers/index.html b/docs/blog/2017/05/05/fixing-drupal-simpletest-issues-inside-docker-containers/index.html
new file mode 100644
index 00000000..a39b062d
--- /dev/null
+++ b/docs/blog/2017/05/05/fixing-drupal-simpletest-issues-inside-docker-containers/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors/index.html b/docs/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors/index.html
new file mode 100644
index 00000000..a855508d
--- /dev/null
+++ b/docs/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors/index.html
@@ -0,0 +1,217 @@
+
+
+
+ DrupalCamp Bristol 2017 - Early Bird Tickets, Call for Sessions, Sponsors | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DrupalCamp Bristol 2017 - Early Bird Tickets, Call for Sessions, Sponsors
+
+15th May 2017
+
+
+
+In less than two months time, DrupalCamp Bristol will be back for our third year! (July seems to come around quicker each year). This is this year’s schedule and venues:
+
+
+
+Today we announced Emma Karayiannis as our Saturday keynote speaker, and we’ll be announcing some of the other speakers later this week.
+
+Not submitted your session yet? The session submissions are open until May 31st. We’re looking for talks not only on Drupal, but other related topics such as PHP, Symfony, server administration/DevOps, project management, case studies, being human etc. If you want to submit but want to ask something beforehand, please send us an email or ping us on Twitter .
+
+Not spoken at a DrupalCamp before? No problem. We’re looking for both new and experienced speakers, and have both long (45 minutes) and short (20 minutes) talk slots available.
+
+Not bought your tickets yet? Early bird tickets for the CXO and conference days are still available! The sprint day tickets are free but limited, so do register for a ticket to claim your place.
+
+We still have sponsorships opportunities available (big thanks to Microserve , Deeson and Proctors ) who have already signed up), but be quick if you want to be included in our brochure so that we can get you added before our print deadline! Without our sponsors, putting on this event each year would not be possible.
+
+Any other questions? Take a look at our website or get in touch via Twitter or email .
+
+
+ Tags:
+ drupal , drupal-planet , drupalcamp , drupalcamp-bristol
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2017/05/20/turning-drupal-module-into-feature/index.html b/docs/blog/2017/05/20/turning-drupal-module-into-feature/index.html
new file mode 100644
index 00000000..6abca0bb
--- /dev/null
+++ b/docs/blog/2017/05/20/turning-drupal-module-into-feature/index.html
@@ -0,0 +1,209 @@
+
+
+
+ Turning Your Custom Drupal Module into a Feature | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Turning Your Custom Drupal Module into a Feature
+
+20th May 2017
+
+ Yesterday I was fixing a bug in an inherited Drupal 7 custom module, and I decided that I was going to add some tests to ensure that the bug was fixed and doesn’t get accidentially re-introduced in the future. The test though required me to have a particular content type and fields which are specific to this site, so weren’t present within the standard installation profile used to run tests.
+
+I decided to convert the custom module into a Feature so that the content type and it’s fields could be added to it, and therefore present on the testing site once the module is installed.
+
+To do this, I needed to expose the module to the Features API.
+
+All that’s needed is to add this line to the mymodule.info
file:
+
+features[features_api][] = api:2
+
+
+After clearing the cache, the module is now visible in the Features list - and ready to have the appropriate configuration added to it.
+
+
+
+
+ Tags:
+ drupal , drupal-7 , drupal-planet , features
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot/index.html b/docs/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot/index.html
new file mode 100644
index 00000000..058162d2
--- /dev/null
+++ b/docs/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot/index.html
@@ -0,0 +1,197 @@
+
+
+
+ Introducing the Drupal Meetups Twitterbot | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Introducing the Drupal Meetups Twitterbot
+
+9th June 2017
+
+
+
+The Drupal Meetups Twitterbot is a small project that I worked on a few months ago, but hadn't got around to promoting yet. It’s intention is to provide one Twitter account where people can get the up to date news from various Drupal meetups.
+
+It works by having a whitelist of Twitter accounts and hashtags to search for, uses Codebird to query the Twitter API and retweets any matching tweets on a scheduled basis.
+
+If you would like your meetup group to be added to the list of searched accounts, please open an issue on the GitHub repo.
+
+
+ Tags:
+ twitter , php
+
+
+
About the Author
+
+
+
+
Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at Microserve and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/accessible-bristol-site-launched/index.html b/docs/blog/accessible-bristol-site-launched/index.html
new file mode 100644
index 00000000..95c13607
--- /dev/null
+++ b/docs/blog/accessible-bristol-site-launched/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/add-date-popup-calendar-custom-form/index.html b/docs/blog/add-date-popup-calendar-custom-form/index.html
new file mode 100644
index 00000000..1a3b38ad
--- /dev/null
+++ b/docs/blog/add-date-popup-calendar-custom-form/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/add-taxonomy-term-multiple-nodes-using-sql/index.html b/docs/blog/add-taxonomy-term-multiple-nodes-using-sql/index.html
new file mode 100644
index 00000000..cdd06947
--- /dev/null
+++ b/docs/blog/add-taxonomy-term-multiple-nodes-using-sql/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/adding-custom-theme-templates-drupal-7/index.html b/docs/blog/adding-custom-theme-templates-drupal-7/index.html
new file mode 100644
index 00000000..9362862f
--- /dev/null
+++ b/docs/blog/adding-custom-theme-templates-drupal-7/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/announcing-the-drupal-vm-config-generator/index.html b/docs/blog/announcing-the-drupal-vm-config-generator/index.html
new file mode 100644
index 00000000..319c845b
--- /dev/null
+++ b/docs/blog/announcing-the-drupal-vm-config-generator/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/announcing-the-drupal-vm-generator/index.html b/docs/blog/announcing-the-drupal-vm-generator/index.html
new file mode 100644
index 00000000..319c845b
--- /dev/null
+++ b/docs/blog/announcing-the-drupal-vm-generator/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/automating-sculpin-jenkins/index.html b/docs/blog/automating-sculpin-jenkins/index.html
new file mode 100644
index 00000000..2eeb70b9
--- /dev/null
+++ b/docs/blog/automating-sculpin-jenkins/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/building-gmail-filters-with-php/index.html b/docs/blog/building-gmail-filters-with-php/index.html
new file mode 100644
index 00000000..f51da40b
--- /dev/null
+++ b/docs/blog/building-gmail-filters-with-php/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/change-content-type-multiple-nodes-using-sql/index.html b/docs/blog/change-content-type-multiple-nodes-using-sql/index.html
new file mode 100644
index 00000000..7eab4891
--- /dev/null
+++ b/docs/blog/change-content-type-multiple-nodes-using-sql/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/checking-if-user-logged-drupal-right-way/index.html b/docs/blog/checking-if-user-logged-drupal-right-way/index.html
new file mode 100644
index 00000000..998ddee0
--- /dev/null
+++ b/docs/blog/checking-if-user-logged-drupal-right-way/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/checkout-specific-revision-svn-command-line/index.html b/docs/blog/checkout-specific-revision-svn-command-line/index.html
new file mode 100644
index 00000000..9f8ddc91
--- /dev/null
+++ b/docs/blog/checkout-specific-revision-svn-command-line/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/conditional-email-addresses-webform/index.html b/docs/blog/conditional-email-addresses-webform/index.html
new file mode 100644
index 00000000..9b288ad9
--- /dev/null
+++ b/docs/blog/conditional-email-addresses-webform/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-a-zen-sub-theme-using-drush/index.html b/docs/blog/create-a-zen-sub-theme-using-drush/index.html
new file mode 100644
index 00000000..1ae97541
--- /dev/null
+++ b/docs/blog/create-a-zen-sub-theme-using-drush/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-and-apply-patches/index.html b/docs/blog/create-and-apply-patches/index.html
new file mode 100644
index 00000000..5554f4b6
--- /dev/null
+++ b/docs/blog/create-and-apply-patches/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-better-photo-gallery-drupal-part-1/index.html b/docs/blog/create-better-photo-gallery-drupal-part-1/index.html
new file mode 100644
index 00000000..6d4f0cb8
--- /dev/null
+++ b/docs/blog/create-better-photo-gallery-drupal-part-1/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-better-photo-gallery-drupal-part-2/index.html b/docs/blog/create-better-photo-gallery-drupal-part-2/index.html
new file mode 100644
index 00000000..4425df4e
--- /dev/null
+++ b/docs/blog/create-better-photo-gallery-drupal-part-2/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-better-photo-gallery-drupal-part-21/index.html b/docs/blog/create-better-photo-gallery-drupal-part-21/index.html
new file mode 100644
index 00000000..44c21df8
--- /dev/null
+++ b/docs/blog/create-better-photo-gallery-drupal-part-21/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-better-photo-gallery-drupal-part-3/index.html b/docs/blog/create-better-photo-gallery-drupal-part-3/index.html
new file mode 100644
index 00000000..3e1de364
--- /dev/null
+++ b/docs/blog/create-better-photo-gallery-drupal-part-3/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-block-social-media-icons-using-cck-views-and-nodequeue/index.html b/docs/blog/create-block-social-media-icons-using-cck-views-and-nodequeue/index.html
new file mode 100644
index 00000000..f1c75186
--- /dev/null
+++ b/docs/blog/create-block-social-media-icons-using-cck-views-and-nodequeue/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-flickr-photo-gallery-using-feeds-cck-and-views/index.html b/docs/blog/create-flickr-photo-gallery-using-feeds-cck-and-views/index.html
new file mode 100644
index 00000000..44698a9d
--- /dev/null
+++ b/docs/blog/create-flickr-photo-gallery-using-feeds-cck-and-views/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-multigroups-drupal-7-using-field-collections/index.html b/docs/blog/create-multigroups-drupal-7-using-field-collections/index.html
new file mode 100644
index 00000000..e9803429
--- /dev/null
+++ b/docs/blog/create-multigroups-drupal-7-using-field-collections/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush/index.html b/docs/blog/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush/index.html
new file mode 100644
index 00000000..e5900479
--- /dev/null
+++ b/docs/blog/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-slideshow-multiple-images-using-fancy-slide/index.html b/docs/blog/create-slideshow-multiple-images-using-fancy-slide/index.html
new file mode 100644
index 00000000..5499ae16
--- /dev/null
+++ b/docs/blog/create-slideshow-multiple-images-using-fancy-slide/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/create-virtual-hosts-mac-os-x-using-virtualhostx/index.html b/docs/blog/create-virtual-hosts-mac-os-x-using-virtualhostx/index.html
new file mode 100644
index 00000000..9b97ec48
--- /dev/null
+++ b/docs/blog/create-virtual-hosts-mac-os-x-using-virtualhostx/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/creating-and-using-custom-tokens-drupal-7/index.html b/docs/blog/creating-and-using-custom-tokens-drupal-7/index.html
new file mode 100644
index 00000000..d8772ed5
--- /dev/null
+++ b/docs/blog/creating-and-using-custom-tokens-drupal-7/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/creating-local-and-staging-sites-drupals-domain-module-enabled/index.html b/docs/blog/creating-local-and-staging-sites-drupals-domain-module-enabled/index.html
new file mode 100644
index 00000000..a9881a4b
--- /dev/null
+++ b/docs/blog/creating-local-and-staging-sites-drupals-domain-module-enabled/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/display-custom-menu-drupal-7-theme-template-file/index.html b/docs/blog/display-custom-menu-drupal-7-theme-template-file/index.html
new file mode 100644
index 00000000..557485af
--- /dev/null
+++ b/docs/blog/display-custom-menu-drupal-7-theme-template-file/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/display-git-branch-or-tag-names-your-bash-prompt/index.html b/docs/blog/display-git-branch-or-tag-names-your-bash-prompt/index.html
new file mode 100644
index 00000000..b4d21083
--- /dev/null
+++ b/docs/blog/display-git-branch-or-tag-names-your-bash-prompt/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/display-number-facebook-fans-php/index.html b/docs/blog/display-number-facebook-fans-php/index.html
new file mode 100644
index 00000000..f00d632f
--- /dev/null
+++ b/docs/blog/display-number-facebook-fans-php/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/dividing-drupals-process-and-preprocess-functions-separate-files/index.html b/docs/blog/dividing-drupals-process-and-preprocess-functions-separate-files/index.html
new file mode 100644
index 00000000..a2ab12e1
--- /dev/null
+++ b/docs/blog/dividing-drupals-process-and-preprocess-functions-separate-files/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/dont-bootstrap-drupal-use-drush/index.html b/docs/blog/dont-bootstrap-drupal-use-drush/index.html
new file mode 100644
index 00000000..93c89428
--- /dev/null
+++ b/docs/blog/dont-bootstrap-drupal-use-drush/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/download-different-versions-drupal-drush/index.html b/docs/blog/download-different-versions-drupal-drush/index.html
new file mode 100644
index 00000000..254e5508
--- /dev/null
+++ b/docs/blog/download-different-versions-drupal-drush/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/drupal-association/index.html b/docs/blog/drupal-association/index.html
new file mode 100644
index 00000000..08738501
--- /dev/null
+++ b/docs/blog/drupal-association/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/drupal-vm-generator-291-released/index.html b/docs/blog/drupal-vm-generator-291-released/index.html
new file mode 100644
index 00000000..06b4e7c3
--- /dev/null
+++ b/docs/blog/drupal-vm-generator-291-released/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/drupalcamp-london-2014/index.html b/docs/blog/drupalcamp-london-2014/index.html
new file mode 100644
index 00000000..a906ab38
--- /dev/null
+++ b/docs/blog/drupalcamp-london-2014/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/drush-make-drupalbristol/index.html b/docs/blog/drush-make-drupalbristol/index.html
new file mode 100644
index 00000000..12f30516
--- /dev/null
+++ b/docs/blog/drush-make-drupalbristol/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/easier-sculpin-commands-with-composer-and-npm-scripts/index.html b/docs/blog/easier-sculpin-commands-with-composer-and-npm-scripts/index.html
new file mode 100644
index 00000000..5fc8fe8a
--- /dev/null
+++ b/docs/blog/easier-sculpin-commands-with-composer-and-npm-scripts/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/easily-embed-typekit-fonts-your-drupal-website/index.html b/docs/blog/easily-embed-typekit-fonts-your-drupal-website/index.html
new file mode 100644
index 00000000..7ef21f27
--- /dev/null
+++ b/docs/blog/easily-embed-typekit-fonts-your-drupal-website/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/fix-vagrant-loading-wrong-virtual-machine/index.html b/docs/blog/fix-vagrant-loading-wrong-virtual-machine/index.html
new file mode 100644
index 00000000..ba556dd8
--- /dev/null
+++ b/docs/blog/fix-vagrant-loading-wrong-virtual-machine/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/forward-one-domain-another-using-modrewrite-and-htaccess/index.html b/docs/blog/forward-one-domain-another-using-modrewrite-and-htaccess/index.html
new file mode 100644
index 00000000..4ac54d14
--- /dev/null
+++ b/docs/blog/forward-one-domain-another-using-modrewrite-and-htaccess/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/git-format-patch/index.html b/docs/blog/git-format-patch/index.html
new file mode 100644
index 00000000..f18f608e
--- /dev/null
+++ b/docs/blog/git-format-patch/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/going-drupalcon/index.html b/docs/blog/going-drupalcon/index.html
new file mode 100644
index 00000000..6f3b1c13
--- /dev/null
+++ b/docs/blog/going-drupalcon/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/how-to-define-a-minimum-drupal-core-version/index.html b/docs/blog/how-to-define-a-minimum-drupal-core-version/index.html
new file mode 100644
index 00000000..7497e83c
--- /dev/null
+++ b/docs/blog/how-to-define-a-minimum-drupal-core-version/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/imagefield-import-archive/index.html b/docs/blog/imagefield-import-archive/index.html
new file mode 100644
index 00000000..11212546
--- /dev/null
+++ b/docs/blog/imagefield-import-archive/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/improve-jpg-quality-imagecache-and-imageapi/index.html b/docs/blog/improve-jpg-quality-imagecache-and-imageapi/index.html
new file mode 100644
index 00000000..8992e29a
--- /dev/null
+++ b/docs/blog/improve-jpg-quality-imagecache-and-imageapi/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/include-css-fonts-using-sass-each-loop/index.html b/docs/blog/include-css-fonts-using-sass-each-loop/index.html
new file mode 100644
index 00000000..3df49c17
--- /dev/null
+++ b/docs/blog/include-css-fonts-using-sass-each-loop/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/include-local-drupal-settings-file-environment-configuration-and-overrides/index.html b/docs/blog/include-local-drupal-settings-file-environment-configuration-and-overrides/index.html
new file mode 100644
index 00000000..b5b84e09
--- /dev/null
+++ b/docs/blog/include-local-drupal-settings-file-environment-configuration-and-overrides/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/index.html b/docs/blog/index.html
new file mode 100644
index 00000000..c1e9ce6b
--- /dev/null
+++ b/docs/blog/index.html
@@ -0,0 +1,302 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ Introducing the Drupal Meetups Twitterbot
+
+9th June 2017
+
+
+
+
+The Drupal Meetups Twitterbot is a small project that I worked on a few months ago, but hadn't got around to promoting yet. It’s intention is to provide one Twitter account where people can get the up to date news from various Drupal meetups.
+
+
+ Read more →
+
+
+ Turning Your Custom Drupal Module into a Feature
+
+20th May 2017
+
+
+ Yesterday I was fixing a bug in an inherited Drupal 7 custom module, and I decided that I was going to add some tests to ensure that the bug was fixed and doesn’t get accidentially re-introduced in the future. The test though required me to have a particular content type and fields which are specific to this site, so weren’t present within the standard installation profile used to run tests.
+
+I decided to convert the custom module into a Feature so that the content type and it’s fields could be added to it, and therefore present on the testing site once the module is installed.
+
+To do this, I needed to expose the module to the Features API.
+
+
+ Read more →
+
+
+ DrupalCamp Bristol 2017 - Early Bird Tickets, Call for Sessions, Sponsors
+
+15th May 2017
+
+
+
+
+In less than two months time, DrupalCamp Bristol will be back for our third year! (July seems to come around quicker each year). This is this year’s schedule and venues:
+
+
+
+
+ Read more →
+
+
+ Fixing Drupal SimpleTest issues inside Docker Containers
+
+5th May 2017
+
+
+ I’ve been a Drupal VM user for a long time, but lately I’ve been using a combination Drupal VM and Docker for my local development environment. There were a couple of issues preventing me from completely switching to Docker - one of which being that when I tried running of my Simpletest tests, a lot of them would fail where they would pass when run within Drupal VM.
+
+Here’s an excerpt from my docker-compose.yml
file:
+
+
+ Read more →
+
+
+ Nginx Redirects With Query String Arguments
+
+31st January 2017
+
+
+ This is an example of how my Nginx configuration looked to redirect from an old domain to a new one, and also to redirect from the root example.com
domain to the canonical www
subdomain.
+
+
+ Read more →
+
+
+ Easier Sculpin Commands with Composer and NPM Scripts
+
+7th January 2017
+
+
+ In this video, I show you how I've simplied my Sculpin and Gulp workflow using custom Composer and NPM scripts.
+
+
+ Read more →
+
+
+ Drupal VM Generator 2.9.1 Released
+
+30th December 2016
+
+
+ I spent some time yesterday working on the Drupal VM Generator , and have released versions 2.8.1, 2.9.0 and 2.9.1.
+
+
+ Read more →
+
+
+ Building Gmail Filters with PHP
+
+15th July 2016
+
+
+ Earlier this week I wrote a small PHP library called GmailFilterBuilder that allows you to write Gmail filters in PHP and export them to XML.
+
+I was already aware of a Ruby library called gmail-britta that does the same thing, but a) I’m not that familiar with Ruby so the syntax …
+
+ Read more →
+
+
+ Simplifying Drupal Migrations with xautoload
+
+3rd May 2016
+
+
+ How to use the xautoload module to autoload migration classes within your Drupal 7 migration modules.
+
+
+ Read more →
+
+
+ Announcing the Drupal VM Generator
+
+15th February 2016
+
+
+ For the past few weeks I’ve been working on a personal side project, based on Drupal VM. It’s called the Drupal VM Generator , and over the weekend I’ve added the final features and fixed the remaining issues, and tagged the 1.0.0 release.
+
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/install-and-configure-subversion-svn-server-ubuntu/index.html b/docs/blog/install-and-configure-subversion-svn-server-ubuntu/index.html
new file mode 100644
index 00000000..db23eb13
--- /dev/null
+++ b/docs/blog/install-and-configure-subversion-svn-server-ubuntu/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/install-nomensa-media-player-drupal/index.html b/docs/blog/install-nomensa-media-player-drupal/index.html
new file mode 100644
index 00000000..54353281
--- /dev/null
+++ b/docs/blog/install-nomensa-media-player-drupal/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/installing-nagios-centos/index.html b/docs/blog/installing-nagios-centos/index.html
new file mode 100644
index 00000000..4d018707
--- /dev/null
+++ b/docs/blog/installing-nagios-centos/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/leaving-nomensa-joining-precedent/index.html b/docs/blog/leaving-nomensa-joining-precedent/index.html
new file mode 100644
index 00000000..3e78a487
--- /dev/null
+++ b/docs/blog/leaving-nomensa-joining-precedent/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/my-new-drupal-modules/index.html b/docs/blog/my-new-drupal-modules/index.html
new file mode 100644
index 00000000..f5d7754f
--- /dev/null
+++ b/docs/blog/my-new-drupal-modules/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/my-sublime-text-2-settings/index.html b/docs/blog/my-sublime-text-2-settings/index.html
new file mode 100644
index 00000000..331d988a
--- /dev/null
+++ b/docs/blog/my-sublime-text-2-settings/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/nginx-redirects-with-query-string-arguments/index.html b/docs/blog/nginx-redirects-with-query-string-arguments/index.html
new file mode 100644
index 00000000..9da9b8ee
--- /dev/null
+++ b/docs/blog/nginx-redirects-with-query-string-arguments/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/open-sublime-text-2-mac-os-x-command-line/index.html b/docs/blog/open-sublime-text-2-mac-os-x-command-line/index.html
new file mode 100644
index 00000000..a3e83751
--- /dev/null
+++ b/docs/blog/open-sublime-text-2-mac-os-x-command-line/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/page/10.html b/docs/blog/page/10.html
new file mode 100644
index 00000000..90ca9d7c
--- /dev/null
+++ b/docs/blog/page/10.html
@@ -0,0 +1,229 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ Using ImageCache and ImageCrop for my Portfolio
+
+28th April 2010
+
+
+ Whilst working on my own portfolio/testimonial website, I decided to have a portfolio page displaying the name of each site and a thumbnail image. For this Blog post, I'll be using a site called Popcorn Strips which I built for a friend earlier this year as an example.
+
+I created a …
+
+ Read more →
+
+
+ Style Drupal 6's Taxonomy Lists with PHP, CSS and jQuery
+
+5th April 2010
+
+
+ Whilst developing this, and other Drupal websites for clients, I decided that I wanted to categorise content using the taxonomy system. However, I wasn't happy with the way that Drupal displayed the terms lists by default, and I started comparing this to other websites that I look at.
+
+To start with, …
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/page/2.html b/docs/blog/page/2.html
new file mode 100644
index 00000000..82fd68b0
--- /dev/null
+++ b/docs/blog/page/2.html
@@ -0,0 +1,319 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ Programmatically Load an Entityform in Drupal 7
+
+22nd December 2015
+
+
+ I recently had my first experience using the Entityform module in a project. It was quite easy to configure with different form types, but then I needed to embed the form into an overlay. I was expecting to use the drupal_get_form()
function and render it, but this didn’t work.
+
+Here are the steps that I took to be able to load, render and embed the form.
+
+
+ Read more →
+
+
+ Automating Sculpin Builds with Jenkins CI
+
+21st July 2015
+
+
+ As part of re-building this site with Sculpin, I wanted to automate the deployments, as in I wouldn't need to run a script like publish.sh locally and have that deploy my code onto my server. Not only did that mean that my local workflow was simpler (update, commit and push, …
+
+ Read more →
+
+
+ Sculpin and Twig Resources
+
+19th July 2015
+
+
+ Here’s a list of resources that I compiled whilst preparing for my Sculpin and Twig talk at DrupalCamp North .
+
+
+ Read more →
+
+
+ Updating Forked Repositories on GitHub
+
+18th June 2015
+
+
+ Sculpin
+
+People may or may not know, but this site runs on Sculpin, a PHP based static site generator (this may be the first time that I've mentioned it on this site). The source code is hosted on GitHub, and I've listed the site on the Community page on the Sculpin …
+
+ Read more →
+
+
+ How to Define a Minimum Drupal Core Version
+
+3rd April 2015
+
+
+ This week, my first code patch was committed to Drupal core. The patch adds the user_has_role() function to the user module, to simplify the way to check whether a user in Drupal has been assigned a specific role. This is something that I normally write a custom function for each …
+
+ Read more →
+
+
+ 2014
+
+20th March 2015
+
+
+ A lot happened in 2014. Here are some of the main things that I'd like to highlight.
+
+
+ Read more →
+
+
+ Include a Local Drupal Settings file for Environment Configuration and Overrides
+
+20th December 2014
+
+
+ How to create and include a local settings file to define and override environment-specific variables, and keep sensitive things like your database credentials and API keys safe.
+
+
+ Read more →
+
+
+ Include environment-specific settings files on Pantheon
+
+27th November 2014
+
+
+ I was recently doing some work on a site hosted on Pantheon and came across an issue, for which part of the suggested fix was to ensure that the $base_url
variable was explicitly defined within settings.php (this is also best practice on all Drupal sites).
+
+The way that was recommended was by using a switch()
function based on Pantheon's environment variable. For example:
+
+
+ Read more →
+
+
+ Using Remote Files when Developing Locally with Stage File Proxy Module
+
+20th November 2014
+
+
+ How to install and configure the Stage File Proxy module to serve remote images on your local Drupal site.
+
+
+ Read more →
+
+
+ Include CSS Fonts by Using a SASS each Loop
+
+18th November 2014
+
+
+ How to use an @each loop in SASS to quickly include multiple font files within your stylesheet.
+
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/page/3.html b/docs/blog/page/3.html
new file mode 100644
index 00000000..c07e02d5
--- /dev/null
+++ b/docs/blog/page/3.html
@@ -0,0 +1,322 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ Updating Features and Adding Components Using Drush
+
+21st October 2014
+
+
+ If you use the Features module to manage your Drupal configuration, it can be time consuming to update features through the UI, especially if you are working on a remote server and need to keep downloading and uploading files.
+
+If you re-create a feature through the UI, you'll be prompted to download a new archive of the feature in its entirety onto your local computer. You could either commit this into a local repository and then pull it remotely, or use a tool such as SCP to upload the archive onto the server and commit it from there. You can simplify this process by using Drush .
+
+
+ Read more →
+
+
+ How to fix Vagrant Loading the Wrong Virtual Machine
+
+6th October 2014
+
+
+ A few times recently, I've had instances where Vagrant seems to have forgotten which virtual machine it's supposed to load, probably due to renaming a project directory or the .vagrant directory being moved accidentally.
+
+Here are the steps that I took to fix this and point Vagrant back at the correct VM.
+
+
+ Read more →
+
+
+ drush make drupalbristol
+
+2nd July 2014
+
+
+ Here are my slides from this month's talk night at the Drupal Bristol user group .
+
+
+ Read more →
+
+
+ git format-patch is your Friend
+
+21st May 2014
+
+
+ An explanation of the "git format-patch" command, and how it could be used in Drupal's Git workflow.
+
+
+ Read more →
+
+
+ Thanks
+
+6th May 2014
+
+
+ This is just a quick post to thank everyone for their comments and congratulations after my previous post about joining the Drupal Association . I’m looking forward to my first day in the job tomorrow.
+
+
+ Read more →
+
+
+ Drupal Association
+
+3rd May 2014
+
+
+ Today was my last day working at Precedent . Next week, I'll be starting my new job at the Drupal Association working on Drupal's home - Drupal.org .
+
+
+ Read more →
+
+
+ DrupalCamp London: What is Git Flow?
+
+3rd March 2014
+
+
+ Here are my slides from my "What is Git Flow?" session at DrupalCamp London .
+
+
+ Read more →
+
+
+ DrupalCamp London 2014
+
+9th February 2014
+
+
+ It's all booked, I'm going to be attending DrupalCamp London this year, my first DrupalCamp!
+
+
+ Read more →
+
+
+ Some Useful Git Aliases
+
+15th January 2014
+
+
+ Here are some bash aliases that I use and find helpful for quickly writing Git and Git Flow commands.
+
+
+ Read more →
+
+
+ Download Different Versions of Drupal with Drush
+
+31st December 2013
+
+
+ If you use Drush , it's likely that you've used the drush pm-download
(or drush dl
for short) command to start a new project. This command downloads projects from Drupal.org, but if you don't specify a project or type "drush dl drupal", the command will download the current stable version of Drupal core. Currently, this will be Drupal 7 with that being the current stable version of core at the time of writing this post.
+
+But what if you don't want Drupal 7?
+
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/page/4.html b/docs/blog/page/4.html
new file mode 100644
index 00000000..2f1094af
--- /dev/null
+++ b/docs/blog/page/4.html
@@ -0,0 +1,322 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ Quickly Apply Patches Using Git and curl or wget
+
+24th December 2013
+
+
+ Testing a patch file is usually a two-step process. First you download the patch file from the source, and then you run a separate command to apply it.
+
+You can save time and typing by running the two commands on one line:
+
+
+ Read more →
+
+
+ Useful Vagrant Commands
+
+27th November 2013
+
+
+ Vagrant is a tool for managing virtual machines within VirtualBox from the command line. Here are some useful commands to know when using Vagrant.
+
+
+ Read more →
+
+
+ Don't Bootstrap Drupal, Use Drush
+
+19th November 2013
+
+
+ There are times when doing Drupal development when you need to run a custom PHP script, maybe moving data from one field to another, that doesn't warrant the time and effort to create a custom module. In this scenario, it would be quicker to write a .php script and bootstrap Drupal to gain access to functions like node_load()
and db_query()
.
+
+To bootstrap Drupal, you would need to add some additional lines of code to the stop of your script. Here is an alternative way.
+
+
+ Read more →
+
+
+ Create a Zen Sub-theme Using Drush
+
+6th September 2013
+
+
+ How to use Drush to quickly build a new sub-theme of Zen .
+
+
+ Read more →
+
+
+ Going to DrupalCon
+
+26th July 2013
+
+
+ Precedent are sending myself and two of our other Drupal Developers to Drupalcon Prague .
+
+
+ Read more →
+
+
+ Creating Local and Staging sites with Drupal's Domain Module Enabled
+
+17th July 2013
+
+
+ The Domain Access project is a suite of modules that provide tools for running a group of affiliated sites from one Drupal installation and a single shared database. The issue is that the domains are stored within the database so these are copied across when the data is migrated between environments, whereas the domains are obviously going to change.
+
+Rather than changing the domain settings within the Domain module itself, the best solution I think is to use table prefixes and create a different domain table per environment.
+
+
+ Read more →
+
+
+ Some useful links for using SimpleTest in Drupal
+
+13th June 2013
+
+
+ Here are some useful links that I've found when researching about unit testing in Drupal using SimpleTest.
+
+
+ Read more →
+
+
+ Display Git Branch or Tag Names in your Bash Prompt
+
+27th April 2013
+
+
+ Whilst watching Drupalize.me 's recent Introduction to Git series , I thought it was useful the way that the current Git branch or tag name was displayed in the bash prompt. Here's how to do it.
+
+
+ Read more →
+
+
+ Leaving Nomensa, Joining Precedent
+
+20th April 2013
+
+
+ Yesterday was my last day working at Nomensa . Next week, I'll be starting as a Senior Developer at Precedent .
+
+
+ Read more →
+
+
+ The Quickest way to Install Sublime Text 2 in Ubuntu
+
+2nd March 2013
+
+
+ After reading numerous blog posts about how to install Sublime Text 2 in Ubuntu , this is definitely the quickest way!
+
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/page/5.html b/docs/blog/page/5.html
new file mode 100644
index 00000000..ba0e04e9
--- /dev/null
+++ b/docs/blog/page/5.html
@@ -0,0 +1,320 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ Creating and using custom tokens in Drupal 7
+
+16th February 2013
+
+
+ This post outlines the steps required to create your own custom tokens in Drupal.
+
+
+ Read more →
+
+
+ Checking if a user is logged into Drupal (the right way)
+
+9th January 2013
+
+
+ I see this regularly when working on Drupal sites when someone wants to check whether the current user is logged in to Drupal (authenticated) or not (anonymous).
+
+
+ Read more →
+
+
+ How to use SASS and Compass in Drupal 7 using Sassy
+
+6th December 2012
+
+
+ I've recently started using SASS rather than LESS to do my CSS preprocessing - namely due to its integration with Compass and it's built-in CSS3 mixins. Here are three modules that provide the ability to use SASS within Drupal.
+
+
+ Read more →
+
+
+ Open Sublime Text 2 from the Mac OS X Command Line
+
+17th November 2012
+
+
+ How to open Sublime Text from the command line.
+
+
+ Read more →
+
+
+ Accessible Bristol site launched
+
+15th November 2012
+
+
+ I'm happy to announce that the Accessible Bristol website was launched this week, on Drupal 7.
+
+The site has been developed over the past few months, and uses the User Relationships and Privatemsg modules to provide a community-based platform where people with an interest in accessibility can register and network with each other.
+
+
+ Read more →
+
+
+ My Sublime Text 2 settings
+
+25th October 2012
+
+
+ Sublime Text 2 has been my text editor of choice for the past few months, and I use it at home, in work, and on any virtual machines that I run. So rather than having to manually re-enter my settings each time, I thought that I'd document them here for future reference.
+
+These preferences ensure that the code is compliant with Drupal coding standards - using two spaces instead of a tab, no trailing whitespace, blank line at the end of a file etc.
+
+
+ Read more →
+
+
+ Reflections on speaking at UnifiedDiff
+
+6th September 2012
+
+
+ Yesterday evening I went along and spoke at the UnifiedDiff meetup in Cardiff, having offered previously to do a presentation providing an introduction to Drupal.
+
+
+ Read more →
+
+
+ Display a Custom Menu in a Drupal 7 Theme Template File
+
+18th August 2012
+
+
+ For reference, this is the code needed to display a menu in a Drupal 7 template file, including the navigation ARIA role.
+
+
+ Read more →
+
+
+ Writing an Article for Linux Journal
+
+27th July 2012
+
+
+ I'm absolutely delighted to announce that I'm going to be writing an article for Linux Journal magazine's upcoming Drupal special.
+
+
+ Read more →
+
+
+ Install and Configure the Nomensa Accessible Media Player in Drupal
+
+14th July 2012
+
+
+ This week I released the first version of the Nomensa Accessible Media Player module for Drupal 7. Here's some instructions of how to install and configure it.
+
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/page/6.html b/docs/blog/page/6.html
new file mode 100644
index 00000000..0c4f7590
--- /dev/null
+++ b/docs/blog/page/6.html
@@ -0,0 +1,325 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ My new Drupal modules
+
+12th July 2012
+
+
+ After a busy few days, I've released two new contrib Drupal modules.
+
+
+ Read more →
+
+
+ Dividing Drupal's process and preprocess functions into separate files
+
+24th May 2012
+
+
+ If you use a lot of process and preprocess functions within your Drupal theme, then your template.php can get very long and it can become difficult to find a certain piece of code.
+
+Following the example of the Omega theme , I've started separating my process and preprocess functions into their own files. For example, mytheme_preprocess_node can be placed within a preprocess/node.inc file, and mytheme_process_page can be placed within process/page.inc.
+
+
+ Read more →
+
+
+ Writing a .info file for a Drupal 7 theme
+
+23rd May 2012
+
+
+ An example .info file for a Drupal 7 theme.
+
+
+ Read more →
+
+
+ Prevent Apache from displaying text files within a web browser
+
+23rd May 2012
+
+
+ When you download Drupal , there are several text files that are placed in the root of your installation. You don't want or need these to be visible to anyone attempting to view them in a browser - especially CHANGELOG.txt as that includes the exact version of Drupal you are running and could therefore have security implications.
+
+Rather than delete these files or change the file permissions manually for each file, I can add the following lines into my VirtualHost configuration.
+
+
+ Read more →
+
+
+ How to add a date popup calendar onto a custom form
+
+23rd May 2012
+
+
+ How to use a date popup calendar within your custom module.
+
+
+ Read more →
+
+
+ Forward one domain to another using mod_rewrite and .htaccess
+
+23rd May 2012
+
+
+ How to use the .htaccess file to forward to a different domain.
+
+
+ Read more →
+
+
+ Checkout a specific revision from SVN from the command line
+
+23rd May 2012
+
+
+ How to checkout a specific revision from a SVN (Subversion) repository.
+
+
+ Read more →
+
+
+ Adding Custom Theme Templates in Drupal 7
+
+19th April 2012
+
+
+ Today, I had a situation where I was displaying a list of teasers for news article nodes. The article content type had several different fields assigned to it, including main and thumbnail images. In this case, I wanted to have different output and fields displayed when a teaser was displayed compared to when a complete node was displayed.
+
+I have previously seen it done this way by adding this into in a node.tpl.php file:
+
+
+ Read more →
+
+
+ Installing Nagios on CentOS
+
+17th April 2012
+
+
+ A great post details that details the steps needed to install Nagios - a popular open source system and network monitoring software application - on CentOS.
+
+http://saylinux.net/story/009506/how-install-nagios-centos-55
+ …
+
+ Read more →
+
+
+ Create an Omega Subtheme with LESS CSS Preprocessor using Omega Tools and Drush
+
+16th April 2012
+
+
+ In this tutorial I'll be showing how to create an Omega subtheme using the Omega Tools module, and have it working with the LESS CSS preprocessor.
+
+The first thing that I need to do is download the Omega theme and the Omega Tools and LESS modules, and then to enable both …
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/page/7.html b/docs/blog/page/7.html
new file mode 100644
index 00000000..30a9d255
--- /dev/null
+++ b/docs/blog/page/7.html
@@ -0,0 +1,330 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ How to use Authorized Keys to Create a Passwordless SSH Connection
+
+1st February 2012
+
+
+ If you're accessing Linux servers or automating tasks between servers, rather than having to enter your user password every time, you can also use SSH public key authentication. This is a simple process that involves creating a local key and storing it within the authorized_keys file on the remote server.
+
+
+Check …
+
+ Read more →
+
+
+ Site Upgraded to Drupal 7
+
+4th January 2012
+
+
+ As the vast majority of the Drupal websites that I currently work on are built on Drupal 7, I thought that it was time that I upgraded this site. Following the core upgrade process and the CCK migration process, everything was upgraded smoothly without any issues.
+
+I've upgraded a handful of …
+
+ Read more →
+
+
+ How to Install and Configure Subversion (SVN) Server on Ubuntu
+
+19th October 2011
+
+
+ Recently, I needed to set up a Subversion (SVN) server on a Ubuntu Linux server. This post is going to outline the steps taken, and the commands used, to install and configure the service.
+
+Note: As I was using Ubuntu, I was using the 'apt-get' command to download and install the …
+
+ Read more →
+
+
+ Create Multigroups in Drupal 7 using Field Collections
+
+28th August 2011
+
+
+ One of my favourite things lately in Drupal 6 has been CCK 3, and more specifically, the Content Multigroups sub-module. Basically this allows you to create a fieldset of various CCK fields, and then repeat that multiple times. For example, I use it on this site whist creating invoices for …
+
+ Read more →
+
+
+ Imagefield Import Archive
+
+23rd May 2011
+
+
+ I've finally uploaded my first module onto Drupal.org!
+
+I've written many custom modules, although the vast majority of them are either small tweaks for my own sites, or company/site-specific modules that wouldn't be good to anyone else, so there would be nothing achieved by contributing them back to the community. Previously, …
+
+ Read more →
+
+
+ Proctors Hosting the next Drupal Meetup
+
+20th May 2011
+
+
+ My employer, Proctor & Stevenson, are going to be hosting the next Bristol & South West Drupal meetup on the 25th May at our offices.
+
+You can view more details, or register on our website.
+ …
+
+ Read more →
+
+
+ Proctor & Stevenson
+
+31st March 2011
+
+
+ 2 weeks ago, I handed in my notice of resignation to Horse & Country TVbecause I've been offered a new role at Proctor & Stevenson - a Marketing Design and Communications agency in Bristol.
+
+Proctors have an extensive client list - including BMW, Panasonic, the Open University and VOSA, and it's …
+
+ Read more →
+
+
+ Display the Number of Facebook fans in PHP
+
+15th March 2011
+
+
+ Replace the $page_id value with your Page ID number (unless you want to show the number of fans for this site).You can find your Page ID by logging into your Facebook account, going to 'Adverts and Pages', clicking 'Edit page', and looking at the URL.
+
+For example, mine is https://www.facebook.com/pages/edit/?id=143394365692197&sk=basic.
+
+I've also …
+
+ Read more →
+
+
+ Easily Embed TypeKit Fonts into your Drupal Website
+
+14th February 2011
+
+
+ To begin with, you will need to register for a TypeKit account - there is a free version if you just want to try it out.
+
+Next, you'll need to create a kit that contains the fonts that you want to use on your website. I've used FF Tisa Web Pro.
+
+Under …
+
+ Read more →
+
+
+ Use Regular Expressions to Search and Replace in Coda or TextMate
+
+4th November 2010
+
+
+ As in the original post, I'd generated a list of node ID values, and needed to add structure the SQL update statment formatted in a certain way. However, I changed my inital query slightly to out put the same nid value twice.
+
+SELECT nid, nid FROM node WHERE TYPE = 'blog' …
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/page/8.html b/docs/blog/page/8.html
new file mode 100644
index 00000000..526e84d2
--- /dev/null
+++ b/docs/blog/page/8.html
@@ -0,0 +1,337 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ Create a Better Photo Gallery in Drupal - Part 2.1
+
+22nd October 2010
+
+
+ Today, I realised that I hadn't published the code that I used to create the total figures of galleries and photos at the top of the gallery (I said at the end of Part 2 that I'd include it in Part 3, but I forgot). So, here it is:
+
+<?php
+
+// Queries …
+
+ Read more →
+
+
+ Create a Better Photo Gallery in Drupal - Part 3
+
+13th October 2010
+
+
+ The next part of the new gallery that I want to implement is to group the galleries by their respective categories. The first step is to edit my original photo_gallery view and add an additional display.
+
+I've called it 'Taxonomy', and it's similar to the original 'All Galleries' view. The differences …
+
+ Read more →
+
+
+ How to Create and Apply Patches
+
+10th October 2010
+
+
+ Earlier this year, I posted a solution to an issue on the Drupal.org issue queue. Originally, I just posted the code back onto the issue, but have now created a patch that can easily be applied to any Drupal 6 installation. Here is a run-through of the process of creating and applying a patch. In this case, I made changes to the user_pass_validate()
function that's found within modules/user/user.pages.inc
.
+
+
+ Read more →
+
+
+ The Inaugural Meetup for the South Wales Drupal User Group
+
+26th September 2010
+
+
+ If you do Drupal, and you're in the area, come and join us for the first South Wales Drupal User Group Meetup!
+
+We'll be meeting in the communal area just outside of the SubHub HQ, at:
+
+4, The Studios
+3 Burt Street
+Cardiff
+CF10 5FZ
+
+For more information and to signup, visit http://groups.drupal.org/node/95104.
+ …
+
+ Read more →
+
+
+ Review of the Image Caption Module
+
+20th August 2010
+
+
+ Up until as recent as last week, whenever I added an image into one of my Blog posts, I was manually adding the caption below each image and styling it accordingly. That was until I installed the Image Caption module.
+
+The Image Caption module uses jQuery to dynamically add captions to …
+
+ Read more →
+
+
+ Create a Better Photo Gallery in Drupal - Part 2
+
+17th August 2010
+
+
+ At the end of my last post, I'd finished creating the first part of the new photo gallery, but I wanted to change the dates of the published photos to reflect the ones on the client's original website.
+
+Firstly, I'll refer to the previous list of published galleries that …
+
+ Read more →
+
+
+ Create a Better Photo Gallery in Drupal - Part 1
+
+11th August 2010
+
+
+ Recently, I converted a client's static HTML website, along with their Coppermine Photo Gallery, into a Drupal-powered website.
+
+Over the next few posts, I'll be replicating the process that I used during the conversion, and how I added some additional features to my Drupal gallery.
+
+To begin with, I created my photo …
+
+ Read more →
+
+
+ Review of the Admin:hover Module
+
+10th August 2010
+
+
+ Sorry for the lack of Blog posts lately, but my new job that I started a few weeks ago has certainly been keeping me busy! I've got a few more posts that I'm preparing content for, and I'll hopefully be back into my weekly-post routine before too long!
+
+Today, I'd like …
+
+ Read more →
+
+
+ Review of the Teleport Module
+
+12th July 2010
+
+
+ As a heavily-reliant Quicksilver user on my MacBook Pro, I was glad when I found the Teleport module for Drupal (due to Elliott Rothman's tweet).
+
+When you press a configurable hot-key, a jQuery dialog box appears where you can search for nodes by title or path, or directly enter the path …
+
+ Read more →
+
+
+ Add a Taxonomy Term to Multiple Nodes Using SQL
+
+7th July 2010
+
+
+ Update: This can also be done using the Views Bulk Operations module.
+
+In preparation for my Blog posts being added to Drupal Planet, I needed to create a new Taxonomy term (or, in this case, tag) called 'Drupal Planet', and assign it to new content to imported into their aggregator. After …
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/page/9.html b/docs/blog/page/9.html
new file mode 100644
index 00000000..52a3e4c2
--- /dev/null
+++ b/docs/blog/page/9.html
@@ -0,0 +1,334 @@
+
+
+
+ Blog | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+ Create Virtual Hosts on Mac OS X Using VirtualHostX
+
+2nd July 2010
+
+
+ This isn't a Drupal related topic per se, but it is a walk-through of one of the applications that I use whilst doing Drupal development work. I assume, like most Mac OS X users, I use MAMP to run Apache, MySQL and PHP locally whilst developing. I also use virtual …
+
+ Read more →
+
+
+ Change the Content Type of Multiple Nodes Using SQL
+
+1st July 2010
+
+
+ In this post, I will be changing values within my Drupal 6 site's database to quickly change the content type of multiple nodes. I will be using a test development site with the core Blog module installed, and converting Blog posts to a custom content type called 'News article'.
+
+Before changing …
+
+ Read more →
+
+
+ Create a Flickr Photo Gallery Using Feeds, CCK and Views
+
+28th June 2010
+
+
+ In this tutorial, I'll show you how to create a photo gallery which uses photos imported from Flickr.
+
+The modules that I'll use to create the Gallery are:
+
+
+CCK
+Feeds
+Feeds Image Grabber
+FileField
+ImageAPI
+ImageCache
+ImageField
+Views
+
+
+The first thing that I did was to create a content type to store my imported images. I named it 'Photo', removed …
+
+ Read more →
+
+
+ 10 Useful Drupal 6 Modules
+
+25th June 2010
+
+
+ Aside from the obvious candidates such as Views, CCK etc, here are a list of 10 contributed modules that I currently use on each Drupal project.
+
+So, in no particular order:
+
+
+Admin: The admin module provides UI improvements to the standard Drupal admin interface. I've just upgraded to the new 6.x-2.0-beta4 version, …
+
+ Read more →
+
+
+ Create a Block of Social Media Icons using CCK, Views and Nodequeue
+
+23rd June 2010
+
+
+ I recently decided that I wanted to have a block displayed in a sidebar on my site containing icons and links to my social media profiles - Twitter, Facebook etc. I tried the Follow module, but it lacked the option to add extra networks such my Drupal.org account, and my …
+
+ Read more →
+
+
+ Improve JPG Quality in Imagecache and ImageAPI
+
+2nd June 2010
+
+
+ Whilst uploading images for my Projects and Testimonials sections, I noticed that the Imagecache-scaled images weren't as high a quality the originals on my Mac. I did some searching online and found out that, by default, Drupal resamples uploaded jpgs to 75% of their original quality.
+
+To increase the quality of …
+
+ Read more →
+
+
+ Quickly Import Multiples Images Using the Imagefield_Import Module
+
+29th May 2010
+
+
+ Thanks to Bob at Mustardseed Media for tweeting about this module. It's undoubtedly saved me hours of work today alone!
+
+I've recently started a personal project converting a website to Drupal. It's currently a static HTML/CSS site which also uses the Coppermine Photo Gallery. As part of building the new website, …
+
+ Read more →
+
+
+ Create a Slideshow of Multiple Images Using Fancy Slide
+
+25th May 2010
+
+
+ Whilst updating my About page, I thought about creating a slideshow of several images instead of just the one static image. When I looking on Drupal.org, the only slideshow modules were to create slideshows of images that were attached to different nodes - not multiple images attached to one node. …
+
+ Read more →
+
+
+ Quickly Create Zen Subthemes Using Zenophile
+
+10th May 2010
+
+
+ If you use the Zen theme, then you should also be using the Zenophile module!
+
+The Zenophile module allows you to very quickly create Zen subthemes from within your web browser, as well as editing options such as the site directory where it should be placed, the layout type (fixed or …
+
+ Read more →
+
+
+ Conditional Email Addresses in a Webform
+
+6th May 2010
+
+
+ I created a new Webform to serve as a simple Contact form, but left the main configuration until after I created the form components. I added 'Name', 'Email', 'Subject' and 'Message' fields, as well as a 'Category' select list. Below 'Options', I entered each of my desired options in the …
+
+ Read more →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/pantheon-settings-files/index.html b/docs/blog/pantheon-settings-files/index.html
new file mode 100644
index 00000000..1b1b208c
--- /dev/null
+++ b/docs/blog/pantheon-settings-files/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/prevent-apache-displaying-text-files-within-web-browser/index.html b/docs/blog/prevent-apache-displaying-text-files-within-web-browser/index.html
new file mode 100644
index 00000000..a7c1e20b
--- /dev/null
+++ b/docs/blog/prevent-apache-displaying-text-files-within-web-browser/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/proctor-stevenson/index.html b/docs/blog/proctor-stevenson/index.html
new file mode 100644
index 00000000..c6f16db4
--- /dev/null
+++ b/docs/blog/proctor-stevenson/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/proctors-hosting-next-drupal-meetup/index.html b/docs/blog/proctors-hosting-next-drupal-meetup/index.html
new file mode 100644
index 00000000..9293f472
--- /dev/null
+++ b/docs/blog/proctors-hosting-next-drupal-meetup/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/programmatically-load-an-entityform-in-drupal-7/index.html b/docs/blog/programmatically-load-an-entityform-in-drupal-7/index.html
new file mode 100644
index 00000000..08a953b3
--- /dev/null
+++ b/docs/blog/programmatically-load-an-entityform-in-drupal-7/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/quickest-way-install-sublime-text-2-ubuntu/index.html b/docs/blog/quickest-way-install-sublime-text-2-ubuntu/index.html
new file mode 100644
index 00000000..bf61da2f
--- /dev/null
+++ b/docs/blog/quickest-way-install-sublime-text-2-ubuntu/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/quickly-apply-patches-using-git-and-curl-or-wget/index.html b/docs/blog/quickly-apply-patches-using-git-and-curl-or-wget/index.html
new file mode 100644
index 00000000..ed3d2567
--- /dev/null
+++ b/docs/blog/quickly-apply-patches-using-git-and-curl-or-wget/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/quickly-create-zen-subthemes-using-zenophile/index.html b/docs/blog/quickly-create-zen-subthemes-using-zenophile/index.html
new file mode 100644
index 00000000..1815c572
--- /dev/null
+++ b/docs/blog/quickly-create-zen-subthemes-using-zenophile/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/quickly-import-multiples-images-using-imagefieldimport-module/index.html b/docs/blog/quickly-import-multiples-images-using-imagefieldimport-module/index.html
new file mode 100644
index 00000000..893e6e35
--- /dev/null
+++ b/docs/blog/quickly-import-multiples-images-using-imagefieldimport-module/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/reflections-speaking-unifieddiff/index.html b/docs/blog/reflections-speaking-unifieddiff/index.html
new file mode 100644
index 00000000..b721bf81
--- /dev/null
+++ b/docs/blog/reflections-speaking-unifieddiff/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/review-adminhover-module/index.html b/docs/blog/review-adminhover-module/index.html
new file mode 100644
index 00000000..4d9f76ea
--- /dev/null
+++ b/docs/blog/review-adminhover-module/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/review-image-caption-module/index.html b/docs/blog/review-image-caption-module/index.html
new file mode 100644
index 00000000..a16c85e7
--- /dev/null
+++ b/docs/blog/review-image-caption-module/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/review-teleport-module/index.html b/docs/blog/review-teleport-module/index.html
new file mode 100644
index 00000000..9438a3d1
--- /dev/null
+++ b/docs/blog/review-teleport-module/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/simplifying-drupal-migrations-with-xautoload/index.html b/docs/blog/simplifying-drupal-migrations-with-xautoload/index.html
new file mode 100644
index 00000000..2fe9e40e
--- /dev/null
+++ b/docs/blog/simplifying-drupal-migrations-with-xautoload/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/site-upgraded-drupal-7/index.html b/docs/blog/site-upgraded-drupal-7/index.html
new file mode 100644
index 00000000..9e1b2c7a
--- /dev/null
+++ b/docs/blog/site-upgraded-drupal-7/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/some-useful-git-aliases/index.html b/docs/blog/some-useful-git-aliases/index.html
new file mode 100644
index 00000000..8d7a24bb
--- /dev/null
+++ b/docs/blog/some-useful-git-aliases/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/some-useful-links-using-simpletest-drupal/index.html b/docs/blog/some-useful-links-using-simpletest-drupal/index.html
new file mode 100644
index 00000000..bdce0445
--- /dev/null
+++ b/docs/blog/some-useful-links-using-simpletest-drupal/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/south-wales-drupal-user-group/index.html b/docs/blog/south-wales-drupal-user-group/index.html
new file mode 100644
index 00000000..2cc73f2c
--- /dev/null
+++ b/docs/blog/south-wales-drupal-user-group/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/style-drupal-6s-taxonomy-lists-php-css-and-jquery/index.html b/docs/blog/style-drupal-6s-taxonomy-lists-php-css-and-jquery/index.html
new file mode 100644
index 00000000..586dae8c
--- /dev/null
+++ b/docs/blog/style-drupal-6s-taxonomy-lists-php-css-and-jquery/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/.htaccess.xml b/docs/blog/tags/.htaccess.xml
new file mode 100644
index 00000000..1f54c7f4
--- /dev/null
+++ b/docs/blog/tags/.htaccess.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Forward one domain to another using mod_rewrite and .htaccess
+ https://www.oliverdavies.uk/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess
+ https://www.oliverdavies.uk/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess
+ Wed, 23 May 2012 00:00:00 +0100
+ How to use the .htaccess file to forward to a different domain.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/.htaccess/index.html b/docs/blog/tags/.htaccess/index.html
new file mode 100644
index 00000000..34ad44ec
--- /dev/null
+++ b/docs/blog/tags/.htaccess/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ".htaccess"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/accessibility.xml b/docs/blog/tags/accessibility.xml
new file mode 100644
index 00000000..83974281
--- /dev/null
+++ b/docs/blog/tags/accessibility.xml
@@ -0,0 +1,36 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Accessible Bristol site launched
+ https://www.oliverdavies.uk/blog/2012/11/15/accessible-bristol-site-launched
+ https://www.oliverdavies.uk/blog/2012/11/15/accessible-bristol-site-launched
+ Thu, 15 Nov 2012 00:00:00 +0000
+ I'm happy to announce that the Accessible Bristol website was launched this week, on Drupal 7.
+
+The site has been developed over the past few months, and uses the User Relationships and Privatemsg modules to provide a community-based platform where people with an interest in accessibility can register and network with each other.
+
+
+ -
+
Install and Configure the Nomensa Accessible Media Player in Drupal
+ https://www.oliverdavies.uk/blog/2012/07/14/install-nomensa-media-player-drupal
+ https://www.oliverdavies.uk/blog/2012/07/14/install-nomensa-media-player-drupal
+ Sat, 14 Jul 2012 00:00:00 +0100
+ This week I released the first version of the Nomensa Accessible Media Player module for Drupal 7. Here's some instructions of how to install and configure it.
+
+
+ -
+
My new Drupal modules
+ https://www.oliverdavies.uk/blog/2012/07/12/my-new-drupal-modules
+ https://www.oliverdavies.uk/blog/2012/07/12/my-new-drupal-modules
+ Thu, 12 Jul 2012 00:00:00 +0100
+ After a busy few days, I've released two new contrib Drupal modules.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/accessibility/index.html b/docs/blog/tags/accessibility/index.html
new file mode 100644
index 00000000..a23291c4
--- /dev/null
+++ b/docs/blog/tags/accessibility/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "accessibility"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/accessible-bristol.xml b/docs/blog/tags/accessible-bristol.xml
new file mode 100644
index 00000000..e70a3383
--- /dev/null
+++ b/docs/blog/tags/accessible-bristol.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Accessible Bristol site launched
+ https://www.oliverdavies.uk/blog/2012/11/15/accessible-bristol-site-launched
+ https://www.oliverdavies.uk/blog/2012/11/15/accessible-bristol-site-launched
+ Thu, 15 Nov 2012 00:00:00 +0000
+ I'm happy to announce that the Accessible Bristol website was launched this week, on Drupal 7.
+
+The site has been developed over the past few months, and uses the User Relationships and Privatemsg modules to provide a community-based platform where people with an interest in accessibility can register and network with each other.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/accessible-bristol/index.html b/docs/blog/tags/accessible-bristol/index.html
new file mode 100644
index 00000000..b8f6bfc4
--- /dev/null
+++ b/docs/blog/tags/accessible-bristol/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "accessible-bristol"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/admin:hover.xml b/docs/blog/tags/admin:hover.xml
new file mode 100644
index 00000000..1e5947ba
--- /dev/null
+++ b/docs/blog/tags/admin:hover.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Review of the Admin:hover Module
+ https://www.oliverdavies.uk/blog/2010/08/10/review-adminhover-module
+ https://www.oliverdavies.uk/blog/2010/08/10/review-adminhover-module
+ Tue, 10 Aug 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/admin:hover/index.html b/docs/blog/tags/admin:hover/index.html
new file mode 100644
index 00000000..72a90fb4
--- /dev/null
+++ b/docs/blog/tags/admin:hover/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "admin:hover"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/administration.xml b/docs/blog/tags/administration.xml
new file mode 100644
index 00000000..cf737be1
--- /dev/null
+++ b/docs/blog/tags/administration.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Review of the Admin:hover Module
+ https://www.oliverdavies.uk/blog/2010/08/10/review-adminhover-module
+ https://www.oliverdavies.uk/blog/2010/08/10/review-adminhover-module
+ Tue, 10 Aug 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/administration/index.html b/docs/blog/tags/administration/index.html
new file mode 100644
index 00000000..083bee8c
--- /dev/null
+++ b/docs/blog/tags/administration/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "administration"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/apache.xml b/docs/blog/tags/apache.xml
new file mode 100644
index 00000000..b4fd8256
--- /dev/null
+++ b/docs/blog/tags/apache.xml
@@ -0,0 +1,28 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Prevent Apache from displaying text files within a web browser
+ https://www.oliverdavies.uk/blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser
+ https://www.oliverdavies.uk/blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser
+ Wed, 23 May 2012 00:00:00 +0100
+ When you download Drupal , there are several text files that are placed in the root of your installation. You don't want or need these to be visible to anyone attempting to view them in a browser - especially CHANGELOG.txt as that includes the exact version of Drupal you are running and could therefore have security implications.
+
+Rather than delete these files or change the file permissions manually for each file, I can add the following lines into my VirtualHost configuration.
+
+
+ -
+
Forward one domain to another using mod_rewrite and .htaccess
+ https://www.oliverdavies.uk/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess
+ https://www.oliverdavies.uk/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess
+ Wed, 23 May 2012 00:00:00 +0100
+ How to use the .htaccess file to forward to a different domain.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/apache/index.html b/docs/blog/tags/apache/index.html
new file mode 100644
index 00000000..72a17f5e
--- /dev/null
+++ b/docs/blog/tags/apache/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "apache"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/aria.xml b/docs/blog/tags/aria.xml
new file mode 100644
index 00000000..4fbb7ed1
--- /dev/null
+++ b/docs/blog/tags/aria.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Display a Custom Menu in a Drupal 7 Theme Template File
+ https://www.oliverdavies.uk/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file
+ https://www.oliverdavies.uk/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file
+ Sat, 18 Aug 2012 00:00:00 +0100
+ For reference, this is the code needed to display a menu in a Drupal 7 template file, including the navigation ARIA role.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/aria/index.html b/docs/blog/tags/aria/index.html
new file mode 100644
index 00000000..12018956
--- /dev/null
+++ b/docs/blog/tags/aria/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "aria"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/autoloading.xml b/docs/blog/tags/autoloading.xml
new file mode 100644
index 00000000..9308922c
--- /dev/null
+++ b/docs/blog/tags/autoloading.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Simplifying Drupal Migrations with xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ Tue, 03 May 2016 00:00:00 +0100
+ How to use the xautoload module to autoload migration classes within your Drupal 7 migration modules.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/autoloading/index.html b/docs/blog/tags/autoloading/index.html
new file mode 100644
index 00000000..93640ec2
--- /dev/null
+++ b/docs/blog/tags/autoloading/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "autoloading"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/calendar.xml b/docs/blog/tags/calendar.xml
new file mode 100644
index 00000000..6c863b65
--- /dev/null
+++ b/docs/blog/tags/calendar.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
How to add a date popup calendar onto a custom form
+ https://www.oliverdavies.uk/blog/2012/05/23/add-date-popup-calendar-custom-form
+ https://www.oliverdavies.uk/blog/2012/05/23/add-date-popup-calendar-custom-form
+ Wed, 23 May 2012 00:00:00 +0100
+ How to use a date popup calendar within your custom module.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/calendar/index.html b/docs/blog/tags/calendar/index.html
new file mode 100644
index 00000000..2f5a2cfc
--- /dev/null
+++ b/docs/blog/tags/calendar/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "calendar"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/cck.xml b/docs/blog/tags/cck.xml
new file mode 100644
index 00000000..07251fc4
--- /dev/null
+++ b/docs/blog/tags/cck.xml
@@ -0,0 +1,45 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Create Multigroups in Drupal 7 using Field Collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ Sun, 28 Aug 2011 00:00:00 +0100
+
+
+ -
+
Create a Better Photo Gallery in Drupal - Part 1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ Wed, 11 Aug 2010 00:00:00 +0100
+
+
+ -
+
Create a Flickr Photo Gallery Using Feeds, CCK and Views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ Mon, 28 Jun 2010 00:00:00 +0100
+
+
+ -
+
Quickly Import Multiples Images Using the Imagefield_Import Module
+ https://www.oliverdavies.uk/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module
+ https://www.oliverdavies.uk/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module
+ Sat, 29 May 2010 00:00:00 +0100
+
+
+ -
+
Using ImageCache and ImageCrop for my Portfolio
+ https://www.oliverdavies.uk/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio
+ https://www.oliverdavies.uk/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio
+ Wed, 28 Apr 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/cck/index.html b/docs/blog/tags/cck/index.html
new file mode 100644
index 00000000..46333734
--- /dev/null
+++ b/docs/blog/tags/cck/index.html
@@ -0,0 +1,220 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "cck"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/centos.xml b/docs/blog/tags/centos.xml
new file mode 100644
index 00000000..d8dfe938
--- /dev/null
+++ b/docs/blog/tags/centos.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Installing Nagios on CentOS
+ https://www.oliverdavies.uk/blog/2012/04/17/installing-nagios-centos
+ https://www.oliverdavies.uk/blog/2012/04/17/installing-nagios-centos
+ Tue, 17 Apr 2012 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/centos/index.html b/docs/blog/tags/centos/index.html
new file mode 100644
index 00000000..f1a53089
--- /dev/null
+++ b/docs/blog/tags/centos/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "centos"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/coda.xml b/docs/blog/tags/coda.xml
new file mode 100644
index 00000000..efb6a174
--- /dev/null
+++ b/docs/blog/tags/coda.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Use Regular Expressions to Search and Replace in Coda or TextMate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ Thu, 04 Nov 2010 00:00:00 +0000
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/coda/index.html b/docs/blog/tags/coda/index.html
new file mode 100644
index 00000000..bf70f2e2
--- /dev/null
+++ b/docs/blog/tags/coda/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "coda"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/code.xml b/docs/blog/tags/code.xml
new file mode 100644
index 00000000..a66a2d95
--- /dev/null
+++ b/docs/blog/tags/code.xml
@@ -0,0 +1,46 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Dividing Drupal's process and preprocess functions into separate files
+ https://www.oliverdavies.uk/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files
+ https://www.oliverdavies.uk/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files
+ Thu, 24 May 2012 00:00:00 +0100
+ If you use a lot of process and preprocess functions within your Drupal theme, then your template.php can get very long and it can become difficult to find a certain piece of code.
+
+Following the example of the Omega theme , I've started separating my process and preprocess functions into their own files. For example, mytheme_preprocess_node can be placed within a preprocess/node.inc file, and mytheme_process_page can be placed within process/page.inc.
+
+
+ -
+
Writing a .info file for a Drupal 7 theme
+ https://www.oliverdavies.uk/blog/2012/05/23/writing-info-file-drupal-7-theme
+ https://www.oliverdavies.uk/blog/2012/05/23/writing-info-file-drupal-7-theme
+ Wed, 23 May 2012 00:00:00 +0100
+ An example .info file for a Drupal 7 theme.
+
+
+ -
+
Prevent Apache from displaying text files within a web browser
+ https://www.oliverdavies.uk/blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser
+ https://www.oliverdavies.uk/blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser
+ Wed, 23 May 2012 00:00:00 +0100
+ When you download Drupal , there are several text files that are placed in the root of your installation. You don't want or need these to be visible to anyone attempting to view them in a browser - especially CHANGELOG.txt as that includes the exact version of Drupal you are running and could therefore have security implications.
+
+Rather than delete these files or change the file permissions manually for each file, I can add the following lines into my VirtualHost configuration.
+
+
+ -
+
Forward one domain to another using mod_rewrite and .htaccess
+ https://www.oliverdavies.uk/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess
+ https://www.oliverdavies.uk/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess
+ Wed, 23 May 2012 00:00:00 +0100
+ How to use the .htaccess file to forward to a different domain.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/code/index.html b/docs/blog/tags/code/index.html
new file mode 100644
index 00000000..76379649
--- /dev/null
+++ b/docs/blog/tags/code/index.html
@@ -0,0 +1,212 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "code"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/compass.xml b/docs/blog/tags/compass.xml
new file mode 100644
index 00000000..2a5807ce
--- /dev/null
+++ b/docs/blog/tags/compass.xml
@@ -0,0 +1,26 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Include CSS Fonts by Using a SASS each Loop
+ https://www.oliverdavies.uk/blog/2014/11/18/include-css-fonts-using-sass-each-loop
+ https://www.oliverdavies.uk/blog/2014/11/18/include-css-fonts-using-sass-each-loop
+ Tue, 18 Nov 2014 00:00:00 +0000
+ How to use an @each loop in SASS to quickly include multiple font files within your stylesheet.
+
+
+ -
+
How to use SASS and Compass in Drupal 7 using Sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ Thu, 06 Dec 2012 00:00:00 +0000
+ I've recently started using SASS rather than LESS to do my CSS preprocessing - namely due to its integration with Compass and it's built-in CSS3 mixins. Here are three modules that provide the ability to use SASS within Drupal.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/compass/index.html b/docs/blog/tags/compass/index.html
new file mode 100644
index 00000000..0afc1d9f
--- /dev/null
+++ b/docs/blog/tags/compass/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "compass"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/composer.xml b/docs/blog/tags/composer.xml
new file mode 100644
index 00000000..230066dd
--- /dev/null
+++ b/docs/blog/tags/composer.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Easier Sculpin Commands with Composer and NPM Scripts
+ https://www.oliverdavies.uk/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts
+ https://www.oliverdavies.uk/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts
+ Sat, 07 Jan 2017 00:00:00 +0000
+ In this video, I show you how I've simplied my Sculpin and Gulp workflow using custom Composer and NPM scripts.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/composer/index.html b/docs/blog/tags/composer/index.html
new file mode 100644
index 00000000..4c159dd6
--- /dev/null
+++ b/docs/blog/tags/composer/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "composer"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/conditional-email.xml b/docs/blog/tags/conditional-email.xml
new file mode 100644
index 00000000..2ca68935
--- /dev/null
+++ b/docs/blog/tags/conditional-email.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Conditional Email Addresses in a Webform
+ https://www.oliverdavies.uk/blog/2010/05/06/conditional-email-addresses-webform
+ https://www.oliverdavies.uk/blog/2010/05/06/conditional-email-addresses-webform
+ Thu, 06 May 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/conditional-email/index.html b/docs/blog/tags/conditional-email/index.html
new file mode 100644
index 00000000..cae9aa3c
--- /dev/null
+++ b/docs/blog/tags/conditional-email/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "conditional-email"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/content-types.xml b/docs/blog/tags/content-types.xml
new file mode 100644
index 00000000..3726a4de
--- /dev/null
+++ b/docs/blog/tags/content-types.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Change the Content Type of Multiple Nodes Using SQL
+ https://www.oliverdavies.uk/blog/2010/07/01/change-content-type-multiple-nodes-using-sql
+ https://www.oliverdavies.uk/blog/2010/07/01/change-content-type-multiple-nodes-using-sql
+ Thu, 01 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/content-types/index.html b/docs/blog/tags/content-types/index.html
new file mode 100644
index 00000000..a7d82afd
--- /dev/null
+++ b/docs/blog/tags/content-types/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "content-types"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/css.xml b/docs/blog/tags/css.xml
new file mode 100644
index 00000000..2203ec17
--- /dev/null
+++ b/docs/blog/tags/css.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
How to use SASS and Compass in Drupal 7 using Sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ Thu, 06 Dec 2012 00:00:00 +0000
+ I've recently started using SASS rather than LESS to do my CSS preprocessing - namely due to its integration with Compass and it's built-in CSS3 mixins. Here are three modules that provide the ability to use SASS within Drupal.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/css/index.html b/docs/blog/tags/css/index.html
new file mode 100644
index 00000000..98e3822d
--- /dev/null
+++ b/docs/blog/tags/css/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "css"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/database.xml b/docs/blog/tags/database.xml
new file mode 100644
index 00000000..1f638761
--- /dev/null
+++ b/docs/blog/tags/database.xml
@@ -0,0 +1,31 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Use Regular Expressions to Search and Replace in Coda or TextMate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ Thu, 04 Nov 2010 00:00:00 +0000
+
+
+ -
+
Add a Taxonomy Term to Multiple Nodes Using SQL
+ https://www.oliverdavies.uk/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql
+ https://www.oliverdavies.uk/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql
+ Wed, 07 Jul 2010 00:00:00 +0100
+
+
+ -
+
Change the Content Type of Multiple Nodes Using SQL
+ https://www.oliverdavies.uk/blog/2010/07/01/change-content-type-multiple-nodes-using-sql
+ https://www.oliverdavies.uk/blog/2010/07/01/change-content-type-multiple-nodes-using-sql
+ Thu, 01 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/database/index.html b/docs/blog/tags/database/index.html
new file mode 100644
index 00000000..310d445f
--- /dev/null
+++ b/docs/blog/tags/database/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "database"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/databases.xml b/docs/blog/tags/databases.xml
new file mode 100644
index 00000000..2c7e074f
--- /dev/null
+++ b/docs/blog/tags/databases.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Creating Local and Staging sites with Drupal's Domain Module Enabled
+ https://www.oliverdavies.uk/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled
+ https://www.oliverdavies.uk/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled
+ Wed, 17 Jul 2013 00:00:00 +0100
+ The Domain Access project is a suite of modules that provide tools for running a group of affiliated sites from one Drupal installation and a single shared database. The issue is that the domains are stored within the database so these are copied across when the data is migrated between environments, whereas the domains are obviously going to change.
+
+Rather than changing the domain settings within the Domain module itself, the best solution I think is to use table prefixes and create a different domain table per environment.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/databases/index.html b/docs/blog/tags/databases/index.html
new file mode 100644
index 00000000..260032aa
--- /dev/null
+++ b/docs/blog/tags/databases/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "databases"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/date.xml b/docs/blog/tags/date.xml
new file mode 100644
index 00000000..67d49dd5
--- /dev/null
+++ b/docs/blog/tags/date.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
How to add a date popup calendar onto a custom form
+ https://www.oliverdavies.uk/blog/2012/05/23/add-date-popup-calendar-custom-form
+ https://www.oliverdavies.uk/blog/2012/05/23/add-date-popup-calendar-custom-form
+ Wed, 23 May 2012 00:00:00 +0100
+ How to use a date popup calendar within your custom module.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/date/index.html b/docs/blog/tags/date/index.html
new file mode 100644
index 00000000..293e749f
--- /dev/null
+++ b/docs/blog/tags/date/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "date"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/distributions.xml b/docs/blog/tags/distributions.xml
new file mode 100644
index 00000000..2746c343
--- /dev/null
+++ b/docs/blog/tags/distributions.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Writing an Article for Linux Journal
+ https://www.oliverdavies.uk/blog/2012/07/27/writing-article-linux-journal
+ https://www.oliverdavies.uk/blog/2012/07/27/writing-article-linux-journal
+ Fri, 27 Jul 2012 00:00:00 +0100
+ I'm absolutely delighted to announce that I'm going to be writing an article for Linux Journal magazine's upcoming Drupal special.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/distributions/index.html b/docs/blog/tags/distributions/index.html
new file mode 100644
index 00000000..1f9db573
--- /dev/null
+++ b/docs/blog/tags/distributions/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "distributions"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/docker.xml b/docs/blog/tags/docker.xml
new file mode 100644
index 00000000..36baf965
--- /dev/null
+++ b/docs/blog/tags/docker.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Fixing Drupal SimpleTest issues inside Docker Containers
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ Fri, 05 May 2017 00:00:00 +0100
+ I’ve been a Drupal VM user for a long time, but lately I’ve been using a combination Drupal VM and Docker for my local development environment. There were a couple of issues preventing me from completely switching to Docker - one of which being that when I tried running of my Simpletest tests, a lot of them would fail where they would pass when run within Drupal VM.
+
+Here’s an excerpt from my docker-compose.yml
file:
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/docker/index.html b/docs/blog/tags/docker/index.html
new file mode 100644
index 00000000..ae7b935f
--- /dev/null
+++ b/docs/blog/tags/docker/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "docker"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/domain.xml b/docs/blog/tags/domain.xml
new file mode 100644
index 00000000..8177dbfb
--- /dev/null
+++ b/docs/blog/tags/domain.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Creating Local and Staging sites with Drupal's Domain Module Enabled
+ https://www.oliverdavies.uk/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled
+ https://www.oliverdavies.uk/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled
+ Wed, 17 Jul 2013 00:00:00 +0100
+ The Domain Access project is a suite of modules that provide tools for running a group of affiliated sites from one Drupal installation and a single shared database. The issue is that the domains are stored within the database so these are copied across when the data is migrated between environments, whereas the domains are obviously going to change.
+
+Rather than changing the domain settings within the Domain module itself, the best solution I think is to use table prefixes and create a different domain table per environment.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/domain/index.html b/docs/blog/tags/domain/index.html
new file mode 100644
index 00000000..b448044d
--- /dev/null
+++ b/docs/blog/tags/domain/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "domain"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-6.xml b/docs/blog/tags/drupal-6.xml
new file mode 100644
index 00000000..1c8e305f
--- /dev/null
+++ b/docs/blog/tags/drupal-6.xml
@@ -0,0 +1,84 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Include a Local Drupal Settings file for Environment Configuration and Overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ Sat, 20 Dec 2014 00:00:00 +0000
+ How to create and include a local settings file to define and override environment-specific variables, and keep sensitive things like your database credentials and API keys safe.
+
+
+ -
+
Checking if a user is logged into Drupal (the right way)
+ https://www.oliverdavies.uk/blog/2013/01/09/checking-if-user-logged-drupal-right-way
+ https://www.oliverdavies.uk/blog/2013/01/09/checking-if-user-logged-drupal-right-way
+ Wed, 09 Jan 2013 00:00:00 +0000
+ I see this regularly when working on Drupal sites when someone wants to check whether the current user is logged in to Drupal (authenticated) or not (anonymous).
+
+
+ -
+
My new Drupal modules
+ https://www.oliverdavies.uk/blog/2012/07/12/my-new-drupal-modules
+ https://www.oliverdavies.uk/blog/2012/07/12/my-new-drupal-modules
+ Thu, 12 Jul 2012 00:00:00 +0100
+ After a busy few days, I've released two new contrib Drupal modules.
+
+
+ -
+
Easily Embed TypeKit Fonts into your Drupal Website
+ https://www.oliverdavies.uk/blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website
+ https://www.oliverdavies.uk/blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website
+ Mon, 14 Feb 2011 00:00:00 +0000
+
+
+ -
+
How to Create and Apply Patches
+ https://www.oliverdavies.uk/blog/2010/10/10/create-and-apply-patches
+ https://www.oliverdavies.uk/blog/2010/10/10/create-and-apply-patches
+ Sun, 10 Oct 2010 00:00:00 +0100
+ Earlier this year, I posted a solution to an issue on the Drupal.org issue queue. Originally, I just posted the code back onto the issue, but have now created a patch that can easily be applied to any Drupal 6 installation. Here is a run-through of the process of creating and applying a patch. In this case, I made changes to the user_pass_validate()
function that's found within modules/user/user.pages.inc
.
+
+
+ -
+
Review of the Image Caption Module
+ https://www.oliverdavies.uk/blog/2010/08/20/review-image-caption-module
+ https://www.oliverdavies.uk/blog/2010/08/20/review-image-caption-module
+ Fri, 20 Aug 2010 00:00:00 +0100
+
+
+ -
+
Create a Better Photo Gallery in Drupal - Part 2
+ https://www.oliverdavies.uk/blog/2010/08/17/create-better-photo-gallery-drupal-part-2
+ https://www.oliverdavies.uk/blog/2010/08/17/create-better-photo-gallery-drupal-part-2
+ Tue, 17 Aug 2010 00:00:00 +0100
+
+
+ -
+
Create a Better Photo Gallery in Drupal - Part 1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ Wed, 11 Aug 2010 00:00:00 +0100
+
+
+ -
+
Review of the Admin:hover Module
+ https://www.oliverdavies.uk/blog/2010/08/10/review-adminhover-module
+ https://www.oliverdavies.uk/blog/2010/08/10/review-adminhover-module
+ Tue, 10 Aug 2010 00:00:00 +0100
+
+
+ -
+
Review of the Teleport Module
+ https://www.oliverdavies.uk/blog/2010/07/12/review-teleport-module
+ https://www.oliverdavies.uk/blog/2010/07/12/review-teleport-module
+ Mon, 12 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-6/index.html b/docs/blog/tags/drupal-6/index.html
new file mode 100644
index 00000000..0c961f3e
--- /dev/null
+++ b/docs/blog/tags/drupal-6/index.html
@@ -0,0 +1,364 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-6"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-7.xml b/docs/blog/tags/drupal-7.xml
new file mode 100644
index 00000000..6d0b5925
--- /dev/null
+++ b/docs/blog/tags/drupal-7.xml
@@ -0,0 +1,95 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Turning Your Custom Drupal Module into a Feature
+ https://www.oliverdavies.uk/blog/2017/05/20/turning-drupal-module-into-feature
+ https://www.oliverdavies.uk/blog/2017/05/20/turning-drupal-module-into-feature
+ Sat, 20 May 2017 00:00:00 +0100
+ Yesterday I was fixing a bug in an inherited Drupal 7 custom module, and I decided that I was going to add some tests to ensure that the bug was fixed and doesn’t get accidentially re-introduced in the future. The test though required me to have a particular content type and fields which are specific to this site, so weren’t present within the standard installation profile used to run tests.
+
+I decided to convert the custom module into a Feature so that the content type and it’s fields could be added to it, and therefore present on the testing site once the module is installed.
+
+To do this, I needed to expose the module to the Features API.
+
+
+ -
+
Simplifying Drupal Migrations with xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ Tue, 03 May 2016 00:00:00 +0100
+ How to use the xautoload module to autoload migration classes within your Drupal 7 migration modules.
+
+
+ -
+
Programmatically Load an Entityform in Drupal 7
+ https://www.oliverdavies.uk/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7
+ https://www.oliverdavies.uk/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7
+ Tue, 22 Dec 2015 00:00:00 +0000
+ I recently had my first experience using the Entityform module in a project. It was quite easy to configure with different form types, but then I needed to embed the form into an overlay. I was expecting to use the drupal_get_form()
function and render it, but this didn’t work.
+
+Here are the steps that I took to be able to load, render and embed the form.
+
+
+ -
+
How to Define a Minimum Drupal Core Version
+ https://www.oliverdavies.uk/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version
+ https://www.oliverdavies.uk/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version
+ Fri, 03 Apr 2015 00:00:00 +0100
+
+
+ -
+
Include a Local Drupal Settings file for Environment Configuration and Overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ Sat, 20 Dec 2014 00:00:00 +0000
+ How to create and include a local settings file to define and override environment-specific variables, and keep sensitive things like your database credentials and API keys safe.
+
+
+ -
+
Creating and using custom tokens in Drupal 7
+ https://www.oliverdavies.uk/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7
+ https://www.oliverdavies.uk/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7
+ Sat, 16 Feb 2013 00:00:00 +0000
+ This post outlines the steps required to create your own custom tokens in Drupal.
+
+
+ -
+
Checking if a user is logged into Drupal (the right way)
+ https://www.oliverdavies.uk/blog/2013/01/09/checking-if-user-logged-drupal-right-way
+ https://www.oliverdavies.uk/blog/2013/01/09/checking-if-user-logged-drupal-right-way
+ Wed, 09 Jan 2013 00:00:00 +0000
+ I see this regularly when working on Drupal sites when someone wants to check whether the current user is logged in to Drupal (authenticated) or not (anonymous).
+
+
+ -
+
How to use SASS and Compass in Drupal 7 using Sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ Thu, 06 Dec 2012 00:00:00 +0000
+ I've recently started using SASS rather than LESS to do my CSS preprocessing - namely due to its integration with Compass and it's built-in CSS3 mixins. Here are three modules that provide the ability to use SASS within Drupal.
+
+
+ -
+
Display a Custom Menu in a Drupal 7 Theme Template File
+ https://www.oliverdavies.uk/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file
+ https://www.oliverdavies.uk/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file
+ Sat, 18 Aug 2012 00:00:00 +0100
+ For reference, this is the code needed to display a menu in a Drupal 7 template file, including the navigation ARIA role.
+
+
+ -
+
My new Drupal modules
+ https://www.oliverdavies.uk/blog/2012/07/12/my-new-drupal-modules
+ https://www.oliverdavies.uk/blog/2012/07/12/my-new-drupal-modules
+ Thu, 12 Jul 2012 00:00:00 +0100
+ After a busy few days, I've released two new contrib Drupal modules.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-7/index.html b/docs/blog/tags/drupal-7/index.html
new file mode 100644
index 00000000..a05d4a86
--- /dev/null
+++ b/docs/blog/tags/drupal-7/index.html
@@ -0,0 +1,284 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-7"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-8.xml b/docs/blog/tags/drupal-8.xml
new file mode 100644
index 00000000..fee5054f
--- /dev/null
+++ b/docs/blog/tags/drupal-8.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Include a Local Drupal Settings file for Environment Configuration and Overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ Sat, 20 Dec 2014 00:00:00 +0000
+ How to create and include a local settings file to define and override environment-specific variables, and keep sensitive things like your database credentials and API keys safe.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-8/index.html b/docs/blog/tags/drupal-8/index.html
new file mode 100644
index 00000000..59d79865
--- /dev/null
+++ b/docs/blog/tags/drupal-8/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-8"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-association.xml b/docs/blog/tags/drupal-association.xml
new file mode 100644
index 00000000..9ffd6b73
--- /dev/null
+++ b/docs/blog/tags/drupal-association.xml
@@ -0,0 +1,26 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
2014
+ https://www.oliverdavies.uk/blog/2015/03/20/2014
+ https://www.oliverdavies.uk/blog/2015/03/20/2014
+ Fri, 20 Mar 2015 20:14:00 +0000
+ A lot happened in 2014. Here are some of the main things that I'd like to highlight.
+
+
+ -
+
Thanks
+ https://www.oliverdavies.uk/blog/2014/05/06/thanks
+ https://www.oliverdavies.uk/blog/2014/05/06/thanks
+ Tue, 06 May 2014 00:00:00 +0100
+ This is just a quick post to thank everyone for their comments and congratulations after my previous post about joining the Drupal Association . I’m looking forward to my first day in the job tomorrow.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-association/index.html b/docs/blog/tags/drupal-association/index.html
new file mode 100644
index 00000000..d877e290
--- /dev/null
+++ b/docs/blog/tags/drupal-association/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-association"
+
+
+
+
+
+ Post Title
+ Date
+
+
+
+
+
+
+ 2014
+
+
+ 20 March 2015
+
+
+
+
+ Thanks
+
+
+ 6 May 2014
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-bristol.xml b/docs/blog/tags/drupal-bristol.xml
new file mode 100644
index 00000000..912f05e8
--- /dev/null
+++ b/docs/blog/tags/drupal-bristol.xml
@@ -0,0 +1,25 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
drush make drupalbristol
+ https://www.oliverdavies.uk/blog/2014/07/02/drush-make-drupalbristol
+ https://www.oliverdavies.uk/blog/2014/07/02/drush-make-drupalbristol
+ Wed, 02 Jul 2014 00:00:00 +0100
+ Here are my slides from this month's talk night at the Drupal Bristol user group .
+
+
+ -
+
Proctors Hosting the next Drupal Meetup
+ https://www.oliverdavies.uk/blog/2011/05/20/proctors-hosting-next-drupal-meetup
+ https://www.oliverdavies.uk/blog/2011/05/20/proctors-hosting-next-drupal-meetup
+ Fri, 20 May 2011 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-bristol/index.html b/docs/blog/tags/drupal-bristol/index.html
new file mode 100644
index 00000000..f4e356c3
--- /dev/null
+++ b/docs/blog/tags/drupal-bristol/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-bristol"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-modules.xml b/docs/blog/tags/drupal-modules.xml
new file mode 100644
index 00000000..20697a6f
--- /dev/null
+++ b/docs/blog/tags/drupal-modules.xml
@@ -0,0 +1,46 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
My new Drupal modules
+ https://www.oliverdavies.uk/blog/2012/07/12/my-new-drupal-modules
+ https://www.oliverdavies.uk/blog/2012/07/12/my-new-drupal-modules
+ Thu, 12 Jul 2012 00:00:00 +0100
+ After a busy few days, I've released two new contrib Drupal modules.
+
+
+ -
+
Review of the Admin:hover Module
+ https://www.oliverdavies.uk/blog/2010/08/10/review-adminhover-module
+ https://www.oliverdavies.uk/blog/2010/08/10/review-adminhover-module
+ Tue, 10 Aug 2010 00:00:00 +0100
+
+
+ -
+
Review of the Teleport Module
+ https://www.oliverdavies.uk/blog/2010/07/12/review-teleport-module
+ https://www.oliverdavies.uk/blog/2010/07/12/review-teleport-module
+ Mon, 12 Jul 2010 00:00:00 +0100
+
+
+ -
+
10 Useful Drupal 6 Modules
+ https://www.oliverdavies.uk/blog/2010/06/25/10-useful-drupal-6-modules
+ https://www.oliverdavies.uk/blog/2010/06/25/10-useful-drupal-6-modules
+ Fri, 25 Jun 2010 00:00:00 +0100
+
+
+ -
+
Quickly Create Zen Subthemes Using Zenophile
+ https://www.oliverdavies.uk/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile
+ https://www.oliverdavies.uk/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile
+ Mon, 10 May 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-modules/index.html b/docs/blog/tags/drupal-modules/index.html
new file mode 100644
index 00000000..ac836f78
--- /dev/null
+++ b/docs/blog/tags/drupal-modules/index.html
@@ -0,0 +1,220 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-modules"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-planet.xml b/docs/blog/tags/drupal-planet.xml
new file mode 100644
index 00000000..de15f2aa
--- /dev/null
+++ b/docs/blog/tags/drupal-planet.xml
@@ -0,0 +1,107 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Turning Your Custom Drupal Module into a Feature
+ https://www.oliverdavies.uk/blog/2017/05/20/turning-drupal-module-into-feature
+ https://www.oliverdavies.uk/blog/2017/05/20/turning-drupal-module-into-feature
+ Sat, 20 May 2017 00:00:00 +0100
+ Yesterday I was fixing a bug in an inherited Drupal 7 custom module, and I decided that I was going to add some tests to ensure that the bug was fixed and doesn’t get accidentially re-introduced in the future. The test though required me to have a particular content type and fields which are specific to this site, so weren’t present within the standard installation profile used to run tests.
+
+I decided to convert the custom module into a Feature so that the content type and it’s fields could be added to it, and therefore present on the testing site once the module is installed.
+
+To do this, I needed to expose the module to the Features API.
+
+
+ -
+
DrupalCamp Bristol 2017 - Early Bird Tickets, Call for Sessions, Sponsors
+ https://www.oliverdavies.uk/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors
+ https://www.oliverdavies.uk/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors
+ Mon, 15 May 2017 00:00:00 +0100
+
+
+In less than two months time, DrupalCamp Bristol will be back for our third year! (July seems to come around quicker each year). This is this year’s schedule and venues:
+
+
+
+
+ -
+
Fixing Drupal SimpleTest issues inside Docker Containers
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ Fri, 05 May 2017 00:00:00 +0100
+ I’ve been a Drupal VM user for a long time, but lately I’ve been using a combination Drupal VM and Docker for my local development environment. There were a couple of issues preventing me from completely switching to Docker - one of which being that when I tried running of my Simpletest tests, a lot of them would fail where they would pass when run within Drupal VM.
+
+Here’s an excerpt from my docker-compose.yml
file:
+
+
+ -
+
Simplifying Drupal Migrations with xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ Tue, 03 May 2016 00:00:00 +0100
+ How to use the xautoload module to autoload migration classes within your Drupal 7 migration modules.
+
+
+ -
+
Announcing the Drupal VM Generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ Mon, 15 Feb 2016 00:00:00 +0000
+ For the past few weeks I’ve been working on a personal side project, based on Drupal VM. It’s called the Drupal VM Generator , and over the weekend I’ve added the final features and fixed the remaining issues, and tagged the 1.0.0 release.
+
+
+ -
+
Programmatically Load an Entityform in Drupal 7
+ https://www.oliverdavies.uk/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7
+ https://www.oliverdavies.uk/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7
+ Tue, 22 Dec 2015 00:00:00 +0000
+ I recently had my first experience using the Entityform module in a project. It was quite easy to configure with different form types, but then I needed to embed the form into an overlay. I was expecting to use the drupal_get_form()
function and render it, but this didn’t work.
+
+Here are the steps that I took to be able to load, render and embed the form.
+
+
+ -
+
How to Define a Minimum Drupal Core Version
+ https://www.oliverdavies.uk/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version
+ https://www.oliverdavies.uk/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version
+ Fri, 03 Apr 2015 00:00:00 +0100
+
+
+ -
+
Include a Local Drupal Settings file for Environment Configuration and Overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ Sat, 20 Dec 2014 00:00:00 +0000
+ How to create and include a local settings file to define and override environment-specific variables, and keep sensitive things like your database credentials and API keys safe.
+
+
+ -
+
Include environment-specific settings files on Pantheon
+ https://www.oliverdavies.uk/blog/2014/11/27/pantheon-settings-files
+ https://www.oliverdavies.uk/blog/2014/11/27/pantheon-settings-files
+ Thu, 27 Nov 2014 00:00:00 +0000
+ I was recently doing some work on a site hosted on Pantheon and came across an issue, for which part of the suggested fix was to ensure that the $base_url
variable was explicitly defined within settings.php (this is also best practice on all Drupal sites).
+
+The way that was recommended was by using a switch()
function based on Pantheon's environment variable. For example:
+
+
+ -
+
Using Remote Files when Developing Locally with Stage File Proxy Module
+ https://www.oliverdavies.uk/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module
+ https://www.oliverdavies.uk/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module
+ Thu, 20 Nov 2014 00:00:00 +0000
+ How to install and configure the Stage File Proxy module to serve remote images on your local Drupal site.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-planet/index.html b/docs/blog/tags/drupal-planet/index.html
new file mode 100644
index 00000000..18a17f5b
--- /dev/null
+++ b/docs/blog/tags/drupal-planet/index.html
@@ -0,0 +1,588 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-planet"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-theming.xml b/docs/blog/tags/drupal-theming.xml
new file mode 100644
index 00000000..ac049983
--- /dev/null
+++ b/docs/blog/tags/drupal-theming.xml
@@ -0,0 +1,32 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Writing a .info file for a Drupal 7 theme
+ https://www.oliverdavies.uk/blog/2012/05/23/writing-info-file-drupal-7-theme
+ https://www.oliverdavies.uk/blog/2012/05/23/writing-info-file-drupal-7-theme
+ Wed, 23 May 2012 00:00:00 +0100
+ An example .info file for a Drupal 7 theme.
+
+
+ -
+
Quickly Create Zen Subthemes Using Zenophile
+ https://www.oliverdavies.uk/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile
+ https://www.oliverdavies.uk/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile
+ Mon, 10 May 2010 00:00:00 +0100
+
+
+ -
+
Style Drupal 6's Taxonomy Lists with PHP, CSS and jQuery
+ https://www.oliverdavies.uk/blog/2010/04/05/style-drupal-6s-taxonomy-lists-php-css-and-jquery
+ https://www.oliverdavies.uk/blog/2010/04/05/style-drupal-6s-taxonomy-lists-php-css-and-jquery
+ Mon, 05 Apr 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-theming/index.html b/docs/blog/tags/drupal-theming/index.html
new file mode 100644
index 00000000..1ca8500f
--- /dev/null
+++ b/docs/blog/tags/drupal-theming/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-theming"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-vm-generator.xml b/docs/blog/tags/drupal-vm-generator.xml
new file mode 100644
index 00000000..6b3c37af
--- /dev/null
+++ b/docs/blog/tags/drupal-vm-generator.xml
@@ -0,0 +1,26 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Drupal VM Generator 2.9.1 Released
+ https://www.oliverdavies.uk/blog/2016/12/30/drupal-vm-generator-291-released
+ https://www.oliverdavies.uk/blog/2016/12/30/drupal-vm-generator-291-released
+ Fri, 30 Dec 2016 00:00:00 +0000
+ I spent some time yesterday working on the Drupal VM Generator , and have released versions 2.8.1, 2.9.0 and 2.9.1.
+
+
+ -
+
Announcing the Drupal VM Generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ Mon, 15 Feb 2016 00:00:00 +0000
+ For the past few weeks I’ve been working on a personal side project, based on Drupal VM. It’s called the Drupal VM Generator , and over the weekend I’ve added the final features and fixed the remaining issues, and tagged the 1.0.0 release.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-vm-generator/index.html b/docs/blog/tags/drupal-vm-generator/index.html
new file mode 100644
index 00000000..218bfc2b
--- /dev/null
+++ b/docs/blog/tags/drupal-vm-generator/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-vm-generator"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal-vm.xml b/docs/blog/tags/drupal-vm.xml
new file mode 100644
index 00000000..ef73e9d7
--- /dev/null
+++ b/docs/blog/tags/drupal-vm.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Announcing the Drupal VM Generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ Mon, 15 Feb 2016 00:00:00 +0000
+ For the past few weeks I’ve been working on a personal side project, based on Drupal VM. It’s called the Drupal VM Generator , and over the weekend I’ve added the final features and fixed the remaining issues, and tagged the 1.0.0 release.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal-vm/index.html b/docs/blog/tags/drupal-vm/index.html
new file mode 100644
index 00000000..d657733c
--- /dev/null
+++ b/docs/blog/tags/drupal-vm/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal-vm"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupal.xml b/docs/blog/tags/drupal.xml
new file mode 100644
index 00000000..c91596f1
--- /dev/null
+++ b/docs/blog/tags/drupal.xml
@@ -0,0 +1,107 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Turning Your Custom Drupal Module into a Feature
+ https://www.oliverdavies.uk/blog/2017/05/20/turning-drupal-module-into-feature
+ https://www.oliverdavies.uk/blog/2017/05/20/turning-drupal-module-into-feature
+ Sat, 20 May 2017 00:00:00 +0100
+ Yesterday I was fixing a bug in an inherited Drupal 7 custom module, and I decided that I was going to add some tests to ensure that the bug was fixed and doesn’t get accidentially re-introduced in the future. The test though required me to have a particular content type and fields which are specific to this site, so weren’t present within the standard installation profile used to run tests.
+
+I decided to convert the custom module into a Feature so that the content type and it’s fields could be added to it, and therefore present on the testing site once the module is installed.
+
+To do this, I needed to expose the module to the Features API.
+
+
+ -
+
DrupalCamp Bristol 2017 - Early Bird Tickets, Call for Sessions, Sponsors
+ https://www.oliverdavies.uk/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors
+ https://www.oliverdavies.uk/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors
+ Mon, 15 May 2017 00:00:00 +0100
+
+
+In less than two months time, DrupalCamp Bristol will be back for our third year! (July seems to come around quicker each year). This is this year’s schedule and venues:
+
+
+
+
+ -
+
Fixing Drupal SimpleTest issues inside Docker Containers
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ Fri, 05 May 2017 00:00:00 +0100
+ I’ve been a Drupal VM user for a long time, but lately I’ve been using a combination Drupal VM and Docker for my local development environment. There were a couple of issues preventing me from completely switching to Docker - one of which being that when I tried running of my Simpletest tests, a lot of them would fail where they would pass when run within Drupal VM.
+
+Here’s an excerpt from my docker-compose.yml
file:
+
+
+ -
+
Simplifying Drupal Migrations with xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ Tue, 03 May 2016 00:00:00 +0100
+ How to use the xautoload module to autoload migration classes within your Drupal 7 migration modules.
+
+
+ -
+
Announcing the Drupal VM Generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ Mon, 15 Feb 2016 00:00:00 +0000
+ For the past few weeks I’ve been working on a personal side project, based on Drupal VM. It’s called the Drupal VM Generator , and over the weekend I’ve added the final features and fixed the remaining issues, and tagged the 1.0.0 release.
+
+
+ -
+
Programmatically Load an Entityform in Drupal 7
+ https://www.oliverdavies.uk/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7
+ https://www.oliverdavies.uk/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7
+ Tue, 22 Dec 2015 00:00:00 +0000
+ I recently had my first experience using the Entityform module in a project. It was quite easy to configure with different form types, but then I needed to embed the form into an overlay. I was expecting to use the drupal_get_form()
function and render it, but this didn’t work.
+
+Here are the steps that I took to be able to load, render and embed the form.
+
+
+ -
+
How to Define a Minimum Drupal Core Version
+ https://www.oliverdavies.uk/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version
+ https://www.oliverdavies.uk/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version
+ Fri, 03 Apr 2015 00:00:00 +0100
+
+
+ -
+
Include a Local Drupal Settings file for Environment Configuration and Overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ Sat, 20 Dec 2014 00:00:00 +0000
+ How to create and include a local settings file to define and override environment-specific variables, and keep sensitive things like your database credentials and API keys safe.
+
+
+ -
+
Include environment-specific settings files on Pantheon
+ https://www.oliverdavies.uk/blog/2014/11/27/pantheon-settings-files
+ https://www.oliverdavies.uk/blog/2014/11/27/pantheon-settings-files
+ Thu, 27 Nov 2014 00:00:00 +0000
+ I was recently doing some work on a site hosted on Pantheon and came across an issue, for which part of the suggested fix was to ensure that the $base_url
variable was explicitly defined within settings.php (this is also best practice on all Drupal sites).
+
+The way that was recommended was by using a switch()
function based on Pantheon's environment variable. For example:
+
+
+ -
+
Using Remote Files when Developing Locally with Stage File Proxy Module
+ https://www.oliverdavies.uk/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module
+ https://www.oliverdavies.uk/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module
+ Thu, 20 Nov 2014 00:00:00 +0000
+ How to install and configure the Stage File Proxy module to serve remote images on your local Drupal site.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupal/index.html b/docs/blog/tags/drupal/index.html
new file mode 100644
index 00000000..33f91bc7
--- /dev/null
+++ b/docs/blog/tags/drupal/index.html
@@ -0,0 +1,548 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupal"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupalcamp-bristol.xml b/docs/blog/tags/drupalcamp-bristol.xml
new file mode 100644
index 00000000..1a4965fe
--- /dev/null
+++ b/docs/blog/tags/drupalcamp-bristol.xml
@@ -0,0 +1,26 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
DrupalCamp Bristol 2017 - Early Bird Tickets, Call for Sessions, Sponsors
+ https://www.oliverdavies.uk/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors
+ https://www.oliverdavies.uk/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors
+ Mon, 15 May 2017 00:00:00 +0100
+
+
+In less than two months time, DrupalCamp Bristol will be back for our third year! (July seems to come around quicker each year). This is this year’s schedule and venues:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupalcamp-bristol/index.html b/docs/blog/tags/drupalcamp-bristol/index.html
new file mode 100644
index 00000000..827ca7e2
--- /dev/null
+++ b/docs/blog/tags/drupalcamp-bristol/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupalcamp-bristol"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupalcamp-london.xml b/docs/blog/tags/drupalcamp-london.xml
new file mode 100644
index 00000000..90dc4657
--- /dev/null
+++ b/docs/blog/tags/drupalcamp-london.xml
@@ -0,0 +1,34 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
2014
+ https://www.oliverdavies.uk/blog/2015/03/20/2014
+ https://www.oliverdavies.uk/blog/2015/03/20/2014
+ Fri, 20 Mar 2015 20:14:00 +0000
+ A lot happened in 2014. Here are some of the main things that I'd like to highlight.
+
+
+ -
+
DrupalCamp London: What is Git Flow?
+ https://www.oliverdavies.uk/blog/2014/03/03/what-git-flow
+ https://www.oliverdavies.uk/blog/2014/03/03/what-git-flow
+ Mon, 03 Mar 2014 00:00:00 +0000
+ Here are my slides from my "What is Git Flow?" session at DrupalCamp London .
+
+
+ -
+
DrupalCamp London 2014
+ https://www.oliverdavies.uk/blog/2014/02/09/drupalcamp-london-2014
+ https://www.oliverdavies.uk/blog/2014/02/09/drupalcamp-london-2014
+ Sun, 09 Feb 2014 00:00:00 +0000
+ It's all booked, I'm going to be attending DrupalCamp London this year, my first DrupalCamp!
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupalcamp-london/index.html b/docs/blog/tags/drupalcamp-london/index.html
new file mode 100644
index 00000000..37e677e6
--- /dev/null
+++ b/docs/blog/tags/drupalcamp-london/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupalcamp-london"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupalcamp-north.xml b/docs/blog/tags/drupalcamp-north.xml
new file mode 100644
index 00000000..1a7aa9f9
--- /dev/null
+++ b/docs/blog/tags/drupalcamp-north.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Sculpin and Twig Resources
+ https://www.oliverdavies.uk/blog/2015/07/19/sculpin-twig-resources
+ https://www.oliverdavies.uk/blog/2015/07/19/sculpin-twig-resources
+ Sun, 19 Jul 2015 01:00:00 +0100
+ Here’s a list of resources that I compiled whilst preparing for my Sculpin and Twig talk at DrupalCamp North .
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupalcamp-north/index.html b/docs/blog/tags/drupalcamp-north/index.html
new file mode 100644
index 00000000..91afa10f
--- /dev/null
+++ b/docs/blog/tags/drupalcamp-north/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupalcamp-north"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupalcamp.xml b/docs/blog/tags/drupalcamp.xml
new file mode 100644
index 00000000..de615bf6
--- /dev/null
+++ b/docs/blog/tags/drupalcamp.xml
@@ -0,0 +1,34 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
DrupalCamp Bristol 2017 - Early Bird Tickets, Call for Sessions, Sponsors
+ https://www.oliverdavies.uk/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors
+ https://www.oliverdavies.uk/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors
+ Mon, 15 May 2017 00:00:00 +0100
+
+
+In less than two months time, DrupalCamp Bristol will be back for our third year! (July seems to come around quicker each year). This is this year’s schedule and venues:
+
+
+
+
+ -
+
Sculpin and Twig Resources
+ https://www.oliverdavies.uk/blog/2015/07/19/sculpin-twig-resources
+ https://www.oliverdavies.uk/blog/2015/07/19/sculpin-twig-resources
+ Sun, 19 Jul 2015 01:00:00 +0100
+ Here’s a list of resources that I compiled whilst preparing for my Sculpin and Twig talk at DrupalCamp North .
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupalcamp/index.html b/docs/blog/tags/drupalcamp/index.html
new file mode 100644
index 00000000..422943da
--- /dev/null
+++ b/docs/blog/tags/drupalcamp/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupalcamp"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drupalcon.xml b/docs/blog/tags/drupalcon.xml
new file mode 100644
index 00000000..f7973e88
--- /dev/null
+++ b/docs/blog/tags/drupalcon.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Going to DrupalCon
+ https://www.oliverdavies.uk/blog/2013/07/26/going-drupalcon
+ https://www.oliverdavies.uk/blog/2013/07/26/going-drupalcon
+ Fri, 26 Jul 2013 00:00:00 +0100
+ Precedent are sending myself and two of our other Drupal Developers to Drupalcon Prague .
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drupalcon/index.html b/docs/blog/tags/drupalcon/index.html
new file mode 100644
index 00000000..7d4ccec5
--- /dev/null
+++ b/docs/blog/tags/drupalcon/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drupalcon"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drush-make.xml b/docs/blog/tags/drush-make.xml
new file mode 100644
index 00000000..d6e163f3
--- /dev/null
+++ b/docs/blog/tags/drush-make.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
drush make drupalbristol
+ https://www.oliverdavies.uk/blog/2014/07/02/drush-make-drupalbristol
+ https://www.oliverdavies.uk/blog/2014/07/02/drush-make-drupalbristol
+ Wed, 02 Jul 2014 00:00:00 +0100
+ Here are my slides from this month's talk night at the Drupal Bristol user group .
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drush-make/index.html b/docs/blog/tags/drush-make/index.html
new file mode 100644
index 00000000..8ba7b48c
--- /dev/null
+++ b/docs/blog/tags/drush-make/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drush-make"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/drush.xml b/docs/blog/tags/drush.xml
new file mode 100644
index 00000000..1b00a123
--- /dev/null
+++ b/docs/blog/tags/drush.xml
@@ -0,0 +1,56 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Updating Features and Adding Components Using Drush
+ https://www.oliverdavies.uk/blog/2014/10/21/updating-features-and-adding-components-using-drush
+ https://www.oliverdavies.uk/blog/2014/10/21/updating-features-and-adding-components-using-drush
+ Tue, 21 Oct 2014 00:00:00 +0100
+ If you use the Features module to manage your Drupal configuration, it can be time consuming to update features through the UI, especially if you are working on a remote server and need to keep downloading and uploading files.
+
+If you re-create a feature through the UI, you'll be prompted to download a new archive of the feature in its entirety onto your local computer. You could either commit this into a local repository and then pull it remotely, or use a tool such as SCP to upload the archive onto the server and commit it from there. You can simplify this process by using Drush .
+
+
+ -
+
drush make drupalbristol
+ https://www.oliverdavies.uk/blog/2014/07/02/drush-make-drupalbristol
+ https://www.oliverdavies.uk/blog/2014/07/02/drush-make-drupalbristol
+ Wed, 02 Jul 2014 00:00:00 +0100
+ Here are my slides from this month's talk night at the Drupal Bristol user group .
+
+
+ -
+
Download Different Versions of Drupal with Drush
+ https://www.oliverdavies.uk/blog/2013/12/31/download-different-versions-drupal-drush
+ https://www.oliverdavies.uk/blog/2013/12/31/download-different-versions-drupal-drush
+ Tue, 31 Dec 2013 00:00:00 +0000
+ If you use Drush , it's likely that you've used the drush pm-download
(or drush dl
for short) command to start a new project. This command downloads projects from Drupal.org, but if you don't specify a project or type "drush dl drupal", the command will download the current stable version of Drupal core. Currently, this will be Drupal 7 with that being the current stable version of core at the time of writing this post.
+
+But what if you don't want Drupal 7?
+
+
+ -
+
Don't Bootstrap Drupal, Use Drush
+ https://www.oliverdavies.uk/blog/2013/11/19/dont-bootstrap-drupal-use-drush
+ https://www.oliverdavies.uk/blog/2013/11/19/dont-bootstrap-drupal-use-drush
+ Tue, 19 Nov 2013 00:00:00 +0000
+ There are times when doing Drupal development when you need to run a custom PHP script, maybe moving data from one field to another, that doesn't warrant the time and effort to create a custom module. In this scenario, it would be quicker to write a .php script and bootstrap Drupal to gain access to functions like node_load()
and db_query()
.
+
+To bootstrap Drupal, you would need to add some additional lines of code to the stop of your script. Here is an alternative way.
+
+
+ -
+
Create a Zen Sub-theme Using Drush
+ https://www.oliverdavies.uk/blog/2013/09/06/create-a-zen-sub-theme-using-drush
+ https://www.oliverdavies.uk/blog/2013/09/06/create-a-zen-sub-theme-using-drush
+ Fri, 06 Sep 2013 00:00:00 +0100
+ How to use Drush to quickly build a new sub-theme of Zen .
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/drush/index.html b/docs/blog/tags/drush/index.html
new file mode 100644
index 00000000..583d28a9
--- /dev/null
+++ b/docs/blog/tags/drush/index.html
@@ -0,0 +1,220 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "drush"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/entity-api.xml b/docs/blog/tags/entity-api.xml
new file mode 100644
index 00000000..e4514871
--- /dev/null
+++ b/docs/blog/tags/entity-api.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create Multigroups in Drupal 7 using Field Collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ Sun, 28 Aug 2011 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/entity-api/index.html b/docs/blog/tags/entity-api/index.html
new file mode 100644
index 00000000..1eda6ad6
--- /dev/null
+++ b/docs/blog/tags/entity-api/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "entity-api"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/entityform.xml b/docs/blog/tags/entityform.xml
new file mode 100644
index 00000000..974bea48
--- /dev/null
+++ b/docs/blog/tags/entityform.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Programmatically Load an Entityform in Drupal 7
+ https://www.oliverdavies.uk/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7
+ https://www.oliverdavies.uk/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7
+ Tue, 22 Dec 2015 00:00:00 +0000
+ I recently had my first experience using the Entityform module in a project. It was quite easy to configure with different form types, but then I needed to embed the form into an overlay. I was expecting to use the drupal_get_form()
function and render it, but this didn’t work.
+
+Here are the steps that I took to be able to load, render and embed the form.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/entityform/index.html b/docs/blog/tags/entityform/index.html
new file mode 100644
index 00000000..56e313ec
--- /dev/null
+++ b/docs/blog/tags/entityform/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "entityform"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/fancy-slide.xml b/docs/blog/tags/fancy-slide.xml
new file mode 100644
index 00000000..0f8884a6
--- /dev/null
+++ b/docs/blog/tags/fancy-slide.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Slideshow of Multiple Images Using Fancy Slide
+ https://www.oliverdavies.uk/blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide
+ https://www.oliverdavies.uk/blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide
+ Tue, 25 May 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/fancy-slide/index.html b/docs/blog/tags/fancy-slide/index.html
new file mode 100644
index 00000000..9d555b0d
--- /dev/null
+++ b/docs/blog/tags/fancy-slide/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "fancy-slide"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/features.xml b/docs/blog/tags/features.xml
new file mode 100644
index 00000000..49de4bb3
--- /dev/null
+++ b/docs/blog/tags/features.xml
@@ -0,0 +1,32 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Turning Your Custom Drupal Module into a Feature
+ https://www.oliverdavies.uk/blog/2017/05/20/turning-drupal-module-into-feature
+ https://www.oliverdavies.uk/blog/2017/05/20/turning-drupal-module-into-feature
+ Sat, 20 May 2017 00:00:00 +0100
+ Yesterday I was fixing a bug in an inherited Drupal 7 custom module, and I decided that I was going to add some tests to ensure that the bug was fixed and doesn’t get accidentially re-introduced in the future. The test though required me to have a particular content type and fields which are specific to this site, so weren’t present within the standard installation profile used to run tests.
+
+I decided to convert the custom module into a Feature so that the content type and it’s fields could be added to it, and therefore present on the testing site once the module is installed.
+
+To do this, I needed to expose the module to the Features API.
+
+
+ -
+
Updating Features and Adding Components Using Drush
+ https://www.oliverdavies.uk/blog/2014/10/21/updating-features-and-adding-components-using-drush
+ https://www.oliverdavies.uk/blog/2014/10/21/updating-features-and-adding-components-using-drush
+ Tue, 21 Oct 2014 00:00:00 +0100
+ If you use the Features module to manage your Drupal configuration, it can be time consuming to update features through the UI, especially if you are working on a remote server and need to keep downloading and uploading files.
+
+If you re-create a feature through the UI, you'll be prompted to download a new archive of the feature in its entirety onto your local computer. You could either commit this into a local repository and then pull it remotely, or use a tool such as SCP to upload the archive onto the server and commit it from there. You can simplify this process by using Drush .
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/features/index.html b/docs/blog/tags/features/index.html
new file mode 100644
index 00000000..fbd92237
--- /dev/null
+++ b/docs/blog/tags/features/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "features"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/feeds.xml b/docs/blog/tags/feeds.xml
new file mode 100644
index 00000000..95c2c731
--- /dev/null
+++ b/docs/blog/tags/feeds.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Flickr Photo Gallery Using Feeds, CCK and Views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ Mon, 28 Jun 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/feeds/index.html b/docs/blog/tags/feeds/index.html
new file mode 100644
index 00000000..60f2d55e
--- /dev/null
+++ b/docs/blog/tags/feeds/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "feeds"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/field-collection.xml b/docs/blog/tags/field-collection.xml
new file mode 100644
index 00000000..8a423c16
--- /dev/null
+++ b/docs/blog/tags/field-collection.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create Multigroups in Drupal 7 using Field Collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ Sun, 28 Aug 2011 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/field-collection/index.html b/docs/blog/tags/field-collection/index.html
new file mode 100644
index 00000000..0a4d2556
--- /dev/null
+++ b/docs/blog/tags/field-collection/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "field-collection"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/fields.xml b/docs/blog/tags/fields.xml
new file mode 100644
index 00000000..771fb591
--- /dev/null
+++ b/docs/blog/tags/fields.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Create Multigroups in Drupal 7 using Field Collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ Sun, 28 Aug 2011 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/fields/index.html b/docs/blog/tags/fields/index.html
new file mode 100644
index 00000000..730a997c
--- /dev/null
+++ b/docs/blog/tags/fields/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "fields"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/filefield.xml b/docs/blog/tags/filefield.xml
new file mode 100644
index 00000000..7dd2b130
--- /dev/null
+++ b/docs/blog/tags/filefield.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Flickr Photo Gallery Using Feeds, CCK and Views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ Mon, 28 Jun 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/filefield/index.html b/docs/blog/tags/filefield/index.html
new file mode 100644
index 00000000..bc65d2d9
--- /dev/null
+++ b/docs/blog/tags/filefield/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "filefield"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/flickr.xml b/docs/blog/tags/flickr.xml
new file mode 100644
index 00000000..3053173d
--- /dev/null
+++ b/docs/blog/tags/flickr.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Flickr Photo Gallery Using Feeds, CCK and Views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ Mon, 28 Jun 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/flickr/index.html b/docs/blog/tags/flickr/index.html
new file mode 100644
index 00000000..851d3a20
--- /dev/null
+++ b/docs/blog/tags/flickr/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "flickr"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/fonts.xml b/docs/blog/tags/fonts.xml
new file mode 100644
index 00000000..b457d48b
--- /dev/null
+++ b/docs/blog/tags/fonts.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Include CSS Fonts by Using a SASS each Loop
+ https://www.oliverdavies.uk/blog/2014/11/18/include-css-fonts-using-sass-each-loop
+ https://www.oliverdavies.uk/blog/2014/11/18/include-css-fonts-using-sass-each-loop
+ Tue, 18 Nov 2014 00:00:00 +0000
+ How to use an @each loop in SASS to quickly include multiple font files within your stylesheet.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/fonts/index.html b/docs/blog/tags/fonts/index.html
new file mode 100644
index 00000000..d63e8bfd
--- /dev/null
+++ b/docs/blog/tags/fonts/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "fonts"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/form-api.xml b/docs/blog/tags/form-api.xml
new file mode 100644
index 00000000..3ee38e69
--- /dev/null
+++ b/docs/blog/tags/form-api.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
How to add a date popup calendar onto a custom form
+ https://www.oliverdavies.uk/blog/2012/05/23/add-date-popup-calendar-custom-form
+ https://www.oliverdavies.uk/blog/2012/05/23/add-date-popup-calendar-custom-form
+ Wed, 23 May 2012 00:00:00 +0100
+ How to use a date popup calendar within your custom module.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/form-api/index.html b/docs/blog/tags/form-api/index.html
new file mode 100644
index 00000000..5df0c353
--- /dev/null
+++ b/docs/blog/tags/form-api/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "form-api"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/forms.xml b/docs/blog/tags/forms.xml
new file mode 100644
index 00000000..e32fe7ea
--- /dev/null
+++ b/docs/blog/tags/forms.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
How to add a date popup calendar onto a custom form
+ https://www.oliverdavies.uk/blog/2012/05/23/add-date-popup-calendar-custom-form
+ https://www.oliverdavies.uk/blog/2012/05/23/add-date-popup-calendar-custom-form
+ Wed, 23 May 2012 00:00:00 +0100
+ How to use a date popup calendar within your custom module.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/forms/index.html b/docs/blog/tags/forms/index.html
new file mode 100644
index 00000000..88daa15e
--- /dev/null
+++ b/docs/blog/tags/forms/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "forms"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/git-flow.xml b/docs/blog/tags/git-flow.xml
new file mode 100644
index 00000000..c91ea1cf
--- /dev/null
+++ b/docs/blog/tags/git-flow.xml
@@ -0,0 +1,26 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
DrupalCamp London: What is Git Flow?
+ https://www.oliverdavies.uk/blog/2014/03/03/what-git-flow
+ https://www.oliverdavies.uk/blog/2014/03/03/what-git-flow
+ Mon, 03 Mar 2014 00:00:00 +0000
+ Here are my slides from my "What is Git Flow?" session at DrupalCamp London .
+
+
+ -
+
DrupalCamp London 2014
+ https://www.oliverdavies.uk/blog/2014/02/09/drupalcamp-london-2014
+ https://www.oliverdavies.uk/blog/2014/02/09/drupalcamp-london-2014
+ Sun, 09 Feb 2014 00:00:00 +0000
+ It's all booked, I'm going to be attending DrupalCamp London this year, my first DrupalCamp!
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/git-flow/index.html b/docs/blog/tags/git-flow/index.html
new file mode 100644
index 00000000..dc743786
--- /dev/null
+++ b/docs/blog/tags/git-flow/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "git-flow"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/git.xml b/docs/blog/tags/git.xml
new file mode 100644
index 00000000..f22e9c52
--- /dev/null
+++ b/docs/blog/tags/git.xml
@@ -0,0 +1,67 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Updating Forked Repositories on GitHub
+ https://www.oliverdavies.uk/blog/2015/06/18/updating-forked-repositories-on-github
+ https://www.oliverdavies.uk/blog/2015/06/18/updating-forked-repositories-on-github
+ Thu, 18 Jun 2015 12:35:00 +0100
+
+
+ -
+
git format-patch is your Friend
+ https://www.oliverdavies.uk/blog/2014/05/21/git-format-patch
+ https://www.oliverdavies.uk/blog/2014/05/21/git-format-patch
+ Wed, 21 May 2014 00:00:00 +0100
+ An explanation of the "git format-patch" command, and how it could be used in Drupal's Git workflow.
+
+
+ -
+
DrupalCamp London: What is Git Flow?
+ https://www.oliverdavies.uk/blog/2014/03/03/what-git-flow
+ https://www.oliverdavies.uk/blog/2014/03/03/what-git-flow
+ Mon, 03 Mar 2014 00:00:00 +0000
+ Here are my slides from my "What is Git Flow?" session at DrupalCamp London .
+
+
+ -
+
DrupalCamp London 2014
+ https://www.oliverdavies.uk/blog/2014/02/09/drupalcamp-london-2014
+ https://www.oliverdavies.uk/blog/2014/02/09/drupalcamp-london-2014
+ Sun, 09 Feb 2014 00:00:00 +0000
+ It's all booked, I'm going to be attending DrupalCamp London this year, my first DrupalCamp!
+
+
+ -
+
Some Useful Git Aliases
+ https://www.oliverdavies.uk/blog/2014/01/15/some-useful-git-aliases
+ https://www.oliverdavies.uk/blog/2014/01/15/some-useful-git-aliases
+ Wed, 15 Jan 2014 00:00:00 +0000
+ Here are some bash aliases that I use and find helpful for quickly writing Git and Git Flow commands.
+
+
+ -
+
Quickly Apply Patches Using Git and curl or wget
+ https://www.oliverdavies.uk/blog/2013/12/24/quickly-apply-patches-using-git-and-curl-or-wget
+ https://www.oliverdavies.uk/blog/2013/12/24/quickly-apply-patches-using-git-and-curl-or-wget
+ Tue, 24 Dec 2013 00:00:00 +0000
+ Testing a patch file is usually a two-step process. First you download the patch file from the source, and then you run a separate command to apply it.
+
+You can save time and typing by running the two commands on one line:
+
+
+ -
+
Display Git Branch or Tag Names in your Bash Prompt
+ https://www.oliverdavies.uk/blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt
+ https://www.oliverdavies.uk/blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt
+ Sat, 27 Apr 2013 00:00:00 +0100
+ Whilst watching Drupalize.me 's recent Introduction to Git series , I thought it was useful the way that the current Git branch or tag name was displayed in the bash prompt. Here's how to do it.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/git/index.html b/docs/blog/tags/git/index.html
new file mode 100644
index 00000000..b927adef
--- /dev/null
+++ b/docs/blog/tags/git/index.html
@@ -0,0 +1,236 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "git"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/github.xml b/docs/blog/tags/github.xml
new file mode 100644
index 00000000..8c6b8207
--- /dev/null
+++ b/docs/blog/tags/github.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Updating Forked Repositories on GitHub
+ https://www.oliverdavies.uk/blog/2015/06/18/updating-forked-repositories-on-github
+ https://www.oliverdavies.uk/blog/2015/06/18/updating-forked-repositories-on-github
+ Thu, 18 Jun 2015 12:35:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/github/index.html b/docs/blog/tags/github/index.html
new file mode 100644
index 00000000..98817415
--- /dev/null
+++ b/docs/blog/tags/github/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "github"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/gmail.xml b/docs/blog/tags/gmail.xml
new file mode 100644
index 00000000..8655390d
--- /dev/null
+++ b/docs/blog/tags/gmail.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Building Gmail Filters with PHP
+ https://www.oliverdavies.uk/blog/2016/07/15/building-gmail-filters-with-php
+ https://www.oliverdavies.uk/blog/2016/07/15/building-gmail-filters-with-php
+ Fri, 15 Jul 2016 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/gmail/index.html b/docs/blog/tags/gmail/index.html
new file mode 100644
index 00000000..7506ff63
--- /dev/null
+++ b/docs/blog/tags/gmail/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "gmail"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/gulp.xml b/docs/blog/tags/gulp.xml
new file mode 100644
index 00000000..71502ed5
--- /dev/null
+++ b/docs/blog/tags/gulp.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Easier Sculpin Commands with Composer and NPM Scripts
+ https://www.oliverdavies.uk/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts
+ https://www.oliverdavies.uk/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts
+ Sat, 07 Jan 2017 00:00:00 +0000
+ In this video, I show you how I've simplied my Sculpin and Gulp workflow using custom Composer and NPM scripts.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/gulp/index.html b/docs/blog/tags/gulp/index.html
new file mode 100644
index 00000000..d18ce01b
--- /dev/null
+++ b/docs/blog/tags/gulp/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "gulp"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/image-caption.xml b/docs/blog/tags/image-caption.xml
new file mode 100644
index 00000000..26d88e1f
--- /dev/null
+++ b/docs/blog/tags/image-caption.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Review of the Image Caption Module
+ https://www.oliverdavies.uk/blog/2010/08/20/review-image-caption-module
+ https://www.oliverdavies.uk/blog/2010/08/20/review-image-caption-module
+ Fri, 20 Aug 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/image-caption/index.html b/docs/blog/tags/image-caption/index.html
new file mode 100644
index 00000000..726d0f9f
--- /dev/null
+++ b/docs/blog/tags/image-caption/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "image-caption"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/imagecache.xml b/docs/blog/tags/imagecache.xml
new file mode 100644
index 00000000..7f517f83
--- /dev/null
+++ b/docs/blog/tags/imagecache.xml
@@ -0,0 +1,31 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Flickr Photo Gallery Using Feeds, CCK and Views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ Mon, 28 Jun 2010 00:00:00 +0100
+
+
+ -
+
Improve JPG Quality in Imagecache and ImageAPI
+ https://www.oliverdavies.uk/blog/2010/06/02/improve-jpg-quality-imagecache-and-imageapi
+ https://www.oliverdavies.uk/blog/2010/06/02/improve-jpg-quality-imagecache-and-imageapi
+ Wed, 02 Jun 2010 00:00:00 +0100
+
+
+ -
+
Using ImageCache and ImageCrop for my Portfolio
+ https://www.oliverdavies.uk/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio
+ https://www.oliverdavies.uk/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio
+ Wed, 28 Apr 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/imagecache/index.html b/docs/blog/tags/imagecache/index.html
new file mode 100644
index 00000000..2f1164cf
--- /dev/null
+++ b/docs/blog/tags/imagecache/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "imagecache"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/imagecrop.xml b/docs/blog/tags/imagecrop.xml
new file mode 100644
index 00000000..0b2dbf6b
--- /dev/null
+++ b/docs/blog/tags/imagecrop.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Using ImageCache and ImageCrop for my Portfolio
+ https://www.oliverdavies.uk/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio
+ https://www.oliverdavies.uk/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio
+ Wed, 28 Apr 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/imagecrop/index.html b/docs/blog/tags/imagecrop/index.html
new file mode 100644
index 00000000..33088742
--- /dev/null
+++ b/docs/blog/tags/imagecrop/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "imagecrop"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/imagefield-import.xml b/docs/blog/tags/imagefield-import.xml
new file mode 100644
index 00000000..4e1bfe82
--- /dev/null
+++ b/docs/blog/tags/imagefield-import.xml
@@ -0,0 +1,24 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Imagefield Import Archive
+ https://www.oliverdavies.uk/blog/2011/05/23/imagefield-import-archive
+ https://www.oliverdavies.uk/blog/2011/05/23/imagefield-import-archive
+ Mon, 23 May 2011 00:00:00 +0100
+
+
+ -
+
Quickly Import Multiples Images Using the Imagefield_Import Module
+ https://www.oliverdavies.uk/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module
+ https://www.oliverdavies.uk/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module
+ Sat, 29 May 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/imagefield-import/index.html b/docs/blog/tags/imagefield-import/index.html
new file mode 100644
index 00000000..d47a0906
--- /dev/null
+++ b/docs/blog/tags/imagefield-import/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "imagefield-import"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/imagefield.xml b/docs/blog/tags/imagefield.xml
new file mode 100644
index 00000000..55bf02ef
--- /dev/null
+++ b/docs/blog/tags/imagefield.xml
@@ -0,0 +1,38 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Review of the Image Caption Module
+ https://www.oliverdavies.uk/blog/2010/08/20/review-image-caption-module
+ https://www.oliverdavies.uk/blog/2010/08/20/review-image-caption-module
+ Fri, 20 Aug 2010 00:00:00 +0100
+
+
+ -
+
Create a Flickr Photo Gallery Using Feeds, CCK and Views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ Mon, 28 Jun 2010 00:00:00 +0100
+
+
+ -
+
Quickly Import Multiples Images Using the Imagefield_Import Module
+ https://www.oliverdavies.uk/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module
+ https://www.oliverdavies.uk/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module
+ Sat, 29 May 2010 00:00:00 +0100
+
+
+ -
+
Using ImageCache and ImageCrop for my Portfolio
+ https://www.oliverdavies.uk/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio
+ https://www.oliverdavies.uk/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio
+ Wed, 28 Apr 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/imagefield/index.html b/docs/blog/tags/imagefield/index.html
new file mode 100644
index 00000000..0773e903
--- /dev/null
+++ b/docs/blog/tags/imagefield/index.html
@@ -0,0 +1,212 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "imagefield"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/index.html b/docs/blog/tags/index.html
new file mode 100644
index 00000000..699b7aa3
--- /dev/null
+++ b/docs/blog/tags/index.html
@@ -0,0 +1,300 @@
+
+
+
+ Tags | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tags
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/installation-profiles.xml b/docs/blog/tags/installation-profiles.xml
new file mode 100644
index 00000000..d6c7b81b
--- /dev/null
+++ b/docs/blog/tags/installation-profiles.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Writing an Article for Linux Journal
+ https://www.oliverdavies.uk/blog/2012/07/27/writing-article-linux-journal
+ https://www.oliverdavies.uk/blog/2012/07/27/writing-article-linux-journal
+ Fri, 27 Jul 2012 00:00:00 +0100
+ I'm absolutely delighted to announce that I'm going to be writing an article for Linux Journal magazine's upcoming Drupal special.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/installation-profiles/index.html b/docs/blog/tags/installation-profiles/index.html
new file mode 100644
index 00000000..9e940bb1
--- /dev/null
+++ b/docs/blog/tags/installation-profiles/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "installation-profiles"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/jenkins.xml b/docs/blog/tags/jenkins.xml
new file mode 100644
index 00000000..12596afb
--- /dev/null
+++ b/docs/blog/tags/jenkins.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Automating Sculpin Builds with Jenkins CI
+ https://www.oliverdavies.uk/blog/2015/07/21/automating-sculpin-jenkins
+ https://www.oliverdavies.uk/blog/2015/07/21/automating-sculpin-jenkins
+ Tue, 21 Jul 2015 01:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/jenkins/index.html b/docs/blog/tags/jenkins/index.html
new file mode 100644
index 00000000..70d17bae
--- /dev/null
+++ b/docs/blog/tags/jenkins/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "jenkins"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/less.xml b/docs/blog/tags/less.xml
new file mode 100644
index 00000000..dce45b01
--- /dev/null
+++ b/docs/blog/tags/less.xml
@@ -0,0 +1,25 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
How to use SASS and Compass in Drupal 7 using Sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ Thu, 06 Dec 2012 00:00:00 +0000
+ I've recently started using SASS rather than LESS to do my CSS preprocessing - namely due to its integration with Compass and it's built-in CSS3 mixins. Here are three modules that provide the ability to use SASS within Drupal.
+
+
+ -
+
Create an Omega Subtheme with LESS CSS Preprocessor using Omega Tools and Drush
+ https://www.oliverdavies.uk/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush
+ https://www.oliverdavies.uk/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush
+ Mon, 16 Apr 2012 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/less/index.html b/docs/blog/tags/less/index.html
new file mode 100644
index 00000000..aa214328
--- /dev/null
+++ b/docs/blog/tags/less/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "less"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/linux-journal.xml b/docs/blog/tags/linux-journal.xml
new file mode 100644
index 00000000..4ab4839f
--- /dev/null
+++ b/docs/blog/tags/linux-journal.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Writing an Article for Linux Journal
+ https://www.oliverdavies.uk/blog/2012/07/27/writing-article-linux-journal
+ https://www.oliverdavies.uk/blog/2012/07/27/writing-article-linux-journal
+ Fri, 27 Jul 2012 00:00:00 +0100
+ I'm absolutely delighted to announce that I'm going to be writing an article for Linux Journal magazine's upcoming Drupal special.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/linux-journal/index.html b/docs/blog/tags/linux-journal/index.html
new file mode 100644
index 00000000..f63b3d76
--- /dev/null
+++ b/docs/blog/tags/linux-journal/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "linux-journal"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/linux.xml b/docs/blog/tags/linux.xml
new file mode 100644
index 00000000..0ba27132
--- /dev/null
+++ b/docs/blog/tags/linux.xml
@@ -0,0 +1,32 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
The Quickest way to Install Sublime Text 2 in Ubuntu
+ https://www.oliverdavies.uk/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu
+ https://www.oliverdavies.uk/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu
+ Sat, 02 Mar 2013 00:00:00 +0000
+ After reading numerous blog posts about how to install Sublime Text 2 in Ubuntu , this is definitely the quickest way!
+
+
+ -
+
Installing Nagios on CentOS
+ https://www.oliverdavies.uk/blog/2012/04/17/installing-nagios-centos
+ https://www.oliverdavies.uk/blog/2012/04/17/installing-nagios-centos
+ Tue, 17 Apr 2012 00:00:00 +0100
+
+
+ -
+
How to use Authorized Keys to Create a Passwordless SSH Connection
+ https://www.oliverdavies.uk/blog/2012/02/01/use-authorized-keys-create-passwordless-ssh-connection
+ https://www.oliverdavies.uk/blog/2012/02/01/use-authorized-keys-create-passwordless-ssh-connection
+ Wed, 01 Feb 2012 00:00:00 +0000
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/linux/index.html b/docs/blog/tags/linux/index.html
new file mode 100644
index 00000000..2657232e
--- /dev/null
+++ b/docs/blog/tags/linux/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "linux"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/mac-os-x.xml b/docs/blog/tags/mac-os-x.xml
new file mode 100644
index 00000000..40008a49
--- /dev/null
+++ b/docs/blog/tags/mac-os-x.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Open Sublime Text 2 from the Mac OS X Command Line
+ https://www.oliverdavies.uk/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line
+ https://www.oliverdavies.uk/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line
+ Sat, 17 Nov 2012 00:00:00 +0000
+ How to open Sublime Text from the command line.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/mac-os-x/index.html b/docs/blog/tags/mac-os-x/index.html
new file mode 100644
index 00000000..fa51f84a
--- /dev/null
+++ b/docs/blog/tags/mac-os-x/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "mac-os-x"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/mamp.xml b/docs/blog/tags/mamp.xml
new file mode 100644
index 00000000..21b78f91
--- /dev/null
+++ b/docs/blog/tags/mamp.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create Virtual Hosts on Mac OS X Using VirtualHostX
+ https://www.oliverdavies.uk/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx
+ https://www.oliverdavies.uk/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx
+ Fri, 02 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/mamp/index.html b/docs/blog/tags/mamp/index.html
new file mode 100644
index 00000000..71132242
--- /dev/null
+++ b/docs/blog/tags/mamp/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "mamp"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/meetups.xml b/docs/blog/tags/meetups.xml
new file mode 100644
index 00000000..3bcef2c1
--- /dev/null
+++ b/docs/blog/tags/meetups.xml
@@ -0,0 +1,24 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Proctors Hosting the next Drupal Meetup
+ https://www.oliverdavies.uk/blog/2011/05/20/proctors-hosting-next-drupal-meetup
+ https://www.oliverdavies.uk/blog/2011/05/20/proctors-hosting-next-drupal-meetup
+ Fri, 20 May 2011 00:00:00 +0100
+
+
+ -
+
The Inaugural Meetup for the South Wales Drupal User Group
+ https://www.oliverdavies.uk/blog/2010/09/26/south-wales-drupal-user-group
+ https://www.oliverdavies.uk/blog/2010/09/26/south-wales-drupal-user-group
+ Sun, 26 Sep 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/meetups/index.html b/docs/blog/tags/meetups/index.html
new file mode 100644
index 00000000..e34163cc
--- /dev/null
+++ b/docs/blog/tags/meetups/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "meetups"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/mod_rewrite.xml b/docs/blog/tags/mod_rewrite.xml
new file mode 100644
index 00000000..dd102c43
--- /dev/null
+++ b/docs/blog/tags/mod_rewrite.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Forward one domain to another using mod_rewrite and .htaccess
+ https://www.oliverdavies.uk/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess
+ https://www.oliverdavies.uk/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess
+ Wed, 23 May 2012 00:00:00 +0100
+ How to use the .htaccess file to forward to a different domain.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/mod_rewrite/index.html b/docs/blog/tags/mod_rewrite/index.html
new file mode 100644
index 00000000..b8f75754
--- /dev/null
+++ b/docs/blog/tags/mod_rewrite/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "mod_rewrite"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/modules.xml b/docs/blog/tags/modules.xml
new file mode 100644
index 00000000..121116e8
--- /dev/null
+++ b/docs/blog/tags/modules.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
How to Create and Apply Patches
+ https://www.oliverdavies.uk/blog/2010/10/10/create-and-apply-patches
+ https://www.oliverdavies.uk/blog/2010/10/10/create-and-apply-patches
+ Sun, 10 Oct 2010 00:00:00 +0100
+ Earlier this year, I posted a solution to an issue on the Drupal.org issue queue. Originally, I just posted the code back onto the issue, but have now created a patch that can easily be applied to any Drupal 6 installation. Here is a run-through of the process of creating and applying a patch. In this case, I made changes to the user_pass_validate()
function that's found within modules/user/user.pages.inc
.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/modules/index.html b/docs/blog/tags/modules/index.html
new file mode 100644
index 00000000..0638cdc5
--- /dev/null
+++ b/docs/blog/tags/modules/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "modules"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/multigroup.xml b/docs/blog/tags/multigroup.xml
new file mode 100644
index 00000000..5fc4150a
--- /dev/null
+++ b/docs/blog/tags/multigroup.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create Multigroups in Drupal 7 using Field Collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections
+ Sun, 28 Aug 2011 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/multigroup/index.html b/docs/blog/tags/multigroup/index.html
new file mode 100644
index 00000000..2bcecabc
--- /dev/null
+++ b/docs/blog/tags/multigroup/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "multigroup"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/nagios.xml b/docs/blog/tags/nagios.xml
new file mode 100644
index 00000000..d27da5b2
--- /dev/null
+++ b/docs/blog/tags/nagios.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Installing Nagios on CentOS
+ https://www.oliverdavies.uk/blog/2012/04/17/installing-nagios-centos
+ https://www.oliverdavies.uk/blog/2012/04/17/installing-nagios-centos
+ Tue, 17 Apr 2012 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/nagios/index.html b/docs/blog/tags/nagios/index.html
new file mode 100644
index 00000000..304a9236
--- /dev/null
+++ b/docs/blog/tags/nagios/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "nagios"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/nginx.xml b/docs/blog/tags/nginx.xml
new file mode 100644
index 00000000..416f63b0
--- /dev/null
+++ b/docs/blog/tags/nginx.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Nginx Redirects With Query String Arguments
+ https://www.oliverdavies.uk/blog/2017/01/31/nginx-redirects-with-query-string-arguments
+ https://www.oliverdavies.uk/blog/2017/01/31/nginx-redirects-with-query-string-arguments
+ Tue, 31 Jan 2017 00:00:00 +0000
+ This is an example of how my Nginx configuration looked to redirect from an old domain to a new one, and also to redirect from the root example.com
domain to the canonical www
subdomain.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/nginx/index.html b/docs/blog/tags/nginx/index.html
new file mode 100644
index 00000000..ada3a09f
--- /dev/null
+++ b/docs/blog/tags/nginx/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "nginx"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/nodequeue.xml b/docs/blog/tags/nodequeue.xml
new file mode 100644
index 00000000..6b4710c0
--- /dev/null
+++ b/docs/blog/tags/nodequeue.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Block of Social Media Icons using CCK, Views and Nodequeue
+ https://www.oliverdavies.uk/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue
+ https://www.oliverdavies.uk/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue
+ Wed, 23 Jun 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/nodequeue/index.html b/docs/blog/tags/nodequeue/index.html
new file mode 100644
index 00000000..78baf658
--- /dev/null
+++ b/docs/blog/tags/nodequeue/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "nodequeue"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/nomensa.xml b/docs/blog/tags/nomensa.xml
new file mode 100644
index 00000000..d6c8c225
--- /dev/null
+++ b/docs/blog/tags/nomensa.xml
@@ -0,0 +1,36 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Leaving Nomensa, Joining Precedent
+ https://www.oliverdavies.uk/blog/2013/04/20/leaving-nomensa-joining-precedent
+ https://www.oliverdavies.uk/blog/2013/04/20/leaving-nomensa-joining-precedent
+ Sat, 20 Apr 2013 00:00:00 +0100
+ Yesterday was my last day working at Nomensa . Next week, I'll be starting as a Senior Developer at Precedent .
+
+
+ -
+
Accessible Bristol site launched
+ https://www.oliverdavies.uk/blog/2012/11/15/accessible-bristol-site-launched
+ https://www.oliverdavies.uk/blog/2012/11/15/accessible-bristol-site-launched
+ Thu, 15 Nov 2012 00:00:00 +0000
+ I'm happy to announce that the Accessible Bristol website was launched this week, on Drupal 7.
+
+The site has been developed over the past few months, and uses the User Relationships and Privatemsg modules to provide a community-based platform where people with an interest in accessibility can register and network with each other.
+
+
+ -
+
Install and Configure the Nomensa Accessible Media Player in Drupal
+ https://www.oliverdavies.uk/blog/2012/07/14/install-nomensa-media-player-drupal
+ https://www.oliverdavies.uk/blog/2012/07/14/install-nomensa-media-player-drupal
+ Sat, 14 Jul 2012 00:00:00 +0100
+ This week I released the first version of the Nomensa Accessible Media Player module for Drupal 7. Here's some instructions of how to install and configure it.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/nomensa/index.html b/docs/blog/tags/nomensa/index.html
new file mode 100644
index 00000000..ce518d20
--- /dev/null
+++ b/docs/blog/tags/nomensa/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "nomensa"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/oliverdavies.co.uk.xml b/docs/blog/tags/oliverdavies.co.uk.xml
new file mode 100644
index 00000000..4d180e9d
--- /dev/null
+++ b/docs/blog/tags/oliverdavies.co.uk.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Block of Social Media Icons using CCK, Views and Nodequeue
+ https://www.oliverdavies.uk/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue
+ https://www.oliverdavies.uk/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue
+ Wed, 23 Jun 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/oliverdavies.co.uk/index.html b/docs/blog/tags/oliverdavies.co.uk/index.html
new file mode 100644
index 00000000..0d0b1cad
--- /dev/null
+++ b/docs/blog/tags/oliverdavies.co.uk/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "oliverdavies.co.uk"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/omega.xml b/docs/blog/tags/omega.xml
new file mode 100644
index 00000000..e8da4110
--- /dev/null
+++ b/docs/blog/tags/omega.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Create an Omega Subtheme with LESS CSS Preprocessor using Omega Tools and Drush
+ https://www.oliverdavies.uk/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush
+ https://www.oliverdavies.uk/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush
+ Mon, 16 Apr 2012 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/omega/index.html b/docs/blog/tags/omega/index.html
new file mode 100644
index 00000000..44d889ef
--- /dev/null
+++ b/docs/blog/tags/omega/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "omega"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/pantheon.xml b/docs/blog/tags/pantheon.xml
new file mode 100644
index 00000000..0052e8df
--- /dev/null
+++ b/docs/blog/tags/pantheon.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Include environment-specific settings files on Pantheon
+ https://www.oliverdavies.uk/blog/2014/11/27/pantheon-settings-files
+ https://www.oliverdavies.uk/blog/2014/11/27/pantheon-settings-files
+ Thu, 27 Nov 2014 00:00:00 +0000
+ I was recently doing some work on a site hosted on Pantheon and came across an issue, for which part of the suggested fix was to ensure that the $base_url
variable was explicitly defined within settings.php (this is also best practice on all Drupal sites).
+
+The way that was recommended was by using a switch()
function based on Pantheon's environment variable. For example:
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/pantheon/index.html b/docs/blog/tags/pantheon/index.html
new file mode 100644
index 00000000..69905b01
--- /dev/null
+++ b/docs/blog/tags/pantheon/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "pantheon"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/patches.xml b/docs/blog/tags/patches.xml
new file mode 100644
index 00000000..ebebbd27
--- /dev/null
+++ b/docs/blog/tags/patches.xml
@@ -0,0 +1,26 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
git format-patch is your Friend
+ https://www.oliverdavies.uk/blog/2014/05/21/git-format-patch
+ https://www.oliverdavies.uk/blog/2014/05/21/git-format-patch
+ Wed, 21 May 2014 00:00:00 +0100
+ An explanation of the "git format-patch" command, and how it could be used in Drupal's Git workflow.
+
+
+ -
+
How to Create and Apply Patches
+ https://www.oliverdavies.uk/blog/2010/10/10/create-and-apply-patches
+ https://www.oliverdavies.uk/blog/2010/10/10/create-and-apply-patches
+ Sun, 10 Oct 2010 00:00:00 +0100
+ Earlier this year, I posted a solution to an issue on the Drupal.org issue queue. Originally, I just posted the code back onto the issue, but have now created a patch that can easily be applied to any Drupal 6 installation. Here is a run-through of the process of creating and applying a patch. In this case, I made changes to the user_pass_validate()
function that's found within modules/user/user.pages.inc
.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/patches/index.html b/docs/blog/tags/patches/index.html
new file mode 100644
index 00000000..a0ceea2a
--- /dev/null
+++ b/docs/blog/tags/patches/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "patches"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/personal.xml b/docs/blog/tags/personal.xml
new file mode 100644
index 00000000..7924e0b9
--- /dev/null
+++ b/docs/blog/tags/personal.xml
@@ -0,0 +1,49 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
2014
+ https://www.oliverdavies.uk/blog/2015/03/20/2014
+ https://www.oliverdavies.uk/blog/2015/03/20/2014
+ Fri, 20 Mar 2015 20:14:00 +0000
+ A lot happened in 2014. Here are some of the main things that I'd like to highlight.
+
+
+ -
+
Thanks
+ https://www.oliverdavies.uk/blog/2014/05/06/thanks
+ https://www.oliverdavies.uk/blog/2014/05/06/thanks
+ Tue, 06 May 2014 00:00:00 +0100
+ This is just a quick post to thank everyone for their comments and congratulations after my previous post about joining the Drupal Association . I’m looking forward to my first day in the job tomorrow.
+
+
+ -
+
Drupal Association
+ https://www.oliverdavies.uk/blog/2014/05/03/drupal-association
+ https://www.oliverdavies.uk/blog/2014/05/03/drupal-association
+ Sat, 03 May 2014 00:00:00 +0100
+ Today was my last day working at Precedent . Next week, I'll be starting my new job at the Drupal Association working on Drupal's home - Drupal.org .
+
+
+ -
+
Leaving Nomensa, Joining Precedent
+ https://www.oliverdavies.uk/blog/2013/04/20/leaving-nomensa-joining-precedent
+ https://www.oliverdavies.uk/blog/2013/04/20/leaving-nomensa-joining-precedent
+ Sat, 20 Apr 2013 00:00:00 +0100
+ Yesterday was my last day working at Nomensa . Next week, I'll be starting as a Senior Developer at Precedent .
+
+
+ -
+
Proctor & Stevenson
+ https://www.oliverdavies.uk/blog/2011/03/31/proctor-stevenson
+ https://www.oliverdavies.uk/blog/2011/03/31/proctor-stevenson
+ Thu, 31 Mar 2011 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/personal/index.html b/docs/blog/tags/personal/index.html
new file mode 100644
index 00000000..0d2eebaa
--- /dev/null
+++ b/docs/blog/tags/personal/index.html
@@ -0,0 +1,220 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "personal"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/photo-gallery.xml b/docs/blog/tags/photo-gallery.xml
new file mode 100644
index 00000000..c8f3b1ae
--- /dev/null
+++ b/docs/blog/tags/photo-gallery.xml
@@ -0,0 +1,38 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Better Photo Gallery in Drupal - Part 2
+ https://www.oliverdavies.uk/blog/2010/08/17/create-better-photo-gallery-drupal-part-2
+ https://www.oliverdavies.uk/blog/2010/08/17/create-better-photo-gallery-drupal-part-2
+ Tue, 17 Aug 2010 00:00:00 +0100
+
+
+ -
+
Create a Better Photo Gallery in Drupal - Part 1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ Wed, 11 Aug 2010 00:00:00 +0100
+
+
+ -
+
Create a Flickr Photo Gallery Using Feeds, CCK and Views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ Mon, 28 Jun 2010 00:00:00 +0100
+
+
+ -
+
Quickly Import Multiples Images Using the Imagefield_Import Module
+ https://www.oliverdavies.uk/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module
+ https://www.oliverdavies.uk/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module
+ Sat, 29 May 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/photo-gallery/index.html b/docs/blog/tags/photo-gallery/index.html
new file mode 100644
index 00000000..f78e2189
--- /dev/null
+++ b/docs/blog/tags/photo-gallery/index.html
@@ -0,0 +1,212 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "photo-gallery"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/php.xml b/docs/blog/tags/php.xml
new file mode 100644
index 00000000..d0c96604
--- /dev/null
+++ b/docs/blog/tags/php.xml
@@ -0,0 +1,68 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Introducing the Drupal Meetups Twitterbot
+ https://www.oliverdavies.uk/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot
+ https://www.oliverdavies.uk/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot
+ Fri, 09 Jun 2017 00:00:00 +0100
+
+
+The Drupal Meetups Twitterbot is a small project that I worked on a few months ago, but hadn't got around to promoting yet. It’s intention is to provide one Twitter account where people can get the up to date news from various Drupal meetups.
+
+
+ -
+
Building Gmail Filters with PHP
+ https://www.oliverdavies.uk/blog/2016/07/15/building-gmail-filters-with-php
+ https://www.oliverdavies.uk/blog/2016/07/15/building-gmail-filters-with-php
+ Fri, 15 Jul 2016 00:00:00 +0100
+
+
+ -
+
Simplifying Drupal Migrations with xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload
+ Tue, 03 May 2016 00:00:00 +0100
+ How to use the xautoload module to autoload migration classes within your Drupal 7 migration modules.
+
+
+ -
+
Don't Bootstrap Drupal, Use Drush
+ https://www.oliverdavies.uk/blog/2013/11/19/dont-bootstrap-drupal-use-drush
+ https://www.oliverdavies.uk/blog/2013/11/19/dont-bootstrap-drupal-use-drush
+ Tue, 19 Nov 2013 00:00:00 +0000
+ There are times when doing Drupal development when you need to run a custom PHP script, maybe moving data from one field to another, that doesn't warrant the time and effort to create a custom module. In this scenario, it would be quicker to write a .php script and bootstrap Drupal to gain access to functions like node_load()
and db_query()
.
+
+To bootstrap Drupal, you would need to add some additional lines of code to the stop of your script. Here is an alternative way.
+
+
+ -
+
Checking if a user is logged into Drupal (the right way)
+ https://www.oliverdavies.uk/blog/2013/01/09/checking-if-user-logged-drupal-right-way
+ https://www.oliverdavies.uk/blog/2013/01/09/checking-if-user-logged-drupal-right-way
+ Wed, 09 Jan 2013 00:00:00 +0000
+ I see this regularly when working on Drupal sites when someone wants to check whether the current user is logged in to Drupal (authenticated) or not (anonymous).
+
+
+ -
+
Display a Custom Menu in a Drupal 7 Theme Template File
+ https://www.oliverdavies.uk/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file
+ https://www.oliverdavies.uk/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file
+ Sat, 18 Aug 2012 00:00:00 +0100
+ For reference, this is the code needed to display a menu in a Drupal 7 template file, including the navigation ARIA role.
+
+
+ -
+
Display the Number of Facebook fans in PHP
+ https://www.oliverdavies.uk/blog/2011/03/15/display-number-facebook-fans-php
+ https://www.oliverdavies.uk/blog/2011/03/15/display-number-facebook-fans-php
+ Tue, 15 Mar 2011 00:00:00 +0000
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/php/index.html b/docs/blog/tags/php/index.html
new file mode 100644
index 00000000..75eae1c0
--- /dev/null
+++ b/docs/blog/tags/php/index.html
@@ -0,0 +1,236 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "php"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/phpstorm.xml b/docs/blog/tags/phpstorm.xml
new file mode 100644
index 00000000..16250d6c
--- /dev/null
+++ b/docs/blog/tags/phpstorm.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Updating Forked Repositories on GitHub
+ https://www.oliverdavies.uk/blog/2015/06/18/updating-forked-repositories-on-github
+ https://www.oliverdavies.uk/blog/2015/06/18/updating-forked-repositories-on-github
+ Thu, 18 Jun 2015 12:35:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/phpstorm/index.html b/docs/blog/tags/phpstorm/index.html
new file mode 100644
index 00000000..1968b796
--- /dev/null
+++ b/docs/blog/tags/phpstorm/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "phpstorm"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/precedent.xml b/docs/blog/tags/precedent.xml
new file mode 100644
index 00000000..302fafe4
--- /dev/null
+++ b/docs/blog/tags/precedent.xml
@@ -0,0 +1,26 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Going to DrupalCon
+ https://www.oliverdavies.uk/blog/2013/07/26/going-drupalcon
+ https://www.oliverdavies.uk/blog/2013/07/26/going-drupalcon
+ Fri, 26 Jul 2013 00:00:00 +0100
+ Precedent are sending myself and two of our other Drupal Developers to Drupalcon Prague .
+
+
+ -
+
Leaving Nomensa, Joining Precedent
+ https://www.oliverdavies.uk/blog/2013/04/20/leaving-nomensa-joining-precedent
+ https://www.oliverdavies.uk/blog/2013/04/20/leaving-nomensa-joining-precedent
+ Sat, 20 Apr 2013 00:00:00 +0100
+ Yesterday was my last day working at Nomensa . Next week, I'll be starting as a Senior Developer at Precedent .
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/precedent/index.html b/docs/blog/tags/precedent/index.html
new file mode 100644
index 00000000..4dc01dcc
--- /dev/null
+++ b/docs/blog/tags/precedent/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "precedent"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/preprocessing.xml b/docs/blog/tags/preprocessing.xml
new file mode 100644
index 00000000..58c3fb03
--- /dev/null
+++ b/docs/blog/tags/preprocessing.xml
@@ -0,0 +1,28 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
How to use SASS and Compass in Drupal 7 using Sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ Thu, 06 Dec 2012 00:00:00 +0000
+ I've recently started using SASS rather than LESS to do my CSS preprocessing - namely due to its integration with Compass and it's built-in CSS3 mixins. Here are three modules that provide the ability to use SASS within Drupal.
+
+
+ -
+
Dividing Drupal's process and preprocess functions into separate files
+ https://www.oliverdavies.uk/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files
+ https://www.oliverdavies.uk/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files
+ Thu, 24 May 2012 00:00:00 +0100
+ If you use a lot of process and preprocess functions within your Drupal theme, then your template.php can get very long and it can become difficult to find a certain piece of code.
+
+Following the example of the Omega theme , I've started separating my process and preprocess functions into their own files. For example, mytheme_preprocess_node can be placed within a preprocess/node.inc file, and mytheme_process_page can be placed within process/page.inc.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/preprocessing/index.html b/docs/blog/tags/preprocessing/index.html
new file mode 100644
index 00000000..0cedaea3
--- /dev/null
+++ b/docs/blog/tags/preprocessing/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "preprocessing"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/regular-expression.xml b/docs/blog/tags/regular-expression.xml
new file mode 100644
index 00000000..6e084d76
--- /dev/null
+++ b/docs/blog/tags/regular-expression.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Use Regular Expressions to Search and Replace in Coda or TextMate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ Thu, 04 Nov 2010 00:00:00 +0000
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/regular-expression/index.html b/docs/blog/tags/regular-expression/index.html
new file mode 100644
index 00000000..03cf3c2f
--- /dev/null
+++ b/docs/blog/tags/regular-expression/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "regular-expression"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/releases.xml b/docs/blog/tags/releases.xml
new file mode 100644
index 00000000..bbf21d9e
--- /dev/null
+++ b/docs/blog/tags/releases.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Drupal VM Generator 2.9.1 Released
+ https://www.oliverdavies.uk/blog/2016/12/30/drupal-vm-generator-291-released
+ https://www.oliverdavies.uk/blog/2016/12/30/drupal-vm-generator-291-released
+ Fri, 30 Dec 2016 00:00:00 +0000
+ I spent some time yesterday working on the Drupal VM Generator , and have released versions 2.8.1, 2.9.0 and 2.9.1.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/releases/index.html b/docs/blog/tags/releases/index.html
new file mode 100644
index 00000000..9e6991e7
--- /dev/null
+++ b/docs/blog/tags/releases/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "releases"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/sass.xml b/docs/blog/tags/sass.xml
new file mode 100644
index 00000000..5d8ac7e8
--- /dev/null
+++ b/docs/blog/tags/sass.xml
@@ -0,0 +1,26 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Include CSS Fonts by Using a SASS each Loop
+ https://www.oliverdavies.uk/blog/2014/11/18/include-css-fonts-using-sass-each-loop
+ https://www.oliverdavies.uk/blog/2014/11/18/include-css-fonts-using-sass-each-loop
+ Tue, 18 Nov 2014 00:00:00 +0000
+ How to use an @each loop in SASS to quickly include multiple font files within your stylesheet.
+
+
+ -
+
How to use SASS and Compass in Drupal 7 using Sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy
+ Thu, 06 Dec 2012 00:00:00 +0000
+ I've recently started using SASS rather than LESS to do my CSS preprocessing - namely due to its integration with Compass and it's built-in CSS3 mixins. Here are three modules that provide the ability to use SASS within Drupal.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/sass/index.html b/docs/blog/tags/sass/index.html
new file mode 100644
index 00000000..f70e0fbf
--- /dev/null
+++ b/docs/blog/tags/sass/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "sass"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/sculpin.xml b/docs/blog/tags/sculpin.xml
new file mode 100644
index 00000000..02aaed81
--- /dev/null
+++ b/docs/blog/tags/sculpin.xml
@@ -0,0 +1,40 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Easier Sculpin Commands with Composer and NPM Scripts
+ https://www.oliverdavies.uk/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts
+ https://www.oliverdavies.uk/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts
+ Sat, 07 Jan 2017 00:00:00 +0000
+ In this video, I show you how I've simplied my Sculpin and Gulp workflow using custom Composer and NPM scripts.
+
+
+ -
+
Automating Sculpin Builds with Jenkins CI
+ https://www.oliverdavies.uk/blog/2015/07/21/automating-sculpin-jenkins
+ https://www.oliverdavies.uk/blog/2015/07/21/automating-sculpin-jenkins
+ Tue, 21 Jul 2015 01:00:00 +0100
+
+
+ -
+
Sculpin and Twig Resources
+ https://www.oliverdavies.uk/blog/2015/07/19/sculpin-twig-resources
+ https://www.oliverdavies.uk/blog/2015/07/19/sculpin-twig-resources
+ Sun, 19 Jul 2015 01:00:00 +0100
+ Here’s a list of resources that I compiled whilst preparing for my Sculpin and Twig talk at DrupalCamp North .
+
+
+ -
+
Updating Forked Repositories on GitHub
+ https://www.oliverdavies.uk/blog/2015/06/18/updating-forked-repositories-on-github
+ https://www.oliverdavies.uk/blog/2015/06/18/updating-forked-repositories-on-github
+ Thu, 18 Jun 2015 12:35:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/sculpin/index.html b/docs/blog/tags/sculpin/index.html
new file mode 100644
index 00000000..8ad320bb
--- /dev/null
+++ b/docs/blog/tags/sculpin/index.html
@@ -0,0 +1,212 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "sculpin"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/sequal-pro.xml b/docs/blog/tags/sequal-pro.xml
new file mode 100644
index 00000000..8b3c55a4
--- /dev/null
+++ b/docs/blog/tags/sequal-pro.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Add a Taxonomy Term to Multiple Nodes Using SQL
+ https://www.oliverdavies.uk/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql
+ https://www.oliverdavies.uk/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql
+ Wed, 07 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/sequal-pro/index.html b/docs/blog/tags/sequal-pro/index.html
new file mode 100644
index 00000000..dfdc999e
--- /dev/null
+++ b/docs/blog/tags/sequal-pro/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "sequal-pro"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/sequel-pro.xml b/docs/blog/tags/sequel-pro.xml
new file mode 100644
index 00000000..bc7bc50a
--- /dev/null
+++ b/docs/blog/tags/sequel-pro.xml
@@ -0,0 +1,38 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Use Regular Expressions to Search and Replace in Coda or TextMate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ Thu, 04 Nov 2010 00:00:00 +0000
+
+
+ -
+
Create a Better Photo Gallery in Drupal - Part 2
+ https://www.oliverdavies.uk/blog/2010/08/17/create-better-photo-gallery-drupal-part-2
+ https://www.oliverdavies.uk/blog/2010/08/17/create-better-photo-gallery-drupal-part-2
+ Tue, 17 Aug 2010 00:00:00 +0100
+
+
+ -
+
Create a Better Photo Gallery in Drupal - Part 1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ Wed, 11 Aug 2010 00:00:00 +0100
+
+
+ -
+
Change the Content Type of Multiple Nodes Using SQL
+ https://www.oliverdavies.uk/blog/2010/07/01/change-content-type-multiple-nodes-using-sql
+ https://www.oliverdavies.uk/blog/2010/07/01/change-content-type-multiple-nodes-using-sql
+ Thu, 01 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/sequel-pro/index.html b/docs/blog/tags/sequel-pro/index.html
new file mode 100644
index 00000000..010746a9
--- /dev/null
+++ b/docs/blog/tags/sequel-pro/index.html
@@ -0,0 +1,212 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "sequel-pro"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/servers.xml b/docs/blog/tags/servers.xml
new file mode 100644
index 00000000..ca9bc8f2
--- /dev/null
+++ b/docs/blog/tags/servers.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Using Remote Files when Developing Locally with Stage File Proxy Module
+ https://www.oliverdavies.uk/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module
+ https://www.oliverdavies.uk/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module
+ Thu, 20 Nov 2014 00:00:00 +0000
+ How to install and configure the Stage File Proxy module to serve remote images on your local Drupal site.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/servers/index.html b/docs/blog/tags/servers/index.html
new file mode 100644
index 00000000..d4db7534
--- /dev/null
+++ b/docs/blog/tags/servers/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "servers"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/settings.php.xml b/docs/blog/tags/settings.php.xml
new file mode 100644
index 00000000..5fe7f2cc
--- /dev/null
+++ b/docs/blog/tags/settings.php.xml
@@ -0,0 +1,28 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Include a Local Drupal Settings file for Environment Configuration and Overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides
+ Sat, 20 Dec 2014 00:00:00 +0000
+ How to create and include a local settings file to define and override environment-specific variables, and keep sensitive things like your database credentials and API keys safe.
+
+
+ -
+
Include environment-specific settings files on Pantheon
+ https://www.oliverdavies.uk/blog/2014/11/27/pantheon-settings-files
+ https://www.oliverdavies.uk/blog/2014/11/27/pantheon-settings-files
+ Thu, 27 Nov 2014 00:00:00 +0000
+ I was recently doing some work on a site hosted on Pantheon and came across an issue, for which part of the suggested fix was to ensure that the $base_url
variable was explicitly defined within settings.php (this is also best practice on all Drupal sites).
+
+The way that was recommended was by using a switch()
function based on Pantheon's environment variable. For example:
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/settings.php/index.html b/docs/blog/tags/settings.php/index.html
new file mode 100644
index 00000000..6b1df504
--- /dev/null
+++ b/docs/blog/tags/settings.php/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "settings.php"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/simpletest.xml b/docs/blog/tags/simpletest.xml
new file mode 100644
index 00000000..9061fc19
--- /dev/null
+++ b/docs/blog/tags/simpletest.xml
@@ -0,0 +1,28 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Fixing Drupal SimpleTest issues inside Docker Containers
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ Fri, 05 May 2017 00:00:00 +0100
+ I’ve been a Drupal VM user for a long time, but lately I’ve been using a combination Drupal VM and Docker for my local development environment. There were a couple of issues preventing me from completely switching to Docker - one of which being that when I tried running of my Simpletest tests, a lot of them would fail where they would pass when run within Drupal VM.
+
+Here’s an excerpt from my docker-compose.yml
file:
+
+
+ -
+
Some useful links for using SimpleTest in Drupal
+ https://www.oliverdavies.uk/blog/2013/06/13/some-useful-links-using-simpletest-drupal
+ https://www.oliverdavies.uk/blog/2013/06/13/some-useful-links-using-simpletest-drupal
+ Thu, 13 Jun 2013 00:00:00 +0100
+ Here are some useful links that I've found when researching about unit testing in Drupal using SimpleTest.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/simpletest/index.html b/docs/blog/tags/simpletest/index.html
new file mode 100644
index 00000000..58a4b92b
--- /dev/null
+++ b/docs/blog/tags/simpletest/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "simpletest"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/slideshow.xml b/docs/blog/tags/slideshow.xml
new file mode 100644
index 00000000..84a24469
--- /dev/null
+++ b/docs/blog/tags/slideshow.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Slideshow of Multiple Images Using Fancy Slide
+ https://www.oliverdavies.uk/blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide
+ https://www.oliverdavies.uk/blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide
+ Tue, 25 May 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/slideshow/index.html b/docs/blog/tags/slideshow/index.html
new file mode 100644
index 00000000..4c65cb1b
--- /dev/null
+++ b/docs/blog/tags/slideshow/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "slideshow"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/sql.xml b/docs/blog/tags/sql.xml
new file mode 100644
index 00000000..88c70746
--- /dev/null
+++ b/docs/blog/tags/sql.xml
@@ -0,0 +1,38 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Better Photo Gallery in Drupal - Part 2
+ https://www.oliverdavies.uk/blog/2010/08/17/create-better-photo-gallery-drupal-part-2
+ https://www.oliverdavies.uk/blog/2010/08/17/create-better-photo-gallery-drupal-part-2
+ Tue, 17 Aug 2010 00:00:00 +0100
+
+
+ -
+
Create a Better Photo Gallery in Drupal - Part 1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ Wed, 11 Aug 2010 00:00:00 +0100
+
+
+ -
+
Add a Taxonomy Term to Multiple Nodes Using SQL
+ https://www.oliverdavies.uk/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql
+ https://www.oliverdavies.uk/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql
+ Wed, 07 Jul 2010 00:00:00 +0100
+
+
+ -
+
Change the Content Type of Multiple Nodes Using SQL
+ https://www.oliverdavies.uk/blog/2010/07/01/change-content-type-multiple-nodes-using-sql
+ https://www.oliverdavies.uk/blog/2010/07/01/change-content-type-multiple-nodes-using-sql
+ Thu, 01 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/sql/index.html b/docs/blog/tags/sql/index.html
new file mode 100644
index 00000000..907f0cf5
--- /dev/null
+++ b/docs/blog/tags/sql/index.html
@@ -0,0 +1,212 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "sql"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/ssh.xml b/docs/blog/tags/ssh.xml
new file mode 100644
index 00000000..3080626c
--- /dev/null
+++ b/docs/blog/tags/ssh.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
How to use Authorized Keys to Create a Passwordless SSH Connection
+ https://www.oliverdavies.uk/blog/2012/02/01/use-authorized-keys-create-passwordless-ssh-connection
+ https://www.oliverdavies.uk/blog/2012/02/01/use-authorized-keys-create-passwordless-ssh-connection
+ Wed, 01 Feb 2012 00:00:00 +0000
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/ssh/index.html b/docs/blog/tags/ssh/index.html
new file mode 100644
index 00000000..203acf14
--- /dev/null
+++ b/docs/blog/tags/ssh/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "ssh"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/sublime-text.xml b/docs/blog/tags/sublime-text.xml
new file mode 100644
index 00000000..53b7a3c6
--- /dev/null
+++ b/docs/blog/tags/sublime-text.xml
@@ -0,0 +1,36 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
The Quickest way to Install Sublime Text 2 in Ubuntu
+ https://www.oliverdavies.uk/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu
+ https://www.oliverdavies.uk/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu
+ Sat, 02 Mar 2013 00:00:00 +0000
+ After reading numerous blog posts about how to install Sublime Text 2 in Ubuntu , this is definitely the quickest way!
+
+
+ -
+
Open Sublime Text 2 from the Mac OS X Command Line
+ https://www.oliverdavies.uk/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line
+ https://www.oliverdavies.uk/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line
+ Sat, 17 Nov 2012 00:00:00 +0000
+ How to open Sublime Text from the command line.
+
+
+ -
+
My Sublime Text 2 settings
+ https://www.oliverdavies.uk/blog/2012/10/25/my-sublime-text-2-settings
+ https://www.oliverdavies.uk/blog/2012/10/25/my-sublime-text-2-settings
+ Thu, 25 Oct 2012 00:00:00 +0100
+ Sublime Text 2 has been my text editor of choice for the past few months, and I use it at home, in work, and on any virtual machines that I run. So rather than having to manually re-enter my settings each time, I thought that I'd document them here for future reference.
+
+These preferences ensure that the code is compliant with Drupal coding standards - using two spaces instead of a tab, no trailing whitespace, blank line at the end of a file etc.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/sublime-text/index.html b/docs/blog/tags/sublime-text/index.html
new file mode 100644
index 00000000..38e02dc6
--- /dev/null
+++ b/docs/blog/tags/sublime-text/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "sublime-text"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/svn.xml b/docs/blog/tags/svn.xml
new file mode 100644
index 00000000..6b8784fc
--- /dev/null
+++ b/docs/blog/tags/svn.xml
@@ -0,0 +1,25 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Checkout a specific revision from SVN from the command line
+ https://www.oliverdavies.uk/blog/2012/05/23/checkout-specific-revision-svn-command-line
+ https://www.oliverdavies.uk/blog/2012/05/23/checkout-specific-revision-svn-command-line
+ Wed, 23 May 2012 00:00:00 +0100
+ How to checkout a specific revision from a SVN (Subversion) repository.
+
+
+ -
+
How to Install and Configure Subversion (SVN) Server on Ubuntu
+ https://www.oliverdavies.uk/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu
+ https://www.oliverdavies.uk/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu
+ Wed, 19 Oct 2011 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/svn/index.html b/docs/blog/tags/svn/index.html
new file mode 100644
index 00000000..d80a85c6
--- /dev/null
+++ b/docs/blog/tags/svn/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "svn"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/swdug.xml b/docs/blog/tags/swdug.xml
new file mode 100644
index 00000000..3363025e
--- /dev/null
+++ b/docs/blog/tags/swdug.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
The Inaugural Meetup for the South Wales Drupal User Group
+ https://www.oliverdavies.uk/blog/2010/09/26/south-wales-drupal-user-group
+ https://www.oliverdavies.uk/blog/2010/09/26/south-wales-drupal-user-group
+ Sun, 26 Sep 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/swdug/index.html b/docs/blog/tags/swdug/index.html
new file mode 100644
index 00000000..b0b02ec1
--- /dev/null
+++ b/docs/blog/tags/swdug/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "swdug"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/symfony.xml b/docs/blog/tags/symfony.xml
new file mode 100644
index 00000000..d8492d7f
--- /dev/null
+++ b/docs/blog/tags/symfony.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Announcing the Drupal VM Generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator
+ Mon, 15 Feb 2016 00:00:00 +0000
+ For the past few weeks I’ve been working on a personal side project, based on Drupal VM. It’s called the Drupal VM Generator , and over the weekend I’ve added the final features and fixed the remaining issues, and tagged the 1.0.0 release.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/symfony/index.html b/docs/blog/tags/symfony/index.html
new file mode 100644
index 00000000..7742feba
--- /dev/null
+++ b/docs/blog/tags/symfony/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "symfony"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/table-prefixing.xml b/docs/blog/tags/table-prefixing.xml
new file mode 100644
index 00000000..9bf83446
--- /dev/null
+++ b/docs/blog/tags/table-prefixing.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Creating Local and Staging sites with Drupal's Domain Module Enabled
+ https://www.oliverdavies.uk/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled
+ https://www.oliverdavies.uk/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled
+ Wed, 17 Jul 2013 00:00:00 +0100
+ The Domain Access project is a suite of modules that provide tools for running a group of affiliated sites from one Drupal installation and a single shared database. The issue is that the domains are stored within the database so these are copied across when the data is migrated between environments, whereas the domains are obviously going to change.
+
+Rather than changing the domain settings within the Domain module itself, the best solution I think is to use table prefixes and create a different domain table per environment.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/table-prefixing/index.html b/docs/blog/tags/table-prefixing/index.html
new file mode 100644
index 00000000..ddd6fcd4
--- /dev/null
+++ b/docs/blog/tags/table-prefixing/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "table-prefixing"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/talks.xml b/docs/blog/tags/talks.xml
new file mode 100644
index 00000000..e5a047eb
--- /dev/null
+++ b/docs/blog/tags/talks.xml
@@ -0,0 +1,34 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
drush make drupalbristol
+ https://www.oliverdavies.uk/blog/2014/07/02/drush-make-drupalbristol
+ https://www.oliverdavies.uk/blog/2014/07/02/drush-make-drupalbristol
+ Wed, 02 Jul 2014 00:00:00 +0100
+ Here are my slides from this month's talk night at the Drupal Bristol user group .
+
+
+ -
+
DrupalCamp London: What is Git Flow?
+ https://www.oliverdavies.uk/blog/2014/03/03/what-git-flow
+ https://www.oliverdavies.uk/blog/2014/03/03/what-git-flow
+ Mon, 03 Mar 2014 00:00:00 +0000
+ Here are my slides from my "What is Git Flow?" session at DrupalCamp London .
+
+
+ -
+
Reflections on speaking at UnifiedDiff
+ https://www.oliverdavies.uk/blog/2012/09/06/reflections-speaking-unifieddiff
+ https://www.oliverdavies.uk/blog/2012/09/06/reflections-speaking-unifieddiff
+ Thu, 06 Sep 2012 00:00:00 +0100
+ Yesterday evening I went along and spoke at the UnifiedDiff meetup in Cardiff, having offered previously to do a presentation providing an introduction to Drupal.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/talks/index.html b/docs/blog/tags/talks/index.html
new file mode 100644
index 00000000..51772525
--- /dev/null
+++ b/docs/blog/tags/talks/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "talks"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/taxonomy.xml b/docs/blog/tags/taxonomy.xml
new file mode 100644
index 00000000..fda29525
--- /dev/null
+++ b/docs/blog/tags/taxonomy.xml
@@ -0,0 +1,31 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Use Regular Expressions to Search and Replace in Coda or TextMate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ Thu, 04 Nov 2010 00:00:00 +0000
+
+
+ -
+
Add a Taxonomy Term to Multiple Nodes Using SQL
+ https://www.oliverdavies.uk/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql
+ https://www.oliverdavies.uk/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql
+ Wed, 07 Jul 2010 00:00:00 +0100
+
+
+ -
+
Style Drupal 6's Taxonomy Lists with PHP, CSS and jQuery
+ https://www.oliverdavies.uk/blog/2010/04/05/style-drupal-6s-taxonomy-lists-php-css-and-jquery
+ https://www.oliverdavies.uk/blog/2010/04/05/style-drupal-6s-taxonomy-lists-php-css-and-jquery
+ Mon, 05 Apr 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/taxonomy/index.html b/docs/blog/tags/taxonomy/index.html
new file mode 100644
index 00000000..32a6ef2a
--- /dev/null
+++ b/docs/blog/tags/taxonomy/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "taxonomy"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/tdd.xml b/docs/blog/tags/tdd.xml
new file mode 100644
index 00000000..909ea66b
--- /dev/null
+++ b/docs/blog/tags/tdd.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Some useful links for using SimpleTest in Drupal
+ https://www.oliverdavies.uk/blog/2013/06/13/some-useful-links-using-simpletest-drupal
+ https://www.oliverdavies.uk/blog/2013/06/13/some-useful-links-using-simpletest-drupal
+ Thu, 13 Jun 2013 00:00:00 +0100
+ Here are some useful links that I've found when researching about unit testing in Drupal using SimpleTest.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/tdd/index.html b/docs/blog/tags/tdd/index.html
new file mode 100644
index 00000000..7616df1a
--- /dev/null
+++ b/docs/blog/tags/tdd/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "tdd"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/teleport.xml b/docs/blog/tags/teleport.xml
new file mode 100644
index 00000000..150f82eb
--- /dev/null
+++ b/docs/blog/tags/teleport.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Review of the Teleport Module
+ https://www.oliverdavies.uk/blog/2010/07/12/review-teleport-module
+ https://www.oliverdavies.uk/blog/2010/07/12/review-teleport-module
+ Mon, 12 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/teleport/index.html b/docs/blog/tags/teleport/index.html
new file mode 100644
index 00000000..5b37fe96
--- /dev/null
+++ b/docs/blog/tags/teleport/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "teleport"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/terminal.xml b/docs/blog/tags/terminal.xml
new file mode 100644
index 00000000..f34fe2dc
--- /dev/null
+++ b/docs/blog/tags/terminal.xml
@@ -0,0 +1,26 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Display Git Branch or Tag Names in your Bash Prompt
+ https://www.oliverdavies.uk/blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt
+ https://www.oliverdavies.uk/blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt
+ Sat, 27 Apr 2013 00:00:00 +0100
+ Whilst watching Drupalize.me 's recent Introduction to Git series , I thought it was useful the way that the current Git branch or tag name was displayed in the bash prompt. Here's how to do it.
+
+
+ -
+
Open Sublime Text 2 from the Mac OS X Command Line
+ https://www.oliverdavies.uk/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line
+ https://www.oliverdavies.uk/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line
+ Sat, 17 Nov 2012 00:00:00 +0000
+ How to open Sublime Text from the command line.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/terminal/index.html b/docs/blog/tags/terminal/index.html
new file mode 100644
index 00000000..ac98a70b
--- /dev/null
+++ b/docs/blog/tags/terminal/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "terminal"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/test-driven-development.xml b/docs/blog/tags/test-driven-development.xml
new file mode 100644
index 00000000..5ad45893
--- /dev/null
+++ b/docs/blog/tags/test-driven-development.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Some useful links for using SimpleTest in Drupal
+ https://www.oliverdavies.uk/blog/2013/06/13/some-useful-links-using-simpletest-drupal
+ https://www.oliverdavies.uk/blog/2013/06/13/some-useful-links-using-simpletest-drupal
+ Thu, 13 Jun 2013 00:00:00 +0100
+ Here are some useful links that I've found when researching about unit testing in Drupal using SimpleTest.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/test-driven-development/index.html b/docs/blog/tags/test-driven-development/index.html
new file mode 100644
index 00000000..9ad7a818
--- /dev/null
+++ b/docs/blog/tags/test-driven-development/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "test-driven-development"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/testing.xml b/docs/blog/tags/testing.xml
new file mode 100644
index 00000000..cb091330
--- /dev/null
+++ b/docs/blog/tags/testing.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Fixing Drupal SimpleTest issues inside Docker Containers
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker
+ Fri, 05 May 2017 00:00:00 +0100
+ I’ve been a Drupal VM user for a long time, but lately I’ve been using a combination Drupal VM and Docker for my local development environment. There were a couple of issues preventing me from completely switching to Docker - one of which being that when I tried running of my Simpletest tests, a lot of them would fail where they would pass when run within Drupal VM.
+
+Here’s an excerpt from my docker-compose.yml
file:
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/testing/index.html b/docs/blog/tags/testing/index.html
new file mode 100644
index 00000000..1ba39c6d
--- /dev/null
+++ b/docs/blog/tags/testing/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "testing"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/textmate.xml b/docs/blog/tags/textmate.xml
new file mode 100644
index 00000000..3e0e243c
--- /dev/null
+++ b/docs/blog/tags/textmate.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Use Regular Expressions to Search and Replace in Coda or TextMate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate
+ Thu, 04 Nov 2010 00:00:00 +0000
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/textmate/index.html b/docs/blog/tags/textmate/index.html
new file mode 100644
index 00000000..e8d059f0
--- /dev/null
+++ b/docs/blog/tags/textmate/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "textmate"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/theming.xml b/docs/blog/tags/theming.xml
new file mode 100644
index 00000000..b4c0b052
--- /dev/null
+++ b/docs/blog/tags/theming.xml
@@ -0,0 +1,43 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Create a Zen Sub-theme Using Drush
+ https://www.oliverdavies.uk/blog/2013/09/06/create-a-zen-sub-theme-using-drush
+ https://www.oliverdavies.uk/blog/2013/09/06/create-a-zen-sub-theme-using-drush
+ Fri, 06 Sep 2013 00:00:00 +0100
+ How to use Drush to quickly build a new sub-theme of Zen .
+
+
+ -
+
Dividing Drupal's process and preprocess functions into separate files
+ https://www.oliverdavies.uk/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files
+ https://www.oliverdavies.uk/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files
+ Thu, 24 May 2012 00:00:00 +0100
+ If you use a lot of process and preprocess functions within your Drupal theme, then your template.php can get very long and it can become difficult to find a certain piece of code.
+
+Following the example of the Omega theme , I've started separating my process and preprocess functions into their own files. For example, mytheme_preprocess_node can be placed within a preprocess/node.inc file, and mytheme_process_page can be placed within process/page.inc.
+
+
+ -
+
Writing a .info file for a Drupal 7 theme
+ https://www.oliverdavies.uk/blog/2012/05/23/writing-info-file-drupal-7-theme
+ https://www.oliverdavies.uk/blog/2012/05/23/writing-info-file-drupal-7-theme
+ Wed, 23 May 2012 00:00:00 +0100
+ An example .info file for a Drupal 7 theme.
+
+
+ -
+
Create an Omega Subtheme with LESS CSS Preprocessor using Omega Tools and Drush
+ https://www.oliverdavies.uk/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush
+ https://www.oliverdavies.uk/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush
+ Mon, 16 Apr 2012 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/theming/index.html b/docs/blog/tags/theming/index.html
new file mode 100644
index 00000000..0de8f5f4
--- /dev/null
+++ b/docs/blog/tags/theming/index.html
@@ -0,0 +1,212 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "theming"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/tokens.xml b/docs/blog/tags/tokens.xml
new file mode 100644
index 00000000..41306950
--- /dev/null
+++ b/docs/blog/tags/tokens.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Creating and using custom tokens in Drupal 7
+ https://www.oliverdavies.uk/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7
+ https://www.oliverdavies.uk/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7
+ Sat, 16 Feb 2013 00:00:00 +0000
+ This post outlines the steps required to create your own custom tokens in Drupal.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/tokens/index.html b/docs/blog/tags/tokens/index.html
new file mode 100644
index 00000000..485abf94
--- /dev/null
+++ b/docs/blog/tags/tokens/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "tokens"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/twig.xml b/docs/blog/tags/twig.xml
new file mode 100644
index 00000000..c0e48452
--- /dev/null
+++ b/docs/blog/tags/twig.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Sculpin and Twig Resources
+ https://www.oliverdavies.uk/blog/2015/07/19/sculpin-twig-resources
+ https://www.oliverdavies.uk/blog/2015/07/19/sculpin-twig-resources
+ Sun, 19 Jul 2015 01:00:00 +0100
+ Here’s a list of resources that I compiled whilst preparing for my Sculpin and Twig talk at DrupalCamp North .
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/twig/index.html b/docs/blog/tags/twig/index.html
new file mode 100644
index 00000000..0c2c1e25
--- /dev/null
+++ b/docs/blog/tags/twig/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "twig"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/twitter.xml b/docs/blog/tags/twitter.xml
new file mode 100644
index 00000000..9460c71a
--- /dev/null
+++ b/docs/blog/tags/twitter.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Introducing the Drupal Meetups Twitterbot
+ https://www.oliverdavies.uk/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot
+ https://www.oliverdavies.uk/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot
+ Fri, 09 Jun 2017 00:00:00 +0100
+
+
+The Drupal Meetups Twitterbot is a small project that I worked on a few months ago, but hadn't got around to promoting yet. It’s intention is to provide one Twitter account where people can get the up to date news from various Drupal meetups.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/twitter/index.html b/docs/blog/tags/twitter/index.html
new file mode 100644
index 00000000..4d877d8d
--- /dev/null
+++ b/docs/blog/tags/twitter/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "twitter"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/typekit.xml b/docs/blog/tags/typekit.xml
new file mode 100644
index 00000000..6649333f
--- /dev/null
+++ b/docs/blog/tags/typekit.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Easily Embed TypeKit Fonts into your Drupal Website
+ https://www.oliverdavies.uk/blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website
+ https://www.oliverdavies.uk/blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website
+ Mon, 14 Feb 2011 00:00:00 +0000
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/typekit/index.html b/docs/blog/tags/typekit/index.html
new file mode 100644
index 00000000..78e71d83
--- /dev/null
+++ b/docs/blog/tags/typekit/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "typekit"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/ubuntu.xml b/docs/blog/tags/ubuntu.xml
new file mode 100644
index 00000000..5baad7a8
--- /dev/null
+++ b/docs/blog/tags/ubuntu.xml
@@ -0,0 +1,25 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
The Quickest way to Install Sublime Text 2 in Ubuntu
+ https://www.oliverdavies.uk/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu
+ https://www.oliverdavies.uk/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu
+ Sat, 02 Mar 2013 00:00:00 +0000
+ After reading numerous blog posts about how to install Sublime Text 2 in Ubuntu , this is definitely the quickest way!
+
+
+ -
+
How to Install and Configure Subversion (SVN) Server on Ubuntu
+ https://www.oliverdavies.uk/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu
+ https://www.oliverdavies.uk/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu
+ Wed, 19 Oct 2011 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/ubuntu/index.html b/docs/blog/tags/ubuntu/index.html
new file mode 100644
index 00000000..6e8616c0
--- /dev/null
+++ b/docs/blog/tags/ubuntu/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "ubuntu"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/vagrant.xml b/docs/blog/tags/vagrant.xml
new file mode 100644
index 00000000..36690699
--- /dev/null
+++ b/docs/blog/tags/vagrant.xml
@@ -0,0 +1,28 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
How to fix Vagrant Loading the Wrong Virtual Machine
+ https://www.oliverdavies.uk/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine
+ https://www.oliverdavies.uk/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine
+ Mon, 06 Oct 2014 00:00:00 +0100
+ A few times recently, I've had instances where Vagrant seems to have forgotten which virtual machine it's supposed to load, probably due to renaming a project directory or the .vagrant directory being moved accidentally.
+
+Here are the steps that I took to fix this and point Vagrant back at the correct VM.
+
+
+ -
+
Useful Vagrant Commands
+ https://www.oliverdavies.uk/blog/2013/11/27/useful-vagrant-commands
+ https://www.oliverdavies.uk/blog/2013/11/27/useful-vagrant-commands
+ Wed, 27 Nov 2013 00:00:00 +0000
+ Vagrant is a tool for managing virtual machines within VirtualBox from the command line. Here are some useful commands to know when using Vagrant.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/vagrant/index.html b/docs/blog/tags/vagrant/index.html
new file mode 100644
index 00000000..31b261a2
--- /dev/null
+++ b/docs/blog/tags/vagrant/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "vagrant"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/version-control.xml b/docs/blog/tags/version-control.xml
new file mode 100644
index 00000000..61579f31
--- /dev/null
+++ b/docs/blog/tags/version-control.xml
@@ -0,0 +1,25 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Checkout a specific revision from SVN from the command line
+ https://www.oliverdavies.uk/blog/2012/05/23/checkout-specific-revision-svn-command-line
+ https://www.oliverdavies.uk/blog/2012/05/23/checkout-specific-revision-svn-command-line
+ Wed, 23 May 2012 00:00:00 +0100
+ How to checkout a specific revision from a SVN (Subversion) repository.
+
+
+ -
+
How to Install and Configure Subversion (SVN) Server on Ubuntu
+ https://www.oliverdavies.uk/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu
+ https://www.oliverdavies.uk/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu
+ Wed, 19 Oct 2011 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/version-control/index.html b/docs/blog/tags/version-control/index.html
new file mode 100644
index 00000000..20c79520
--- /dev/null
+++ b/docs/blog/tags/version-control/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "version-control"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/views-attach.xml b/docs/blog/tags/views-attach.xml
new file mode 100644
index 00000000..a14736b1
--- /dev/null
+++ b/docs/blog/tags/views-attach.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Better Photo Gallery in Drupal - Part 1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ Wed, 11 Aug 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/views-attach/index.html b/docs/blog/tags/views-attach/index.html
new file mode 100644
index 00000000..6c5a9f09
--- /dev/null
+++ b/docs/blog/tags/views-attach/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "views-attach"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/views.xml b/docs/blog/tags/views.xml
new file mode 100644
index 00000000..ad15ef67
--- /dev/null
+++ b/docs/blog/tags/views.xml
@@ -0,0 +1,31 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create a Better Photo Gallery in Drupal - Part 1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1
+ Wed, 11 Aug 2010 00:00:00 +0100
+
+
+ -
+
Create a Flickr Photo Gallery Using Feeds, CCK and Views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views
+ Mon, 28 Jun 2010 00:00:00 +0100
+
+
+ -
+
Create a Block of Social Media Icons using CCK, Views and Nodequeue
+ https://www.oliverdavies.uk/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue
+ https://www.oliverdavies.uk/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue
+ Wed, 23 Jun 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/views/index.html b/docs/blog/tags/views/index.html
new file mode 100644
index 00000000..f97faca5
--- /dev/null
+++ b/docs/blog/tags/views/index.html
@@ -0,0 +1,204 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "views"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/virtual-hosts.xml b/docs/blog/tags/virtual-hosts.xml
new file mode 100644
index 00000000..2efec7cb
--- /dev/null
+++ b/docs/blog/tags/virtual-hosts.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create Virtual Hosts on Mac OS X Using VirtualHostX
+ https://www.oliverdavies.uk/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx
+ https://www.oliverdavies.uk/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx
+ Fri, 02 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/virtual-hosts/index.html b/docs/blog/tags/virtual-hosts/index.html
new file mode 100644
index 00000000..1867539f
--- /dev/null
+++ b/docs/blog/tags/virtual-hosts/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "virtual-hosts"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/virtualbox.xml b/docs/blog/tags/virtualbox.xml
new file mode 100644
index 00000000..dbe872d6
--- /dev/null
+++ b/docs/blog/tags/virtualbox.xml
@@ -0,0 +1,20 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
How to fix Vagrant Loading the Wrong Virtual Machine
+ https://www.oliverdavies.uk/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine
+ https://www.oliverdavies.uk/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine
+ Mon, 06 Oct 2014 00:00:00 +0100
+ A few times recently, I've had instances where Vagrant seems to have forgotten which virtual machine it's supposed to load, probably due to renaming a project directory or the .vagrant directory being moved accidentally.
+
+Here are the steps that I took to fix this and point Vagrant back at the correct VM.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/virtualbox/index.html b/docs/blog/tags/virtualbox/index.html
new file mode 100644
index 00000000..f4ffc2c2
--- /dev/null
+++ b/docs/blog/tags/virtualbox/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "virtualbox"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/virtualhostx.xml b/docs/blog/tags/virtualhostx.xml
new file mode 100644
index 00000000..3f15afe6
--- /dev/null
+++ b/docs/blog/tags/virtualhostx.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Create Virtual Hosts on Mac OS X Using VirtualHostX
+ https://www.oliverdavies.uk/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx
+ https://www.oliverdavies.uk/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx
+ Fri, 02 Jul 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/virtualhostx/index.html b/docs/blog/tags/virtualhostx/index.html
new file mode 100644
index 00000000..5159e895
--- /dev/null
+++ b/docs/blog/tags/virtualhostx/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "virtualhostx"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/webform.xml b/docs/blog/tags/webform.xml
new file mode 100644
index 00000000..548e75af
--- /dev/null
+++ b/docs/blog/tags/webform.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Conditional Email Addresses in a Webform
+ https://www.oliverdavies.uk/blog/2010/05/06/conditional-email-addresses-webform
+ https://www.oliverdavies.uk/blog/2010/05/06/conditional-email-addresses-webform
+ Thu, 06 May 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/webform/index.html b/docs/blog/tags/webform/index.html
new file mode 100644
index 00000000..8eb4849b
--- /dev/null
+++ b/docs/blog/tags/webform/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "webform"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/writing.xml b/docs/blog/tags/writing.xml
new file mode 100644
index 00000000..ddb88734
--- /dev/null
+++ b/docs/blog/tags/writing.xml
@@ -0,0 +1,18 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:19 +0100
+ -
+
Writing an Article for Linux Journal
+ https://www.oliverdavies.uk/blog/2012/07/27/writing-article-linux-journal
+ https://www.oliverdavies.uk/blog/2012/07/27/writing-article-linux-journal
+ Fri, 27 Jul 2012 00:00:00 +0100
+ I'm absolutely delighted to announce that I'm going to be writing an article for Linux Journal magazine's upcoming Drupal special.
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/writing/index.html b/docs/blog/tags/writing/index.html
new file mode 100644
index 00000000..e9ba3faf
--- /dev/null
+++ b/docs/blog/tags/writing/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "writing"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/zen.xml b/docs/blog/tags/zen.xml
new file mode 100644
index 00000000..6061cf7a
--- /dev/null
+++ b/docs/blog/tags/zen.xml
@@ -0,0 +1,25 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:18 +0100
+ -
+
Create a Zen Sub-theme Using Drush
+ https://www.oliverdavies.uk/blog/2013/09/06/create-a-zen-sub-theme-using-drush
+ https://www.oliverdavies.uk/blog/2013/09/06/create-a-zen-sub-theme-using-drush
+ Fri, 06 Sep 2013 00:00:00 +0100
+ How to use Drush to quickly build a new sub-theme of Zen .
+
+
+ -
+
Quickly Create Zen Subthemes Using Zenophile
+ https://www.oliverdavies.uk/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile
+ https://www.oliverdavies.uk/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile
+ Mon, 10 May 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/zen/index.html b/docs/blog/tags/zen/index.html
new file mode 100644
index 00000000..1db6fb1a
--- /dev/null
+++ b/docs/blog/tags/zen/index.html
@@ -0,0 +1,196 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "zen"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/tags/zenophile.xml b/docs/blog/tags/zenophile.xml
new file mode 100644
index 00000000..c526ce3e
--- /dev/null
+++ b/docs/blog/tags/zenophile.xml
@@ -0,0 +1,17 @@
+
+
+
+ Oliver Davies
+ https://www.oliverdavies.uk
+ en
+ Oliver Davies, Drupal Developer
+ Mon, 10 Jul 2017 22:27:20 +0100
+ -
+
Quickly Create Zen Subthemes Using Zenophile
+ https://www.oliverdavies.uk/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile
+ https://www.oliverdavies.uk/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile
+ Mon, 10 May 2010 00:00:00 +0100
+
+
+
+
\ No newline at end of file
diff --git a/docs/blog/tags/zenophile/index.html b/docs/blog/tags/zenophile/index.html
new file mode 100644
index 00000000..4d2602fa
--- /dev/null
+++ b/docs/blog/tags/zenophile/index.html
@@ -0,0 +1,188 @@
+
+
+
+ Tag Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "zenophile"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/blog/thanks/index.html b/docs/blog/thanks/index.html
new file mode 100644
index 00000000..d4cc48c1
--- /dev/null
+++ b/docs/blog/thanks/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/updating-features-and-adding-components-using-drush/index.html b/docs/blog/updating-features-and-adding-components-using-drush/index.html
new file mode 100644
index 00000000..f586ff44
--- /dev/null
+++ b/docs/blog/updating-features-and-adding-components-using-drush/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/updating-forked-repositories-on-github/index.html b/docs/blog/updating-forked-repositories-on-github/index.html
new file mode 100644
index 00000000..f9e5faee
--- /dev/null
+++ b/docs/blog/updating-forked-repositories-on-github/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/use-authorized-keys-create-passwordless-ssh-connection/index.html b/docs/blog/use-authorized-keys-create-passwordless-ssh-connection/index.html
new file mode 100644
index 00000000..fef827f5
--- /dev/null
+++ b/docs/blog/use-authorized-keys-create-passwordless-ssh-connection/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/use-regular-expressions-search-and-replace-coda-or-textmate/index.html b/docs/blog/use-regular-expressions-search-and-replace-coda-or-textmate/index.html
new file mode 100644
index 00000000..a0001d71
--- /dev/null
+++ b/docs/blog/use-regular-expressions-search-and-replace-coda-or-textmate/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/use-sass-and-compass-drupal-7-using-sassy/index.html b/docs/blog/use-sass-and-compass-drupal-7-using-sassy/index.html
new file mode 100644
index 00000000..580361a1
--- /dev/null
+++ b/docs/blog/use-sass-and-compass-drupal-7-using-sassy/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/useful-vagrant-commands/index.html b/docs/blog/useful-vagrant-commands/index.html
new file mode 100644
index 00000000..98fcf6e3
--- /dev/null
+++ b/docs/blog/useful-vagrant-commands/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/using-imagecache-and-imagecrop-my-portfolio/index.html b/docs/blog/using-imagecache-and-imagecrop-my-portfolio/index.html
new file mode 100644
index 00000000..7d936f19
--- /dev/null
+++ b/docs/blog/using-imagecache-and-imagecrop-my-portfolio/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/using-remote-files-when-developing-locally-with-stage-file-proxy-module/index.html b/docs/blog/using-remote-files-when-developing-locally-with-stage-file-proxy-module/index.html
new file mode 100644
index 00000000..e03bfa77
--- /dev/null
+++ b/docs/blog/using-remote-files-when-developing-locally-with-stage-file-proxy-module/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/what-git-flow/index.html b/docs/blog/what-git-flow/index.html
new file mode 100644
index 00000000..9fecec9d
--- /dev/null
+++ b/docs/blog/what-git-flow/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/writing-article-linux-journal/index.html b/docs/blog/writing-article-linux-journal/index.html
new file mode 100644
index 00000000..2c7312fd
--- /dev/null
+++ b/docs/blog/writing-article-linux-journal/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/blog/writing-info-file-drupal-7-theme/index.html b/docs/blog/writing-info-file-drupal-7-theme/index.html
new file mode 100644
index 00000000..bbf46582
--- /dev/null
+++ b/docs/blog/writing-info-file-drupal-7-theme/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/company-information/index.html b/docs/company-information/index.html
new file mode 100644
index 00000000..595b3b2d
--- /dev/null
+++ b/docs/company-information/index.html
@@ -0,0 +1,209 @@
+
+
+
+ Company Information | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Company name
+Oliver Davies Ltd (previously Oliver Davies Web Development Ltd)
+
+Registered address
+106 Rowan Way, Malpas, Newport, NP20 6JN
+
+Company number
+8017706
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/consulting/index.html b/docs/consulting/index.html
new file mode 100644
index 00000000..f615c101
--- /dev/null
+++ b/docs/consulting/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/contact/index.html b/docs/contact/index.html
new file mode 100644
index 00000000..6502ddc0
--- /dev/null
+++ b/docs/contact/index.html
@@ -0,0 +1,231 @@
+
+
+
+ Contact | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contact
+ To send me an email, complete the form below.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/contact/thanks/index.html b/docs/contact/thanks/index.html
new file mode 100644
index 00000000..1b943dae
--- /dev/null
+++ b/docs/contact/thanks/index.html
@@ -0,0 +1,198 @@
+
+
+
+ Thanks! | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Thanks!
+ Your email has been sent. You should receive a response within the next working day.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/experience/index.html b/docs/experience/index.html
new file mode 100644
index 00000000..3794d634
--- /dev/null
+++ b/docs/experience/index.html
@@ -0,0 +1,398 @@
+
+
+
+ Experience | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Experience
+
+
+
+
+
+
+
+
+
Microserve
+
+
https://microserve.io
+
Senior Drupal Developer from March 2017 to Present (Bristol, England).
+
+
+
+
+
+
+
+
+
Freelance
+
+
+
Web Developer & System Administrator from 2007 to Present (Remote).
+
+
+
+
Working on Drupal and Symfony development, maintenance and support projects in my spare time.
+
+
Administration of Debian, Ubuntu and CentOS servers, and configuration using Puppet, or more recently, Ansible.
+
+
+
+
+
+
+
+
+
+
+
+
Appnovation
+
+
https://www.appnovation.com
+
Senior Drupal Developer from May 2016 to March 2017 (Cardiff, Wales).
+
+
+
+
Drupal 7 and 8 site building, custom module development and theming.
+
+
Part of various pre-sales teams, including the company’s first UK Drupal 8 project and first FTSE 100 client.
+
+
+
+
+
+
+
+
+
+
+
+
CTI Digital
+
+
https://www.ctidigital.com
+
Lead Drupal Developer from November 2015 to May 2016 (Remote).
+
+
+
+
Working on various Drupal 7 projects for clients including Greater London Authority (http://www.london.gov.uk), British Land and British Council, as well as various retainer contracts.
+
+
Working on internal Drupal 8 learning initiatives, focussing on custom module development and data migration.
+
+
Initial development of a CLI application for generating new and auditing existing codebases to ensure consistency across projects. This uses various Symfony components - mainly the Console and Filesystem components.
+
+
+
+
+
+
+
+
+
+
+
+
Microserve
+
+
https://microserve.io
+
Senior Drupal Developer from July 2015 to November 2015 (Bristol, England).
+
+
+
+
Full-stack Drupal development, focussing on data migration.
+
+
Lead Developer of the road.cc rebuild project onto Drupal 7, including working with non-Drupal PHP applications and utilising of Symfony components, and interacting with Drupal via REST.
+
+
Community and contribution advocate.
+
+
+
+
+
+
+
+
+
+
+
+
Drupal Association
+
+
https://assoc.drupal.org
+
Drupal.org Developer from 2014 to July 2015 (Remote).
+
+
+
+
Maintaining and improving Drupal.org - the home of the Drupal community.
+
+
Speaking at user groups and DrupalCamps to promote the Drupal Association.
+
+
+
+
+
+
+
+
+
+
+
+
Precedent
+
+
http://precedent.com
+
Senior Drupal Developer from 2013 to 2014 (Cardiff, Wales).
+
+
+
+
Drupal 7 website development, including site building, theming, module development, data migration and server configuration.
+
+
+
+
+
+
+
+
+
+
+
+
Nomensa
+
+
http://www.nomensa.com
+
Contract Drupal Developer / Application Developer & System Administrator from 2012 to 2013 (Bristol, England).
+
+
+
+
Drupal 7 website development and Linux server administration.
+
+
I originally started as a contractor, and later took a staff role.
+
+
+
+
+
+
+
+
+
+
+
+
Proctor & Stevenson
+
+
http://www.proctors.co.uk
+
PHP Developer from 2011 to 2012 (Bristol, England).
+
+
+
+
Website development, mainly with Drupal and PHP, including the agency’s first Drupal 7 project.
+
+
+
+
+
+
+
+
+
+
+
+
Horse & Country TV
+
+
http://www.horseandcountry.tv
+
Web Developer from 2010 to 2011 (Cwmbran, Wales).
+
+
+
+
Maintaining and adding new features to the Horse & Country TV website (Drupal 6).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/git-flow/index.html b/docs/git-flow/index.html
new file mode 100644
index 00000000..b38557ef
--- /dev/null
+++ b/docs/git-flow/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 00000000..8b308533
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,475 @@
+
+
+
+ Web Developer, System Administrator - PHP, Drupal, Symfony, Linux | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/portfolio/index.html b/docs/portfolio/index.html
new file mode 100644
index 00000000..fcf033b9
--- /dev/null
+++ b/docs/portfolio/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/projects/abertawe-country-hotel-for-cats/index.html b/docs/projects/abertawe-country-hotel-for-cats/index.html
new file mode 100644
index 00000000..bbe37144
--- /dev/null
+++ b/docs/projects/abertawe-country-hotel-for-cats/index.html
@@ -0,0 +1,182 @@
+
+
+
+ Abertawe Country Hotel for Cats | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Abertawe Country Hotel for Cats
+
+
+
+ View the website
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/accessible-bristol/index.html b/docs/projects/accessible-bristol/index.html
new file mode 100644
index 00000000..dcd65683
--- /dev/null
+++ b/docs/projects/accessible-bristol/index.html
@@ -0,0 +1,183 @@
+
+
+
+ Accessible Bristol | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Accessible Bristol
+
+
+
+ View the website
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/aspira/index.html b/docs/projects/aspira/index.html
new file mode 100644
index 00000000..d467c181
--- /dev/null
+++ b/docs/projects/aspira/index.html
@@ -0,0 +1,191 @@
+
+
+
+ Aspira | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Aspira
+
+
+
+ View the website
+
+
+
+
+
Built whilst at
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/avon-motorsport/index.html b/docs/projects/avon-motorsport/index.html
new file mode 100644
index 00000000..0a601dab
--- /dev/null
+++ b/docs/projects/avon-motorsport/index.html
@@ -0,0 +1,192 @@
+
+
+
+ Avon Motorsport | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Avon Motorsport
+
+
+
+ View the website
+
+
+
+
+
Built whilst at
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/daylight-photo-awards/index.html b/docs/projects/daylight-photo-awards/index.html
new file mode 100644
index 00000000..dc974c17
--- /dev/null
+++ b/docs/projects/daylight-photo-awards/index.html
@@ -0,0 +1,185 @@
+
+
+
+ Daylight Photo Awards | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Daylight Photo Awards
+
+
+
+ View the website
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/digital-theatre-plus/index.html b/docs/projects/digital-theatre-plus/index.html
new file mode 100644
index 00000000..b2451e7b
--- /dev/null
+++ b/docs/projects/digital-theatre-plus/index.html
@@ -0,0 +1,190 @@
+
+
+
+ Digital Theatre Plus | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Digital Theatre Plus
+
+
+
+ View the website
+
+
+
+
+
Built whilst at
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/door-decor-more/index.html b/docs/projects/door-decor-more/index.html
new file mode 100644
index 00000000..3f6d03bb
--- /dev/null
+++ b/docs/projects/door-decor-more/index.html
@@ -0,0 +1,190 @@
+
+
+
+ Door Decor & More | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Door Decor & More
+
+
+
+ View the website
+
+
+
+
+
Built for
+
+
+ Zooba Ltd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/drupal-org/index.html b/docs/projects/drupal-org/index.html
new file mode 100644
index 00000000..42e8da0b
--- /dev/null
+++ b/docs/projects/drupal-org/index.html
@@ -0,0 +1,194 @@
+
+
+
+ Drupal.org | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Drupal.org
+
+
+
+ View the website
+
+
+
+
+
Built whilst at
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/drupal-vm-generator-website/index.html b/docs/projects/drupal-vm-generator-website/index.html
new file mode 100644
index 00000000..e99a5ee0
--- /dev/null
+++ b/docs/projects/drupal-vm-generator-website/index.html
@@ -0,0 +1,178 @@
+
+
+
+ drupalvmgenerator.com | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ drupalvmgenerator.com
+
+ drupalvmgenerator.com is a Drupal 8 website for the Drupal VM Generator project.
+
+It contains information about the project such as installation instructions, but also integrates with GitHub to provide a download link to the latest drupalvm.phar file, and provides a manifest file for the self:update
command to use.
+
+I’ve also started adding articles onto the site to coincide with new releases and announcements.
+
+
+ View the website
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/horse-country-tv/index.html b/docs/projects/horse-country-tv/index.html
new file mode 100644
index 00000000..cc1aa96d
--- /dev/null
+++ b/docs/projects/horse-country-tv/index.html
@@ -0,0 +1,191 @@
+
+
+
+ Horse & Country TV | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Horse & Country TV
+
+
+
+ View the website
+
+
+
+
+
Built whilst at
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/hutch-paving/index.html b/docs/projects/hutch-paving/index.html
new file mode 100644
index 00000000..4096720f
--- /dev/null
+++ b/docs/projects/hutch-paving/index.html
@@ -0,0 +1,187 @@
+
+
+
+ Hutch Paving | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hutch Paving
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/ifoa/index.html b/docs/projects/ifoa/index.html
new file mode 100644
index 00000000..1de69376
--- /dev/null
+++ b/docs/projects/ifoa/index.html
@@ -0,0 +1,191 @@
+
+
+
+ Institute and Faculty of Actuaries (IFoA) | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Institute and Faculty of Actuaries (IFoA)
+
+
+
+ View the website
+
+
+
+
+
Built whilst at
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/index.html b/docs/projects/index.html
new file mode 100644
index 00000000..7afef741
--- /dev/null
+++ b/docs/projects/index.html
@@ -0,0 +1,216 @@
+
+
+
+ Projects | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Projects
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/my-favourite-voucher-codes/index.html b/docs/projects/my-favourite-voucher-codes/index.html
new file mode 100644
index 00000000..dbcbcb45
--- /dev/null
+++ b/docs/projects/my-favourite-voucher-codes/index.html
@@ -0,0 +1,182 @@
+
+
+
+ My Favourite Voucher Codes | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ My Favourite Voucher Codes
+
+
+
+ View the website
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/road-cc/index.html b/docs/projects/road-cc/index.html
new file mode 100644
index 00000000..fdabb45e
--- /dev/null
+++ b/docs/projects/road-cc/index.html
@@ -0,0 +1,192 @@
+
+
+
+ road.cc | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ road.cc
+
+
+
+ View the website
+
+
+
+
+
Built whilst at
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/source-for-searches/index.html b/docs/projects/source-for-searches/index.html
new file mode 100644
index 00000000..964b6550
--- /dev/null
+++ b/docs/projects/source-for-searches/index.html
@@ -0,0 +1,192 @@
+
+
+
+ Source for Searches | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source for Searches
+
+
+
+ View the website
+
+
+
+
+
Built whilst at
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/vikisports/index.html b/docs/projects/vikisports/index.html
new file mode 100644
index 00000000..c9d823a0
--- /dev/null
+++ b/docs/projects/vikisports/index.html
@@ -0,0 +1,183 @@
+
+
+
+ Vikisports | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vikisports
+
+
+
+ View the website
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/watts-tvc/index.html b/docs/projects/watts-tvc/index.html
new file mode 100644
index 00000000..88fb3e07
--- /dev/null
+++ b/docs/projects/watts-tvc/index.html
@@ -0,0 +1,193 @@
+
+
+
+ Watts TVC | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Watts TVC
+
+
+
+ View the website
+
+
+
+
+
Built for
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/projects/wl2/index.html b/docs/projects/wl2/index.html
new file mode 100644
index 00000000..4af1ae77
--- /dev/null
+++ b/docs/projects/wl2/index.html
@@ -0,0 +1,182 @@
+
+
+
+ wL2 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ wL2
+
+
+
+ View the website
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/robots.txt b/docs/robots.txt
new file mode 100644
index 00000000..d4642dfa
--- /dev/null
+++ b/docs/robots.txt
@@ -0,0 +1,6 @@
+User-agent: *
+Disallow: /_projects/
+Disallow: /_testimonials/
+Disallow: /404.html
+
+Sitemap: https://www.oliverdavies.uk/sitemap.xml
\ No newline at end of file
diff --git a/docs/services/index.html b/docs/services/index.html
new file mode 100644
index 00000000..808c51a7
--- /dev/null
+++ b/docs/services/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/sitemap.xml b/docs/sitemap.xml
new file mode 100644
index 00000000..eca5db43
--- /dev/null
+++ b/docs/sitemap.xml
@@ -0,0 +1,722 @@
+
+
+
+ https://www.oliverdavies.uk
+ 2017-07-10
+ daily
+ 0.8
+
+
+
+ https://www.oliverdavies.uk/accessibility/
+ 2017-07-10
+ monthly
+ 0.6
+
+
+ https://www.oliverdavies.uk/blog/
+ 2017-07-10
+ monthly
+ 0.6
+
+
+ https://www.oliverdavies.uk/company-information/
+ 2017-07-10
+ monthly
+ 0.6
+
+
+ https://www.oliverdavies.uk/contact/
+ 2017-07-10
+ monthly
+ 0.6
+
+
+ https://www.oliverdavies.uk/services/
+ 2017-07-10
+ monthly
+ 0.6
+
+
+ https://www.oliverdavies.uk/talks/
+ 2017-07-10
+ monthly
+ 0.6
+
+
+ https://www.oliverdavies.uk/work/
+ 2017-07-10
+ monthly
+ 0.6
+
+
+
+ https://www.oliverdavies.uk/blog
+ 2017-07-10
+ monthly
+ 0.8
+
+
+
+ https://www.oliverdavies.uk/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot/
+ 2017-06-09T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2017/05/20/turning-drupal-module-into-feature/
+ 2017-05-20T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors/
+ 2017-05-15T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2017/05/05/fixing-drupal-simpletest-docker/
+ 2017-05-05T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2017/01/31/nginx-redirects-with-query-string-arguments/
+ 2017-01-31T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts/
+ 2017-01-07T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2016/12/30/drupal-vm-generator-291-released/
+ 2016-12-30T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2016/07/15/building-gmail-filters-with-php/
+ 2016-07-15T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload/
+ 2016-05-03T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2016/02/15/announcing-the-drupal-vm-generator/
+ 2016-02-15T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7/
+ 2015-12-22T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2015/07/21/automating-sculpin-jenkins/
+ 2015-07-21T01:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2015/07/19/sculpin-twig-resources/
+ 2015-07-19T01:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2015/06/18/updating-forked-repositories-on-github/
+ 2015-06-18T12:35:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version/
+ 2015-04-03T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2015/03/20/2014/
+ 2015-03-20T20:14:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides/
+ 2014-12-20T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/11/27/pantheon-settings-files/
+ 2014-11-27T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module/
+ 2014-11-20T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/11/18/include-css-fonts-using-sass-each-loop/
+ 2014-11-18T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/10/21/updating-features-and-adding-components-using-drush/
+ 2014-10-21T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine/
+ 2014-10-06T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/07/02/drush-make-drupalbristol/
+ 2014-07-02T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/05/21/git-format-patch/
+ 2014-05-21T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/05/06/thanks/
+ 2014-05-06T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/05/03/drupal-association/
+ 2014-05-03T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/03/03/what-git-flow/
+ 2014-03-03T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/02/09/drupalcamp-london-2014/
+ 2014-02-09T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2014/01/15/some-useful-git-aliases/
+ 2014-01-15T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/12/31/download-different-versions-drupal-drush/
+ 2013-12-31T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/12/24/quickly-apply-patches-using-git-and-curl-or-wget/
+ 2013-12-24T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/11/27/useful-vagrant-commands/
+ 2013-11-27T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/11/19/dont-bootstrap-drupal-use-drush/
+ 2013-11-19T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/09/06/create-a-zen-sub-theme-using-drush/
+ 2013-09-06T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/07/26/going-drupalcon/
+ 2013-07-26T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled/
+ 2013-07-17T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/06/13/some-useful-links-using-simpletest-drupal/
+ 2013-06-13T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt/
+ 2013-04-27T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/04/20/leaving-nomensa-joining-precedent/
+ 2013-04-20T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu/
+ 2013-03-02T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7/
+ 2013-02-16T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2013/01/09/checking-if-user-logged-drupal-right-way/
+ 2013-01-09T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy/
+ 2012-12-06T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line/
+ 2012-11-17T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/11/15/accessible-bristol-site-launched/
+ 2012-11-15T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/10/25/my-sublime-text-2-settings/
+ 2012-10-25T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/09/06/reflections-speaking-unifieddiff/
+ 2012-09-06T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file/
+ 2012-08-18T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/07/27/writing-article-linux-journal/
+ 2012-07-27T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/07/14/install-nomensa-media-player-drupal/
+ 2012-07-14T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/07/12/my-new-drupal-modules/
+ 2012-07-12T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files/
+ 2012-05-24T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/05/23/writing-info-file-drupal-7-theme/
+ 2012-05-23T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser/
+ 2012-05-23T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/05/23/add-date-popup-calendar-custom-form/
+ 2012-05-23T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess/
+ 2012-05-23T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/05/23/checkout-specific-revision-svn-command-line/
+ 2012-05-23T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/04/19/adding-custom-theme-templates-drupal-7/
+ 2012-04-19T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/04/17/installing-nagios-centos/
+ 2012-04-17T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush/
+ 2012-04-16T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/02/01/use-authorized-keys-create-passwordless-ssh-connection/
+ 2012-02-01T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2012/01/04/site-upgraded-drupal-7/
+ 2012-01-04T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu/
+ 2011-10-19T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections/
+ 2011-08-28T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2011/05/23/imagefield-import-archive/
+ 2011-05-23T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2011/05/20/proctors-hosting-next-drupal-meetup/
+ 2011-05-20T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2011/03/31/proctor-stevenson/
+ 2011-03-31T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2011/03/15/display-number-facebook-fans-php/
+ 2011-03-15T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website/
+ 2011-02-14T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate/
+ 2010-11-04T00:00:00+00:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/10/22/create-better-photo-gallery-drupal-part-21/
+ 2010-10-22T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/10/13/create-better-photo-gallery-drupal-part-3/
+ 2010-10-13T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/10/10/create-and-apply-patches/
+ 2010-10-10T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/09/26/south-wales-drupal-user-group/
+ 2010-09-26T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/08/20/review-image-caption-module/
+ 2010-08-20T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/08/17/create-better-photo-gallery-drupal-part-2/
+ 2010-08-17T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/08/11/create-better-photo-gallery-drupal-part-1/
+ 2010-08-11T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/08/10/review-adminhover-module/
+ 2010-08-10T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/07/12/review-teleport-module/
+ 2010-07-12T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql/
+ 2010-07-07T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx/
+ 2010-07-02T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/07/01/change-content-type-multiple-nodes-using-sql/
+ 2010-07-01T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views/
+ 2010-06-28T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/06/25/10-useful-drupal-6-modules/
+ 2010-06-25T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue/
+ 2010-06-23T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/06/02/improve-jpg-quality-imagecache-and-imageapi/
+ 2010-06-02T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module/
+ 2010-05-29T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide/
+ 2010-05-25T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile/
+ 2010-05-10T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/05/06/conditional-email-addresses-webform/
+ 2010-05-06T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio/
+ 2010-04-28T00:00:00+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/blog/2010/04/05/style-drupal-6s-taxonomy-lists-php-css-and-jquery/
+ 2010-04-05T00:00:00+01:00
+ weekly
+ 1.0
+
+
+
+ https://www.oliverdavies.uk/talks/dancing-for-drupal/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/deploying-php-applications-with-fabric/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/getting-started-with-drupal-8-module-development/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/drupal-8-rejoining-the-herd/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/drupal-8/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/modern-drupal-development-with-composer/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/drupal-vm-generator/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/drupal-vm-meet-symfony-console/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/drupalorg-in-2015-whats-coming-next/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/drush-make-drupalbristol/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/getting-your-data-into-drupal-8/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/git-flow/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/goodbye-drush-make-hello-composer/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/it-all-started-with-a-patch/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/building-static-websites-with-sculpin/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/test-drive-twig-with-sculpin/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/test-driven-drupal-development-with-simpletest-and-phpunit/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+ https://www.oliverdavies.uk/talks/so-what-is-this-drupal-thing/
+ 2017-07-10T22:27:13+01:00
+ weekly
+ 1.0
+
+
+
\ No newline at end of file
diff --git a/docs/speaker-info/index.html b/docs/speaker-info/index.html
new file mode 100644
index 00000000..c7024388
--- /dev/null
+++ b/docs/speaker-info/index.html
@@ -0,0 +1,231 @@
+
+
+
+ Speaker information | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Speaker information
+ Job title
+
+Senior Developer at Microserve .
+
+Bio
+
+Oliver Davies (@opdavies ) has been building websites since 2007, specialising in PHP and Drupal since 2008, and more recently also working with Symfony, Silex, Laravel and Sculpin. He is a Senior Developer at Microserve , a Drupal core contributor and mentor, and an open source and contribution advocate.
+
+He regularly blogs and gives talks about web development and systems administration, maintains and contributes to various open source projects, and co-organises the Drupal Bristol and PHPSW meetups and DrupalCamp Bristol conference.
+
+Photo
+
+https://www.dropbox.com/s/say1muiqedik0l4/0188395_thumb.jpg
+
+Events that I’ve spoken at
+
+
+DrupalCamp London (2014, 2015, 2016, 2017)
+DrupalCamp Brighton 2015
+DrupalCamp North 2015
+PHP South Coast 2016
+DrupalCamp Bristol 2016
+Nomad PHP
+
+
+Videos
+
+Here are some videos of my previous talks:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/speaking/index.html b/docs/speaking/index.html
new file mode 100644
index 00000000..f51e8f50
--- /dev/null
+++ b/docs/speaking/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2012/09/05/what-is-this-drupal-thing-unified-diff/index.html b/docs/talks/2012/09/05/what-is-this-drupal-thing-unified-diff/index.html
new file mode 100644
index 00000000..707ef3d3
--- /dev/null
+++ b/docs/talks/2012/09/05/what-is-this-drupal-thing-unified-diff/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2014/03/01/git-flow-drupalcamp-london-2014/index.html b/docs/talks/2014/03/01/git-flow-drupalcamp-london-2014/index.html
new file mode 100644
index 00000000..b38557ef
--- /dev/null
+++ b/docs/talks/2014/03/01/git-flow-drupalcamp-london-2014/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2014/07/02/drush-make-drupalbristol-drupal-bristol/index.html b/docs/talks/2014/07/02/drush-make-drupalbristol-drupal-bristol/index.html
new file mode 100644
index 00000000..e79a9aaa
--- /dev/null
+++ b/docs/talks/2014/07/02/drush-make-drupalbristol-drupal-bristol/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2015/01/18/drupalorg-2015-drupalcamp-brighton-2015/index.html b/docs/talks/2015/01/18/drupalorg-2015-drupalcamp-brighton-2015/index.html
new file mode 100644
index 00000000..1b8d7f2e
--- /dev/null
+++ b/docs/talks/2015/01/18/drupalorg-2015-drupalcamp-brighton-2015/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2015/02/28/drupalorg-2015-drupalcamp-london-2015/index.html b/docs/talks/2015/02/28/drupalorg-2015-drupalcamp-london-2015/index.html
new file mode 100644
index 00000000..1b8d7f2e
--- /dev/null
+++ b/docs/talks/2015/02/28/drupalorg-2015-drupalcamp-london-2015/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2015/04/08/drupal-8-phpsw/index.html b/docs/talks/2015/04/08/drupal-8-phpsw/index.html
new file mode 100644
index 00000000..46ff1769
--- /dev/null
+++ b/docs/talks/2015/04/08/drupal-8-phpsw/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2015/07/25/test-drive-twig-with-sculpin-drupalcamp-north-2015/index.html b/docs/talks/2015/07/25/test-drive-twig-with-sculpin-drupalcamp-north-2015/index.html
new file mode 100644
index 00000000..1dbfc0fc
--- /dev/null
+++ b/docs/talks/2015/07/25/test-drive-twig-with-sculpin-drupalcamp-north-2015/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2015/08/25/dancing-for-drupal-umbristol/index.html b/docs/talks/2015/08/25/dancing-for-drupal-umbristol/index.html
new file mode 100644
index 00000000..5c7cb39a
--- /dev/null
+++ b/docs/talks/2015/08/25/dancing-for-drupal-umbristol/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2015/10/14/sculpin-phpsw/index.html b/docs/talks/2015/10/14/sculpin-phpsw/index.html
new file mode 100644
index 00000000..edadb88f
--- /dev/null
+++ b/docs/talks/2015/10/14/sculpin-phpsw/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2016/03/05/drupal-8-module-development-drupalcamp-london-2016/index.html b/docs/talks/2016/03/05/drupal-8-module-development-drupalcamp-london-2016/index.html
new file mode 100644
index 00000000..f5dc0573
--- /dev/null
+++ b/docs/talks/2016/03/05/drupal-8-module-development-drupalcamp-london-2016/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2016/03/09/drupal-vm-generator-nwdug/index.html b/docs/talks/2016/03/09/drupal-vm-generator-nwdug/index.html
new file mode 100644
index 00000000..5e2f93d6
--- /dev/null
+++ b/docs/talks/2016/03/09/drupal-vm-generator-nwdug/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2016/04/02/drupal-vm-generator-drupal-bristol/index.html b/docs/talks/2016/04/02/drupal-vm-generator-drupal-bristol/index.html
new file mode 100644
index 00000000..5e2f93d6
--- /dev/null
+++ b/docs/talks/2016/04/02/drupal-vm-generator-drupal-bristol/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2016/06/11/drupal-8-rejoining-the-herd-php-south-coast-2016/index.html b/docs/talks/2016/06/11/drupal-8-rejoining-the-herd-php-south-coast-2016/index.html
new file mode 100644
index 00000000..d12c5ad9
--- /dev/null
+++ b/docs/talks/2016/06/11/drupal-8-rejoining-the-herd-php-south-coast-2016/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2016/07/23/drupal-vm-meet-symfony-console-drupalcamp-bristol-2016/index.html b/docs/talks/2016/07/23/drupal-vm-meet-symfony-console-drupalcamp-bristol-2016/index.html
new file mode 100644
index 00000000..1ce5d96a
--- /dev/null
+++ b/docs/talks/2016/07/23/drupal-vm-meet-symfony-console-drupalcamp-bristol-2016/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2016/11/09/drupal-development-with-composer-phpsw/index.html b/docs/talks/2016/11/09/drupal-development-with-composer-phpsw/index.html
new file mode 100644
index 00000000..f8598ad0
--- /dev/null
+++ b/docs/talks/2016/11/09/drupal-development-with-composer-phpsw/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2016/11/17/goodbye-drush-make-hello-composer-drupal-bristol/index.html b/docs/talks/2016/11/17/goodbye-drush-make-hello-composer-drupal-bristol/index.html
new file mode 100644
index 00000000..748309ff
--- /dev/null
+++ b/docs/talks/2016/11/17/goodbye-drush-make-hello-composer-drupal-bristol/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2017/01/18/getting-your-data-into-drupal-8-drupal-bristol/index.html b/docs/talks/2017/01/18/getting-your-data-into-drupal-8-drupal-bristol/index.html
new file mode 100644
index 00000000..cdae3438
--- /dev/null
+++ b/docs/talks/2017/01/18/getting-your-data-into-drupal-8-drupal-bristol/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/2017/03/04/getting-your-data-into-drupal-8-drupalcamp-london-2017/index.html b/docs/talks/2017/03/04/getting-your-data-into-drupal-8-drupalcamp-london-2017/index.html
new file mode 100644
index 00000000..cdae3438
--- /dev/null
+++ b/docs/talks/2017/03/04/getting-your-data-into-drupal-8-drupalcamp-london-2017/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/archive/index.html b/docs/talks/archive/index.html
new file mode 100644
index 00000000..47f9e13c
--- /dev/null
+++ b/docs/talks/archive/index.html
@@ -0,0 +1,872 @@
+
+
+
+ Talk Archive | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Talk Archive
+ Here are a list of my previous conference and user group talks:
+
+
+
+
+
+
+
+
+
+ Date
+
+ Talk
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 20 April 2017
+
+ 19:00 (CET)
+
+
+
+ Deploying PHP Applications with Fabric
+
+
+ Lightning talk
+
+
+
+
+
+ Nomad PHP
+
+
+
+ Online
+
+
+
+
+
+
+
+
+
+
+ 4 March 2017
+
+ 12:05 - 12:50
+
+
+
+ Getting (Your Data) Into Drupal 8
+
+
+ Talk
+
+
+
+
+
+ DrupalCamp London 2017
+
+
+
+ London, UK
+
+
+
+
+
+
+
+
+
+
+ 4 March 2017
+
+ 16:15 - 17:00
+
+
+
+ Test Driven Drupal Development with SimpleTest and PHPUnit
+
+
+ Talk
+
+
+
+
+
+ DrupalCamp London 2017
+
+
+
+ London, UK
+
+
+
+
+
+
+
+
+
+
+ 8 February 2016
+
+
+
+
+ It All Started With A Patch
+
+
+ Lightning talk
+
+
+
+
+
+ PHPSW
+
+
+
+ Bristol, UK
+
+
+
+
+
+ joind.in
+
+
+
+
+
+
+
+ 18 January 2017
+
+
+
+
+ Getting (Your Data) Into Drupal 8
+
+
+ Talk
+
+
+
+
+
+ Drupal Bristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+ 17 November 2016
+
+
+
+
+ Goodbye Drush Make. Hello Composer!
+
+
+ Talk
+
+
+
+
+
+ Drupal Bristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+ 9 November 2016
+
+
+
+
+ Modern Drupal Development with Composer
+
+
+ Lightning talk
+
+
+
+
+
+ PHPSW
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+ 23 July 2016
+
+
+
+
+ Drupal VM, Meet Symfony Console
+
+
+ Talk
+
+
+
+
+
+ DrupalCamp Bristol 2016
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+ 11 June 2016
+
+
+
+
+ Drupal 8: Rejoining the Herd
+
+
+ Talk
+
+
+
+
+
+ PHP South Coast 2016
+
+
+
+ Portsmouth, UK
+
+
+
+
+
+ joind.in
+
+
+
+
+
+
+
+ 2 April 2016
+
+
+
+
+ Drupal VM Generator
+
+
+ Lightning talk
+
+
+
+
+
+ Drupal Bristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+ 8 March 2016
+
+
+
+
+ Drupal VM Generator
+
+
+ Lightning talk
+
+
+
+
+
+ NWDUG
+
+
+
+ Manchester, UK
+
+
+
+
+
+
+
+
+
+
+ 5 March 2016
+
+
+
+
+ Getting Started with Drupal 8 Module Development
+
+
+ Talk
+
+
+
+
+ DrupalCamp London 2016
+
+
+ London, UK
+
+
+
+
+
+
+
+
+
+
+ 14 October 2015
+
+
+
+
+ Building Static Websites with Sculpin
+
+
+ Lightning talk
+
+
+
+
+
+ PHPSW
+
+
+
+ Bristol, UK
+
+
+
+
+
+ joind.in
+
+
+
+
+
+
+
+ 25 August 2015
+
+
+
+
+ Dancing for Drupal
+
+
+ Talk
+
+
+
+
+
+ umBristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+ 25 July 2015
+
+
+
+
+ Test Drive Twig with Sculpin
+
+
+ Talk
+
+
+
+
+
+ DrupalCamp North 2015
+
+
+
+ Sunderland, UK
+
+
+
+
+
+
+
+
+
+
+ 8 April 2015
+
+
+
+
+ Drupal 8
+
+
+ Lightning talk
+
+
+
+
+
+ PHPSW
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+ 28 February 2015
+
+
+
+
+ Drupal.org in 2015: What's Coming Next
+
+
+ Talk
+
+
+
+
+ DrupalCamp London 2015
+
+
+ London, UK
+
+
+
+
+
+
+
+
+
+
+ 18 January 2015
+
+
+
+
+ Drupal.org in 2015: What's Coming Next
+
+
+ Talk
+
+
+
+
+ DrupalCamp Brighton 2015
+
+
+ Brighton, UK
+
+
+
+
+
+
+
+
+
+
+ 19 August 2014
+
+
+
+
+ About the Drupal Association
+
+
+ Talk
+
+
+
+
+ SWDUG
+
+
+ Cardiff, UK
+
+
+
+
+
+
+
+
+
+
+ 19 August 2014
+
+
+
+
+ drush make drupalbristol
+
+
+ Talk
+
+
+
+
+
+ Drupal Bristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+ 1 March 2014
+
+
+
+
+ Never Commit to Master - An Introduction to Git Flow
+
+
+ Talk
+
+
+
+
+ DrupalCamp London 2014
+
+
+ London, UK
+
+
+
+
+
+
+
+
+
+
+ 10 July 2013
+
+
+
+
+ Drupal and the LDAP Module
+
+
+ Talk
+
+
+
+
+ SWDUG
+
+
+ Cardiff, UK
+
+
+
+
+
+
+
+
+
+
+ 5 September 2012
+
+
+
+
+ So, what is this Drupal thing?
+
+
+ Talk
+
+
+
+
+
+ unified.diff
+
+
+
+ Cardiff, UK
+
+
+
+
+
+
+
+
+
+
+
+
+Upcoming talks can be found on the talks page .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/building-static-websites-with-sculpin/index.html b/docs/talks/building-static-websites-with-sculpin/index.html
new file mode 100644
index 00000000..1952415b
--- /dev/null
+++ b/docs/talks/building-static-websites-with-sculpin/index.html
@@ -0,0 +1,237 @@
+
+
+
+ Building Static Websites with Sculpin | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Building Static Websites with Sculpin
+
+
Sculpin is a static site generator written in PHP. It converts Markdown files, Twig templates and standard HTML into a static HTML site that can be easily deployed.
+
+
This talk will cover a little of the background to Sculpin and what it is, and then will move into some demonstrations of how to build a Sculpin site and what it can do!
+
+
You can view the full slides , including the embedded videos.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 14 October 2015
+
+
+
+
+
+
+ PHPSW
+
+
+
+ Bristol, UK
+
+
+
+
+
+ joind.in
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/dancing-for-drupal/index.html b/docs/talks/dancing-for-drupal/index.html
new file mode 100644
index 00000000..f824b3d1
--- /dev/null
+++ b/docs/talks/dancing-for-drupal/index.html
@@ -0,0 +1,235 @@
+
+
+
+ Dancing for Drupal | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dancing for Drupal
+
+
As part of their CMS Dance-Off , I was selected to speak about Drupal alongside other speakers representing Umbraco, Sitecore and Episerver.
+
+
The points to cover were:
+
+
+How does your CMS store configuration data, 'structure' and content?
+How do you manage source-control, versioning and deployment?
+How do you manage multiple simultaneous editors and/or developers?
+How do you manage upgrades?
+What are the 3 best things about your CMS?
+What are the 3 worst things about your CMS?
+What does the future of your CMS look like?
+
+
+
In each point, tried to cover the differences between Drupal core and developing a project using Drupal, as well as between Drupal 7 and Drupal 8, as things like source control and versioning would be approached differently.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 25 August 2015
+
+
+
+
+
+
+ umBristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/deploying-php-applications-with-fabric/index.html b/docs/talks/deploying-php-applications-with-fabric/index.html
new file mode 100644
index 00000000..646fba16
--- /dev/null
+++ b/docs/talks/deploying-php-applications-with-fabric/index.html
@@ -0,0 +1,261 @@
+
+
+
+ Deploying PHP Applications with Fabric | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Deploying PHP Applications with Fabric
+
+
You’ve built your application, and now you just need to deploy it. There are various ways that this could be done – from (S)FTP, to SCP and rsync, to running commands like “git pull” and “composer install” directly on the server (not recommended).
+
+
My favourite deployment tool of late is Fabric – a Python based command line tool for running commands locally as well as on remote servers. It’s language and framework agnostic, and unopinionated so you define the steps and workflow that you need – from a basic few-step deployment to a full Capistrano style zero-downtime deployment.
+
+
This talk will cover some introduction to Fabric and how to write your own fabfiles, and then look at some examples of different use case deployments for your PHP project.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 20 April 2017
+
+ 19:00 (CET)
+
+
+
+
+
+ Nomad PHP
+
+
+
+ Online
+
+
+
+
+
+
+
+
+
+
+ October 2017
+
+
+
+
+
+
+ PHP North West 2017
+
+
+
+ Manchester, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/drupal-8-rejoining-the-herd/index.html b/docs/talks/drupal-8-rejoining-the-herd/index.html
new file mode 100644
index 00000000..41525588
--- /dev/null
+++ b/docs/talks/drupal-8-rejoining-the-herd/index.html
@@ -0,0 +1,230 @@
+
+
+
+ Drupal 8: Rejoining the Herd | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Drupal 8: Rejoining the Herd
+
+
Drupal 8 was (finally) released on November 19th 2015, after almost 4 years of work and code commits by over 3,200 different contributors. Whilst it’s pretty much the same as the Drupal that we know and, hopefully, love, a lot has changed behind the scenes and under the hood!
+
+
In this talk, I'll highlight some of the new features and improvements in Drupal 8, and discuss some of the benefits to Drupal site builders, themers, and module developers. I'll also talk about some of the non-technical changes and the cultural shift from "not invented here" to "proudly found elsewhere", and how we are rejoining the PHP herd.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/drupal-8/index.html b/docs/talks/drupal-8/index.html
new file mode 100644
index 00000000..3e3cf8fa
--- /dev/null
+++ b/docs/talks/drupal-8/index.html
@@ -0,0 +1,228 @@
+
+
+
+ Drupal 8 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Drupal 8
+
+
This was a ten minute lightning talk, designed to highlight the major changes coming in Drupal 8.
+
+
I categorised the technical changes into groups for site builders, developers and themers, and also highlighted the cultural shift from "not invented here" to "proudly found elsewhere" and the benefits that brings.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 8 April 2015
+
+
+
+
+
+
+ PHPSW
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/drupal-vm-generator-2/index.html b/docs/talks/drupal-vm-generator-2/index.html
new file mode 100644
index 00000000..5e2f93d6
--- /dev/null
+++ b/docs/talks/drupal-vm-generator-2/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/drupal-vm-generator/index.html b/docs/talks/drupal-vm-generator/index.html
new file mode 100644
index 00000000..8ee046d2
--- /dev/null
+++ b/docs/talks/drupal-vm-generator/index.html
@@ -0,0 +1,248 @@
+
+
+
+ Drupal VM Generator | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Drupal VM Generator
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 8 March 2016
+
+
+
+
+
+
+ NWDUG
+
+
+
+ Manchester, UK
+
+
+
+
+
+
+
+
+
+
+ 2 April 2016
+
+
+
+
+
+
+ Drupal Bristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/drupal-vm-meet-symfony-console/index.html b/docs/talks/drupal-vm-meet-symfony-console/index.html
new file mode 100644
index 00000000..b5ed76ed
--- /dev/null
+++ b/docs/talks/drupal-vm-meet-symfony-console/index.html
@@ -0,0 +1,225 @@
+
+
+
+ Drupal VM, Meet Symfony Console | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Drupal VM, Meet Symfony Console
+
+
TL;DR - Come and learn about Symfony Console, with examples from a real-world project.
+
+
The Drupal VM Generator is a CLI application, built on Symfony Console , that generates configuration files for Drupal VM based on personal settings and user interaction.
+
+
After an introduction to Drupal VM itself and the Drupal VM Generator, we’ll jump into the code and see how Symfony Console applications are structured, how to write new commands, and how to integrate additional libraries like Guzzle, Twig and other Symfony components - whilst referencing code from the Drupal VM Generator project.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 23 July 2016
+
+
+
+
+
+
+ DrupalCamp Bristol 2016
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/drupalorg-2015-2/index.html b/docs/talks/drupalorg-2015-2/index.html
new file mode 100644
index 00000000..1b8d7f2e
--- /dev/null
+++ b/docs/talks/drupalorg-2015-2/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/drupalorg-2015/index.html b/docs/talks/drupalorg-2015/index.html
new file mode 100644
index 00000000..1b8d7f2e
--- /dev/null
+++ b/docs/talks/drupalorg-2015/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/talks/drupalorg-in-2015-whats-coming-next/index.html b/docs/talks/drupalorg-in-2015-whats-coming-next/index.html
new file mode 100644
index 00000000..7b1b48bd
--- /dev/null
+++ b/docs/talks/drupalorg-in-2015-whats-coming-next/index.html
@@ -0,0 +1,238 @@
+
+
+
+ Drupal.org in 2015: What's Coming Next | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Drupal.org in 2015: What's Coming Next
+
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 18 January 2015
+
+
+
+
+
+ DrupalCamp Brighton 2015
+
+
+ Brighton, UK
+
+
+
+
+
+
+
+
+
+
+ 28 February 2015
+
+
+
+
+
+ DrupalCamp London 2015
+
+
+ London, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/drush-make-drupalbristol/index.html b/docs/talks/drush-make-drupalbristol/index.html
new file mode 100644
index 00000000..21dc253f
--- /dev/null
+++ b/docs/talks/drush-make-drupalbristol/index.html
@@ -0,0 +1,220 @@
+
+
+
+ drush make drupalbristol | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ drush make drupalbristol
+
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 19 August 2014
+
+
+
+
+
+
+ Drupal Bristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/getting-started-with-drupal-8-module-development/index.html b/docs/talks/getting-started-with-drupal-8-module-development/index.html
new file mode 100644
index 00000000..1ca9f3ab
--- /dev/null
+++ b/docs/talks/getting-started-with-drupal-8-module-development/index.html
@@ -0,0 +1,247 @@
+
+
+
+ Getting Started with Drupal 8 Module Development | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Getting Started with Drupal 8 Module Development
+
+
New to object-orientated PHP, Symfony or YAML, and want to get started building modules in Drupal 8? This is the session for you!
+
+
In this session, we’ll cover:
+
+
+Where Drupal 8 modules are located, and how they are structured.
+How to build a simple module, including our own permissions and routes.
+How to add your own controller and service classes.
+What is the service/dependency injection container, and how do we use it?
+How we can use tools such as PhpStorm and Drupal Console to speed up the process.
+
+
+
What we won’t be covering:
+
+
+Automated testing in PHPUnit or Simpletest.
+Adding third party libraries and external dependencies via Composer.
+
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 5 March 2016
+
+
+
+
+
+ DrupalCamp London 2016
+
+
+ London, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/getting-your-data-into-drupal-8/index.html b/docs/talks/getting-your-data-into-drupal-8/index.html
new file mode 100644
index 00000000..c82d23dd
--- /dev/null
+++ b/docs/talks/getting-your-data-into-drupal-8/index.html
@@ -0,0 +1,261 @@
+
+
+
+ Getting (Your Data) Into Drupal 8 | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Getting (Your Data) Into Drupal 8
+
+
If you’ve moved a site from Drupal 6 to 7, the chances are that you’ve either used the upgrade path to update your old site in-place, or you built a new site from scratch and used the Migrate module from contrib to migrate your data from the old database.
+
+
In Drupal 8, things have changed as there’s no upgrade path from Drupal 7 and the Migrate module has been moved into core, though there are still migration related modules available in contrib.
+
+
This talk will look at the core Migrate module and how it implements Drupal 8 features such as YAML and the plugin and configuration systems, and how to write your own migrations to get your data into Drupal 8.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 18 January 2017
+
+
+
+
+
+
+ Drupal Bristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+ 4 March 2017
+
+ 12:05 - 12:50
+
+
+
+
+
+ DrupalCamp London 2017
+
+
+
+ London, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/git-flow/index.html b/docs/talks/git-flow/index.html
new file mode 100644
index 00000000..151d58fc
--- /dev/null
+++ b/docs/talks/git-flow/index.html
@@ -0,0 +1,223 @@
+
+
+
+ Never Commit to Master - An Introduction to Git Flow | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Never Commit to Master - An Introduction to Git Flow
+
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 1 March 2014
+
+
+
+
+
+ DrupalCamp London 2014
+
+
+ London, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/goodbye-drush-make-hello-composer/index.html b/docs/talks/goodbye-drush-make-hello-composer/index.html
new file mode 100644
index 00000000..68b25315
--- /dev/null
+++ b/docs/talks/goodbye-drush-make-hello-composer/index.html
@@ -0,0 +1,225 @@
+
+
+
+ Goodbye Drush Make. Hello Composer! | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Goodbye Drush Make. Hello Composer!
+
+
One of the main outcomes of Drupal 8 was “getting off the island” with third-party code included in core and adopting modern best practices from the wider PHP ecosystem - including Composer , PHP’s dependency manager.
+
+
Included to manage core’s dependencies, it has also gained traction in the contrib space with the creation of the Drupal Composer project, and the Drupal Packagist and now native endpoints on Drupal.org exposing contrib project metadata.
+
+
In this session, I'll show how to fully manage a Drupal 7 or Drupal 8 website including contributed modules and themes and external libraries with Composer.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 17 November 2016
+
+
+
+
+
+
+ Drupal Bristol
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/index.html b/docs/talks/index.html
new file mode 100644
index 00000000..49a58c20
--- /dev/null
+++ b/docs/talks/index.html
@@ -0,0 +1,434 @@
+
+
+
+ Talks | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Talks
+
+I regularly speak at conferences and user groups about a range of subjects including Drupal, Sculpin and Git. If you would like to me to speak at your group or conference, please get in touch .
+
+There is also information about events that I’ve attended and spoken at on my Lanyrd and Joind.in profiles.
+
+
+
+
+
+
+
+Upcoming Talks
+
+
+
+
+Last 5 Talks
+
+
+
+
+You can view more talks in the talks archive .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/it-all-started-with-a-patch/index.html b/docs/talks/it-all-started-with-a-patch/index.html
new file mode 100644
index 00000000..a40c2dea
--- /dev/null
+++ b/docs/talks/it-all-started-with-a-patch/index.html
@@ -0,0 +1,233 @@
+
+
+
+ It All Started With A Patch | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ It All Started With A Patch
+
+
A crash course of why and how to get involved with open source.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 8 February 2016
+
+
+
+
+
+
+ PHPSW
+
+
+
+ Bristol, UK
+
+
+
+
+
+ joind.in
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/modern-drupal-development-with-composer/index.html b/docs/talks/modern-drupal-development-with-composer/index.html
new file mode 100644
index 00000000..4b8d36d2
--- /dev/null
+++ b/docs/talks/modern-drupal-development-with-composer/index.html
@@ -0,0 +1,230 @@
+
+
+
+ Modern Drupal Development with Composer | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Modern Drupal Development with Composer
+
+
Building a Drupal application? You no longer need to download archives to add new modules or update core, or deal with Drupal specific tools to manage your codebase.
+
+
With Drupal "getting off the island" there has been an increase in the adoption of common PHP tools within the Drupal ecosystem.
+
+
In this lightning talk, I’ll show how to build a Drupal application using Composer for dependency management.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 9 November 2016
+
+
+
+
+
+
+ PHPSW
+
+
+
+ Bristol, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/so-what-is-this-drupal-thing/index.html b/docs/talks/so-what-is-this-drupal-thing/index.html
new file mode 100644
index 00000000..a3d55105
--- /dev/null
+++ b/docs/talks/so-what-is-this-drupal-thing/index.html
@@ -0,0 +1,221 @@
+
+
+
+ So, what is this Drupal thing? | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ So, what is this Drupal thing?
+
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 5 September 2012
+
+
+
+
+
+
+ unified.diff
+
+
+
+ Cardiff, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/test-drive-twig-with-sculpin/index.html b/docs/talks/test-drive-twig-with-sculpin/index.html
new file mode 100644
index 00000000..9382a412
--- /dev/null
+++ b/docs/talks/test-drive-twig-with-sculpin/index.html
@@ -0,0 +1,223 @@
+
+
+
+ Test Drive Twig with Sculpin | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test Drive Twig with Sculpin
+
+
Sculpin is a static site generator written in PHP, and based on Symfony components . It uses YAML and Twig , which makes it very appealing to Drupal people wanting to learn these in preparation for Drupal 8.
+
+
This session covered how to install Sculpin itself, as well as how to use it to build a static site from Markdown, HTML and Twig templates. We also covered Sculpin concepts such as content types, themes and partials, and Twig layouts, blocks and inheritance, as well as some tips and tricks that I've found whilst developing with Sculpin.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+ 25 July 2015
+
+
+
+
+
+
+ DrupalCamp North 2015
+
+
+
+ Sunderland, UK
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/talks/test-driven-drupal-development-with-simpletest-and-phpunit/index.html b/docs/talks/test-driven-drupal-development-with-simpletest-and-phpunit/index.html
new file mode 100644
index 00000000..e6e80d14
--- /dev/null
+++ b/docs/talks/test-driven-drupal-development-with-simpletest-and-phpunit/index.html
@@ -0,0 +1,216 @@
+
+
+
+ Test Driven Drupal Development with SimpleTest and PHPUnit | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test Driven Drupal Development with SimpleTest and PHPUnit
+
+
Testing is important. Why? It allows developers to add new features and edit and refactor existing code without the worry of adding regressions, reduces the reliance on manual testing to discover bugs, and by taking a test driven approach, your implementation code is leaner as you only write what is needed for your tests to pass.
+
+
Drupal 7 includes the SimpleTest module for unit and functional testing, whilst Drupal 8 also includes and supports PHPUnit - the defacto PHP testing framework, used by other PHP projects including Symfony and Laravel - making it easier for people to test their code. And with testing being one of the Drupal core gates with tests needing to be included with every new feature or bug fix, and core’s 100% pass rate policy, testing has become an essential skill when contributing to core, or when working on your own projects.
+
+
In this talk, we’ll cover the methodology and terminology involved with automated testing, and then take a test driven approach to creating a new Drupal module.
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ Date
+
+
+ Event
+
+ Feedback
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/terms-and-conditions/index.html b/docs/terms-and-conditions/index.html
new file mode 100644
index 00000000..937f9ea1
--- /dev/null
+++ b/docs/terms-and-conditions/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/terms/index.html b/docs/terms/index.html
new file mode 100644
index 00000000..6aa73dbc
--- /dev/null
+++ b/docs/terms/index.html
@@ -0,0 +1,199 @@
+
+
+
+ Development Terms | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Development Terms
+
+TODO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/testimonials/index.html b/docs/testimonials/index.html
new file mode 100644
index 00000000..11653eef
--- /dev/null
+++ b/docs/testimonials/index.html
@@ -0,0 +1,340 @@
+
+
+
+ Testimonials | Oliver Davies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Testimonials
+
+
+
+ Chris Jarvis
+
+
+
+
+
+ Oliver is an amazing colleague, he's professional, full of knowledge and I could not recommend him more.
+
+
+
+
+ Josh Mitchell
+
+
+
+
+
+ Oliver is a skilled Drupal developer with a passion for the Drupal community. As his direct supervisor, I was able to watch Oliver grow with the Drupal Association and contribute an amazing amount of effort and integrity to all of his work.
+
+Everything we have thrown at Oliver, he has approached with an open and flexible mind that has allowed him to work on a wide range of projects and features for Drupal products.
+
+
+
+
+ Holly Ross
+
+
+
+
+
+ Oliver has been an outstanding contributor to the Drupal Association team. He is a talented developer who writes great code and applies his curiosity and love of learning to every project. He is also a fantastic team member, who gives to the team as much as he gets.
+
+Oliver is the embodiment of everything good about the Drupal community.
+
+
+
+
+ Léonie Watson
+
+
+
+
+
Director of Accessibility at Nomensa
+
+
+
+ Oliver is a flexible and hardworking developer, with a terrific knowledge of Drupal. He promotes accessibility best practice within the Drupal community, and is always happy to share his knowledge with other people.
+
+
+
+
+ James Chapman
+
+
+
+
+
+ We used Oliver on a number of occasions throughout 2012 and I have to say we've been delighted with his work. His skills working with Drupal are excellent particularly with custom module development and we wouldn’t hesitate to recommend him others.
+
+
+
+
+ Daniel Easterbrook
+
+
+
+
Digital Strategy Consultant
+
+
+
+ Oliver is seasoned Drupal and all round highly skilled and experienced web developer. I have worked with Oliver on an important project where he was reliable, prompt and ensured strict client deadline delivery and confidentiality at all times.
+
+
+
+
+ Brian Hartwell
+
+
+
+
Interactive Creative Director
+
+
+
+ Oliver was great to work with. He has expert knowledge with Drupal and delivered exactly what we were looking for on time. He's understanding, friendly and easy to get along with. I would enjoy working with him again in the future.
+
+
+
+
+ Marlon Duncanson
+
+
+
+
Brand & Web Specialist
+
+
+
+ Oliver is a great guy and really easy to work with. He really goes the extra mile to make sure the project is done properly. I would recommend him and will not hesitate to use him again in future.
+
+
+
+
+ Brian Healy
+
+
+
+
+
Director of Business Development at Tincan
+
+
+
+ Oliver was fantastic to work with - pro-active and highly responsive, he worked well remotely and as part of a project team. His understanding of the project requirement(s) and ability to translate it into working code was essential and he delivered.
+
+
+
+
+ Ed Welsby
+
+
+
+
+
+ Oliver was great to work with, he has a solid knowledge of the various aspects of web development and never minded helping me out with Linux commands!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Availability
+
+
+
+
+
+
+ Currently have limited part-time capacity
+
+
+
+
+ Currently no spare full-time capacity.
+
+
+
+
+
+
Latest blog posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/work/index.html b/docs/work/index.html
new file mode 100644
index 00000000..808c51a7
--- /dev/null
+++ b/docs/work/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file