major update + rewrite

This commit is contained in:
Plailect 2016-10-29 19:02:14 -04:00
parent e9bb4232f1
commit c6947ce74b
241 changed files with 18445 additions and 3 deletions

3
.bundle/config Normal file
View file

@ -0,0 +1,3 @@
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_DISABLE_SHARED_GEMS: "true"

13
.editorconfig Normal file
View file

@ -0,0 +1,13 @@
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = false
[*.md]
trim_trailing_whitespace = false

5
.gitattributes vendored Normal file
View file

@ -0,0 +1,5 @@
_assets/css/vendor/* linguist-vendored
_assets/js/plugins/* linguist-vendored
_assets/js/vendor/* linguist-vendored
assets/fonts/* linguist-vendored
assets/js/vendor/* linguist-vendored

11
.gitignore vendored Normal file
View file

@ -0,0 +1,11 @@
*.sublime-project
*.sublime-workspace
.DS_Store
.jekyll-metadata
.sass-cache
_asset_bundler_cache
_site
codekit-config.json
node_modules
npm-debug.log*
vendor/

24
Gemfile Normal file
View file

@ -0,0 +1,24 @@
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
# bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
gem "github-pages", group: :jekyll_plugins
# If you want to use Jekyll native, uncomment the line below.
# To upgrade, run `bundle update`.
# gem "jekyll"
gem "wdm", "~> 0.1.0" if Gem.win_platform?
# If you have any plugins, put them here!
group :jekyll_plugins do
# gem "jekyll-archives"
end

144
Gemfile.lock Normal file
View file

@ -0,0 +1,144 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (4.2.7)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.4.0)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.10.0)
colorator (1.1.0)
ethon (0.9.0)
ffi (>= 1.3.0)
execjs (2.7.0)
faraday (0.9.2)
multipart-post (>= 1.2, < 3)
ffi (1.9.14)
ffi (1.9.14-x64-mingw32)
forwardable-extended (2.6.0)
gemoji (2.1.0)
github-pages (96)
activesupport (= 4.2.7)
github-pages-health-check (= 1.2.0)
jekyll (= 3.2.1)
jekyll-coffeescript (= 1.0.1)
jekyll-feed (= 0.5.1)
jekyll-gist (= 1.4.0)
jekyll-github-metadata (= 2.0.2)
jekyll-mentions (= 1.2.0)
jekyll-paginate (= 1.1.0)
jekyll-redirect-from (= 0.11.0)
jekyll-sass-converter (= 1.3.0)
jekyll-seo-tag (= 2.0.0)
jekyll-sitemap (= 0.10.0)
jemoji (= 0.7.0)
kramdown (= 1.11.1)
liquid (= 3.0.6)
listen (= 3.0.6)
mercenary (~> 0.3)
minima (= 1.2.0)
rouge (= 1.11.1)
terminal-table (~> 1.4)
github-pages-health-check (1.2.0)
addressable (~> 2.3)
net-dns (~> 0.8)
octokit (~> 4.0)
public_suffix (~> 1.4)
typhoeus (~> 0.7)
html-pipeline (2.4.2)
activesupport (>= 2)
nokogiri (>= 1.4)
i18n (0.7.0)
jekyll (3.2.1)
colorator (~> 1.0)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 1.1)
kramdown (~> 1.3)
liquid (~> 3.0)
mercenary (~> 0.3.3)
pathutil (~> 0.9)
rouge (~> 1.7)
safe_yaml (~> 1.0)
jekyll-coffeescript (1.0.1)
coffee-script (~> 2.2)
jekyll-feed (0.5.1)
jekyll-gist (1.4.0)
octokit (~> 4.2)
jekyll-github-metadata (2.0.2)
jekyll (~> 3.1)
octokit (~> 4.0)
jekyll-mentions (1.2.0)
activesupport (~> 4.0)
html-pipeline (~> 2.3)
jekyll (~> 3.0)
jekyll-paginate (1.1.0)
jekyll-redirect-from (0.11.0)
jekyll (>= 2.0)
jekyll-sass-converter (1.3.0)
sass (~> 3.2)
jekyll-seo-tag (2.0.0)
jekyll (~> 3.1)
jekyll-sitemap (0.10.0)
jekyll-watch (1.5.0)
listen (~> 3.0, < 3.1)
jemoji (0.7.0)
activesupport (~> 4.0)
gemoji (~> 2.0)
html-pipeline (~> 2.2)
jekyll (>= 3.0)
json (1.8.3)
kramdown (1.11.1)
liquid (3.0.6)
listen (3.0.6)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9.7)
mercenary (0.3.6)
mini_portile2 (2.1.0)
minima (1.2.0)
minitest (5.9.0)
multipart-post (2.0.0)
net-dns (0.8.0)
nokogiri (1.6.8)
mini_portile2 (~> 2.1.0)
pkg-config (~> 1.1.7)
nokogiri (1.6.8-x64-mingw32)
mini_portile2 (~> 2.1.0)
pkg-config (~> 1.1.7)
octokit (4.3.0)
sawyer (~> 0.7.0, >= 0.5.3)
pathutil (0.14.0)
forwardable-extended (~> 2.6)
pkg-config (1.1.7)
public_suffix (1.5.3)
rb-fsevent (0.9.7)
rb-inotify (0.9.7)
ffi (>= 0.5.0)
rouge (1.11.1)
safe_yaml (1.0.4)
sass (3.4.22)
sawyer (0.7.0)
addressable (>= 2.3.5, < 2.5)
faraday (~> 0.8, < 0.10)
terminal-table (1.7.2)
unicode-display_width (~> 1.1.1)
thread_safe (0.3.5)
typhoeus (0.8.0)
ethon (>= 0.8.0)
tzinfo (1.2.2)
thread_safe (~> 0.1)
unicode-display_width (1.1.1)
PLATFORMS
ruby
x64-mingw32
DEPENDENCIES
github-pages
BUNDLED WITH
1.13.6

238
_config.yml Normal file
View file

@ -0,0 +1,238 @@
# Welcome to Jekyll!
#
# This config file is meant for settings that affect your entire site, values
# which you are expected to set up once and rarely need to edit after that.
# For technical reasons, this file is *NOT* reloaded automatically when you use
# `jekyll serve`. If you change this file, please restart the server process.
# Site Settings
locale : "en-US"
title : "Guide"
title_separator : "-"
name : "Plailect"
description : "Full arm9loaderhax CFW Guide"
url : "https://plailect.github.io" # the base hostname & protocol for your site e.g. "https://mmistakes.github.io"
baseurl : "/Guide" # the subpath of your site, e.g. "/blog"
repository : "Plailect/Guide" # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes"
teaser : # filename of teaser fallback teaser image placed in /images/, .e.g. "500x300.png"
breadcrumbs : # true, false (default)
words_per_minute : 200
comments:
provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "custom"
disqus:
shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname-
discourse:
server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org
facebook:
# https://developers.facebook.com/docs/plugins/comments
appid :
num_posts : # 5 (default)
colorscheme : # "light" (default), "dark"
staticman:
allowedFields : ['name', 'email', 'url', 'message']
branch : # "master", "gh-pages"
commitMessage : "New comment."
filename : comment-{@timestamp}
format : "yml"
moderation : true
path : "_data/comments/{options.slug}"
requiredFields : ['name', 'email', 'message']
transforms:
email : "md5"
generatedFields:
date:
type : "date"
options:
format : "iso8601" # "iso8601" (default), "timestamp-seconds", "timestamp-milliseconds"
atom_feed:
path : # blank (default) uses feed.xml
# SEO Related
google_site_verification :
bing_site_verification :
alexa_site_verification :
yandex_site_verification :
# Social Sharing
twitter:
username :
facebook:
username :
app_id :
publisher :
og_image : # Open Graph/Twitter default site image
# For specifying social profiles
# - https://developers.google.com/structured-data/customize/social-profiles
social:
type : # Person or Organization (defaults to Person)
name : # If the user or organization name differs from the site's name
links: # An array of links to social media profiles
# Analytics
analytics:
provider : "google" # false (default), "google", "google-universal", "custom"
google:
tracking_id : "UA-86465881-1"
# # Site Author
# author:
# name : "Plailect"
# avatar : "bio-photo.png"
# bio : "3DS Hacker"
# location : "Nullsec"
# email : "Plailect@gmail.com"
# uri :
# bitbucket :
# codepen :
# dribbble :
# flickr :
# facebook :
# foursquare :
# github : "Plailect"
# google_plus :
# keybase :
# instagram :
# lastfm : "Plailect"
# linkedin :
# pinterest :
# soundcloud :
# stackoverflow : # "123456/username" (the last part of your profile url, e.g. http://stackoverflow.com/users/123456/username)
# steam :
# tumblr :
# twitter : "Plailect"
# vine :
# weibo :
# xing :
# youtube :
# Reading Files
include:
- .htaccess
- _pages
exclude:
- "*.sublime-project"
- "*.sublime-workspace"
- vendor
- .asset-cache
- .bundle
- .jekyll-assets-cache
- .sass-cache
- assets/js/plugins
- assets/js/_main.js
- assets/js/vendor
- Capfile
- CHANGELOG
- config
- Gemfile
- Gruntfile.js
- gulpfile.js
- LICENSE
- log
- node_modules
- package.json
- Rakefile
- README
- tmp
keep_files:
- .git
- .svn
encoding: "utf-8"
markdown_ext: "markdown,mkdown,mkdn,mkd,md"
# Conversion
markdown: kramdown
highlighter: rouge
lsi: false
excerpt_separator: "\n\n"
incremental: false
# Markdown Processing
kramdown:
input: GFM
hard_wrap: false
auto_ids: true
footnote_nr: 1
entity_output: as_char
toc_levels: 1..6
smart_quotes: lsquo,rsquo,ldquo,rdquo
enable_coderay: false
# Sass/SCSS
sass:
sass_dir: _sass
style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
# Defaults
defaults:
# _pages
- scope:
path: ""
type: pages
values:
layout: single
author_profile: false
# Outputting
permalink: /:categories/:title/
paginate: 5 # amount of posts to show
paginate_path: /page:num/
timezone: # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
# Plugins
gems:
- jekyll-paginate
- jekyll-sitemap
- jekyll-gist
- jekyll-feed
- jemoji
# mimic GitHub Pages with --safe
whitelist:
- jekyll-paginate
- jekyll-sitemap
- jekyll-gist
- jekyll-feed
- jemoji
# Archives
# Type
# - GitHub Pages compatible archive pages built with Liquid ~> type: liquid (default)
# - Jekyll Archives plugin archive pages ~> type: jekyll-archives
# Path (examples)
# - Archive page should exist at path when using Liquid method or you can
# expect broken links (especially with breadcrumbs enabled)
# - <base_path>/tags/my-awesome-tag/index.html ~> path: /tags/
# - <base_path/categories/my-awesome-category/index.html ~> path: /categories/
# - <base_path/my-awesome-category/index.html ~> path: /
category_archive:
type: liquid
path: /categories/
tag_archive:
type: liquid
path: /tags/
# https://github.com/jekyll/jekyll-archives
# jekyll-archives:
# enabled:
# - categories
# - tags
# layouts:
# category: archive-taxonomy
# tag: archive-taxonomy
# permalinks:
# category: /categories/:name/
# tag: /tags/:name/
# HTML Compression
# - http://jch.penibelst.de/
compress_html:
clippings: all
ignore:
envs: development

26
_data/navigation.yml Normal file
View file

@ -0,0 +1,26 @@
# main links links
main:
- title: "FAQ"
url: /faq
- title: "Troubleshooting"
url: /troubleshooting
- title: "Donations"
url: /donations
- title: "Credits"
url: /credits
- title: "Updating A9LH"
url: /updating-a9lh
- title: "Region Changing"
url: /region-changing
- title: "NAND Size"
url: /nand-size
- title: "OTP Info"
url: /otp-info

355
_data/ui-text.yml Normal file
View file

@ -0,0 +1,355 @@
# User interface text and labels
# English (default)
# -----------------
en: &DEFAULT_EN
page : "Page"
pagination_previous : "Previous"
pagination_next : "Next"
breadcrumb_home_label : "Home"
breadcrumb_separator : "/"
toc_label : "On This Page"
ext_link_label : "Direct Link"
less_than : "less than"
minute_read : "minute read"
share_on_label : "Share on"
meta_label :
tags_label : "Tags:"
categories_label : "Categories:"
date_label : "Updated:"
comments_label : "Leave a Comment"
comments_title : "Comments"
more_label : "Learn More"
related_label : "You May Also Enjoy"
follow_label : "Follow:"
feed_label : "Feed"
powered_by : "Powered by"
website_label : "Website"
email_label : "Email"
recent_posts : "Recent Posts"
undefined_wpm : "Undefined parameter words_per_minute at _config.yml"
comment_form_info : "Your email address will not be published. Required fields are marked"
comment_form_comment_label : "Comment"
comment_form_md_info : "Markdown is supported."
comment_form_name_label : "Name"
comment_form_email_label : "Email address"
comment_form_website_label : "Website (optional)"
comment_btn_submit : "Submit Comment"
comment_btn_submitted : "Submitted"
comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved."
comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again."
loading_label : "Loading..."
en-US:
<<: *DEFAULT_EN
en-CA:
<<: *DEFAULT_EN
en-GB:
<<: *DEFAULT_EN
en-AU:
<<: *DEFAULT_EN
# Spanish
# --------------
es: &DEFAULT_ES
page : "Página"
pagination_previous : "Anterior"
pagination_next : "Siguiente"
breadcrumb_home_label : "Inicio"
breadcrumb_separator : "/"
toc_label : "Contenidos"
ext_link_label : "Enlace"
less_than : "menos de"
minute_read : "minuto de lectura"
share_on_label : "Compartir"
meta_label :
tags_label : "Etiquetas:"
categories_label : "Categorías:"
date_label : "Actualizado:"
comments_label : "Comentar"
comments_title :
more_label : "Ver más"
related_label : "Podrías ver también"
follow_label : "Seguir:"
feed_label : "Feed"
powered_by : "Powered by"
website_label : "Sitio web"
email_label : "Email"
recent_posts : "Entradas recientes"
undefined_wpm : "Parametro words_per_minute (Palabras por minuto) no definido en _config.yml"
comment_form_info :
comment_form_comment_label :
comment_form_md_info :
comment_form_name_label :
comment_form_email_label :
comment_form_website_label :
comment_btn_submit :
comment_btn_submitted :
comment_success_msg :
comment_error_msg :
loading_label :
es-ES:
<<: *DEFAULT_ES
es-CO:
<<: *DEFAULT_ES
# French
# -----------------
fr: &DEFAULT_FR
page : "Page"
pagination_previous : "Précédent"
pagination_next : "Suivant"
breadcrumb_home_label : "Accueil"
breadcrumb_separator : "/"
toc_label : "Sur cette page"
ext_link_label : "Lien direct"
less_than : "plus petit que"
minute_read : "minute de lecture"
share_on_label : "Partager sur"
meta_label :
tags_label : "Tags :"
categories_label : "Catégories :"
date_label : "Mis à jour :"
comments_label : "Laisser un commentaire"
comments_title :
more_label : "Lire plus"
related_label : "Vous pourriez aimer"
follow_label : "Suivez moi"
feed_label : "Flux"
powered_by : "Propulsé par"
website_label : "Site"
email_label : "Email"
recent_posts : "Posts récents"
undefined_wpm : "Le paramètre words_per_minute n'est pas défini dans _config.yml"
comments_title : "Commentaires"
comment_form_info : "Votre adresse email ne sera pas visible. Les champs obligatoires sont marqués"
comment_form_comment_label : "Commentaire"
comment_form_md_info : "Markdown est supporté."
comment_form_name_label : "Nom"
comment_form_email_label : "Adresse mail"
comment_form_website_label : "Site web (optionnel)"
comment_btn_submit : "Envoyer"
comment_btn_submitted : "Envoyé"
comment_success_msg : "Merci pour votre comentaire, il sera visible sur le site une fois approuvé."
comment_error_msg : "Désolé, une erreur est survenue lors de la soumission. Vérifiez que les champs obligatoires ont été remplis et réessayez."
loading_label : "Chargement..."
fr-FR:
<<: *DEFAULT_FR
fr-BE:
<<: *DEFAULT_FR
fr-CH:
<<: *DEFAULT_FR
# Turkish
# -----------------
tr: &DEFAULT_TR
page : "Sayfa"
pagination_previous : "Önceki"
pagination_next : "Sonraki"
breadcrumb_home_label : "Ana Sayfa"
breadcrumb_separator : "/"
toc_label : "İçindekiler"
ext_link_label : "Doğrudan Bağlantı"
less_than : "Şu süreden az: "
minute_read : "dakika tahmini okuma süresi"
share_on_label : "Paylaş"
meta_label :
tags_label : "Etiketler:"
categories_label : "Kategoriler:"
date_label : "Güncelleme tarihi:"
comments_label : "Yorum yapın"
comments_title :
more_label : "Daha fazlasını öğrenin"
related_label : "Bunlar ilginizi çekebilir:"
follow_label : "Takip et:"
feed_label : "RSS"
powered_by : "Emeği geçenler: "
website_label : "Web sayfası"
email_label : "E-posta"
recent_posts : "Son yazılar"
undefined_wpm : "_config.yml dosyasında tanımlanmamış words_per_minute parametresi"
comment_form_info :
comment_form_comment_label :
comment_form_md_info :
comment_form_name_label :
comment_form_email_label :
comment_form_website_label :
comment_btn_submit :
comment_btn_submitted :
comment_success_msg :
comment_error_msg :
loading_label :
tr-TR:
<<: *DEFAULT_TR
# Portuguese
# -----------------
pt: &DEFAULT_PT
page : "Página"
pagination_previous : "Anterior"
pagination_next : "Seguinte"
breadcrumb_home_label : "Início"
breadcrumb_separator : "/"
toc_label : "Nesta Página"
ext_link_label : "Link Direto"
less_than : "menos de"
minute_read : "minutos de leitura"
share_on_label : "Partilhar no"
meta_label :
tags_label : "Etiquetas:"
categories_label : "Categorias:"
date_label : "Atualizado:"
comments_label : "Deixe um Comentário"
comments_title : "Comentários"
more_label : "Saber mais"
related_label : "Também pode gostar de"
follow_label : "Siga:"
feed_label : "Feed"
powered_by : "Feito com"
website_label : "Site"
email_label : "Email"
recent_posts : "Artigos Recentes"
undefined_wpm : "Parâmetro words_per_minute não definido em _config.yml"
comment_form_info : "O seu endereço email não será publicado. Os campos obrigatórios estão assinalados"
comment_form_comment_label : "Comentário"
comment_form_md_info : "Markdown é suportado."
comment_form_name_label : "Nome"
comment_form_email_label : "Endereço Email"
comment_form_website_label : "Site (opcional)"
comment_btn_submit : "Sumbeter Comentário"
comment_btn_submitted : "Submetido"
comment_success_msg : "Obrigado pelo seu comentário! Será visível no site logo que aprovado."
comment_error_msg : "Lamento, ocorreu um erro na sua submissão. Por favor verifique se todos os campos obrigatórios estão corretamente preenchidos e tente novamente."
loading_label : "A carregar..."
# Brazilian Portuguese
pt-BR:
page : "Página"
pagination_previous : "Anterior"
pagination_next : "Próxima"
breadcrumb_home_label : "Home"
breadcrumb_separator : "/"
toc_label : "Nesta página"
ext_link_label : "Link direto"
less_than : "meno que"
minute_read : "minutos de leitura"
share_on_label : "Compartilhe em"
meta_label :
tags_label : "Tags:"
categories_label : "Categorias:"
date_label : "Atualizado em:"
comments_label : "Deixe um comentário"
comments_title :
more_label : "Aprenda Mais"
related_label : "Você Talvez Goste Também"
follow_label : "Acompanhe em"
feed_label : "Feed"
powered_by : "Feito com"
website_label : "Site"
email_label : "Email"
recent_posts : "Postagens recentes"
undefined_wpm : "Parâmetro indefinido em word_per_minute no _config.yml"
comment_form_info :
comment_form_comment_label :
comment_form_md_info :
comment_form_name_label :
comment_form_email_label :
comment_form_website_label :
comment_btn_submit :
comment_btn_submitted :
comment_success_msg :
comment_error_msg :
loading_label :
pt-PT:
<<: *DEFAULT_PT
# Italian
# -----------------
it: &DEFAULT_IT
page : "Pagina"
pagination_previous : "Precedente"
pagination_next : "Prossima"
breadcrumb_home_label : "Home"
breadcrumb_separator : "/"
toc_label : "Indice della pagina"
ext_link_label : "Link"
less_than : "meno di"
minute_read : "minuto/i di lettura"
share_on_label : "Condividi"
meta_label :
tags_label : "Tags:"
categories_label : "Categorie:"
date_label : "Aggiornato:"
comments_label : "Scrivi un commento"
comments_title :
more_label : "Scopri di più"
related_label : "Potrebbe Piacerti Anche"
follow_label : "Segui:"
feed_label : "Feed"
powered_by : "Powered by"
website_label : "Website"
email_label : "Email"
recent_posts : "Articoli Recenti"
undefined_wpm : "Parametro words_per_minute non definito in _config.yml"
comment_form_info : "Il tuo indirizzo email non sarà pubblicato. Sono segnati i campi obbligatori"
comment_form_comment_label : "Commenta"
comment_form_md_info : "Il linguaggio Markdown è supportato"
comment_form_name_label : "Nome"
comment_form_email_label : "Indirizzo email"
comment_form_website_label : "Sito Web (opzionale)"
comment_btn_submit : "Invia commento"
comment_btn_submitted : "Inviato"
comment_success_msg : "Grazie per il tuo commento! Verrà visualizzato nel sito una volta che sarà approvato."
comment_error_msg : "C'è stato un errore con il tuo invio. Assicurati che tutti i campi richiesti siano stati completati e riprova."
loading_label : "Caricamento..."
it-IT:
<<: *DEFAULT_IT
# Chinese (zh-CN Chinese - China)
# -----------------
zh: &DEFAULT_ZH
page : "页面"
pagination_previous : "向前"
pagination_next : "向后"
breadcrumb_home_label : "首页"
breadcrumb_separator : "/"
toc_label : "在本页上"
ext_link_label : "直接链接"
less_than : "少于"
minute_read : "分钟 阅读"
share_on_label : "分享"
meta_label :
tags_label : "标签:"
categories_label : "分类:"
date_label : "最新的:"
comments_label : "留下评论"
comments_title : "评论"
more_label : "了解更多"
related_label : "猜您还喜欢"
follow_label : "关注:"
feed_label : "Feed"
powered_by : "Powered by"
website_label : "网站"
email_label : "Email"
recent_posts : "最新文章"
undefined_wpm : "Undefined parameter words_per_minute at _config.yml"
comment_form_info : "Your email address will not be published. Required fields are marked"
comment_form_comment_label : "Comment"
comment_form_md_info : "Markdown is supported."
comment_form_name_label : "Name"
comment_form_email_label : "Email address"
comment_form_website_label : "Website (optional)"
comment_btn_submit : "Submit Comment"
comment_btn_submitted : "Submitted"
comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved."
comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again."
loading_label : "Loading..."
zh-CN:
<<: *DEFAULT_ZH
zh-HK:
<<: *DEFAULT_ZH
zh-SG:
<<: *DEFAULT_ZH
zh-TW:
<<: *DEFAULT_ZH
# Another locale
# --------------

View file

@ -0,0 +1,3 @@
<!-- start custom analytics snippet -->
<!-- end custom analytics snippet -->

View file

@ -0,0 +1,9 @@
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', '{{ site.analytics.google.tracking_id }}', 'auto');
ga('send', 'pageview');
</script>

View file

@ -0,0 +1,11 @@
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '{{ site.analytics.google.tracking_id }}']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>

12
_includes/analytics.html Normal file
View file

@ -0,0 +1,12 @@
{% if site.analytics.provider and page.analytics != false %}
{% case site.analytics.provider %}
{% when "google" %}
{% include /analytics-providers/google.html %}
{% when "google-universal" %}
{% include /analytics-providers/google-universal.html %}
{% when "custom" %}
{% include /analytics-providers/custom.html %}
{% endcase %}
{% endif %}

View file

@ -0,0 +1,40 @@
{% include base_path %}
{% if post.header.teaser %}
{% capture teaser %}{{ post.header.teaser }}{% endcapture %}
{% else %}
{% assign teaser = site.teaser %}
{% endif %}
{% if post.id %}
{% assign title = post.title | markdownify | remove: "<p>" | remove: "</p>" %}
{% else %}
{% assign title = post.title %}
{% endif %}
<div class="{{ include.type | default: "list" }}__item">
<article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork">
{% if include.type == "grid" and teaser %}
<div class="archive__item-teaser">
<img src=
{% if teaser contains "://" %}
"{{ teaser }}"
{% else %}
"{{ teaser | prepend: "/images/" | prepend: base_path }}"
{% endif %}
alt="">
</div>
{% endif %}
<h2 class="archive__item-title" itemprop="headline">
{% if post.link %}
<a href="{{ post.link }}">{{ title }}</a> <a href="{{ base_path }}{{ post.url }}" rel="permalink"><i class="fa fa-link" aria-hidden="true" title="permalink"></i><span class="sr-only">Permalink</span></a>
{% else %}
<a href="{{ base_path }}{{ post.url }}" rel="permalink">{{ title }}</a>
{% endif %}
</h2>
{% if post.read_time %}
<p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> {% include read-time.html %}</p>
{% endif %}
{% if post.excerpt %}<p class="archive__item-excerpt" itemprop="description">{{ post.excerpt | markdownify | strip_html | truncate: 160 }}</p>{% endif %}
</article>
</div>

View file

@ -0,0 +1,102 @@
{% include base_path %}
{% if page.author and site.data.authors[page.author] %}
{% assign author = site.data.authors[page.author] %}{% else %}{% assign author = site.author %}
{% endif %}
<div itemscope itemtype="http://schema.org/Person">
<div class="author__avatar">
{% if author.avatar contains "://" %}
<img src="{{ author.avatar }}" alt="{{ author.name }}">
{% else %}
<img src="{{ author.avatar | prepend: "/images/" | prepend: base_path }}" class="author__avatar" alt="{{ author.name }}">
{% endif %}
</div>
<div class="author__content">
<h3 class="author__name">{{ author.name }}</h3>
{% if author.bio %}<p class="author__bio">{{ author.bio }}</p>{% endif %}
</div>
<div class="author__urls-wrapper">
<button class="btn btn--inverse">{{ site.data.ui-text[site.locale].follow_label | remove: ":" | default: "Follow" }}</button>
<ul class="author__urls social-icons">
{% if author.location %}
<li><i class="fa fa-fw fa-map-marker" aria-hidden="true"></i> {{ author.location }}</li>
{% endif %}
{% if author.uri %}
<li><a href="{{ author.uri }}"><i class="fa fa-fw fa-chain" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].website_label | default: "Website" }}</a></li>
{% endif %}
{% if author.email %}
<li><a href="mailto:{{ author.email }}"><i class="fa fa-fw fa-envelope-square" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].email_label | default: "Email" }}</a></li>
{% endif %}
{% if author.keybase %}
<li><a href="https://keybase.io/{{ author.keybase }}"><i class="fa fa-fw fa-key" aria-hidden="true"></i> Keybase</a></li>
{% endif %}
{% if author.twitter %}
<li><a href="https://twitter.com/{{ author.twitter }}"><i class="fa fa-fw fa-twitter-square" aria-hidden="true"></i> Twitter</a></li>
{% endif %}
{% if author.facebook %}
<li><a href="https://www.facebook.com/{{ author.facebook }}"><i class="fa fa-fw fa-facebook-square" aria-hidden="true"></i> Facebook</a></li>
{% endif %}
{% if author.google_plus %}
<li><a href="https://plus.google.com/+{{ author.google_plus }}"><i class="fa fa-fw fa-google-plus-square" aria-hidden="true"></i> Google+</a></li>
{% endif %}
{% if author.linkedin %}
<li><a href="https://www.linkedin.com/in/{{ author.linkedin }}"><i class="fa fa-fw fa-linkedin-square" aria-hidden="true"></i> LinkedIn</a></li>
{% endif %}
{% if author.xing %}
<li><a href="https://www.xing.com/profile/{{ author.xing }}"><i class="fa fa-fw fa-xing-square" aria-hidden="true"></i> XING</a></li>
{% endif %}
{% if author.instagram %}
<li><a href="https://instagram.com/{{ author.instagram }}"><i class="fa fa-fw fa-instagram" aria-hidden="true"></i> Instagram</a></li>
{% endif %}
{% if author.tumblr %}
<li><a href="https://{{ author.tumblr }}.tumblr.com"><i class="fa fa-fw fa-tumblr-square" aria-hidden="true"></i> Tumblr</a></li>
{% endif %}
{% if author.bitbucket %}
<li><a href="https://bitbucket.org/{{ author.bitbucket }}"><i class="fa fa-fw fa-bitbucket" aria-hidden="true"></i> Bitbucket</a></li>
{% endif %}
{% if author.github %}
<li><a href="https://github.com/{{ author.github }}"><i class="fa fa-fw fa-github" aria-hidden="true"></i> Github</a></li>
{% endif %}
{% if author.stackoverflow %}
<li><a href="https://www.stackoverflow.com/users/{{ author.stackoverflow }}"><i class="fa fa-fw fa-stack-overflow" aria-hidden="true"></i> Stackoverflow</a></li>
{% endif %}
{% if author.lastfm %}
<li><a href="https://last.fm/user/{{ author.lastfm }}"><i class="fa fa-fw fa-lastfm-square" aria-hidden="true"></i> Last.fm</a></li>
{% endif %}
{% if author.dribbble %}
<li><a href="https://dribbble.com/{{ author.dribbble }}"><i class="fa fa-fw fa-dribbble" aria-hidden="true"></i> Dribbble</a></li>
{% endif %}
{% if author.pinterest %}
<li><a href="https://www.pinterest.com/{{ author.pinterest }}"><i class="fa fa-fw fa-pinterest" aria-hidden="true"></i> Pinterest</a></li>
{% endif %}
{% if author.foursquare %}
<li><a href="https://foursquare.com/{{ author.foursquare }}"><i class="fa fa-fw fa-foursquare" aria-hidden="true"></i> Foursquare</a></li>
{% endif %}
{% if author.steam %}
<li><a href="https://steamcommunity.com/id/{{ author.steam }}"><i class="fa fa-fw fa-steam-square" aria-hidden="true"></i> Steam</a></li>
{% endif %}
{% if author.youtube %}
<li><a href="https://www.youtube.com/user/{{ author.youtube }}"><i class="fa fa-fw fa-youtube-square" aria-hidden="true"></i> YouTube</a></li>
{% endif %}
{% if author.soundcloud %}
<li><a href="https://soundcloud.com/{{ author.soundcloud }}"><i class="fa fa-fw fa-soundcloud" aria-hidden="true"></i> Soundcloud</a></li>
{% endif %}
{% if author.weibo %}
<li><a href="https://www.weibo.com/{{ author.weibo }}"><i class="fa fa-fw fa-weibo" aria-hidden="true"></i> Weibo</a></li>
{% endif %}
{% if author.flickr %}
<li><a href="https://www.flickr.com/{{ author.flickr }}"><i class="fa fa-fw fa-flickr" aria-hidden="true"></i> Flickr</a></li>
{% endif %}
{% if author.codepen %}
<li><a href="https://codepen.io/{{ author.codepen }}"><i class="fa fa-fw fa-codepen" aria-hidden="true"></i> CodePen</a></li>
{% endif %}
{% if author.vine %}
<li><a href="https://vine.co/u/{{ author.vine }}"><i class="fa fa-fw fa-vine" aria-hidden="true"></i> Vine</a></li>
{% endif %}
</ul>
</div>
</div>

5
_includes/base_path Normal file
View file

@ -0,0 +1,5 @@
{% if site.url %}
{% assign base_path = site.url | append: site.baseurl %}
{% else %}
{% assign base_path = site.github.url %}
{% endif %}

View file

@ -0,0 +1,41 @@
{% include base_path %}
{% case site.categories.type %}
{% when "liquid" %}
{% assign path_type = "#" %}
{% when "jekyll-archives" %}
{% assign path_type = nil %}
{% endcase %}
{% if page.collection != 'posts' %}
{% assign path_type = nil %}
{% assign crumb_path = '/' %}
{% else %}
{% assign crumb_path = site.categories.path %}
{% endif %}
<nav class="breadcrumbs">
<ol itemscope itemtype="http://schema.org/BreadcrumbList">
{% assign crumbs = page.url | split: '/' %}
{% assign i = 1 %}
{% for crumb in crumbs offset: 1 %}
{% if forloop.first %}
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
<a href="{{ base_path }}/" itemprop="item"><span itemprop="name">{{ site.data.ui-text[site.locale].breadcrumb_home_label | default: "Home" }}</span></a>
<meta itemprop="position" content="{{ i }}" />
</li>
<span class="sep">{{ site.data.ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
{% endif %}
{% if forloop.last %}
<li class="current">{{ page.title }}</li>
{% else %}
{% assign i = i | plus: 1 %}
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
<a href="{{ base_path }}{{ crumb | downcase | replace: '%20', '-' | prepend: path_type | prepend: crumb_path }}" itemprop="item"><span itemprop="name">{{ crumb | replace: '-', ' ' | replace: '%20', ' ' | capitalize }}</span></a>
<meta itemprop="position" content="{{ i }}" />
</li>
<span class="sep">{{ site.data.ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
{% endif %}
{% endfor %}
</ol>
</nav>

View file

@ -0,0 +1,3 @@
<!--[if lt IE 9]>
<div class="notice--danger align-center" style="margin: 0;">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</div>
<![endif]-->

View file

@ -0,0 +1,28 @@
{% include base_path %}
{% case site.category_archive.type %}
{% when "liquid" %}
{% assign path_type = "#" %}
{% when "jekyll-archives" %}
{% assign path_type = nil %}
{% endcase %}
{% if site.category_archive.path %}
{% comment %}
<!-- Sort alphabetically regardless of case e.g. a B c d E -->
<!-- modified from http://www.codeofclimber.ru/2015/sorting-site-tags-in-jekyll/ -->
{% endcomment %}
{% capture page_categories %}{% for category in page.categories %}{{ category | downcase }}#{{ category }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
{% assign category_hashes = (page_categories | split: ',' | sort:0) %}
<p class="page__taxonomy">
<strong><i class="fa fa-fw fa-folder-open" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].categories_label | default: "Categories:" }} </strong>
<span itemprop="keywords">
{% for hash in category_hashes %}
{% assign keyValue = hash | split: '#' %}
{% capture category_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %}
<a href="{{ base_path }}{{ category_word | slugify | prepend: path_type | prepend: site.category_archive.path }}" class="page__taxonomy-item" rel="tag">{{ category_word }}</a>{% unless forloop.last %}<span class="sep">, </span>{% endunless %}
{% endfor %}
</span>
</p>
{% endif %}

22
_includes/comment.html Normal file
View file

@ -0,0 +1,22 @@
<article id="comment{{ include.index }}" class="js-comment comment" itemprop="comment" itemscope itemtype="http://schema.org/Comment">
<div class="comment__avatar-wrapper">
<img class="comment__avatar" src="https://www.gravatar.com/avatar/{{ include.email }}?d=mm&s=80">
</div>
<div class="comment__content-wrapper">
<h3 class="comment__author" itemprop="author" itemscope itemtype="http://schema.org/Person">
{% unless include.url == blank %}
<span itemprop="name"><a rel="external nofollow" itemprop="url" href="{{ include.url }}">{{ include.name }}</a></span>
{% else %}
<span itemprop="name">{{ include.name }}</span>
{% endunless %}
</h3>
<p class="comment__date">
{% if include.date %}
{% if include.index %}<a href="#comment{{ include.index }}" itemprop="url">{% endif %}
<time datetime="{{ include.date | date_to_xmlschema }}" itemprop="datePublished">{{ include.date | date: "%B %d, %Y at %I:%M %p" }}</time>
{% if include.index %}</a>{% endif %}
{% endif %}
</p>
<div itemprop="text">{{ include.message | markdownify }}</div>
</div>
</article>

View file

@ -0,0 +1,3 @@
<!-- start custom comments snippet -->
<!-- end custom comments snippet -->

View file

@ -0,0 +1,14 @@
{% if site.comments.discourse.server %}
{% include base_path %}
{% capture canonical %}{{ base_path }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
<script type="text/javascript">
DiscourseEmbed = { discourseUrl: '//{{ site.comments.discourse.server }}/',
discourseEmbedUrl: '{{ canonical }}' };
(function () {
var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
})();
</script>
<noscript>Please enable JavaScript to view the comments powered by [Discourse](http://forum.beta-europe.org/c/beta/website).</a></noscript>
{% endif %}

View file

@ -0,0 +1,22 @@
{% if site.comments.disqus.shortname %}
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = '{{ site.comments.disqus.shortname }}';
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
/* * * DON'T EDIT BELOW THIS LINE * * */
(function () {
var s = document.createElement('script'); s.async = true;
s.type = 'text/javascript';
s.src = '//' + disqus_shortname + '.disqus.com/count.js';
(document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
}());
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
{% endif %}

View file

@ -0,0 +1,8 @@
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5{% if site.comments.facebook.appid %}&appId={{ site.comments.facebook.appid }}{% endif %}";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

View file

@ -0,0 +1,2 @@
<script async type="text/javascript" src="//apis.google.com/js/plusone.js?callback=gpcb"></script>
<noscript>Please enable JavaScript to view the <a href="https://plus.google.com/">comments powered by Google+.</a></noscript>

View file

@ -0,0 +1,18 @@
{% if site.comments.provider and page.comments %}
{% case site.comments.provider %}
{% when "disqus" %}
{% include /comments-providers/disqus.html %}
{% when "discourse" %}
{% include /comments-providers/discourse.html %}
{% when "facebook" %}
{% include /comments-providers/facebook.html %}
{% when "google-plus" %}
{% include /comments-providers/google-plus.html %}
{% when "staticman" %}
{% include /comments-providers/staticman.html %}
{% when "custom" %}
{% include /comments-providers/custom.html %}
{% endcase %}
{% endif %}

View file

@ -0,0 +1,42 @@
{% if site.repository and site.staticman.branch %}
<script>
(function ($) {
var $comments = $('.js-comments');
$('#new_comment').submit(function () {
var form = this;
$(form).addClass('disabled');
$('#comment-form-submit').html('<i class="fa fa-spinner fa-spin fa-fw"></i> {{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }}');
$.ajax({
type: $(this).attr('method'),
url: $(this).attr('action'),
data: $(this).serialize(),
contentType: 'application/x-www-form-urlencoded',
success: function (data) {
$('#comment-form-submit').html('{{ site.data.ui-text[site.locale].comment_btn_submitted | default: "Submitted" }}');
$('.page__comments-form .js-notice').removeClass('notice--danger');
$('.page__comments-form .js-notice').addClass('notice--success');
showAlert('{{ site.data.ui-text[site.locale].comment_success_msg | default: "Thanks for your comment! It will show on the site once it has been approved." }}');
},
error: function (err) {
console.log(err);
$('#comment-form-submit').html('{{ site.data.ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}');
$('.page__comments-form .js-notice').removeClass('notice--success');
$('.page__comments-form .js-notice').addClass('notice--danger');
showAlert('{{ site.data.ui-text[site.locale].comment_error_msg | default: "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." }}');
$(form).removeClass('disabled');
}
});
return false;
});
function showAlert(message) {
$('.page__comments-form .js-notice').removeClass('hidden');
$('.page__comments-form .js-notice-text').html(message);
}
})(jQuery);
</script>
{% endif %}

82
_includes/comments.html Normal file
View file

@ -0,0 +1,82 @@
{% include base_path %}
<div class="page__comments">
{% capture comments_label %}{{ site.data.ui-text[site.locale].comments_label | default: "Comments" }}{% endcapture %}
{% case site.comments.provider %}
{% when "disqus" %}
<h4 class="page__comments-title">{{ comments_label }}</h4>
<section id="disqus_thread"></section>
{% when "facebook" %}
<h4 class="page__comments-title">{{ comments_label }}</h4>
<section class="fb-comments" data-href="{{ base_path }}{{ page.url }}" data-mobile="true" data-num-posts="{{ site.comments.facebook.num_posts | default: 5 }}" data-width="100%" data-colorscheme="{{ site.comments.facebook.colorscheme | default: 'light' }}"></section>
{% when "google-plus" %}
<h4 class="page__comments-title">{{ comments_label }}</h4>
<section class="g-comments" data-href="{{ base_path }}{{ page.url }}" data-first_party_property="BLOGGER" data-view_type="FILTERED_POSTMOD">Loading Google+ Comments ...</section>
{% when "staticman" %}
<section id="comments">
{% if site.repository and site.staticman.branch %}
<!-- Start static comments -->
<div class="js-comments">
{% if site.data.comments[page.slug] %}
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_title | default: "Comments" }}</h4>
{% assign comments = site.data.comments[page.slug] | sort %}
{% for comment in comments %}
{% assign email = comment[1].email %}
{% assign name = comment[1].name %}
{% assign url = comment[1].url %}
{% assign date = comment[1].date %}
{% assign message = comment[1].message %}
{% include comment.html index=forloop.index email=email name=name url=url date=date message=message %}
{% endfor %}
{% endif %}
</div>
<!-- End static comments -->
<!-- Start new comment form -->
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_label | default: "Leave a Comment" }}</h4>
<p class="small">{{ site.data.ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} <span class="required">*</span></p>
<form id="new_comment" class="page__comments-form js-form form" method="post" action="https://api.staticman.net/v1/entry/{{ site.repository }}/{{ site.staticman.branch }}">
<div class="form__spinner">
<i class="fa fa-spinner fa-spin fa-3x fa-fw"></i>
<span class="sr-only">{{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }}</span>
</div>
<fieldset>
<label for="comment-form-message">{{ site.data.ui-text[site.locale].comment_form_comment_label | default: "Comment" }} <small class="required">*</small></label>
<textarea type="text" rows="3" id="comment-form-message" name="fields[message]" tabindex="1"></textarea>
<div class="small help-block"><a href="https://daringfireball.net/projects/markdown/">{{ site.data.ui-text[site.locale].comment_form_md_info | default: "Markdown is supported." }}</a></div>
</fieldset>
<fieldset>
<label for="comment-form-name">{{ site.data.ui-text[site.locale].comment_form_name_label | default: "Name" }} <small class="required">*</small></label>
<input type="text" id="comment-form-name" name="fields[name]" tabindex="2" />
</fieldset>
<fieldset>
<label for="comment-form-email">{{ site.data.ui-text[site.locale].comment_form_email_label | default: "Email address" }} <small class="required">*</small></label>
<input type="email" id="comment-form-email" name="fields[email]" tabindex="3" />
</fieldset>
<fieldset>
<label for="comment-form-url">{{ site.data.ui-text[site.locale].comment_form_website_label | default: "Website (optional)" }}</label>
<input type="url" id="comment-form-url" name="fields[url]" tabindex="4"/>
</fieldset>
<fieldset class="hidden" style="display: none;">
<input type="hidden" name="options[slug]" value="{{ page.slug }}">
<label for="comment-form-location">Not used. Leave blank if you are a human.</label>
<input type="text" id="comment-form-location" name="fields[hidden]" autocomplete="off"/>
</fieldset>
<!-- Start comment form alert messaging -->
<p class="hidden js-notice">
<strong class="js-notice-text"></strong>
</p>
<!-- End comment form alert messaging -->
<fieldset>
<button type="submit" id="comment-form-submit" tabindex="5" class="btn btn--large">{{ site.data.ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}</button>
</fieldset>
</form>
<!-- End new comment form -->
{% endif %}
</section>
{% when "custom" %}
<section id="comments"></section>
{% endcase %}
</div>

52
_includes/feature_row Normal file
View file

@ -0,0 +1,52 @@
{% include base_path %}
{% if include.id %}
{% assign feature_row = page.[include.id] %}
{% else %}
{% assign feature_row = page.feature_row %}
{% endif %}
<div class="feature__wrapper">
{% for f in feature_row %}
{% if f.url contains "://" %}
{% capture f_url %}{{ f.url }}{% endcapture %}
{% else %}
{% capture f_url %}{{ f.url | prepend: base_path }}{% endcapture %}
{% endif %}
<div class="feature__item{% if include.type %}--{{ include.type }}{% endif %}">
<div class="archive__item">
{% if f.image_path %}
<div class="archive__item-teaser">
<img src=
{% if f.image_path contains "://" %}
"{{ f.image_path }}"
{% else %}
"{{ f.image_path | prepend: "/images/" | prepend: base_path }}"
{% endif %}
alt="{% if f.alt %}{{ f.alt }}{% endif %}">
</div>
{% endif %}
<div class="archive__item-body">
{% if f.title %}
<h2 class="archive__item-title">{{ f.title }}</h2>
{% endif %}
{% if f.excerpt %}
<div class="archive__item-excerpt">
{{ f.excerpt | markdownify }}
</div>
{% endif %}
{% if f.url %}
<p><a href="{{ f_url }}" class="btn {{ f.btn_class }}">{{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}</a></p>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>

2
_includes/footer.html Normal file
View file

@ -0,0 +1,2 @@
{% include base_path %}
<div class="page__footer-copyright">&copy; {{ site.time | date: '%Y' }} {{ site.name | default: site.title }} - <a href="https://github.com/Plailect/Guide">Source</a> - <a href="why-ads">Why Ads?</a>

View file

@ -0,0 +1,2 @@
<!-- start custom footer snippets -->
<!-- end custom footer snippets -->

49
_includes/gallery Normal file
View file

@ -0,0 +1,49 @@
{% include base_path %}
{% if include.id %}
{% assign gallery = page.[include.id] %}
{% else %}
{% assign gallery = page.gallery %}
{% endif %}
{% if gallery.size == 2 %}
{% assign gallery_layout = 'half' %}
{% elsif gallery.size >= 3 %}
{% assign gallery_layout = 'third' %}
{% else %}
{% assign gallery_layout = '' %}
{% endif %}
<figure class="{{ gallery_layout }} {{ include.class }}">
{% for img in gallery %}
{% if img.url %}
<a href=
{% if img.url contains "://" %}
"{{ img.url }}"
{% else %}
"{{ img.url | prepend: "/images/" | prepend: base_path }}"
{% endif %}
{% if img.title %}title="{{ img.title }}"{% endif %}
>
<img src=
{% if img.image_path contains "://" %}
"{{ img.image_path }}"
{% else %}
"{{ img.image_path | prepend: "/images/" | prepend: base_path }}"
{% endif %}
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
</a>
{% else %}
<img src=
{% if img.image_path contains "://" %}
"{{ img.image_path }}"
{% else %}
"{{ img.image_path | prepend: "/images/" | prepend: base_path }}"
{% endif %}
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
{% endif %}
{% endfor %}
{% if include.caption %}
<figcaption>{{ include.caption | markdownify | remove: "<p>" | remove: "</p>" }}</figcaption>
{% endif %}
</figure>

47
_includes/group-by-array Normal file
View file

@ -0,0 +1,47 @@
<!--
# Jekyll Group-By-Array 0.1.0
# https://github.com/mushishi78/jekyll-group-by-array
# © 2015 Max White <mushishi78@gmail.com>
# MIT License
-->
<!-- Initialize -->
{% assign __empty_array = '' | split: ',' %}
{% assign group_names = __empty_array %}
{% assign group_items = __empty_array %}
<!-- Map -->
{% assign __names = include.collection | map: include.field %}
<!-- Flatten -->
{% assign __names = __names | join: ',' | join: ',' | split: ',' %}
<!-- Uniq -->
{% assign __names = __names | sort %}
{% for name in __names | sort %}
<!-- If not equal to previous then it must be unique as sorted -->
{% unless name == previous %}
<!-- Push to group_names -->
{% assign group_names = group_names | push: name %}
{% endunless %}
{% assign previous = name %}
{% endfor %}
<!-- group_items -->
{% for name in group_names %}
<!-- Collect if contains -->
{% assign __item = __empty_array %}
{% for __element in include.collection %}
{% if __element[include.field] contains name %}
{% assign __item = __item | push: __element %}
{% endif %}
{% endfor %}
<!-- Push to group_items -->
{% assign group_items = group_items | push: __item %}
{% endfor %}

21
_includes/head.html Normal file
View file

@ -0,0 +1,21 @@
{% include base_path %}
<meta charset="utf-8">
{% include seo.html %}
<link href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ base_path }}/feed.xml{% endif %}" type="application/atom+xml" rel="alternate" title="{{ site.title }} Feed">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script>
document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js ';
</script>
<!-- For all browsers -->
<link rel="stylesheet" href="{{ base_path }}/assets/css/main.css">
<meta http-equiv="cleartype" content="on">

View file

@ -0,0 +1,29 @@
<!-- start custom head snippets -->
{% include base_path %}
<!-- insert favicons. use http://realfavicongenerator.net/ -->
<script type="text/javascript">
amzn_assoc_ad_type = "link_enhancement_widget";
amzn_assoc_tracking_id = "plailect-20";
amzn_assoc_linkid = "009e211cd968ca4d258ce41de4c9457f";
amzn_assoc_placement = "";
amzn_assoc_marketplace = "amazon";
amzn_assoc_region = "US";
</script>
<script src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&Operation=GetScript&ID=OneJS&WS=1&MarketPlace=US"></script>
<link rel="apple-touch-icon" sizes="180x180" href="{{ base_path }}/images/apple-touch-icon.png?v=PYEmwKvQAx">
<link rel="icon" type="image/png" href="{{ base_path }}/images/favicon-32x32.png?v=PYEmwKvQAx" sizes="32x32">
<link rel="icon" type="image/png" href="{{ base_path }}/images/favicon-194x194.png?v=PYEmwKvQAx" sizes="194x194">
<link rel="icon" type="image/png" href="{{ base_path }}/images/android-chrome-192x192.png?v=PYEmwKvQAx" sizes="192x192">
<link rel="icon" type="image/png" href="{{ base_path }}/images/favicon-16x16.png?v=PYEmwKvQAx" sizes="16x16">
<link rel="manifest" href="{{ base_path }}/images/manifest.json?v=PYEmwKvQAx">
<link rel="mask-icon" href="{{ base_path }}/images/safari-pinned-tab.svg?v=PYEmwKvQAx" color="#5bbad5">
<link rel="shortcut icon" href="{{ base_path }}/images/favicon.ico?v=PYEmwKvQAx">
<meta name="apple-mobile-web-app-title" content="Guide">
<meta name="application-name" content="Guide">
<meta name="msapplication-TileColor" content="#00a300">
<meta name="msapplication-TileImage" content="{{ base_path }}/images/mstile-144x144.png?v=PYEmwKvQAx">
<meta name="msapplication-config" content="{{ base_path }}/images/browserconfig.xml?v=PYEmwKvQAx">
<meta name="theme-color" content="#000000">
<!-- end custom head snippets -->

23
_includes/masthead.html Normal file
View file

@ -0,0 +1,23 @@
{% include base_path %}
<div class="masthead">
<div class="masthead__inner-wrap">
<div class="masthead__menu">
<nav id="site-nav" class="greedy-nav">
<button><div class="navicon"></div></button>
<ul class="visible-links">
<li class="masthead__menu-item masthead__menu-item--lg"><a href="{{ base_path }}/">{{ site.title }}</a></li>
{% for link in site.data.navigation.main %}
{% if link.url contains 'http' %}
{% assign domain = '' %}
{% else %}
{% assign domain = base_path %}
{% endif %}
<li class="masthead__menu-item"><a href="{{ domain }}{{ link.url }}">{{ link.title }}</a></li>
{% endfor %}
</ul>
<ul class="hidden-links hidden"></ul>
</nav>
</div>
</div>
</div>

46
_includes/nav_list Normal file
View file

@ -0,0 +1,46 @@
{% include base_path %}
{% assign navigation = site.data.navigation[include.nav] %}
<nav class="nav__list">
{% if page.sidebar.title %}<header><h4 class="nav__title" style="padding: 0;">{{ page.sidebar.title }}</h4></header>{% endif %}
<ul>
{% for nav in navigation %}
<li>
{% if nav.url %}
{% comment %}internal/external URL check{% endcomment %}
{% if nav.url contains "://" %}
{% assign domain = "" %}
{% else %}
{% assign domain = base_path %}
{% endif %}
<a href="{{ domain }}{{ nav.url }}"><span class="nav__sub-title">{{ nav.title }}</span></a>
{% else %}
<span class="nav__sub-title">{{ nav.title }}</span>
{% endif %}
{% if nav.children != null %}
<ul>
{% for child in nav.children %}
{% comment %}internal/external URL check{% endcomment %}
{% if child.url contains "://" %}
{% assign domain = "" %}
{% else %}
{% assign domain = base_path %}
{% endif %}
{% comment %}set "active" class on current page{% endcomment %}
{% if child.url == page.url %}
{% assign active = "active" %}
{% else %}
{% assign active = "" %}
{% endif %}
<li><a href="{{ domain }}{{ child.url }}" class="{{ active }}">{{ child.title }}</a></li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
</nav>

55
_includes/page__hero.html Normal file
View file

@ -0,0 +1,55 @@
{% include base_path %}
{% if page.header.image contains "://" %}
{% capture img_path %}{{ page.header.image }}{% endcapture %}
{% else %}
{% capture img_path %}{{ page.header.image | prepend: "/images/" | prepend: base_path }}{% endcapture %}
{% endif %}
{% if page.header.cta_url contains "://" %}
{% capture cta_path %}{{ page.header.cta_url }}{% endcapture %}
{% else %}
{% capture cta_path %}{{ page.header.cta_url | prepend: base_path }}{% endcapture %}
{% endif %}
{% if page.header.overlay_image contains "://" %}
{% capture overlay_img_path %}{{ page.header.overlay_image }}{% endcapture %}
{% elsif page.header.overlay_image %}
{% capture overlay_img_path %}{{ page.header.overlay_image | prepend: "/images/" | prepend: base_path }}{% endcapture %}
{% endif %}
{% if page.header.overlay_filter contains "rgba" %}
{% capture overlay_filter %}{{ page.header.overlay_filter }}{% endcapture %}
{% elsif page.header.overlay_filter %}
{% capture overlay_filter %}rgba(0, 0, 0, {{ page.header.overlay_filter }}){% endcapture %}
{% endif %}
<div class="page__hero{% if page.header.overlay_color or page.header.overlay_image %}--overlay{% endif %}"
style="{% if page.header.overlay_color %}background-color: {{ page.header.overlay_color | default: 'transparent' }};{% endif %} {% if overlay_img_path %}background-image: {% if overlay_filter %}linear-gradient({{ overlay_filter }}, {{ overlay_filter }}), {% endif %}url('{{ overlay_img_path }}');{% endif %}"
>
{% if page.header.overlay_color or page.header.overlay_image %}
<div class="wrapper">
<h1 class="page__title" itemprop="headline">
{% if paginator %}
{{ site.title }}{% unless paginator.page == 1 %} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}
{% else %}
{{ page.title | default: site.title | markdownify | remove: "<p>" | remove: "</p>" }}
{% endif %}
</h1>
{% if page.excerpt %}
<p class="page__lead">{{ page.excerpt | markdownify | remove: "<p>" | remove: "</p>" }}</p>
{% endif %}
{% if site.read_time and page.read_time %}
<p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> {% include read-time.html %}</p>
{% endif %}
{% if page.header.cta_url %}
<p><a href="{{ cta_path }}" class="btn btn--light-outline btn--large">{{ page.header.cta_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}</a></p>
{% endif %}
</div>
{% else %}
<img src="{{ img_path }}" alt="{{ page.title }}" class="page__hero-image">
{% endif %}
{% if page.header.caption %}
<span class="page__hero-caption">{{ page.header.caption | markdownify | remove: "<p>" | remove: "</p>" }}</span>
{% endif %}
</div>

View file

@ -0,0 +1,9 @@
{% include base_path %}
{% if site.tag_archive.type and page.tags[0] %}
{% include tag-list.html %}
{% endif %}
{% if site.category_archive.type and page.categories[0] %}
{% include category-list.html %}
{% endif %}

70
_includes/paginator.html Normal file
View file

@ -0,0 +1,70 @@
{% include base_path %}
{% if paginator.total_pages > 1 %}
<nav class="pagination">
<ul>
{% comment %} Link for previous page {% endcomment %}
{% if paginator.previous_page %}
{% if paginator.previous_page == 1 %}
<li><a href="{{ base_path }}/">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a></li>
{% else %}
<li><a href="{{ base_path }}/page{{ paginator.previous_page }}/">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a></li>
{% endif %}
{% else %}
<li><a href="#" class="disabled"><span aria-hidden="true">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</span></a></li>
{% endif %}
{% comment %} First page {% endcomment %}
{% if paginator.page == 1 %}
<li><a href="#" class="disabled current">1</a></li>
{% else %}
<li><a href="{{ base_path }}/">1</a></li>
{% endif %}
{% assign page_start = 2 %}
{% if paginator.page > 4 %}
{% assign page_start = paginator.page | minus: 2 %}
{% comment %} Ellipsis for truncated links {% endcomment %}
<li><a href="#" class="disabled">&hellip;</a></li>
{% endif %}
{% assign page_end = paginator.total_pages | minus: 1 %}
{% assign pages_to_end = paginator.total_pages | minus: paginator.page %}
{% if pages_to_end > 4 %}
{% assign page_end = paginator.page | plus: 2 %}
{% endif %}
{% for index in (page_start..page_end) %}
{% if index == paginator.page %}
<li><a href="{{ base_path }}/page{{ index }}/" class="disabled current">{{ index }}</a></li>
{% else %}
{% comment %} Distance from current page and this link {% endcomment %}
{% assign dist = paginator.page | minus: index %}
{% if dist < 0 %}
{% comment %} Distance must be a positive value {% endcomment %}
{% assign dist = 0 | minus: dist %}
{% endif %}
<li><a href="{{ base_path }}/page{{ index }}/">{{ index }}</a></li>
{% endif %}
{% endfor %}
{% comment %} Ellipsis for truncated links {% endcomment %}
{% if pages_to_end > 3 %}
<li><a href="#" class="disabled">&hellip;</a></li>
{% endif %}
{% if paginator.page == paginator.total_pages %}
<li><a href="#" class="disabled current">{{ paginator.page }}</a></li>
{% else %}
<li><a href="{{ base_path }}/page{{ paginator.total_pages }}/">{{ paginator.total_pages }}</a></li>
{% endif %}
{% comment %} Link next page {% endcomment %}
{% if paginator.next_page %}
<li><a href="{{ base_path }}/page{{ paginator.next_page }}/">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a></li>
{% else %}
<li><a href="#" class="disabled"><span aria-hidden="true">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</span></a></li>
{% endif %}
</ul>
</nav>
{% endif %}

View file

@ -0,0 +1,16 @@
{% include base_path %}
{% if page.previous or page.next %}
<nav class="pagination">
{% if page.previous %}
<a href="{{ base_path }}{{ page.previous.url }}" class="pagination--pager" title="{{ page.previous.title | markdownify | strip_html }}">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a>
{% else %}
<a href="#" class="pagination--pager disabled">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a>
{% endif %}
{% if page.next %}
<a href="{{ base_path }}{{ page.next.url }}" class="pagination--pager" title="{{ page.next.title | markdownify | strip_html }}">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a>
{% else %}
<a href="#" class="pagination--pager disabled">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a>
{% endif %}
</nav>
{% endif %}

17
_includes/read-time.html Normal file
View file

@ -0,0 +1,17 @@
{% if post.read_time %}
{% assign words = post.content | strip_html | number_of_words %}
{% elsif page.read_time %}
{% assign words = page.content | strip_html | number_of_words %}
{% endif %}
{% if site.words_per_minute %}
{% if words < 180 %}
{{ site.data.ui-text[site.locale].less_than | default: "less than" }} 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
{% elsif words < 360 %}
1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
{% else %}
{{ words | divided_by:site.words_per_minute }} {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
{% endif %}
{% else %}
{{ site.data.ui-text[site.locale].undefined_wpm | "Undefined parameter words_per_minute at _config.yml" }}
{% endif %}

4
_includes/scripts.html Normal file
View file

@ -0,0 +1,4 @@
<script src="{{ base_path }}/assets/js/main.min.js"></script>
{% include analytics.html %}
{% include /comments-providers/scripts.html %}

137
_includes/seo.html Normal file
View file

@ -0,0 +1,137 @@
{% include base_path %}
<!-- begin SEO -->
{% if site.url %}
{% assign seo_url = site.url | append: site.baseurl %}
{% endif %}
{% assign seo_url = seo_url | default: site.github.url %}
{% if page.title %}
{% assign seo_title = page.title | append: " " | append: site.title_separator | append: " " | append: site.title %}
{% endif %}
{% if seo_title %}
{% assign seo_title = seo_title | markdownify | strip_html | strip_newlines | escape_once %}
{% endif %}
{% if site.url %}
{% assign canonical_url = page.url | replace: "index.html", "" | prepend: site.url %}
{% endif %}
<title>{{ seo_title | default: site.title }}{% if paginator %}{% unless paginator.page == 1 %} {{ site.title_separator }} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}{% endif %}</title>
{% assign seo_description = page.description | default: page.excerpt | default: site.description %}
{% if seo_description %}
{% assign seo_description = seo_description | markdownify | strip_html | strip_newlines | escape_once %}
{% endif %}
{% assign seo_author = page.author | default: page.author[0] | default: site.author[0] %}
{% if seo_author %}
{% if seo_author.twitter %}
{% assign seo_author_twitter = seo_author.twitter %}
{% else %}
{% if site.data.authors and site.data.authors[seo_author] %}
{% assign seo_author_twitter = site.data.authors[seo_author].twitter %}
{% else %}
{% assign seo_author_twitter = seo_author %}
{% endif %}
{% endif %}
{% assign seo_author_twitter = seo_author_twitter | replace: "@", "" %}
{% endif %}
<meta property="og:locale" content="{{ site.locale | replace: "-", "_" | default: "en" }}">
<meta property="og:site_name" content="{{ site.title }}">
<meta property="og:title" content="{{ page.title | default: site.title | markdownify | strip_html | strip_newlines | escape_once }}">
{% if seo_url %}
<link rel="canonical" href="{{ page.url | prepend: seo_url | replace: "/index.html", "/" }}">
<meta property="og:url" content="{{ page.url | prepend: seo_url | replace: "/index.html", "/" }}">
{% endif %}
{% if page.excerpt %}
<meta property="og:description" content="{{ seo_description }}">
{% endif %}
{% if site.twitter.username %}
<meta name="twitter:site" content="@{{ site.twitter.username | replace: "@", "" }}">
<meta name="twitter:title" content="{{ page.title | default: site.title | markdownify | strip_html | strip_newlines | escape_once }}">
<meta name="twitter:description" content="{{ seo_description }}">
<meta name="twitter:url" content="{{ canonical_url }}">
{% if page.header.image %}
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="{% if page.header.image contains "://" %}{{ page.header.image }}{% else %}{{ page.header.image | prepend: "/images/" | prepend: base_path }}{% endif %}">
{% else %}
<meta name="twitter:card" content="summary">
{% if page.header.teaser %}
<meta name="twitter:image" content="{% if page.header.teaser contains "://" %}{{ page.header.teaser }}{% else %}{{ page.header.teaser | prepend: "/images/" | prepend: base_path }}{% endif %}">
{% elsif site.og_image %}
<meta name="twitter:image" content="{{ site.og_image | prepend: "/images/" | prepend: base_path }}">
{% endif %}
{% endif %}
{% if seo_author_twitter %}
<meta name="twitter:creator" content="@{{ seo_author_twitter }}">
{% endif %}
{% endif %}
{% if site.facebook %}
{% if site.facebook.publisher %}
<meta property="article:publisher" content="{{ site.facebook.publisher }}">
{% endif %}
{% if site.facebook.app_id %}
<meta property="fb:app_id" content="{{ site.facebook.app_id }}">
{% endif %}
{% endif %}
<meta property="og:image" content="{{ base_path }}/images/RoundedIcon.png" />
{% if page.date %}
<meta property="og:type" content="article">
<meta property="article:published_time" content="{{ page.date | date_to_xmlschema }}">
{% endif %}
{% if paginator.previous_page %}
<link rel="prev" href="{{ paginator.previous_page_path | prepend: seo_url }}">
{% endif %}
{% if paginator.next_page %}
<link rel="next" href="{{ paginator.next_page_path | prepend: seo_url }}">
{% endif %}
{% if site.og_image %}
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Organization",
"url": {{ seo_url | jsonify }},
"logo": {{ site.og_image | prepend: "/images/" | prepend: base_path | jsonify }}
}
</script>
{% endif %}
{% if site.social %}
<script type="application/ld+json">
{
"@context" : "http://schema.org",
"@type" : "{% if site.social.type %}{{ site.social.type }}{% else %}Person{% endif %}",
"name" : "{{ site.social.name | default: site.name }}",
"url" : {{ seo_url | jsonify }},
"sameAs" : {{ site.social.links | jsonify }}
}
</script>
{% endif %}
{% if site.google_site_verification %}
<meta name="google-site-verification" content="{{ site.google_site_verification }}" />
{% endif %}
{% if site.bing_site_verification %}
<meta name="msvalidate.01" content="{{ site.bing_site_verification }}">
{% endif %}
{% if site.alexa_site_verification %}
<meta name="alexaVerifyID" content="{{ site.alexa_site_verification }}">
{% endif %}
{% if site.yandex_site_verification %}
<meta name="yandex-verification" content="{{ site.yandex_site_verification }}">
{% endif %}
<!-- end SEO -->

25
_includes/sidebar.html Normal file
View file

@ -0,0 +1,25 @@
{% include base_path %}
{% if page.author_profile or layout.author_profile or page.sidebar %}
<div class="sidebar sticky">
{% if page.author_profile or layout.author_profile %}{% include author-profile.html %}{% endif %}
{% if page.sidebar %}
{% for s in page.sidebar %}
{% if s.image %}
<img src=
{% if s.image contains "://" %}
"{{ s.image }}"
{% else %}
"{{ s.image | prepend: "/images/" | prepend: base_path }}"
{% endif %}
alt="{% if s.image_alt %}{{ s.image_alt }}{% endif %}">
{% endif %}
{% if s.title %}<h3>{{ s.title }}</h3>{% endif %}
{% if s.text %}{{ s.text | markdownify }}{% endif %}
{% endfor %}
{% if page.sidebar.nav %}
{% include nav_list nav=page.sidebar.nav %}
{% endif %}
{% endif %}
</div>
{% endif %}

View file

@ -0,0 +1,15 @@
{% include base_path %}
<section class="page__share">
{% if site.data.ui-text[site.locale].share_on_label %}
<h4 class="page__share-title">{{ site.data.ui-text[site.locale].share_on_label | default: "Share on" }}</h4>
{% endif %}
<a href="https://twitter.com/intent/tweet?{% if site.twitter.username %}via={{ site.twitter.username }}&{% endif %}text={{ page.title }} {{ base_path }}{{ page.url }}" class="btn btn--twitter" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Twitter"><i class="fa fa-fw fa-twitter" aria-hidden="true"></i><span> Twitter</span></a>
<a href="https://www.facebook.com/sharer/sharer.php?u={{ base_path }}{{ page.url }}" class="btn btn--facebook" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Facebook"><i class="fa fa-fw fa-facebook" aria-hidden="true"></i><span> Facebook</span></a>
<a href="https://plus.google.com/share?url={{ base_path }}{{ page.url }}" class="btn btn--google-plus" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Google Plus"><i class="fa fa-fw fa-google-plus" aria-hidden="true"></i><span> Google+</span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url={{ base_path }}{{ page.url }}" class="btn btn--linkedin" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} LinkedIn"><i class="fa fa-fw fa-linkedin" aria-hidden="true"></i><span> LinkedIn</span></a>
</section>

28
_includes/tag-list.html Normal file
View file

@ -0,0 +1,28 @@
{% include base_path %}
{% case site.tag_archive.type %}
{% when "liquid" %}
{% assign path_type = "#" %}
{% when "jekyll-archives" %}
{% assign path_type = nil %}
{% endcase %}
{% if site.tag_archive.path %}
{% comment %}
<!-- Sort alphabetically regardless of case e.g. a B c d E -->
<!-- modified from http://www.codeofclimber.ru/2015/sorting-site-tags-in-jekyll/ -->
{% endcomment %}
{% capture page_tags %}{% for tag in page.tags %}{{ tag | downcase }}#{{ tag }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
{% assign tag_hashes = (page_tags | split: ',' | sort:0) %}
<p class="page__taxonomy">
<strong><i class="fa fa-fw fa-tags" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].tags_label | default: "Tags:" }} </strong>
<span itemprop="keywords">
{% for hash in tag_hashes %}
{% assign keyValue = hash | split: '#' %}
{% capture tag_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %}
<a href="{{ base_path }}{{ tag_word | slugify | prepend: path_type | prepend: site.tag_archive.path }}" class="page__taxonomy-item" rel="tag">{{ tag_word }}</a>{% unless forloop.last %}<span class="sep">, </span>{% endunless %}
{% endfor %}
</span>
</p>
{% endif %}

7
_includes/toc Normal file
View file

@ -0,0 +1,7 @@
<aside class="sidebar__right">
<nav class="toc" markdown="1">
<header><h4 class="nav__title"><i class="fa fa-{{ include.icon | default: 'file-text' }}"></i> {{ include.title | default: site.data.ui-text[site.locale].toc_label }}</h4></header>
* Auto generated table of contents
{:toc .toc__menu}
</nav>
</aside>

View file

@ -0,0 +1,16 @@
---
layout: default
author_profile: false
---
<div id="main" role="main">
{% include sidebar.html %}
<div class="archive">
<h1 class="page__title">{{ page.title }}</h1>
{% include base_path %}
{% for post in page.posts %}
{% include archive-single.html %}
{% endfor %}
</div>
</div>

24
_layouts/archive.html Normal file
View file

@ -0,0 +1,24 @@
---
layout: default
---
{% if page.header.overlay_color or page.header.overlay_image or page.header.image %}
{% include page__hero.html %}
{% endif %}
{% if page.url != "/" and site.breadcrumbs %}
{% unless paginator %}
{% include breadcrumbs.html %}
{% endunless %}
{% endif %}
<div id="main" role="main">
{% include sidebar.html %}
<div class="archive">
{% unless page.header.overlay_color or page.header.overlay_image %}
<h1 class="page__title">{{ page.title }}</h1>
{% endunless %}
{{ content }}
</div>
</div>

10
_layouts/compress.html Normal file
View file

@ -0,0 +1,10 @@
---
# Jekyll layout that compresses HTML
# v3.0.2
# http://jch.penibelst.de/
# © 20142015 Anatol Broder
# MIT License
---
{% capture _LINE_FEED %}
{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd p rt rp optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}</{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "<!-- -->" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "<pre" %}{% assign _content = "" %}{% for _pre_before in _pre_befores %}{% assign _pres = _pre_before | split: "</pre>" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "</pre>" %}<pre{{ _pres.first }}</pre>{% endif %}{% unless _pre_before contains "</pre>" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " <e;<e; </e>;</e>;</e> ;</e>" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %} <table id="compress_html_profile_{{ site.time | date: "%Y%m%d" }}" class="compress_html_profile"> <thead> <tr> <td>Step <td>Bytes <tbody> <tr> <td>raw <td>{{ content | size }}{% if _profile_endings %} <tr> <td>endings <td>{{ _profile_endings }}{% endif %}{% if _profile_startings %} <tr> <td>startings <td>{{ _profile_startings }}{% endif %}{% if _profile_comments %} <tr> <td>comments <td>{{ _profile_comments }}{% endif %}{% if _profile_collapse %} <tr> <td>collapse <td>{{ _profile_collapse }}{% endif %}{% if _profile_clippings %} <tr> <td>clippings <td>{{ _profile_clippings }}{% endif %} </table>{% endif %}{% endif %}

30
_layouts/default.html Normal file
View file

@ -0,0 +1,30 @@
---
---
{% include base_path %}
<!doctype html>
<html lang="{{ site.locale | slice: 0,2 | default: "en" }}" class="no-js">
<head>
{% include head.html %}
{% include head/custom.html %}
</head>
<body class="layout--{{ page.layout | default: layout.layout }}{% if page.classes or layout.classes %}{{ page.classes | default: layout.classes | join: ' ' | prepend: ' ' }}{% endif %}">
{% include browser-upgrade.html %}
{% include masthead.html %}
{{ content }}
<div class="page__footer">
<footer>
{% include footer/custom.html %}
{% include footer.html %}
</footer>
</div>
{% include scripts.html %}
</body>
</html>

85
_layouts/single.html Normal file
View file

@ -0,0 +1,85 @@
---
layout: default
---
{% include base_path %}
{% if page.header.overlay_color or page.header.overlay_image or page.header.image %}
{% include page__hero.html %}
{% endif %}
{% if page.url != "/" and site.breadcrumbs %}
{% unless paginator %}
{% include breadcrumbs.html %}
{% endunless %}
{% endif %}
<div id="main" role="main">
{% include sidebar.html %}
<article class="page" itemscope itemtype="http://schema.org/CreativeWork">
{% if page.title %}<meta itemprop="headline" content="{{ page.title | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
{% if page.excerpt %}<meta itemprop="description" content="{{ page.excerpt | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
{% if page.date %}<meta itemprop="datePublished" content="{{ page.date | date: "%B %d, %Y" }}">{% endif %}
{% if page.modified %}<meta itemprop="dateModified" content="{{ page.modified | date: "%B %d, %Y" }}">{% endif %}
<div class="page__inner-wrap">
{% unless page.header.overlay_color or page.header.overlay_image %}
<header>
{% if page.title %}<h1 class="page__title" itemprop="headline">{{ page.title | markdownify | remove: "<p>" | remove: "</p>" }}</h1>{% endif %}
{% if page.read_time %}
<p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> {% include read-time.html %}</p>
{% endif %}
</header>
{% endunless %}
<section class="page__content" itemprop="text">
{{ content }}
{% if page.link %}<div><a href="{{ page.link }}" class="btn">{{ site.data.ui-text[site.locale].ext_link_label | default: "Direct Link" }}</a></div>{% endif %}
<center>
<div class ="notice--info"><b>For support, ask for help at <a href="https://gate.omicron.pw">#3dshacks on Rizon IRC</a> or <a href="https://discord.gg/MWxPgEp">3DS Hacking on Discord</a>.<br>If you appreciate this guide, I accept <a href="donations">Donations</a> through both Bitcoin and PayPal.</b></div>
<script src="//z-na.amazon-adsystem.com/widgets/onejs?MarketPlace=US&storeId=plailect-20&adInstanceId=f93cf192-a553-45d5-8fe6-f2359d7efe74"></script>
</center>
</section>
<footer class="page__meta">
{% if site.data.ui-text[site.locale].meta_label %}
<h4 class="page__meta-title">{{ site.data.ui-text[site.locale].meta_label }}</h4>
{% endif %}
{% include page__taxonomy.html %}
{% if page.modified %}
<p class="page__date"><strong><i class="fa fa-fw fa-calendar" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}</strong> <time datetime="{{ page.modified | date: "%Y-%m-%d" }}">{{ page.modified | date: "%B %d, %Y" }}</time></p>
{% elsif page.date %}
<p class="page__date"><strong><i class="fa fa-fw fa-calendar" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}</strong> <time datetime="{{ page.date | date_to_xmlschema }}">{{ page.date | date: "%B %d, %Y" }}</time></p>
{% endif %}
</footer>
{% if page.share %}{% include social-share.html %}{% endif %}
{% include post_pagination.html %}
</div>
{% if site.comments.provider and page.comments %}
{% include comments.html %}
{% endif %}
</article>
{% comment %}<!-- only show related on a post page when not disabled -->{% endcomment %}
{% if page.id and page.related and site.related_posts.size > 0 %}
<div class="page__related">
{% if site.data.ui-text[site.locale].related_label %}
<h4 class="page__related-title">{{ site.data.ui-text[site.locale].related_label | default: "You May Also Enjoy" }}</h4>
{% endif %}
<div class="grid__wrapper">
{% for post in site.related_posts limit:4 %}
{% include archive-single.html type="grid" %}
{% endfor %}
</div>
</div>
{% endif %}
</div>

33
_layouts/splash.html Normal file
View file

@ -0,0 +1,33 @@
---
layout: default
---
{% include base_path %}
{% if page.header.overlay_color or page.header.overlay_image or page.header.image %}
{% include page__hero.html %}
{% endif %}
<div id="main" role="main">
<article class="splash" itemscope itemtype="http://schema.org/CreativeWork">
{% if page.title %}<meta itemprop="headline" content="{{ page.title | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
{% if page.excerpt %}<meta itemprop="description" content="{{ page.excerpt | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
{% if page.date %}<meta itemprop="datePublished" content="{{ page.date | date: "%B %d, %Y" }}">{% endif %}
{% if page.modified %}<meta itemprop="dateModified" content="{{ page.modified | date: "%B %d, %Y" }}">{% endif %}
<section class="page__content" itemprop="text">
{{ content }}
</section>
</article>
<center>
<div class ="notice--info"><b>For support, ask for help at <a href="https://gate.omicron.pw">#3dshacks on Rizon IRC</a> or <a href="https://discord.gg/MWxPgEp">3DS Hacking on Discord</a>.<br>If you appreciate this guide, I accept <a href="donations">Donations</a> through both Bitcoin and PayPal.</b></div>
<script src="//z-na.amazon-adsystem.com/widgets/onejs?MarketPlace=US&storeId=plailect-20&adInstanceId=f93cf192-a553-45d5-8fe6-f2359d7efe74"></script>
</center>
</div>

View file

@ -0,0 +1,62 @@
---
title: "2.1.0 ctrtransfer"
permalink: /2.1.0-ctrtransfer.html
---
This section is only required for Old 3DS or 2DS. If you are on a New 3DS, skip to [Installing arm9loaderhax](installing-arm9loaderhax).
{: .notice--primary}
If you downgrade to 2.1.0 on a 2DS and left Wireless Communication off, you can re-enable the wireless by removing the battery for several seconds then booting back up.
{: .notice--info}
Never format a 2DS while on a version <6.0.0 or you will be unable to complete initial setup and will BRICK!
{: .notice--danger}
#### Overview of steps
In this section, we will be flashing your console's [CTRNAND](https://www.3dbrew.org/wiki/Flash_Filesystem#CTR_partition) partition to 2.1.0 in order to take advantage of an oversight in 2.1.0 for the purpose of extracting the [OTP](otp-info) unique to your console. This OTP file is required to install arm9loaderhax, and **cannot** be shared with other consoles.
This is accomplished by [installing a premade ctrtransfer image](https://www.reddit.com/r/3dshacks/comments/4zhe4a/) containing 2.1.0, copying your console specific files (such as `moveable.sed` and `SecureInfo_A`) to it, then fixing the title databases.
The OTP is a requirement to use arm9loaderhax on the Old 3DS, while the New 3DS uses an exploit in the way keys are encrypted on the device in order to install arm9loaderhax without the OTP.
#### What you need
* You will need to have booted into Decrypt9
* The 2.1.0 ctrtransfer image for your device and region
*(if your device is not from one of these regions, just pick one)*:
+ [Old 3DS or 2DS 2.1.0 - EUR - ctrtransfer](torrents/2.1.0-4E_ctrtransfer_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:89acc9c1b488b8b38251de0ddf07975d6bd354a1"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS or 2DS 2.1.0 - JPN - ctrtransfer](torrents/2.1.0-4J_ctrtransfer_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:3dbb9c9c85a33c6242f424dcbaebcacdd8a5912b"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS or 2DS 2.1.0 - USA - ctrtransfer](torrents/2.1.0-4U_ctrtransfer_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:1609ce9ee7b0ed9b6dea0b3e7cca4fc52dad6ff4"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
#### Instructions
You should be in Decrypt9 for these steps.
1. Press (Select) on the main menu to eject your SD card, then put it in your computer
2. Copy the 2.1.0 `.bin` and `.bin.sha` from the ctrtransfer zip to the `/files9/` folder on your SD card
3. Reinsert your SD card into your 3DS
4. Go to "SysNAND Options", then "CTRNAND Transfer", then "Auto CTRNAND Transfer"
5. Select the 2.1.0 ctrtransfer image when prompted by pressing (A)
6. If you do not already have a NAND backup, **backup SysNAND to `NANDmin.bin` when prompted by pressing (A)**
7. Allow the transfer process to proceed automatically, this may take some time
8. Once the transfer is complete, press (B) to go back
9. Press (Select) to eject your SD card
9. Delete the 2.1.0 ctrtransfer image `.bin` and `.bin.sha` from the `/files9/` folder on your SD card
19. Clear Home Menu's extdata by navigating to the following folder on your SD card: `/Nintendo 3DS/(32 Character ID)/(32 Character ID)/extdata/00000000/`
+ EUR Region: Delete `00000098`
+ JPN Region: Delete `00000082`
+ USA Region: Delete `0000008f`
+ CHN Region: Delete `000000A1`
+ KOR Region: Delete `000000A9`
+ TWN Region: Delete `000000B1`
12. Reinsert your SD card into your 3DS
11. Press (Start) to reboot
___
*(Screen distortions or discolorations are normal for some devices while on 2.1.0, they will go away once you restore your backup)*
{: .notice--info}
Continue to [Installing arm9loaderhax](installing-arm9loaderhax).
{: .notice--primary}

9
_pages/404.md Normal file
View file

@ -0,0 +1,9 @@
---
title: "Page Not Found"
layout: single
excerpt: "Page not found. Your pixels are in another canvas."
sitemap: false
permalink: /404.html
---
Sorry, but the page you were trying to view does not exist.

91
_pages/9.2.0-Downgrade.md Normal file
View file

@ -0,0 +1,91 @@
---
title: "9.2.0 Downgrade"
permalink: /9.2.0-downgrade.html
---
Some regions may downgrade to another version such as 9.1.0 or 9.0.0. This is fine as those versions function nearly the same for our purposes.
{: .notice--success}
If you encounter this error and cannot use recovery mode, you can edit the connection settings as long as the 3DS completely fails to connect to any access point (such as if the point is out of range).
{: .notice--info}
This version of sysDowngrader (which is compatible with >9.2.0 systems) uses an unstable exploit, and because of this it may take many tries to work.
{: .notice--info}
{% capture notice-3 %}
If sysDowngrader crashes at any point during the downgrade (which can happen occasionally), you can power off the system by holding the power button. You will be left with what's called a "partial downgrade" or "partial", which is recoverable.
Although a partially downgraded system may show 9.2.0 as the system version, you are not done. You must restart from the beginning of Section II and downgrade a second time to install any files that were not installed. browserhax will work for partial downgrades as long as you are using the recommended version of sysDowngrader.
{% endcapture %}
<div class="notice--info">{{ notice-3 | markdownify }}</div>
If you are are between versions 11.0.0 and 11.2.0, you MUST have [downgraded your NFIRM](nfirm-downgrade) to successfully complete this part.
{: .notice--warning}
{% capture notice-2 %}
**All** variations of sysUpdater, *not* just sysDowngrader, have a *very* small chance of causing a "soft brick" once the downgrade is complete and the device reboots. This will cause the system to boot directly to the Nintendo error screen instructing users to power off the device.
The reason for this is unknown, but can be prevented by performing a system format *before* downgrading. It seems to happen very often on systems with ambassador status or who have DSiWare installed.
Once this error happens, it can *only* be fixed by using recovery mode (A + R + L + Up on the D-Pad) to update to the latest system version.
As of the time this is written, the latest version (11.2.0) has completely blocked all software downgrading, and if someone encounters this error they will be locked out of any further downgrading unless they downgrade their NFIRM.
{% endcapture %}
<div class="notice--warning">{{ notice-2 | markdownify }}</div>
**You MUST downgrade with the correct pack for your console/region or you will BRICK.**
{: .notice--danger}
#### What you need
* The Homebrew Launcher and an entrypoint (such as menuhax)
* The latest release of [sysDowngrader](https://github.com/Plailect/sysDowngrader/releases/latest)
* The 9.2.0 downgrade pack zip file for your device and region:
+ [New 3DS 9.2.0 - EUR](torrents/9.2.0-20E(Full)_n3DS.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:4e22cf8bc71c99a70bb846c7cf416d4caafbe58e"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [New 3DS 9.2.0 - JPN](torrents/9.2.0-20J(Full)_n3DS.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:c8630ed31b53637b9023bd4dc1ce38362bb8ecd9"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [New 3DS 9.2.0 - USA](torrents/9.2.0-20U(Full)_n3DS.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:1e670b71b7f26f2765bbe55d0f6cb8c0459d2e8c"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
~
+ [Old 3DS or 2DS 9.2.0 - EUR](torrents/9.2.0-20E(Full).torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:844006eb64474c115bd5b847f6c59d333be3397a"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS or 2DS 9.2.0 - JPN](torrents/9.2.0-20J(Full).torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:bb27a53a524276b6527d3b139395b2afc7affe1a"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS or 2DS 9.2.0 - USA](torrents/9.2.0-20U(Full).torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:940d6479a3972a99daeb85c499f0d6e4e24a2c8b"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS or 2DS 9.0.0 - KOR](torrents/9.0.0-20K(Full).torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:2695d01cdfecb74a59e25b98f76ab9285a2dae11"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
<!---
+ [Old 3DS or 2DS 9.0.0 - TWN](torrents/9.0.0-20T(Full).torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:f2f3bf7250f7ae558ab9ebd3c425a8f85021f80f"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
--->
#### Instructions
##### Section I - Prep work
3. Copy and merge the `3ds` folder from the sysDowngrader zip to the root of your SD card
4. Delete any existing `updates` folder from your SD card if there is one
5. Copy the `updates` folder from the 9.2.0 downgrade zip to the root of your SD card
6. Reinsert your SD card into your 3DS
##### Section II - Downgrading
1. Boot into the Homebrew Launcher (if you followed the previous part, you can do this by holding D-Pad down on boot)
2. Open sysDowngrader
5. Press (Y) to downgrade to 9.2.0
6. If you are stuck being unable to acquire the am:u service, power off your 3DS by holding the power button and try again (this can take many tries)
7. Wait; do not touch anything even if it appears to freeze
8. If, after around 30 seconds, it is still frozen, it is safe to power off and try again
9. If you get an error before installation, power off your 3DS by holding the power button and try again (this can take many tries)
10. If you get an error in the middle of installation, follow the instructions in the beginning for partial downgrades
11. If you freeze on the "Rebooting in 10 seconds" line for longer than 10 seconds, it is safe to power off your 3DS by holding the power button
13. Clear Home Menu's extdata by navigating to the following folder on your SD card: `/Nintendo 3DS/(32 Character ID)/(32 Character ID)/extdata/00000000/`
+ EUR Region: Delete `00000098`
+ JPN Region: Delete `00000082`
+ USA Region: Delete `0000008f`
+ KOR Region: Delete `000000A9`
+ TWN Region: Delete `000000B1`
14. Reinsert your SD card into your 3DS and boot
12. If you still get a black screen after downgrading and deleting the folder, [follow this troubleshooting guide](troubleshooting#ts_sys_down)
Continue to [Decrypt9 (Homebrew Launcher)](decrypt9-(homebrew-launcher))
{: .notice--primary}

View file

@ -0,0 +1,48 @@
---
title: "9.2.0 ctrtransfer"
permalink: /9.2.0-ctrtransfer.html
---
If you started on 2.1.0 **on Old 3DS**, this guide is for you.
{: .notice--success}
If you downgraded to 2.1.0 **on Old 3DS, 2DS, or New 3DS** but for some reason have **no functional NAND backups**, this guide is for you.
{: .notice--success}
If you have already hacked your 3DS before and have a EmuNAND based CFW setup, this guide deals exclusively with SysNAND and you should follow all instructions from within or applying to SysNAND. Note that the terms EmuNAND and RedNAND refer to slightly different implementations of [the same concept](http://3dbrew.org/wiki/NAND_Redirection).
{: .notice--info}
#### What you need
* Everything from the "What you need" for [Installing arm9loaderhax](installing-arm9loaderhax)
* The latest release of [Decrypt9WIP](https://github.com/d0k3/Decrypt9WIP/releases/latest)
* The 9.2.0 ctrtransfer image for your device and region
*(if your device is not from one of these regions, just pick one that matches your device type)*:
+ [New 3DS 9.2.0 - EUR - ctrtransfer](torrents/9.2.0-20E_ctrtransfer_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:fed7bfeec0e52b42a77467cfb6ffd3e9dd2d5a70"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [New 3DS 9.2.0 - JPN - ctrtransfer](torrents/9.2.0-20J_ctrtransfer_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:b22d67fd02b3b0e30ac991e451db0f2d32e7beca"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [New 3DS 9.2.0 - USA - ctrtransfer](torrents/9.2.0-20U_ctrtransfer_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:985d47442dc470d1b9f908256bed041c63885f60"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
~
+ [Old 3DS or 2DS 9.2.0 - EUR - ctrtransfer](torrents/9.2.0-20E_ctrtransfer_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:8d6142313971b08f92257e7fb1c1d5689e34ed78"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS or 2DS 9.2.0 - JPN - ctrtransfer](torrents/9.2.0-20J_ctrtransfer_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:24ad2b85e67013ef1f91178dca7ad2e40663b9b2"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS or 2DS 9.2.0 - USA - ctrtransfer](torrents/9.2.0-20U_ctrtransfer_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:1dc79a2a0babb45497961888f369423a93135e2b"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
#### Instructions
4. Copy the 9.2.0 ctrtransfer image `.bin` and `.bin.sha` from the ctrtransfer zip to the `/files9/` folder on your SD card
5. Copy `Decrypt9WIP.bin` to the `/luma/payloads/` folder on your SD card and rename `Decrypt9WIP.bin` to `x_Decrypt9WIP.bin`
6. Reinsert your SD card into your 3DS
7. Open Decrypt9 from arm9loaderhax by holding X during boot
8. Go to "SysNAND Options", then "CTRNAND Transfer", then "Auto CTRNAND Transfer"
9. Select the 9.2.0 ctrtransfer image when prompted by pressing (A)
10. **Backup SysNAND to `NANDmin.bin` when prompted by pressing (A)**
11. Allow the transfer process to proceed automatically, this may take some time
12. Once the transfer is complete, press Select to eject your SD card
13. Put your SD card in your computer, then copy `NANDmin.bin` and `NANDmin.bin.sha` from the `/files9/` folder on your SD card to a safe location; make backups in multiple locations; this backup will save you from a brick if anything goes wrong in the future **(Your backup should match one of the sizes on [this](nand-size) page; if it does not, you should delete it and make a new one!)**
14. Delete the 9.2.0 ctrtransfer image `.bin` and `.bin.sha` from the `/files9/` folder on your SD card
15. Reinsert your SD card into your 3DS
16. Press Start to reboot
17. Update your CFW SysNAND to the latest version using system settings
+ **Yes this is safe, stop opening Github issues about it.**
Return to [Installing arm9loaderhax](installing-arm9loaderhax).
{: .notice--primary}

28
_pages/Cart-Update.md Normal file
View file

@ -0,0 +1,28 @@
---
title: "Cart Update"
permalink: /cart-update.html
---
All game carts contain a copy of the required system version to play it, allowing anyone on a lower version to use the cartridge to update to that version (even without an internet connection).
{: .notice--info}
Cart Updates will only deliver updates to core features, such as the System Settings, Home Menu, Nintendo 3DS Sound, etc. Cart Updates will not deliver updates to Network features, such as System Transfer, Internet Browser, StreetPass Mii Plaza or eShop.
{: .notice--info}
This means that a cart update will NOT install a browser if you do not already have one. This will **only** update the actual system version *(for example, 2.1.0-0 -> 6.0.0-0)*. The last number *(the -0)* will **not** change.
{: .notice--warning}
**Updating with a game cart containing the version 9.9.0 or above will remove your browser!**
{: .notice--danger}
#### What you need
* A game cart that [contains the version](http://www.3dsdb.com/) specified in the chart
#### Instructions
1. Boot your 3DS into recovery mode by holding L+R+A+UP while powering on
2. Decline the update and reboot
3. Put the game in the system
4. Attempt to launch the game
5. Update when prompted

62
_pages/Credits.md Normal file
View file

@ -0,0 +1,62 @@
---
title: "Credits"
permalink: /credits.html
---
**Special thanks to all of [#Cakey on Freenode](http://webchat.freenode.net/?channels=%23Cakey) for being awesome!**
{: .notice--primary}
If I forgot you here, contact me and I'll add your name.
{: .notice}
+ AHP_Person
+ Al3x_10m
+ aliaspider
+ AngelSL
+ ashinnblunts
+ AuroraWright
+ b1l1s
+ Cell9
+ coder65535
+ Cruel`
+ d0k3
+ dank101
+ dark_samus
+ Dazzozo
+ Delebile
+ DinohScene
+ dukesrg
+ elSeledonio
+ felipejfc
+ Frozen_Chen
+ Gelex
+ Hamcha
+ icecream
+ ihaveamac
+ IngeniousDefault
+ J-D-K
+ MassExplosion123
+ mid-kid
+ MrNbaYoh
+ Mrrraou
+ Night_Fallen_Wolf
+ Normmatt
+ plutooo
+ Psi-Hate
+ Raugo
+ Reboot.ms
+ s_99
+ SciresM
+ Shadowtrance
+ shinyquagsire23
+ smealum
+ Steveice10
+ Syphurith
+ TuxSH
+ Urbanshadow
+ Vappy
+ vegaroxas
+ WulfyStylez
+ xy2_
+ yellows8
+ yifan_lu

254
_pages/DSiWare-Downgrade.md Normal file
View file

@ -0,0 +1,254 @@
---
title: "DSiWare Downgrade"
permalink: /dsiware-downgrade.html
---
If you are between versions 11.0.0 and 11.2.0, you must follow this guide to downgrade your NATIVE_FIRM using DSiWare and a second 3DS which has already has a Custom Firmware installed on it in order to dump and restore your NAND.
{: .notice}
If you are below 11.2.0 on either device, then you should do the ctr-httpwn steps (when prompted) on each device under 11.2.0 to allow you to System Transfer with them.
{: .notice--info}
This takes advantage of an oversight which allows DSiWare titles to read and write anywhere in NAND.
{: .notice--info}
This is a currently working implementation of the "FIRM partitions known-plaintext" exploit detailed [here](https://www.3dbrew.org/wiki/3DS_System_Flaws).
{: .notice--info}
This guide will assume the CFW 3DS is running arm9loaderhax and was setup with this guide, but will work (with slight modifications such as doing all SysNAND steps on EmuNAND) on systems running an EmuNAND. Note that the terms EmuNAND and RedNAND refer to slightly different implementations of [the same concept](http://3dbrew.org/wiki/NAND_Redirection).
{: .notice--info}
{% capture notice-4 %}
This exploit requires you to [System Transfer](http://en-americas-support.nintendo.com/app/answers/detail/a_id/13996/) from a CFW 3DS to a stock 3DS as part of the steps. System Transfers will work in the following directions *only*:
+ New 3DS -> New 3DS
+ Old 3DS or 2DS -> Old 3DS or 2DS
+ Old 3DS or 2DS -> New 3DS
{% endcapture %}
<div class="notice--warning">{{ notice-4 | markdownify }}</div>
Both systems MUST be from the same region.
{: .notice--warning}
3DS #1's NNID will be stuck on 3DS #2 unless you either system transfer back or call Nintendo! (details in the instructions)
{: .notice--danger}
System Transfers can only be performed once a week.
{: .notice--danger}
#### What you need
* Two 3DS systems
+ **3DS #1**: the 3DS running some kind of custom firmware (arm9loaderhax or some form of EmuNAND/EmuNAND) *on the latest version*
+ **3DS #2**: the 3DS on stock firmware *between 11.0.0 and 11.2.0*
* Purchase one of the following exploitable DSiWare games (a pirated copy of the game will **not** work) on **3DS #1**
+ **Fieldrunners**: Works for **USA + EUR** (never released for JPN)
+ **Legends of Exidia**: Works for **USA + EUR** (JPN title pulled from eShop)
+ **Guitar Rock Tour**: Works for **EUR Only** (game has been pulled in all regions, you must have installed it already)
* The exploited save for your game and region:
+ **Fieldrunners USA Region**: [`public.sav`](torrents/fieldrunners_usa_save.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:34d12dbde622aff3c43736f4668162c3bb2d05a9"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ **Fieldrunners EUR Region**: [`public.sav`](torrents/fieldrunners_eur_save.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:a342e4a43ca6c5a4ec03f5891fd5b954bf4ab34e"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ **Guitar Rock Tour EUR Region**: [`public.sav`](torrents/grtpwn_eur_save.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:aa5bf12862437ba369a54f15fae27cbb6bcd0eb0"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ **Legends of Exidia ALL Regions**: [`public.sav`](torrents/exidia_save.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:5ab3518f63994d275c6f7352c396c618541bb4d0"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* The latest release of [3DSident](https://github.com/joel16/3DSident/releases/latest)
* The latest release of [FBI](https://github.com/Steveice10/FBI/releases/latest)
* The latest release of [dgTool](https://github.com/Plailect/dgTool/releases/latest)
* The latest version of [Universal Inject Generator](https://github.com/d0k3/Universal-Inject-Generator/archive/master.zip)
* The Homebrew [Starter Kit](http://smealum.github.io/ninjhax2/starter.zip)
* The NFIRM zip corresponding to the device and version of **3DS #2**:
+ [New 3DS 11.0.0 to 10.4.0](torrents/11.0.0_to_10.4.0_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:2d13a5ea1570f911bd5c6423e0c30e51d548837a"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS 11.0.0 to 10.4.0](torrents/11.0.0_to_10.4.0_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:72393bbd99bc285db84a9cabf39d9b3200058d6a"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
~
+ [New 3DS 11.1.0 to 10.4.0](torrents/11.1.0_to_10.4.0_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:d7d60c27c18f53bd8508a194656a465f6448bedf"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS 11.1.0 to 10.4.0](torrents/11.1.0_to_10.4.0_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:0caf9a948a2d8bf23606d641f6628e2baeb983bb"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
~
+ [New 3DS 11.2.0 to 10.4.0](torrents/11.2.0_to_10.4.0_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:881388a552a1ce9a963d391bf1a023642270991c"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS 11.2.0 to 10.4.0](torrents/11.2.0_to_10.4.0_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:a479e4ee55efbc18c181d426cd77a34815388151"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* Download a legitimate copy of **Steel Diver: Sub Wars** (the game is free, but any copy of the game not from the eShop will **not** work) on **3DS #1**
* The latest release of [steelhax](https://github.com/VegaRoXas/vegaroxas.github.io/raw/master/files/steelhax-installer.rar)
* If **3DS #2** is below 11.2.0, you will _also_ need the following
+ The latest release of [ctr-httpwn](https://github.com/yellows8/ctr-httpwn/releases)
#### Instructions
##### Section I - Prep Work
1. Create a folder named `files9` on the root of **3DS #1**'s SD card if it does not already exist
2. **Use a [save manager](https://github.com/J-D-K/JKSM/releases/latest) to backup any saves you care about on 3DS #2 (it will be formatted!)**
3. Copy `public.sav` to the root of **3DS #1**'s SD card
4. On **3DS #1**, hold Start on boot to launch Hourglass9
5. Go to SysNAND Options, then SysNAND Backup/Restore, then backup **(min size)** SysNAND to `NAND.bin`
6. Press (Select) on the main menu to eject your SD card, then put it in your computer
7. Copy `NAND.bin` and `NAND.bin.sha` from the `/files9/` folder on your SD card to a safe location; make backups in multiple locations; this backup will save you from a brick if anything goes wrong in the future **(Your backup should match one of the sizes on [this](nand-size) page; if it does not, you should delete it and make a new one!)**
6. Press (Select) on the main menu to eject **3DS #1**'s SD card, then put it in your computer
7. Put **3DS #2**'s SD card into your computer
8. **Backup every file on both 3DS's SD cards to two separate folders on your computer (keep track of which is which)!**
9. Reinsert each SD card back into their corresponding 3DS
10. Press (Start) to reboot
##### Section II - Installing the save
1. Purchase one of the following exploitable DSiWare games (a pirated copy of the game will **not** work)
+ **Fieldrunners**: Works for **USA + EUR**
+ **Legends of Exidia**: Works for **USA + EUR**
+ **Guitar Rock Tour**: You must have already purchased this for **EUR**
2. Launch FBI on **3DS #1**
3. Navigate to `SD`
4. Press (A) on `public.sav` and copy it
5. Press (B) to get back to the main menu
6. Navigate to `TWL NAND` -> `title` -> `00030004`
7. Navigate to the folder for your game and region:
+ **Fieldrunners USA Region**: `4b464445` -> `data`
+ **Fieldrunners EUR Region**: `4b464456` -> `data`
+ **Legends of Exidia USA Region**: `4b4c4545` -> `data`
+ **Legends of Exidia EUR Region**: `4b4c4556` -> `data`
+ **Guitar Rock Tour EUR Region**: `4b475256` -> `data`
8. Press (A) on the existing `public.sav` and delete it
9. Press (A) on the current directory and paste `public.sav`
10. Press (B) to get back to the main menu
11. Press (Start) to exit
3. Launch your DSiWare game on **3DS #1**
4. Test if the save is functional
+ **Fieldrunners**: Touch the 'Scores' button at the main menu
+ **Legends of Exidia**: After pressing (A) or (Start) at the two title screens, select the first save slot and press continue
+ **Guitar Rock Tour**: Scroll down and go to High-Scores -> Drums -> Easy
+ If your game has an error about `boot.nds`, **then the exploit has been successful**
+ If your game behaves normally and does not give you this error, then you should stop and figure out what went wrong
+ If you get a black screen, [follow this troubleshooting guide](troubleshooting#twl_broken)
##### Section III - steelhax
**This will allow you to enter the homebrew launcher after the System Transfer.**
1. Copy the `steelhax-installer` folder from the steelhax zip to the `/3ds/` folder on **3DS #1**'s SD card
2. Reinsert your SD card into your 3DS
3. Ensure that **Steel Diver: Sub Wars** does not have any updates installed using System Settings:
+ Go to "Data Management", then "Nintendo 3DS", then "Downloadable Content"
+ Select **Steel Diver: Sub Wars**, then select "delete"
+ Exit the System Settings
2. Launch **Steel Diver: Sub Wars**
+ Do not update the game
3. Press (A) to continue, then create / select a Mii
4. Exit the game
2. Launch the homebrew launcher on **3DS #1**
+ If it is an arm9loaderhax installed device, you can do that with [hblauncher_loader](https://github.com/yellows8/hblauncher_loader/releases)
3. Launch steelhax installer
4. Press (A) to continue
5. Press (A) to confirm **Steel Diver: Sub Wars**'s version
6. Press (A) to confirm **3DS #1**'s system version
7. Press (Start) to exit the installer
8. Press (Start) to open the homebrew launcher exit menu
7. Press (X) to Return to Home Menu (no reboot)
+ You may get an "Error has occurred" message with the option to continue. This is fine, just hit (A)
9. Launch **Steel Diver: Sub Wars** to test the exploit
+ Do not update the game
+ The save game may be corrupted
+ Do not press "ok" to delete the corrupted save data, just exit with the home button
+ If you do press "ok" by mistake, you will have to recreate the Mii
+ Redo the installation starting with the homebrew launcher
+ This can take many tries
+ If it is successful, the device will boot into the homebrew launcher
10. Once you are in the homebrew launcher successfully, launch steelhax installer
11. Press (A) to continue
12. Press (A) to confirm **Steel Diver: Sub Wars**'s version
16. This time, change the version to match **3DS #2**'s system version
+ Even though you will be downgrading its NFIRM, you should still select the system version it is on now
12. Copy _the contents of_ the `starter.zip` to the root of **3DS #2**'s SD card, then put the SD card back into **3DS #2**
##### Section IV - ctr-httpwn
**This section is only required if _3DS #2_ is under 11.2.0.**
**This will allow you to system transfer on versions other than the latest.**
1. Copy and merge the `3ds` folder from the ctr-httpwn zip to **3DS #2**'s SD card
2. Reinsert your SD card into **3DS #2**
2. Launch the homebrew launcher on the device using [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))
+ **Ensure menuhax is not installed, or you won't be able to return to Home Menu from the homebrew launcher**
3. Launch ctr-httpwn on **3DS #2**
4. Press (A) to continue
5. Press (Start) to exit ctr-httpwn
6. Press (Start) to open the homebrew launcher exit menu
7. Press (X) to Return to Home Menu (no reboot)
+ You may get an "Error has occurred" message with the option to continue. This is fine, just hit (A)
8. Continue to the next section **without rebooting**
+ **3DS #2** has been temporarily patched to allow network functions (such as System Transfer) without running the latest system version
+ Keep in mind that exiting the System Settings will reboot the system
+ If the system is rebooted, you'll have to re-run ctr-httpwn before System Transfer will work
##### Section V - System Transfer
1. **Backup every file on both 3DS's SD cards to two separate folders on your computer (keep track of which is which)!**
2. Reinsert each SD card back into their corresponding 3DS
4. If **3DS #2** has a Nintendo Network ID on it, you must format the device using System Settings:
+ Go to the last page of "Other Settings" and select "Format System Memory", then follow all instructions
5. Read the following:
+ Your CFW 3DS = 3DS #1 = "Source System"
+ Your Stock 3DS = 3DS #2 = "Target System"
+ **Move DSiWare titles if prompted!**
+ Do **NOT** delete the source system's SD card contents if prompted
+ Make sure neither device's battery dies during the transfer
6. Go to [this link](http://en-americas-support.nintendo.com/app/answers/detail/a_id/227/) and follow Nintendo's official instructions for System Transferring from one system to another while keeping in mind what you just read
##### Section VI - Restoring 3DS #1
1. On **3DS #1**, complete initial setup
2. Do one of the following *(or neither if you don't mind __3DS #1__'s NNID being nonfunctional)*
+ Do the rest of the sections and then the full guide on **3DS #2**, then wait one week, then System Transfer from **3DS #2** back to **3DS #1** *(remember you cannot transfer back from a New 3DS to an Old 3DS)*
+ Call Nintendo and tell them you no longer have access to the device that your NNID is linked to (which is **3DS #2** in this case), and would like it linked to a different device (which is **3DS #1** in this case)
3. Reboot **3DS #1** while holding Start to launch Hourglass9
4. Go to SysNAND Backup/Restore and restore SysNAND from `NAND.bin`
##### Section VII - Backing up 3DS #2's NFIRM
1. Copy `boot.nds` to the root of **3DS #2**'s SD card
1. Create a folder named `dgTool` on the root of **3DS #2**'s SD card if it does not already exist
3. Copy the contents of the NFIRM zip to the `dgTool` folder on the root of **3DS #2**'s SD card
3. Launch your DSiWare game on **3DS #2**
4. Launch dgTool using your DSiWare game
+ Fieldrunners: Touch the 'Scores' button at the main menu
+ Legends of Exidia: After pressing (A) or (Start) at the two title screens, select the first save slot and press continue
+ Guitar Rock Tour: Scroll down and go to High-Scores -> Drums -> Easy
+ If your game does not have the hacked save file installed, [follow this troubleshooting guide](troubleshooting#ts_dsiware)
5. Use dgTool to backup **3DS #2**'s NFIRM
+ New 3DS: select "Dump F0F1_N3DS.bin"
+ Old 3DS or 2DS: select "Dump F0F1_O3DS.bin"
6. Make note of the NFIRM backup's location
7. Exit dgTool
8. Put your SD card in your computer, then copy `F0F1_N3DS.bin` or `F0F1_O3DS.bin` (depending on your device) to a safe location; make backups in multiple locations; this backup will save you from a brick if anything goes wrong
##### Section VIII - Flashing 3DS #2's NFIRM
**Do NOT downgrade with dgTool on a device that already has arm9loaderhax installed or you will BRICK!**
1. Launch your DSiWare game on **3DS #2**
2. Launch dgTool using your DSiWare game
+ Fieldrunners: Touch the 'Scores' button at the main menu
+ Legends of Exidia: After pressing (A) or (Start) at the two title screens, select the first save slot and press continue
+ Guitar Rock Tour: Scroll down and go to High-Scores -> Drums -> Easy
3. Select "Downgrade FIRM to 10.4" and confirm to flash the 10.4.0 NFIRM bin to **3DS #2**
4. Exit dgTool
5. Reboot
##### Section IX - Exploit verification
1. Copy and merge the `3ds` folder from the 3DSident zip to **3DS #2**'s SD card
2. Reinsert your SD card into **3DS #2**
3. Launch the homebrew launcher on **3DS #2** using [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))
4. Launch 3DSident
5. Verify that the following:
+ **Kernel version**: 2.50-11
+ **FIRM version**: 2.50-11
+ If either of these do not display the versions above, something has gone wrong and you should try again from the beginning
Continue to [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)), using steelhax for your entrypoint instead of one of the ones listed.
{: .notice--primary}
You can use another entrypoint if you want to, I just recommend steelhax because it is free.
{: .notice--info}
**3DS #2**'s version number will *not* have changed in the settings.
{: .notice--info}
If, once transfered, steelhax only crashes to a black screen on **3DS #2**, [follow this troubleshooting guide](troubleshooting#ts_steelhax).
{: .notice--warning}

View file

@ -0,0 +1,31 @@
---
title: "Decrypt9 (Browser)"
permalink: /decrypt9-(browser).html
---
The first thing this guide will do is get you running Decrypt9, which is a multipurpose toolkit that will allow us to install the version 2.1.0, which contains a vulnerability that is needed for further exploitation of the system.
{: .notice}
If you have already hacked your 3DS before and have a EmuNAND based CFW setup, this guide deals exclusively with SysNAND and you should follow all instructions from within or applying to SysNAND. Note that the terms EmuNAND and RedNAND refer to slightly different implementations of [the same concept](http://3dbrew.org/wiki/NAND_Redirection).
{: .notice--info}
#### What you need
* The latest release of [Decrypt9WIP](https://github.com/d0k3/Decrypt9WIP/releases/)
#### Instructions
1. Create a folder named `files9` on the root of your SD card if it does not already exist
2. Copy `Launcher.dat` and `Decrypt9WIP.dat` from the Decrypt9WIP zip to the root of your SD card
3. Reinsert your SD card into your 3DS
4. Open the browser and go to one of the following URLs on your 3DS
+ `https://dukesrg.github.io/?Decrypt9WIP.dat`
+ `http://go.gateway-3ds.com/`
+ `http://www.reboot.ms/3ds/load.html?Launcher.dat`
+ `http://dukesrg.dynu.net/3ds/rop?GW17567.dat&Launcher.dat`
+ Make sure to try each URL if the first one doesn't work (some versions cannot use the first one, and some versions cannot use the last three)
+ If you get an error, [follow this troubleshooting guide](troubleshooting#ts_browser)
5. If the exploit was successful, you will have booted into Decrypt9
Continue to [2.1.0 ctrtransfer](2.1.0-ctrtransfer).
{: .notice--primary}

View file

@ -0,0 +1,29 @@
---
title: "Decrypt9 (Homebrew Launcher)"
permalink: /decrypt9-(homebrew-launcher).html
---
If you have already hacked your 3DS before and have a EmuNAND based CFW setup, this guide deals exclusively with SysNAND and you should follow all instructions from within or applying to SysNAND. Note that the terms EmuNAND and RedNAND refer to slightly different implementations of [the same concept](http://3dbrew.org/wiki/NAND_Redirection).
{: .notice--info}
#### What you need
* The latest release of [Decrypt9WIP](https://github.com/d0k3/Decrypt9WIP/releases/)
#### Instructions
2. Create a folder named `files9` on the root of your SD card if it does not already exist
3. Copy the `Decrypt9WIP` folder from the Decrypt9WIP zip to `/3ds/` on your SD card
3. Reinsert your SD card into your 3DS
4. Enter the homebrew launcher
4. Open Decrypt9WIP **(This can sometimes take a few tries)**
+ If you cannot launch Decrypt9WIP after many tries, you most likely have a partial downgrade and should refer to the [9.2.0 Downgrade](9.2.0-downgrade) page
4. Go to "SysNAND Options", then "SysNAND Backup/Restore"
5. Perform a "NAND Backup (min size)" and backup your NAND to `NANDmin.bin`
6. Return to the Main Menu
If you are on Old 3DS, continue to [2.1.0 ctrtransfer](2.1.0-ctrtransfer)
{: .notice--primary}
If you are on New 3DS, reboot with (Start) and continue to [Installing arm9loaderhax](installing-arm9loaderhax)
{: .notice--primary}

32
_pages/Decrypt9-(MSET).md Normal file
View file

@ -0,0 +1,32 @@
---
title: "Decrypt9 (MSET)"
permalink: /decrypt9-(mset).html
---
The first thing this guide will do is get you running Decrypt9, which is a multipurpose toolkit that will allow us to install the version 2.1.0, which contains a vulnerability that is needed for further exploitation of the system.
{: .notice}
If you have already hacked your 3DS before and have a EmuNAND based CFW setup, this guide deals exclusively with SysNAND and you should follow all instructions from within or applying to SysNAND. Note that the terms EmuNAND and RedNAND refer to slightly different implementations of [the same concept](http://3dbrew.org/wiki/NAND_Redirection).
{: .notice--info}
#### What you need
* DS flashcard that works on your 3DS version
* The latest release of [Decrypt9WIP](https://github.com/d0k3/Decrypt9WIP/releases/)
#### Instructions
1. Create a folder named `files9` on the root of your SD card if it does not already exist
2. Copy `Launcher.dat` and `Decrypt9WIP.dat` from the Decrypt9WIP zip to the root of your SD card
3. Reinsert your SD card into your 3DS
4. Put `Decrypt9.nds` from the Decrypt9 zip on your DS flashcard
5. Start your DS flashcard from your 3DS
6. Boot `Decrypt9.nds` using your flashcart
7. Select the correct option for your system version
+ 4.X.X -> "4.x Decrypt9WIP"
+ 6.X.X -> "6.x Decrypt9WIP"
8. Reboot the system, then go to System Settings, then "Other Settings", then "Profile", then "Nintendo DS Profile"
9. If the exploit was successful, you will have booted into Decrypt9
Continue to [2.1.0 ctrtransfer](2.1.0-ctrtransfer).
{: .notice--primary}

17
_pages/Donations.md Normal file
View file

@ -0,0 +1,17 @@
---
title: "Donations"
permalink: /donations.html
---
## If you appreciate this guide, I accept donations.
{: .text-center}
{: .notice--success}
![Bitcoin](images/donate_64.png){: .align-center}
17qitDUbhhd8PdEa6kxJWSqbNvg9PRS4rT
{: .text-center}
![Paypal](images/paypal.jpg){: .align-center}
devonmaloney@hotmail.com
{: .text-center}

55
_pages/FAQ.md Normal file
View file

@ -0,0 +1,55 @@
---
title: "FAQ"
permalink: /faq.html
---
<a name="faq_latestfw" />**Q:** *I am on the latest system version, is my device hackable?*
**A:** Yes, but only by [downgrading its NFIRM](nfirm-downgrade) (see [this](https://www.reddit.com/r/3dshacks/comments/4iry4s/)).
<a name="faq_updatecfw" />**Q:** *How do I update Luma3DS?*
**A:** Use Luma3DS Updater
<a name="faq_gatewaysky" />**Q:** *I heard about this thing I have to pay for (Gateway, Sky3DS, etc), is that something I need?*
**A:** No. arm9loaderhax is a superior method of loading hax that runs early in boot and opens up the opportunity for things such as true custom firmware.
<a name="faq_gatewaysaves" />**Q:** *How do I move saves from an existing Gateway setup to device installed games?*
**A:** See [this](https://gbatemp.net/threads/425743/)
<a name="faq_need" />**Q:** *What do I need to do this guide?*
**A:** This guide can be completely done with free software and (if you have no browser) a compatible game
<a name="faq_risky" />**Q:** *How risky is hacking my console?*
**A:** Bricks are now *basically* impossible unless you ignore/circumvent all safety checks.
<a name="faq_homebrew" />**Q:** *Can I run awesome homebrew and emulators with this?*
**A:** Yes! Custom Firmware not only enables the Homebrew Launcher, but it also will give you hacks on all versions, which means you keep it forever, even with updates.
<a name="faq_regionfree" />**Q:** *Can I use this to play games from other regions?*
**A:** Luma3DS supports Region Free patches, which enables users to install games from any region without any extra modification or steps.
<a name="faq_updates" />**Q:** *Is it safe to update CFW SysNAND?*
**A:** Yes, but if you are feeling apprehensive you can wait until there is confirmation it works.
<a name="faq_support" />**Q:** *Where should I go for support?*
**A:** For support, ask for help at [#3dshacks on Rizon IRC](https://gate.omicron.pw) or [3DS Hacking on Discord](https://discord.gg/MWxPgEp).
<a name="faq_le4gbsd" />**Q:** *Can I do this with a 4GB (or smaller) SD card?*
**A:** Thanks to the new CTRNAND method, yes!
<a name="faq_ge128gbsd" />**Q:** *Can I use a 128 GB (or larger) SD card?*
**A:** Yes, but some users have reported slowdowns when using such large sizes. Note that you cannot format the card with exFAT; you need to format it with FAT32.
<a name="faq_movesd" />**Q:** *How do I move to a new SD card at the end of this?*
**A:** Just copy all the files to the new SD card.
<a name="faq_NNID" />**Q:** *Can I keep my NNID?*
**A:** If you start with an NNID and follow every step, you will end up keeping your NNID at the end.
<a name="faq_systransfer" />**Q:** *What about System Transfers?*
**A:** Once you have completed the guide, you can system transfer to and from an arm9loaderhax'd 3DS or 2DS exactly like you would a regular stock console or EmuNAND (you will lose any non-legitimate games/themes/DLC in the transfer; saves will stay even for games that are lost).
<a name="faq_nopc" />**Q:** *Can I do this without a computer (e.g. an Android phone)?*
**A:** All you need is the ability to put files on an SD card!
<a name="faq_problem" />**Q:** *Help! Something bad happened and now I cannot boot...*
**A:** Please look at the [troubleshooting guide](troubleshooting).

View file

@ -0,0 +1,11 @@
---
title: "Get Started (New 3DS)"
permalink: /get-started-(new-3ds).html
---
Click the image of your device region to take you to the appropriate page.
{: .notice--primary}
| EUR | JPN | USA |
|:-:|:-:|:-:|
| [![EUR](images/eu.png)](get-started-(new-3ds-eur)) | [![JPN](images/jp.png)](get-started-(new-3ds-jpn)) | [![USA](images/us.png)](get-started-(new-3ds-usa)) |

View file

@ -0,0 +1,32 @@
---
title: "Get Started (New 3DS - EUR)"
permalink: /get-started-(new-3ds-eur).html
---
Select the appropriate page for your version from the chart below.
{: .notice--primary}
{% capture notice-1 %}
The first two columns of the chart refer to the last number of your version (which corresponds to the browser version installed to the system). If the version is -0 then you do not have a browser, while any number above -0 indicates a browser is installed.
The "from" and "to" fields are inclusive. This means that, for example, the "from 9.0.0 to 9.2.0" row includes 9.0.0, 9.1.0, and 9.2.0.
In the case of "5.0.0-0U" for example, you would follow the "No Browser" column and 5.0.0 to 5.1.0 row because the system is on the a system version in that range and has no browser installed.
{% endcapture %}
<div class="notice--info">{{ notice-1 | markdownify }}</div>
For all versions you can [Cart Update](cart-update) to a higher version in the same column to follow its instructions instead.
{: .notice--warning}
If you updated with a game cart containing the version 9.9.0 or above *(meaning that you have a version on 9.9.0 or above, but your browser is on -25 or lower, such as 10.2.0-24)*, your browser was removed and you will need to use the "No Browser" column.
{: .notice--warning}
The device version can be found at the bottom right of the top screen of the System Settings.
{: .notice--success}
| From | To | No Browser | Browser |
|:-:|:-:|:-:|:-:|
| 9.0.0 | 10.6.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Homebrew Launcher (Browser)](homebrew-launcher-(browser)) |
| 10.7.0 | 10.7.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))| [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))|
| 11.0.0 | 11.2.0 | [NFIRM Downgrade](nfirm-downgrade) | [NFIRM Downgrade](nfirm-downgrade) |

View file

@ -0,0 +1,33 @@
---
title: "Get Started (New 3DS - JPN)"
permalink: /get-started-(new-3ds-jpn).html
---
Select the appropriate page for your version from the chart below.
{: .notice--primary}
{% capture notice-1 %}
The first two columns of the chart refer to the last number of your version (which corresponds to the browser version installed to the system). If the version is -0 then you do not have a browser, while any number above -0 indicates a browser is installed.
The "from" and "to" fields are inclusive. This means that, for example, the "from 9.0.0 to 9.2.0" row includes 9.0.0, 9.1.0, and 9.2.0.
In the case of "5.0.0-0U" for example, you would follow the "No Browser" column and 5.0.0 to 5.1.0 row because the system is on the a system version in that range and has no browser installed.
{% endcapture %}
<div class="notice--info">{{ notice-1 | markdownify }}</div>
For all versions you can [Cart Update](cart-update) to a higher version in the same column to follow its instructions instead.
{: .notice--warning}
If you updated with a game cart containing the version 9.9.0 or above *(meaning that you have a version on 9.9.0 or above, but your browser is on -25 or lower, such as 10.2.0-24)*, your browser was removed and you will need to use the "No Browser" column.
{: .notice--warning}
The device version can be found at the bottom right of the top screen of the System Settings.
{: .notice--success}
| From | To | No Browser | Browser |
|:-:|:-:|:-:|:-:|
| 8.1.0 | 8.1.0 | [NTR and Cubic Ninja](ntr-and-cubic-ninja) | [Homebrew Launcher (Browser)](homebrew-launcher-(browser)) |
| 9.0.0 | 10.6.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Homebrew Launcher (Browser)](homebrew-launcher-(browser)) |
| 10.7.0 | 10.7.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))|
| 11.0.0 | 11.2.0 | [NFIRM Downgrade](nfirm-downgrade) | [NFIRM Downgrade](nfirm-downgrade) |

View file

@ -0,0 +1,32 @@
---
title: "Get Started (New 3DS - USA)"
permalink: /get-started-(new-3ds-usa).html
---
Select the appropriate page for your version from the chart below.
{: .notice--primary}
{% capture notice-1 %}
The first two columns of the chart refer to the last number of your version (which corresponds to the browser version installed to the system). If the version is -0 then you do not have a browser, while any number above -0 indicates a browser is installed.
The "from" and "to" fields are inclusive. This means that, for example, the "from 9.0.0 to 9.2.0" row includes 9.0.0, 9.1.0, and 9.2.0.
In the case of "5.0.0-0U" for example, you would follow the "No Browser" column and 5.0.0 to 5.1.0 row because the system is on the a system version in that range and has no browser installed.
{% endcapture %}
<div class="notice--info">{{ notice-1 | markdownify }}</div>
For all versions you can [Cart Update](cart-update) to a higher version in the same column to follow its instructions instead.
{: .notice--warning}
If you updated with a game cart containing the version 9.9.0 or above *(meaning that you have a version on 9.9.0 or above, but your browser is on -25 or lower, such as 10.2.0-24)*, your browser was removed and you will need to use the "No Browser" column.
{: .notice--warning}
The device version can be found at the bottom right of the top screen of the System Settings.
{: .notice--success}
| From | To | No Browser | Browser |
|:-:|:-:|:-:|:-:|
| 9.0.0 | 10.6.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Homebrew Launcher (Browser)](homebrew-launcher-(browser)) |
| 10.7.0 | 10.7.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))| [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))|
| 11.0.0 | 11.2.0 | [NFIRM Downgrade](nfirm-downgrade) | [NFIRM Downgrade](nfirm-downgrade) |

View file

@ -0,0 +1,11 @@
---
title: "Get Started (Old 3DS)"
permalink: /get-started-(old-3ds).html
---
Click the image of your device region to take you to the appropriate page.
{: .notice--primary}
| EUR | JPN | KOR | USA |
|:-:|:-:|:-:|:-:|
| [![EUR](images/eu.png)](get-started-(old-3ds-eur)) | [![JPN](images/jp.png)](get-started-(old-3ds-jpn)) | [![KOR](images/kr.png)](get-started-(old-3ds-kor)) | [![USA](images/us.png)](get-started-(old-3ds-usa)) |

View file

@ -0,0 +1,40 @@
---
title: "Get Started (Old 3DS - EUR)"
permalink: /get-started-(old-3ds-eur).html
---
Select the appropriate page for your version from the chart below.
{: .notice--primary}
{% capture notice-1 %}
The first two columns of the chart refer to the last number of your version (which corresponds to the browser version installed to the system). If the version is -0 then you do not have a browser, while any number above -0 indicates a browser is installed.
The "from" and "to" fields are inclusive. This means that, for example, the "from 9.0.0 to 9.2.0" row includes 9.0.0, 9.1.0, and 9.2.0.
In the case of "5.0.0-0U" for example, you would follow the "No Browser" column and 5.0.0 to 5.1.0 row because the system is on the a system version in that range and has no browser installed.
{% endcapture %}
<div class="notice--info">{{ notice-1 | markdownify }}</div>
For all versions you can [Cart Update](cart-update) to a higher version in the same column to follow its instructions instead.
{: .notice--warning}
If you updated with a game cart containing the version 9.9.0 or above *(meaning that you have a version on 9.9.0 or above, but your browser is on -25 or lower, such as 10.2.0-24)*, your browser was removed and you will need to use the "No Browser" column.
{: .notice--warning}
The device version can be found at the bottom right of the top screen of the System Settings.
{: .notice--success}
| From | To | No Browser | Browser |
|:-:|:-:|:-:|:-:|
| 1.0.0 | 1.1.0 | [Cart Update](cart-update) | [Cart Update](cart-update) |
| 2.1.0 | 2.1.0 | [Cart Update](cart-update) | [Installing arm9loaderhax](installing-arm9loaderhax)|
| 2.2.0 | 3.0.0 | [Cart Update](cart-update) | [Cart Update](cart-update) |
| 4.0.0 | 4.5.0 | [Decrypt9 (MSET)](decrypt9-(mset)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 5.0.0 | 5.1.0 | [Cart Update](cart-update) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 6.0.0 | 6.3.0 | [Decrypt9 (MSET)](decrypt9-(mset)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 7.0.0 | 8.1.0 | [Cart Update](cart-update) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 9.0.0 | 9.2.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 9.3.0 | 10.6.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Homebrew Launcher (Browser)](homebrew-launcher-(browser)) |
| 10.7.0 | 10.7.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))| [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))|
| 11.0.0 | 11.2.0 | [NFIRM Downgrade](nfirm-downgrade) | [NFIRM Downgrade](nfirm-downgrade) |

View file

@ -0,0 +1,40 @@
---
title: "Get Started (Old 3DS - JPN)"
permalink: /get-started-(old-3ds-jpn).html
---
Select the appropriate page for your version from the chart below.
{: .notice--primary}
{% capture notice-1 %}
The first two columns of the chart refer to the last number of your version (which corresponds to the browser version installed to the system). If the version is -0 then you do not have a browser, while any number above -0 indicates a browser is installed.
The "from" and "to" fields are inclusive. This means that, for example, the "from 9.0.0 to 9.2.0" row includes 9.0.0, 9.1.0, and 9.2.0.
In the case of "5.0.0-0U" for example, you would follow the "No Browser" column and 5.0.0 to 5.1.0 row because the system is on the a system version in that range and has no browser installed.
{% endcapture %}
<div class="notice--info">{{ notice-1 | markdownify }}</div>
For all versions you can [Cart Update](cart-update) to a higher version in the same column to follow its instructions instead.
{: .notice--warning}
If you updated with a game cart containing the version 9.9.0 or above *(meaning that you have a version on 9.9.0 or above, but your browser is on -25 or lower, such as 10.2.0-24)*, your browser was removed and you will need to use the "No Browser" column.
{: .notice--warning}
The device version can be found at the bottom right of the top screen of the System Settings.
{: .notice--success}
| From | To | No Browser | Browser |
|:-:|:-:|:-:|:-:|
| 1.0.0 | 1.1.0 | [Cart Update](cart-update) | [Cart Update](cart-update) |
| 2.1.0 | 2.1.0 | [Cart Update](cart-update) | [Installing arm9loaderhax](installing-arm9loaderhax)|
| 2.2.0 | 3.0.0 | [Cart Update](cart-update) | [Cart Update](cart-update) |
| 4.0.0 | 4.5.0 | [Decrypt9 (MSET)](decrypt9-(mset)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 5.0.0 | 5.1.0 | [Cart Update](cart-update) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 6.0.0 | 6.3.0 | [Decrypt9 (MSET)](decrypt9-(mset)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 7.0.0 | 8.1.0 | [Cart Update](cart-update) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 9.0.0 | 9.2.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 9.3.0 | 10.6.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Homebrew Launcher (Browser)](homebrew-launcher-(browser)) |
| 10.7.0 | 10.7.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))| [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))|
| 11.0.0 | 11.2.0 | [NFIRM Downgrade](nfirm-downgrade) | [NFIRM Downgrade](nfirm-downgrade) |

View file

@ -0,0 +1,40 @@
---
title: "Get Started (Old 3DS - KOR)"
permalink: /get-started-(old-3ds-kor).html
---
Select the appropriate page for your version from the chart below.
{: .notice--primary}
{% capture notice-1 %}
The first two columns of the chart refer to the last number of your version (which corresponds to the browser version installed to the system). If the version is -0 then you do not have a browser, while any number above -0 indicates a browser is installed.
The "from" and "to" fields are inclusive. This means that, for example, the "from 9.0.0 to 9.2.0" row includes 9.0.0, 9.1.0, and 9.2.0.
In the case of "5.0.0-0U" for example, you would follow the "No Browser" column and 5.0.0 to 5.1.0 row because the system is on the a system version in that range and has no browser installed.
{% endcapture %}
<div class="notice--info">{{ notice-1 | markdownify }}</div>
**For all versions you can [Cart Update](cart-update) to a higher version in the same column to follow its instructions instead.**
{: .notice--warning}
If you updated with a game cart containing the version 9.9.0 or above *(meaning that you have a version on 9.9.0 or above, but your browser is on -25 or lower, such as 10.2.0-24)*, your browser was removed and you will need to use the "No Browser" column.
{: .notice--warning}
The device version can be found at the bottom right of the top screen of the System Settings.
{: .notice--success}
| From | To | No Browser | Browser |
|:-:|:-:|:-:|:-:|
| 1.0.0 | 1.1.0 | [Cart Update](cart-update) | [Cart Update](cart-update) |
| 2.1.0 | 2.1.0 | [Cart Update](cart-update) | [Installing arm9loaderhax](installing-arm9loaderhax)|
| 2.2.0 | 3.0.0 | [Cart Update](cart-update) | [Cart Update](cart-update) |
| 4.0.0 | 4.5.0 | [Decrypt9 (MSET)](decrypt9-(mset)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 5.0.0 | 5.1.0 | [Cart Update](cart-update) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 6.0.0 | 6.3.0 | [Decrypt9 (MSET)](decrypt9-(mset)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 7.0.0 | 9.2.0 | [Cart Update](cart-update) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 9.3.0 | 9.5.0 | [Cart Update](cart-update) | [Cart Update](cart-update) |
| 9.6.0 | 10.6.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Homebrew Launcher (Browser)](homebrew-launcher-(browser)) |
| 10.7.0 | 10.7.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))| [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))|
| 11.0.0 | 11.2.0 | [NFIRM Downgrade](nfirm-downgrade) | [NFIRM Downgrade](nfirm-downgrade) |

View file

@ -0,0 +1,40 @@
---
title: "Get Started (Old 3DS - USA)"
permalink: /get-started-(old-3ds-usa).html
---
Select the appropriate page for your version from the chart below.
{: .notice--primary}
{% capture notice-1 %}
The first two columns of the chart refer to the last number of your version (which corresponds to the browser version installed to the system). If the version is -0 then you do not have a browser, while any number above -0 indicates a browser is installed.
The "from" and "to" fields are inclusive. This means that, for example, the "from 9.0.0 to 9.2.0" row includes 9.0.0, 9.1.0, and 9.2.0.
In the case of "5.0.0-0U" for example, you would follow the "No Browser" column and 5.0.0 to 5.1.0 row because the system is on the a system version in that range and has no browser installed.
{% endcapture %}
<div class="notice--info">{{ notice-1 | markdownify }}</div>
**For all versions you can [Cart Update](cart-update) to a higher version in the same column to follow its instructions instead.**
{: .notice--warning}
If you updated with a game cart containing the version 9.9.0 or above *(meaning that you have a version on 9.9.0 or above, but your browser is on -25 or lower, such as 10.2.0-24)*, your browser was removed and you will need to use the "No Browser" column.
{: .notice--warning}
The device version can be found at the bottom right of the top screen of the System Settings.
{: .notice--success}
| From | To | No Browser | Browser |
|:-:|:-:|:-:|:-:|
| 1.0.0 | 1.1.0 | [Cart Update](cart-update) | [Cart Update](cart-update) |
| 2.1.0 | 2.1.0 | [Cart Update](cart-update) | [Installing arm9loaderhax](installing-arm9loaderhax)|
| 2.2.0 | 3.0.0 | [Cart Update](cart-update) | [Cart Update](cart-update) |
| 4.0.0 | 4.5.0 | [Decrypt9 (MSET)](decrypt9-(mset)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 5.0.0 | 5.1.0 | [Cart Update](cart-update) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 6.0.0 | 6.3.0 | [Decrypt9 (MSET)](decrypt9-(mset)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 7.0.0 | 8.1.0 | [Cart Update](cart-update) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 9.0.0 | 9.2.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Decrypt9 (Browser)](decrypt9-(browser)) |
| 9.3.0 | 10.6.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) | [Homebrew Launcher (Browser)](homebrew-launcher-(browser)) |
| 10.7.0 | 10.7.0 | [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))| [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser))|
| 11.0.0 | 11.2.0 | [NFIRM Downgrade](nfirm-downgrade) | [NFIRM Downgrade](nfirm-downgrade) |

17
_pages/Get-Started.md Normal file
View file

@ -0,0 +1,17 @@
---
title: "Get Started"
permalink: /get-started.html
---
The colors of the devices in the image may vary, but note the button placement and features of each device carefully to ensure you select the correct one.
{: .notice}
Click the image of your device to take you to the appropriate page.
{: .notice--primary}
Different device models, versions, and regions will require different steps to achieve the end goal of arm9loaderhax Custom Firmware. The following series of pages will help you find where to start for your device.
{: .notice--info}
| New 3DS | Old 3DS or 2DS |
|:-:|:-:|
| [![New 3DS](images/new3ds.png)](get-started-(new-3ds)) <br><br> [![New 3DS XL](images/new3dsxl.png)](get-started-(new-3ds)) | [![Old 3DS](images/old3ds.png)](get-started-(old-3ds)) &nbsp;&nbsp; [![Old 3DS XL](images/old3dsxl.png)](get-started-(old-3ds)) <br><br> [![2DS](images/2ds.png)](get-started-(old-3ds)) |

View file

@ -0,0 +1,60 @@
---
title: "Hardmod Downgrade"
permalink: /hardmod-downgrade.html
---
The version of autofirm used in this guide was modified from [Reboot.ms](https://www.reboot.ms/forum/threads/2403/)'s autofirm which was modified from '[Raugo](https://gbatemp.net/members/356694/)'s original autofirm ([with permission](http://archive.is/KOrWp)).
{: .notice}
An excellent guide to getting a hardmod can be found [here](https://gbatemp.net/threads/414498/).
{: .notice--info}
This is a currently working implementation of the "FIRM partitions known-plaintext" exploit detailed [here](https://www.3dbrew.org/wiki/3DS_System_Flaws).
{: .notice--info}
This will work on New 3DS, Old 3DS, and 2DS.
{: .notice--success}
#### What you need
* Your NAND image extracted using your [hardmod](https://gbatemp.net/threads/414498/)
* The latest version of [autofirm](https://github.com/Plailect/autofirm/archive/master.zip)
* The latest release of [3DSident](https://github.com/joel16/3DSident/releases/latest)
* The NFIRM zip corresponding to your device and version:
+ [New 3DS 11.0.0 to 10.4.0](torrents/11.0.0_to_10.4.0_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:2d13a5ea1570f911bd5c6423e0c30e51d548837a"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS 11.0.0 to 10.4.0](torrents/11.0.0_to_10.4.0_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:72393bbd99bc285db84a9cabf39d9b3200058d6a"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
~
+ [New 3DS 11.1.0 to 10.4.0](torrents/11.1.0_to_10.4.0_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:d7d60c27c18f53bd8508a194656a465f6448bedf"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS 11.1.0 to 10.4.0](torrents/11.1.0_to_10.4.0_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:0caf9a948a2d8bf23606d641f6628e2baeb983bb"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
~
+ [New 3DS 11.2.0 to 10.4.0](torrents/11.2.0_to_10.4.0_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:881388a552a1ce9a963d391bf1a023642270991c"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS 11.2.0 to 10.4.0](torrents/11.2.0_to_10.4.0_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:a479e4ee55efbc18c181d426cd77a34815388151"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
#### Instructions_
##### Section I - NAND modification
1. Extract the autofirm zip to a folder called `autofirm`
2. Place a copy of your NAND backup (named `nand.bin`) in `/autofirm/` folder
3. Copy the contents of the NFIRM zip to the `/autofirm/source/firmwares/` folder
4. Run `autofirm.bat` and select which device and version the NAND backup is for
5. Wait while the script runs
6. If everything worked, then your original NAND will have been renamed to `backup_nand.bin` and you will have a modified `nand.bin` containing the 10.4.0 NATIVE_FIRM
7. Flash this `nand.bin` to your device with your hardmod
##### Section II - Exploit verification
1. Copy and merge the `3ds` folder from the 3DSident zip to your device's SD card
2. Reinsert your SD card into your 3DS
3. Use [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)) to launch the homebrew launcher on the device
4. Launch 3DSident
5. Verify that the following:
+ **Kernel version**: 2.50-11
+ **FIRM version**: 2.50-11
+ If either of these do not display the versions above, something has gone wrong and you should try again from the beginning
Your version number will *not* have changed in the settings.
{: .notice--info}
Continue to [Homebrew Launcher (No Browser)](homebrew-launcher-(no-browser)).
{: .notice--primary}

68
_pages/Home.md Normal file
View file

@ -0,0 +1,68 @@
---
layout: splash
permalink: /
header:
overlay_color: "#5e616c"
overlay_image: home-page-feature.jpg
overlay_filter: 0.5
cta_label: "Get Started"
cta_url: "/get-started"
caption:
excerpt: 'A complete guide to 3DS custom firmware, <br /> from stock to arm9loaderhax.<br />'
---
**This guide needs *your* help to seed [these](https://github.com/Plailect/Guide/archive/master.zip) ([rss](https://plailect.github.io/Guide/rss.xml)) torrents!**
{: .notice--info}
**To use the [torrent](https://en.wikipedia.org/wiki/Torrent_file) files in this guide, you will need a torrent client like [Transmission](https://sourceforge.net/projects/trqtw/files/latest/download)**
{: .notice--info}
**Read all of the introductory pages before proceeding.**
{: .notice--warning}
## What is Homebrew?
[**Homebrew**](https://en.wikipedia.org/wiki/List_of_homebrew_video_games) usually refers to software that is not authorized by Nintendo. It allows you to run homebrew games, tools like save editing and backup, and emulators for various older systems.
In most cases, running homebrew on your console is 100% free using just the Internet Browser. There are also various other exploits in commercial games to get homebrew running.
## What is Custom Firmware?
**Custom Firmware** ("CFW") enables you to use more advanced hacks that userland homebrew can't easily do. For instance, signature patches let you install unsigned titles that appear right on your HOME Menu.
CFW can be easily set up on any console that is on 9.2.0-20 or lower. Other versions can be downgraded, most for free or with just an exploit game.
## What does this guide install?
This guide has the end goal of taking a completely unmodified 3DS from stock
firmware to arm9loaderhax powered Custom Firmware. On some versions, it utilizes homebrew as a jumping off point, but Custom Firmware is still the goal.
Arm9loaderhax is the newest and best method of launching Custom Firmware that gives us nearly full control of the system only milliseconds into boot, which is similar to the effect of BootMii for the Wii.
The benefits of arm9loaderhax over other Custom Firmware launch methods are numerous, and as such it is recommended to use this guide over any other that relies on outdated software (such as menuhax or rxTools).
## What can I do with Custom Firmware?
+ Play all game cards and eShop games, regardless of region
+ Customize your HOME Menu with user-created [themes](https://3dsthem.es/) and [badges](https://badges.3dsthem.es/)
+ Use "ROM hacks" for games that you own
+ Take gameplay and application screenshots
+ [Backup, edit, and restore](https://gbatemp.net/threads/release-jks-savemanager-homebrew-cia-save-manager.413143/) saves for many games
+ Play games for older systems with various emulators, using RetroArch or other standalone emulators. (Works best with a New Nintendo 3DS)
+ Install homebrew titles to your system, and have them appear on your HOME Menu
+ Dump your game cards to a format you can install, and play them without needing the card
+ New 3DS only: stream live gameplay to your PC wirelessly with NTR CFW
+ Run many old Nintendo DS flash carts that were blocked long ago or never worked on Nintendo 3DS
+ Safely update to the latest system version without fear of losing access to homebrew
## What do I need to know before starting?
+ **Before beginning the guide, you must know the risks of 3DS hacking: EVERY time you modify your system, there is always the potential for an UNRECOVERABLE brick. They're rare, but still a possibility so make sure you follow ALL directions EXACTLY.**
+ If you have already hacked your 3DS before to get an EmuNAND setup, and would like to move the contents of your previous EmuNAND to your new SysNAND CFW, you should follow all instructions and restore your existing EmuNAND when prompted once you reach [Installing arm9loaderhax](installing-arm9loaderhax).
+ This guide will work on New 3DS, Old 3DS, and 2DS in all regions on firmware 11.2.0 or below *(except CHN / TWN on both New 3DS and Old 3DS, and KOR New 3DS)*.
+ If everything goes according to plan, you will lose no data and end up with everything that you started with (games, NNID, saves, etc will be preserved).
+ A large part of this guide is lengthy NAND dumps and downgrades, so the entire process can take *several* hours thanks to the 3DS's slow processor.
+ **Keep the device plugged in and charged throughout the entire process to avoid data loss or damage from an unexpected power-off!**
+ Your SD card should be [MBR, not GPT](http://www.howtogeek.com/245610/) (the SD card that comes with the device will be MBR by default).
+ If you need to format a brand new SD card, you can use [`guiformat`](torrents/guiformat.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:e7c03f28a16790e64a2d67c5554441ea4e969fcf"><i class="fa fa-magnet" aria-hidden="true"></i></a></code> and set to an Allocation Unit Size of 32K.
+ The 2DS is essentially identical to the Old 3DS in terms of software, and that any steps which say "Old 3DS" also apply to 2DS.

View file

@ -0,0 +1,53 @@
---
title: "Homebrew Launcher (Browser)"
permalink: /homebrew-launcher-(browser).html
---
**9.0.0 - 9.8.0**: Skip changing the date and time and initializing savedata in the beginning.
{: .notice--primary}
The Homebrew Launcher has many different entrypoints, or methods of launching. The most common is browserhax, which launches the Homebrew Launcher using nothing more than the included browser. This can then be used to install menuhax, which lets you hold a button while the console is booting up to launch the Homebrew Launcher before the rest of the system starts.
{: .notice--info}
**Browserhax will work for EUR / JPN / USA / KOR regions ONLY!**
{: .notice--warning}
#### What you need
+ The Homebrew [Starter Kit](http://smealum.github.io/ninjhax2/starter.zip)
+ The latest release of [Decrypt9WIP](https://github.com/d0k3/Decrypt9WIP/releases/latest)
+ An internet connection setup on your 3DS
#### Instructions
1. Copy _the contents of_ the `starter.zip` to the root of your SD card
3. Reinsert your SD card into your 3DS
2. Open the theme menu, change your theme to any other theme, then switch back. This will initialize the theme data and is required
3. Launch the Settings application
4. Change the date to `January 1, 2000`
5. Change the time to `00:00`
6. Launch the browser, then open the browser settings as fast as possible
7. Scroll to the bottom and Initialize Savedata (it also may be called Clear All Save Data) as fast as possible
8. Navigate to `http://yls8.mtheall.com/3dsbrowserhax_auto.php`
+ You can also load the page by scanning the following QR code (press (L + R) on the home menu, then tap the QR icon on the bottom screen)
![browserhax_auto](https://yls8.mtheall.com/3dsbrowserhax_auto_qrcode.png)
+ If you get an error, [follow this troubleshooting guide](troubleshooting#ts_browser)
9. Your console should load the homebrew menu
10. Open the menuhax_manager application
11. Press (A) to install, it may show some errors but that's fine as long as it shows "Install finished successfully" towards the end
+ If you are prompted to "override the detected system version," press (B) to decline
12. Go back to the main menuhax_manager menu, then select "Configure menuhax"
13. Press (A) to continue, then select "Type1"
14. Hold (Down) on the D-Pad, then tap the touch screen; this is the recommended button to use for launching menuhax in this guide because it does not interfere with any other functions of tools we will be using
15. Go back to the main menuhax_manager menu, then press (Start) to exit back into the Homebrew Launcher
16. Press the (Start) button then press (A) to reboot
17. You can now hold D-Pad (Down) while the system is booting to launch the Homebrew Launcher
You can now launch the Homebrew Launcher by holding D-Pad (Down) while the system is booting
{: .notice--info}
If you are above the version 9.2.0, continue to [9.2.0 Downgrade](9.2.0-downgrade)
{: .notice--primary}
If you are on the version 9.2.0 or below, continue to [Decrypt9 (Homebrew Launcher)](decrypt9-(homebrew-launcher))
{: .notice--primary}

View file

@ -0,0 +1,55 @@
---
title: "Homebrew Launcher (No Browser)"
permalink: /homebrew-launcher-(no-browser).html
---
The Homebrew Launcher has many different entrypoints, or methods of launching. The most common is browserhax, but for devices that can't use it, this page has many alternative options.
{: .notice}
If you do not already own any of these games and do not have another 3DS that can access the Homebrew Launcher, the cheapest option is to buy a "Nintendo Selects" copy of Ocarina of Time 3D (ensure you get the correct cartridge for your region) and a [Powersaves](https://www.amazon.com/dp/B00IVJ1M7M) (compatible with all regions), then use oot3dhax from the chart below.
{: .notice--info}
#### What you need
+ The Homebrew [Starter Kit](http://smealum.github.io/ninjhax2/starter.zip)
+ The latest release of [Decrypt9WIP](https://github.com/d0k3/Decrypt9WIP/releases/latest)
#### Instructions
1. Copy _the contents of_ the `starter.zip` to the root of your SD card
2. Create a folder named `files9` on the root of your SD card if it does not already exist
3. Copy the `Decrypt9WIP` folder from the Decrypt9WIP zip to `/3ds/` on your SD card
4. Reinsert your SD card into your 3DS
5. Use one of the following alternate entrypoints to get into the homebrew launcher:
| <sub> | <sub>Requires | <sub>Editions | <sub>Devices | <sub>Regions | <sub>Game Versions | <sub>System Versions |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| <sub>[oot3dhax](https://github.com/yellows8/oot3dhax) | <sub>[*Ocarina of Time 3D*](https://amzn.to/2fkaKdp), <br> Either a powersaves or another 3DS which already has the Homebrew Launcher | <sub>Cart | <sub>New, Old, 2DS | <sub>EUR, JPN, USA | <sub>All | <sub>9.0.0-X up to and including 11.1.0-X |
| <sub>[smashbroshax](https://gbatemp.net/threads/397194/) | <sub>[*Super Smash Bros*](https://amzn.to/2ftGA72) | <sub>Cart, eShop | <sub>New | <sub>EUR, JPN, USA | <sub><1.1.3, <br> Carts with "amiibo" on the cover are preinstalled with v1.1.4 | <sub>9.0.0-X up to and including 11.1.0-X |
| <sub>[supermysterychunkhax](https://smd.salthax.org/) | <sub>[*Pokemon Super Mystery Dungeon*](https://amzn.to/2ebxZ75), <br> Another 3DS which already has the Homebrew Launcher | <sub>Cart | <sub>New, Old, 2DS | <sub>EUR, JPN, USA | <sub>All | <sub>9.9.0-X (USA/JPN) / 10.2.0-X (EUR) up to and including 11.0.0-X |
| <sub>[freakyhax](http://plutooo.github.io/freakyhax/) | <sub>[*Freakyforms Deluxe*](https://amzn.to/2f6eHO7) | <sub>eShop, Cart | <sub>New, Old, 2DS | <sub>EUR, JPN, USA | <sub>All | <sub>9.0.0-X up to and including 11.1.0-X |
| <sub>[basehaxx](http://mrnbayoh.github.io/basehaxx/) | <sub>*Pokemon [Omega Ruby](https://amzn.to/2eRILNQ)/[Alpha Sapphire](https://amzn.to/2ebGrmN)*, <br> Another 3DS which already has the Homebrew Launcher | <sub>Cart | <sub>New, Old, 2DS | <sub>EUR, JPN, USA | <sub>1.0, 1.4 | <sub>9.0.0-X up to and including 11.0.0-X |
| <sub>[BASICSploit](https://mrnbayoh.github.io/basicsploit/) | <sub>[*SmileBASIC*](https://www.nintendo.com/games/detail/eYURHNjVdfyrnA3OJGfmlMYIrJUzgOcv) | <sub>eShop | <sub>New, Old, 2DS | <sub>USA | <sub>3.2.1 | <sub>9.0.0-X up to and including 11.0.0-X |
| <sub>[smilehax](https://plutooo.github.io/smilehax/) | <sub>[*SmileBASIC*](https://www.nintendo.com/games/detail/eYURHNjVdfyrnA3OJGfmlMYIrJUzgOcv) | <sub>eShop | <sub>New, Old, 2DS | <sub>JPN, USA | <sub>3.3.1 | <sub>9.0.0-X up to and including 11.0.0-X |
| <sub>[stickerhax](https://github.com/yellows8/stickerhax) | <sub>[*Paper Mario: Sticker Star*](https://amzn.to/2f6aDx8), <br> Another 3DS which already has the Homebrew Launcher | <sub>eShop, Cart | <sub>New, Old, 2DS | <sub>EUR, JPN, KOR, USA | <sub>All | <sub>9.0.0-X up to and including 11.1.0-X |
| <sub>[Ninjhax 2](http://smealum.github.io/ninjhax2/) | <sub>[*Cubic Ninja*](https://amzn.to/2eRI1by) | <sub>eShop, Cart | <sub>New, Old, 2DS | <sub>EUR, JPN, USA | <sub>All | <sub>9.0.0-X up to and including 11.1.0-X |
<script type="text/javascript">
amzn_assoc_placement = "adunit0";
amzn_assoc_tracking_id = "plailect-20";
amzn_assoc_ad_mode = "manual";
amzn_assoc_ad_type = "smart";
amzn_assoc_marketplace = "amazon";
amzn_assoc_region = "US";
amzn_assoc_title = "3DS Homebrew Launcher";
amzn_assoc_linkid = "718ad647bc3d1b8f8c44b3a1f34bc235";
amzn_assoc_search_bar = "false";
amzn_assoc_asins = "B01AC3ZDCE,B00DD0B1R0,B00YC7DZP4,B00IVJ1M7M,B008YYSBR8,B004SG211I,B00KI2OZ9M,B00K848IH0";
</script>
<script src="//z-na.amazon-adsystem.com/widgets/onejs?MarketPlace=US"></script>
If you are above the version 9.2.0, continue to [9.2.0 Downgrade](9.2.0-downgrade)
{: .notice--primary}
If you are on the version 9.2.0 or below, continue to [Decrypt9 (Homebrew Launcher)](decrypt9-(homebrew-launcher))
{: .notice--primary}

View file

@ -0,0 +1,223 @@
---
title: "Installing arm9loaderhax"
permalink: /installing-arm9loaderhax.html
---
The final Step of this guide is to install arm9loaderhax and setup Luma3DS to run just milliseconds into the boot. This is accomplished by using SafeA9LHInstaller by [AuroraWright](https://github.com/AuroraWright/).
{: .notice}
This will install [AuroraWright's Fork](https://github.com/AuroraWright/arm9loaderhax) of arm9loaderhax.
{: .notice--info}
We will also setup the ability to launch payloads from arm9loaderhax, giving us the ability to unbrick our SysNAND from situations that would normally brick us by restoring from backup.
{: .notice--info}
**You cannot use another console's OTP or you will brick GUARANTEED.**
{: .notice--danger}
#### Overview of steps
In this section, we will go through the process that all the other steps have led up to: actually installing arm9loaderhax.
This is nearly the best possible kind of device exploit because it is permanently installable into the NAND firm partitions, and runs before most of the OS loads, allowing it to not only work on *all* versions once installed, but also protect itself and recover from most situations that would brick a non-A9LH 3DS such as a nonfunctional home menu or bad title install.
The file `arm9loaderhax.bin` is what is launched by arm9loaderhax itself after it finishes loading off of NAND, and can be any valid arm9 payload. This file can be replaced at any time, although Luma3DS allows for the launch of other arm9 payloads by holding buttons on boot.
In this case, we use Luma3DS by [AuroraWright](https://github.com/AuroraWright/) to boot a patched SysNAND directly, allowing us to completely bypass the need for any kind of EmuNAND, vastly simplifying the usage of a hacked 3DS in addition to saving SD card space.
Once arm9loaderhax is installed and Luma3DS is setup with the correct options, we then restore our previous backup.
During this process, we also setup programs such as the following:
+ **FBI** *(installs CIA formatted games and applications)*
+ **Luma3DS Updater** *(updates our CFW installation easily)*
+ **Hourglass9** *(multipurpose tool which can do NAND and cartridge functions)*
#### What you need
* [`aeskeydb.bin`](torrents/aeskeydb.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:18b3a17f78e2376e05feaa150749d9fd689b25dc"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* [`data_input_v3.zip`](torrents/data_input_v3.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:a1195c9f7ab650fa7c7bf020b51fc19ea8d9440c"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* [`fbi-2.4.2-injectable.zip`](torrents/fbi-2.4.2-injectable.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:f978b4cf5eda72823240b9c649f3fd2940a9f525"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* The release of SafeA9LHInstaller corresponding to your device:
+ New 3DS Compatible [Release](https://github.com/AuroraWright/SafeA9LHInstaller/releases/tag/v2.5.1)
+ Old 3DS or 2DS Compatible [Release](https://github.com/AuroraWright/SafeA9LHInstaller/releases/tag/v2.0.3)
* The latest release of [arm9loaderhax](https://github.com/AuroraWright/arm9loaderhax/releases/latest)
* The latest release of [Luma3DS](https://github.com/AuroraWright/Luma3DS/releases/latest)
* The latest release of [hblauncher_loader](https://github.com/yellows8/hblauncher_loader/releases/latest)
* The latest release of [Hourglass9](https://github.com/d0k3/Hourglass9/releases/latest)
* The latest release of [Luma3DS Updater](https://github.com/Hamcha/lumaupdate/releases/latest)
* The latest release of [DspDump](https://github.com/Cruel/DspDump/releases/latest)
* The latest release of [FBI](https://github.com/Steveice10/FBI/releases/)
* The Homebrew [Starter Kit](http://smealum.github.io/ninjhax2/starter.zip)
#### Instructions
##### Section I - Prep work
{% capture notice-5 %}
Ensure you are using an SD card that is not corrupted!
If you use a corrupted SD card without fixing it, you may BRICK!
If you think your SD card may be corrupted, backup every file on your SD card to a folder on your computer, format it, then copy your files back to the SD card.
{% endcapture %}
<div class="notice--danger">{{ notice-5 | markdownify }}</div>
1. **If it exists, copy the `/files9/` folder on your SD card to a safe location on your computer and back it up to multiple locations (such as online file storage); the files inside could save you from total data loss if you break your system**
2. Create a folder named `cias` on the root of your SD card if it does not already exist
4. **Delete the `a9lh` folder from the root of your SD card if it exists**
+ **If you accidentally install arm9loaderhax using another device's `OTP.bin`, you will BRICK!**
3. Delete the `3ds` folder from the root of your SD card if it exists
4. **Copy _the contents of_ the `starter.zip` to the root of your SD card**
+ This will include a brand new `3ds` folder to replace the one you just deleted
5. Copy _the contents of_ the SafeA9LHInstaller zip to the root of your SD card
6. Copy the `a9lh` folder from `data_input_v3.zip` to the root of your SD Card
7. Copy _the contents of_ the arm9loaderhax release zip to `a9lh` folder on your SD card
9. Copy `hblauncher_loader.cia` from the hblauncher_loader zip to the `/cias/` folder on your SD card
10. Copy `lumaupdater.cia` from the Luma3DS Updater zip to the `/cias/` folder on your SD card
11. Copy `FBI.cia` from the FBI zip to the `/cias/` folder on your SD card
12. **Copy `arm9loaderhax.bin` from the Luma3DS zip to the root of your SD card, overwrite existing files**
13. Create a folder named `luma` on the root of your SD card
14. Create a folder named `payloads` in the `luma` folder on your SD card
15. Copy `Hourglass9.bin` from the Hourglass9 zip to the `/luma/payloads/` folder on your SD card and rename `Hourglass9.bin` to `start_Hourglass9.bin`
16. Copy `aeskeydb.bin` to the `/files9/` folder on your SD card
17. Copy `DspDump.3dsx` to the `/3ds/` folder on your SD card
18. Copy _the contents of_ `fbi-2.4.2-injectable.zip` to the `/files9/` folder on your SD card
19. Clear Home Menu's extdata by navigating to the following folder on your SD card: `/Nintendo 3DS/(32 Character ID)/(32 Character ID)/extdata/00000000/`
+ EUR Region: Delete `00000098`
+ JPN Region: Delete `00000082`
+ USA Region: Delete `0000008f`
+ CHN Region: Delete `000000A1`
+ KOR Region: Delete `000000A9`
+ TWN Region: Delete `000000B1`
##### Section II - Installing arm9loaderhax
1. Reinsert your SD card into your 3DS
2. Do the steps for installing arm9loaderhax on your device:
+ Old 3DS
+ You should be on 2.1.0
+ Go to `http://dukesrg.github.io/2xrsa.html?arm11.bin` on your 3DS
+ If you get an error, [follow this troubleshooting guide](troubleshooting#ts_browser)
+ If you get a glitched screen, [follow this troubleshooting guide](troubleshooting#ts_safe_a9lh_screen)
+ Press (Select) to Full Install
+ The installer will now install arm9loaderhax on your device (this is very fast)
+ Shut down your console, hold the power button until it turns off if necessary
+ Copy your console specific `OTP.bin` from the `/a9lh/` folder on your SD card to a safe location on your computer and back it up to multiple locations (such as online file storage), then reinsert your SD card into your 3DS
+ New 3DS
+ Get into the homebrew launcher through the entrypoint of your choice
+ Launch SafeA9LHInstaller
+ If you get a glitched screen, [follow this troubleshooting guide](troubleshooting#ts_safe_a9lh_screen)
+ Press (Select) to Full Install
+ The installer will now install arm9loaderhax on your device (this is very fast)
+ Shut down your console, hold the power button until it turns off if necessary
##### Section III - Configuring Luma3DS
1. Hold select on boot to enter the Luma3DS menu
+ Make sure to start holding the button before pressing power
+ If you get a black screen, [follow this troubleshooting guide](troubleshooting#ts_sys_a9lh)
+ If you boot to SafeA9LHInstaller, [follow this troubleshooting guide](troubleshooting#ts_safe_a9lh)
2. Use the (A) button and the D-Pad to turn on the following:
+ **"Autoboot SysNAND"**
+ **"Use SysNAND FIRM if booting with R (A9LH)"**
+ **"Show NAND or user string in System Settings"**
+ **"Show GBA boot screen in patched AGB_FIRM"**
+ This may cause crashes for some injected GBA Virtual Consoles
+ If some games do not work properly, disable this option and try again
3. If you are using a **New 3DS**, you should *also* enable the following:
+ **"New 3DS CPU" to "Clock+L2(x)"**
+ This will increase the framerate of many games, but may cause instability in others
+ If some games do not work properly, disable this option and try again
4. Press Start to save and reboot
+ If it freezes, hold the power button until it shuts down, then continue with the instructions
+ If you get a black screen, [follow this troubleshooting guide](troubleshooting#ts_sys_a9lh)
4. **If, before following this guide, you already had an EmuNAND setup and would like to move the contents of your previous EmuNAND to your new SysNAND CFW, now is the time to [follow Move EmuNAND](move-emunand).**
10. Update your 3DS again by going to System Settings, then "Other Settings", then going all the way to the right and using "System Update"
+ **Yes this is safe, stop asking about it.**
+ If this gives you an error, set your DNS settings to "auto"
+ If this still gives you an error, restore your NAND backup before updating
+ Copy `NANDmin.bin` to the `/files9/` folder on your SD card
+ If your backup is of a version between 4.0.0 and 4.5.0, put [`firmware.bin`](https://plailect.github.io/Guide/torrents/o3ds_firmware.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:0323ffe6f1df5986517baef2211a3e98634e34ec"><i class="fa fa-magnet" aria-hidden="true"></i></a></code> in `/luma/` (delete this file after updating your 3DS)
+ Open Hourglass9 from arm9loaderhax by holding (Start) on boot
+ Go to "SysNAND Backup/Restore"
+ Restore from `NANDmin.bin`
+ Press (Start) to reboot
+ If you don't have your NAND backup or it doesn't work, [follow 9.2.0 ctrtransfer](9.2.0-ctrtransfer) before updating
##### Section IV - Injecting FBI
1. Open Hourglass9 from arm9loaderhax by holding (Start) on boot
2. Go to "SysNAND Backup/Restore", then select the "Health&Safety Dump" option to dump Health & Safety to `hs.app` **(you can use Up and Down / Left and Right to change the name)**
3. Press (B), then select the "Health&Safety Inject" option
8. Select the FBI injectable `.app` for your region
4. Press (A) and confirm to inject
9. Press (Start) to reboot
10. If you still launch to the stock Health & Safety app and have downgraded with Gateway in the past, [follow this troubleshooting guide](troubleshooting#gw_fbi)
##### Section V - Finalizing setup
2. Open Health and Safety (which is now FBI)
3. Select "SD"
4. Select "cias"
5. Navigate to `FBI.cia` and press (A) to install
6. Navigate to `hblauncher_loader.cia` and press (A) to install
7. Navigate to `lumaupdater.cia` and press (A) to install
8. Exit with the home button
9. Launch the Homebrew Launcher from the home menu
10. Select "DSP Dump"
11. Press (Start) when prompted to exit
12. Reboot while holding Start to launch Hourglass9
13. Go to "SysNAND Backup/Restore", then select "Health&Safety Inject"
14. Select `hs.app` (the original one that doesn't contain FBI), then press (A) and confirm to inject
15. Press (Start) on the main menu to reboot!
16. **If DSi / DS functionality has broken (such as DS carts or DSiWare no longer working), [follow this troubleshooting guide](troubleshooting#twl_broken)**
___
You can now use Luma3DS Updater to update your Luma3DS to the latest version just by opening it and pressing (A). *(This is not the same thing as a System Update; it just downloads and extracts the newest Luma3DS files)*
{: .notice--info}
{% capture notice-6 %}
You will no longer be able to boot without the SD card in, that is normal.
You will now boot a Custom Firmware based SysNAND by default.
You can now hold (Select) on boot to launch the Luma3DS configuration menu.
You can now hold (Start) on boot to launch Hourglass9, an arm9loaderhax safe multipurpose NAND and cartridge tool.
{% endcapture %}
<div class="notice--info">{{ notice-6 | markdownify }}</div>
You can update your arm9loaderhax installation in the future by following the instructions on the [Updating A9LH](updating-a9lh) page.
{: .notice--info}
To use [NTR CFW](https://github.com/44670/BootNTR/), get `ntr.bin` from the appropriate zip on [this](https://github.com/44670/BootNTR/releases) page and copy it to the root of your SD card, then install `BootNTR.cia` from [this](https://github.com/astronautlevel2/BootNTR/releases/latest) page.
{: .notice--info}
Keep your `NANDmin.bin` file, it can be restored by Hourglass9 to save you from a brick in the future.
{: .notice--info}
You can remove your NAND backups from `/files9/` as long as you still have them backed up to a safe location.
{: .notice--info}
{% capture notice-7 %}
**You can remove any extra files and folders from the root of the SD card that are *not* in the following list:**
| **Files and folders to keep on your SD card:** |
|:----------------------------------------------:|
| `3ds` |
| `files9` |
| `hblauncherloader` |
| `luma` |
| `Nintendo 3DS` |
| `arm9loaderhax.bin` |
| `boot.3dsx` |
{% endcapture %}
<div class="notice--info">{{ notice-7 | markdownify }}</div>
For information on changing your device to another region, check out the [Region Changing](region-changing) page.
{: .notice--success}
For information on keeping your A9LH installation up to date, check out the [Updating A9LH](updating-a9lh) page.
{: .notice--success}

41
_pages/Move-EmuNAND.md Normal file
View file

@ -0,0 +1,41 @@
---
title: "Move EmuNAND"
permalink: /move-emunand.html
---
This is add-on section for moving the contents of a previous EmuNAND to your new SysNAND CFW, then removing the old EmuNAND partition. Note that the terms EmuNAND and RedNAND refer to slightly different implementations of [the same concept](http://3dbrew.org/wiki/NAND_Redirection).
{: .notice--info}
You will LOSE your GBA VC and DSiWare saves!
{: .notice--danger}
**You MUST have already installed arm9loaderhax + Luma3DS to use this.**
{: .notice--danger}
#### What you need
* An existing EmuNAND
* The latest release of [EmuNAND9](https://github.com/d0k3/EmuNAND9/releases/latest)
#### Instructions
1. Copy `EmuNAND9.bin` from the EmuNAND9 zip to the `/luma/payloads/` folder on your SD card and rename `EmuNAND9.bin` to `y_EmuNAND9.bin`
2. Reinsert your SD card into your 3DS
3. Open Hourglass9 from arm9loaderhax by holding (Start) on boot
4. Go to "EmuNAND Backup/Restore", then select the "EmuNAND Backup" option to backup your EmuNAND to `NAND_emu.bin`
5. Press (B) to get back to the main menu
6. Go to "SysNAND Backup/Restore", then select the "SysNAND Restore (keep a9lh)" option to restore your SysNAND from `NAND_emu.bin`
7. Press (Select) to eject your SD card
8. Put your SD card in your computer, then copy `NAND_emu.bin` and `NAND_emu.bin.sha` from the `/files9/` folder on your SD card to a safe location; make backups in multiple locations; this backup will save you from a brick if anything goes wrong in the future **(Your backup should match one of the sizes on [this](nand-size) page; if it does not, you should delete it and make a new one!)**
9. Delete `NAND_emu.bin` from the `/files9/` folder on your SD card after copying it
10. **Backup every file on your SD card to a folder on your computer, all files will be deleted in the next step**
11. Reinsert your SD card into your 3DS
12. Press (Start) to reboot while holding (Y) to open EmuNAND9
13. Go to "SD Format Options", then "Format SD..."
14. Select the "Format SD (No EmuNAND)" option
15. Press Select on the main menu to eject your SD card
16. Put your SD card in your computer, then copy all your files back into it
18. Reinsert your SD card into your 3DS and boot
19. If you get a black screen, [follow this troubleshooting guide](troubleshooting#ts_sys_down)
Return to [Installing arm9loaderhax](installing-arm9loaderhax).

52
_pages/NAND-Size.md Normal file
View file

@ -0,0 +1,52 @@
---
title: "NAND Size"
permalink: /nand-size.html
---
A valid NAND backup should be one of the following sizes in most situations.
{: .notice--primary}
Occasionally, you will get a backup with a different size than one of these listed. It is fine for a backup to be larger than expected, just ensure that it is never *smaller* than the sizes listed.
{: .notice--info}
Note that a *min size* NAND will always be the smallest possible size for the purpose of saving space, and may not match the size of other NAND backups from your device. This is fine, just make sure that it matches one of the sizes on this page.
{: .notice--info}
The brand name refers to the manufacturer of the NAND chip in your device, **not** your SD card.
{: .notice--warning}
**Your backup should match one of the sizes on this page; if it does not, you should delete it and make a new one!**
{: .notice--danger}
## 2DS:
+ Toshiba NAND:
988.807.168 bytes = 943 MiB
+ Toshiba NAND:
1.979.711.488 bytes = 1.84 GiB
+ Samsung NAND:
1.000.341.504 bytes = 954 MiB
+ Samsung NAND:
1.300.234.240 bytes = 1.21 GiB
## Old 3DS:
+ Toshiba NAND:
988.807.168 bytes = 943 MiB
+ Samsung NAND:
1.000.341.504 bytes = 954 MiB
## New 3DS:
+ Toshiba NAND:
1.979.711.488 bytes = 1.84 GiB
+ Samsung NAND:
1.300.234.240 bytes = 1.21 GiB
+ Samsung NAND:
1.954.545.664 bytes = 1.82 GiB

18
_pages/NFIRM-Downgrade.md Normal file
View file

@ -0,0 +1,18 @@
---
title: "NFIRM Downgrade"
permalink: /nfirm-downgrade.html
---
If you are between 11.0.0 and 11.2.0, you must follow this guide to downgrade your NFIRM using one of the methods at the bottom of this page to directly dump and restore your NAND.
{: .notice--info}
Both of these are working implementation of the "FIRM partitions known-plaintext" exploit detailed [here](https://www.3dbrew.org/wiki/3DS_System_Flaws).
{: .notice--info}
This will work on New 3DS, Old 3DS, and 2DS (although the DSiWare method has some restrictions).
{: .notice--success}
---
+ Use [this](hardmod-downgrade) link to downgrade your NFIRM with a [hardmod](https://gbatemp.net/threads/414498/)
+ Use [this](dsiware-downgrade) link to downgrade your NFIRM with DSiWare and a second 3DS (which already has CFW)

View file

@ -0,0 +1,63 @@
---
title: "NTR and Cubic Ninja"
permalink: /ntr-and-cubic-ninja.html
---
**NTR Cubic Ninja will work for JPN New 3DS ONLY!**
{: .notice--warning}
#### What you need
* [JPN Cubic Ninja](https://www.amazon.com/dp/B004QL7M0A)
* The Homebrew [Starter Kit](http://smealum.github.io/ninjhax2/starter.zip)
* The latest release of [Decrypt9WIP9](https://github.com/d0k3/Decrypt9WIP/releases/latest)
* [`3ds-private-update-server.zip`](torrents/3ds-private-update-server.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:8623e580752f22940d96630ef723ce30a707b22e"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* [WAMPSERVER (PHP 5.5) 2.5](http://www.wampserver.com/en/#download-wrapper)
* [`node.exe`](http://nodejs.org/dist/latest/win-x86/node.exe)
* [`update.php`](torrents/update.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:cd7e59ea9744115913b561dbde15f8d68e713507"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* The v3.2 release of [NTR CFW](https://github.com/44670/BootNTR/releases/tag/3.2)
* The latest release of [NTR Debugger](torrents/NTR%20Debugger.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:66274cee542bef7745792714673bf2be4d606496"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* The 9.2.0 downgrade pack zip file for your device and region:
+ [New 3DS 9.2.0 - JPN](torrents/9.2.0-20J(Full)_n3DS.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:c8630ed31b53637b9023bd4dc1ce38362bb8ecd9"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
#### Instructions
##### Section I - Prep Work
1. Install WAMP to the default directory
2. Copy the contents of `3ds-private-update-server.zip` to `C:\wamp\www\` (overwrite existing files)
3. Copy `update.php` to `C:\wamp\www\` (overwrite existing files)
4. Copy the `updates` folder from the 9.2.0 downgrade zip to `C:\wamp\www\`
5. Move `node.exe` to `C:\wamp\www\updates`
6. Move `C:\wamp\www\CdnCiaUnpack.js` to `C:\wamp\www\updates`
7. In the `C:\wamp\www\updates` directory, drag `CdnCiaUnpack.js` onto `node.exe` to create `GetSystemUpdate.partial.xml`
8. Move `node.exe` and `CdnCiaUnpack.js` back to `C:\wamp\www\`
9. Copy `GetSystemUpdate.partial.xml` to `C:\wamp\www\` (so that a copy of it exists in both `C:\wamp\www\updates` and `C:\wamp\www\`)
9. Click the WAMP icon in your system tray, then click "Put Online"
10. Use the command "ipconfig" in CMD to get your computer's IPv4 Address, you will need it soon
11. Copy `ntr.bin` to the root of your SD card
12. Create a folder named `files9` on the root of your SD card if it does not already exist
1. Copy _the contents of_ the `starter.zip` to the root of your SD card, then put the SD card back into your 3DS
2. Copy the `Decrypt9WIP` folder from the Decrypt9WIP zip to `/3ds/` on your SD card
##### Section II - Updating
1. Boot your 3DS into recovery mode by holding L+R+A+UP while powering on
2. Decline the update and reboot
3. Open Cubic Ninja (if it already has NinjHax installed, hold L+R+X+Y to reset it)
4. Select "Create", then "QR Code", then "Scan QR Code"
5. Scan the QR code in the NTR CFW zip for your region
6. On the home menu, press (Y) and (X) at the same time to open NTR's menu
7. Enable the debugger and close the menu
8. Use your router's web page to get your 3DS's IP address (google it if you don't know how, all routers are different)
9. Run NTR Debugger on your computer
10. Enter the following commands (replace 192.168.1.100 with your 3DS's IP address and 192.168.1.200 with your computer's IP address)
+ `connect("192.168.1.100", 8000)`
+ `write(0x15E424, tuple(map(ord, "http://192.168.1.200/update.php\0")), pid=0x25)`
+ `write(0x15E0EC, tuple(map(ord, "http://192.168.1.200/update.php\0")), pid=0x25)`
+ `write(0x15E463, tuple(map(ord, "http://192.168.1.200/update.php\0")), pid=0x25)`
11. Update your 3DS by going to System Settings, then "Other Settings", then going all the way to the right and using "System Update"
___
Continue to [Installing arm9loaderhax](installing-arm9loaderhax).

18
_pages/OTP-Info.md Normal file
View file

@ -0,0 +1,18 @@
---
title: "OTP Info"
permalink: /otp-info.html
---
The OTP is a 0x100 byte region of seemingly random data at address 0x10012000. It is presumed that console unique keys are derived from this region, although it is currently unknown exactly how. The region is likely the console unique data store which is decrypted by the bootrom, but we don't know how that is done until somebody dumps the full protected bootrom. It is unknown at this time if anyone has successfully dumped the protected bootrom.
Prior to version 3.0.0-X, the 0x10012000-region (the OTP) was left unprotected and could be dumped by an attacker with sufficient permissions (arm9 code execution).
After version 3.0.0-X, Nintendo switched to locking this region using the register CFG_SYSPROT9, which also locks the bootloader and is set extremely early in boot, long before we are able to gain code execution. This register can be set exactly once, and cannot be switched off until the unit is fully powered off, and therefore it is impossible to dump the full OTP without a version below 3.0.0-X.
There is, however, a method to dump the hash of the OTP on version 9.6.0-X. Because Kernel9Loader does not clear the SHA_HASH register after it has been used, dumping the SHA_HASH will give the hash of the OTP which was handed over to Kernel9 from Kernel9Loader. In addition, there is a long standing vulnerability where an MCU reboot caused by the i2c will not clear RAM like it's supposed to.
This allows for a hardware based attack where arbitrary data is written to nand_sector96+0x10 in a SysNAND backup and flashed to the device. Afterwards we wire the i2c to MCU reboot on our command, write a payload (which will write 0x1000A040 - 0x1000A060 to a file on the SD card) to arm9 memory somewhere, fill all memory with a NOP sled followed by a JMP instruction pointing to the payload. We can then MCU reboot repeatedly (incrementing nand_sector96+0x10 by 1 each time) until the Kernel9Loader jumps to the payload by random chance.
Because of the complexity and extra hardware involved in the method described above, I have decided to limit the scope of this guide strictly to the software based approach of downgrading to a version below 3.0.0-X. Version 2.1.0-X was selected because it is the only version below 3.0.0-X that contains a fully exploitable browser version (2.0.0-X has a partially exploitable browser, but it won't work for other reasons).
This process involves flashing your CTRNAND to 2.1.0-4. This is accomplished by installing a premade CTRNAND image containing 2.1.0, copying your console specific files (such as `moveable.sed` and `SecureInfo_A`) to it, then fixing the title database CMACS. On New 3DS, it also swaps CTRNAND's encryption slot and installs an Old 3DS NCSD header to NAND, allowing it to boot the Old 3DS only 2.1.0 software.

104
_pages/Region-Changing.md Normal file
View file

@ -0,0 +1,104 @@
---
title: "Region Changing"
permalink: /region-changing.html
---
This is add-on section for region changing your arm9loaderhax CFW SysNAND. This is done by installing the 9.2.0 ctrtransfer image for the region you want to switch to and modifying your SecureInfo_A file.
{: .notice--primary}
**Region changing is almost completely unnecessary since Luma3DS supports out of region games and individual [title region emulation](https://github.com/AuroraWright/Luma3DS/wiki/Options-and-usage).**
{: .notice--info}
This process will unlink your NNID from the system, since it will no longer be compatible with it. NNID's are locked to the region of the device that created them, and cannot be transferred between regions without [a very complex and advanced process](https://gist.githubusercontent.com/yifanlu/e80db121d38aceb8cca0e03cefd5853b/raw/3c4dd89869156ca0f945a2791e699acfdb32b510/gistfile1.txt).
{: .notice--warning}
After this process, only **New 3DSs which have never accessed the eShop before** and **any Old 3DSs** will be able to access the eShop after creating a new NNID on their new region. Region changed New 3DSs that have already accessed the eShop on their original region cannot create a new NNID and access the eShop on their new region!
{: .notice--warning}
Note that occasionally the eShop will inexplicably still not work for devices that it should work for. This is entirely to do with Nintendo's servers, and I really do not have any control over it.
{: .notice--warning}
**You MUST have already installed arm9loaderhax + Luma3DS to use this.**
{: .notice--danger}
#### What you need
* The latest release of [GodMode9](https://github.com/d0k3/GodMode9/releases/)
* The latest release of [Decrypt9WIP](https://github.com/d0k3/Decrypt9WIP/releases/latest)
* The 9.2.0 ctrtransfer image for your device and the region you want to switch to
+ [New 3DS 9.2.0 - EUR - ctrtransfer](torrents/9.2.0-20E_ctrtransfer_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:fed7bfeec0e52b42a77467cfb6ffd3e9dd2d5a70"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [New 3DS 9.2.0 - JPN - ctrtransfer](torrents/9.2.0-20J_ctrtransfer_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:b22d67fd02b3b0e30ac991e451db0f2d32e7beca"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [New 3DS 9.2.0 - USA - ctrtransfer](torrents/9.2.0-20U_ctrtransfer_n3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:985d47442dc470d1b9f908256bed041c63885f60"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
~
+ [Old 3DS or 2DS 9.2.0 - EUR - ctrtransfer](torrents/9.2.0-20E_ctrtransfer_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:8d6142313971b08f92257e7fb1c1d5689e34ed78"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS or 2DS 9.2.0 - JPN - ctrtransfer](torrents/9.2.0-20J_ctrtransfer_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:24ad2b85e67013ef1f91178dca7ad2e40663b9b2"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [Old 3DS or 2DS 9.2.0 - USA - ctrtransfer](torrents/9.2.0-20U_ctrtransfer_o3ds.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:1dc79a2a0babb45497961888f369423a93135e2b"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
#### Instructions
**Some consoles have a `SecureInfo_B` instead of `SecureInfo_A`; this is fine and you should use `SecureInfo_B` for the relevant steps.**
##### Section I - Prep work
1. Copy `GodMode9.bin` from the GodMode9 zip to the `/luma/payloads` folder on your SD card and rename `GodMode9.bin` in `/luma/payloads` to `up_GodMode9.bin`
2. Copy `Decrypt9WIP.bin` to the `/luma/payloads/` folder on your SD card and rename `Decrypt9WIP.bin` to `x_Decrypt9WIP.bin`
3. Copy the 9.2.0 ctrtransfer image `.bin` and `.bin.sha` from the ctrtransfer zip to the `/files9/` folder on your SD card
4. Reinsert your SD card into your 3DS
<!---
##### Section II - Backup tickets
5. Open Decrypt9 from arm9loaderhax by holding (X) during boot
6. Go to "Ticket/Titlekey Options", then select "Ticket Dump (SysNAND)"
7. Press (Select) to eject your SD card, then put it in your computer
8. Delete all `.tik` files in the `/files9/` folder that **do not** start with "00-"
9. Leave all the `.tik` files that do start with "00-" in the folder
10. Reinsert your SD card into your 3DS, then press (B)
--->
##### Section II - ctrtransfer
5. Open Decrypt9 from arm9loaderhax by holding (X) during boot
6. Go to "SysNAND Options", then "CTRNAND Transfer", then "Auto CTRNAND Transfer"
7. Select the 9.2.0 ctrtransfer image when prompted by pressing (A)
8. **Backup SysNAND to `NANDmin.bin` when prompted by pressing (A)**
9. Allow the transfer process to proceed automatically, this may take some time
10. Once the transfer is complete, press Select to eject your SD card
11. Put your SD card in your computer, then copy `NANDmin.bin` and `NANDmin.bin.sha` from the `/files9/` folder on your SD card to a safe location; make backups in multiple locations; this backup will save you from a brick if anything goes wrong in the future **(Your backup should match one of the sizes on [this](nand-size) page; if it does not, you should delete it and make a new one!)**
12. Delete the 9.2.0 ctrtransfer image `.bin` and `.bin.sha` from the `/files9/` folder on your SD card after copying it
13. Reinsert your SD card into your 3DS
##### Section III - Editing SecureInfo
1. Press (Start) then hold (Up) to reboot into arm9loaderhax GodMode9
**(Be VERY careful with this tool, it can brick you if you misuse it, even with arm9loaderhax installed!)**
2. Navigate to `SYSNAND CTRNAND` -> `rw` -> `sys`
3. Press (Y) on `SecureInfo_A` to copy it
4. Press (Y) to paste a copy of `SecureInfo_A`
5. Select "Copy path(s)"
6. Press (A) to unlock SysNAND writing, then input the key combo given
7. Select "Choose new name"
8. Use the D-Pad to rename the file to `SecureInfo_C`, pressing (A) when you're done (overwrite any existing `SecureInfo_C`)
9. Scroll down to the `SecureInfo_C` you just pasted
10. Press (A) on `SecureInfo_C` then select "Show in Hexeditor"
11. Press (A) to continue
12. Press (A) to enter edit mode
13. Go to the beginning of line 00000100 and press (A) on it
14. Hold (A) while pressing (Up) or (Down) on the D-Pad to edit the number
15. Change the first number pair on line 00000100 to the following pair that corresponds to *the region you want to change to*:
- "00" : JPN
- "01" : USA
- "02" : EUR
16. Press (B) to exit edit mode, then save changes, then press (B) again to return to the directory
17. You should see both a `SecureInfo_A` and `SecureInfo_C` if everything was done properly. (`SecureInfo_C` is used in place of `SecureInfo_A` when using Luma3DS if it detects the file on boot)
18. Press Start to reboot
##### Section IV - Region settings
1. Open the System Settings
2. Go to "Other Settings", "Profile", then "Region Settings"
3. Select a country from the region you switched to
4. If prompted, you do not need to set a state
5. Update your region changed CFW SysNAND to the latest version

189
_pages/Troubleshooting.md Normal file
View file

@ -0,0 +1,189 @@
---
title: "Troubleshooting"
permalink: /troubleshooting.html
---
If you are unable to boot your 3DS, please look for the section relevant to you, and follow the instructions. Once a solution works for you, you can proceed on with the main guide
(The section is fairly long, try using Ctrl+F to search for your issue.)
{: .notice--primary}
**If you still cannot solve your issue and need to reach out for help, please paste the contents of all relevant .log files from the root of your SD card into a [Gist](https://gist.github.com/), then come for help prepared with a detailed description of your problem and what you've tried.**
{: .notice--info}
## <a name="twl_broken" />DSi / DS functionality is broken after completing the guide
#### What you need
* The TWL_FIRM `.cia` for your device
+ [`New_3DS TWL_FIRM - v9936.cia`](torrents/New_3DS%20TWL_FIRM%20-%20v9936.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:eab8558c97b18b1f329a2bfcc3c899b84c082a27"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
+ [`Old_3DS TWL_FIRM - v8817.cia`](torrents/Old_3DS%20TWL_FIRM%20-%20v8817.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:17511eadb6e6f3ff22d04f90644e37bd2d96ca43"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* [`TWL Version Data - v0.cia`](torrents/TWL%20Version%20Data%20-%20v0.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:4a106681407fede5de95cc8bda635432481f6b5d"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* [`DS Internet - v2048.cia`](torrents/DS%20Internet%20-%20v2048.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:2b9df8496922f2546dfb0b01220068ce53c19d3d"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* [`DS Download Play - v1024.cia`](torrents/DS%20Download%20Play%20-%20v1024.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:b581d3c5d98f5e621fddfc1ce5704bb45bf05a8c"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* [`Nintendo DS Cart Whitelist - v11264.cia`](torrents/Nintendo%20DS%20Cart%20Whitelist%20-%20v11264.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:7b90d506ad032a581a00035616eaa17a68c48eff"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
#### Instructions
##### Section I - Prep work
1. Copy `TWL Version Data - v0.cia` to the `/cias/` folder on your SD card
2. Copy `DS Download Play - v1024.cia` to the `/cias/` folder on your SD card
3. Copy `DS Internet - v2048.cia` to the `/cias/` folder on your SD card
4. Copy `Nintendo DS Cart Whitelist - v11264.cia` to the `/cias/` folder on your SD card
5. Copy either `New_3DS TWL_FIRM - v9936.cia` or `Old_3DS TWL_FIRM - v8817.cia` to the `/cias/` folder on your SD card
##### Section II - Installing titles
1. Open FBI
3. Select "SD"
4. Select "cias"
8. Navigate to `TWL Version Data - v0.cia` and press (A) to install
8. Navigate to `DS Download Play - v1024.cia` and press (A) to install
8. Navigate to `DS Internet - v2048.cia` and press (A) to install
8. Navigate to `Nintendo DS Cart Whitelist - v11264.cia` and press (A) to install
9. Navigate to either `New_3DS TWL_FIRM - v9936.cia` or `Old_3DS TWL_FIRM - v8817.cia` and press (A) to install
8. Exit with the home button
## <a name="gw_fbi" />Cannot inject H&S on Gateway downgraded device
This is caused by Gateway implementing a very shoddy downgrade method, which leaves two versions of each app on the system. One of them is unused, but it confuses Decrypt9, causing it to inject into the wrong one.
#### What you need
* The latest release of [GodMode9](https://github.com/d0k3/GodMode9/releases/)
#### Instructions
1. Copy `GodMode9.bin` from the GodMode9 zip to the `/luma/payloads` folder on your SD card and rename `GodMode9.bin` in `/luma/payloads` to `up_GodMode9.bin`
2. Reinsert your SD card into your 3DS
5. Open GodMode9 from arm9loaderhax by holding (Up) during boot
**(Be VERY careful with this tool, it can brick you if you misuse it, even with arm9loaderhax installed!)**
2. Navigate to `SYSNAND CTRNAND` -> `title` -> `00040010`
7. Navigate to the folder for your device and region:
+ **Old 3DS EUR**: `00022300` -> `content`
+ **Old 3DS JPN**: `00020300` -> `content`
+ **Old 3DS USA**: `00021300` -> `content`
+ **New 3DS EUR**: `20022300` -> `content`
+ **New 3DS JPN**: `20020300` -> `content`
+ **New 3DS USA**: `20021300` -> `content`
8. Notice that there are two sets of app and tmd files, one set with uppercase extensions (`.TMD` and `.APP`), and one set with lowercase extensions (`.tmd` and `.app`)
11. While holding the (R) trigger, press (Y) to create a new directory
10. Press (A) to confirm the name `newdir` (it doesn't matter what it's called)
6. Press (A) to unlock SysNAND writing, then input the key combo given
9. Press the (L) trigger on each of the uppercase extension files (`.TMD` and `.APP`) to mark them
10. Press (Y) to copy the files
11. Navigate to `newdir`
12. Press (Y) to paste the files
13. Select "Move path(s)"
14. The uppercase extension files will have been moved to the `newdir` directory
15. Press (Start) to reboot
16. Return to [Installing arm9loaderhax](installing-arm9loaderhax) and retry the FBI injection
17. If this still doesn't work, move the uppercase extension files back to the `content` folder, then move the lowercase extension files to the `newdir` folder, then return to [Installing arm9loaderhax](installing-arm9loaderhax) and retry the FBI injection
## <a name="ts_browser" />A browser based exploit is not working
Browser based exploits (such as browserhax or 2xrsa) are often unstable and crash frequently, but they can sometimes be fixed by doing the following steps
1. Open the browser, then open the browser settings
1. Scroll to the bottom and Initialize Savedata (it also may be called Clear All Save Data)
2. Try the exploit again
## <a name="ts_safe_a9lh" />System boots directly SafeA9LHInstaller
You copied the wrong `arm9loaderhax.bin` file to your SD card (you were only supposed to copy the `3ds` folder and `SafeA9LHInstaller.dat` file from the SafeA9LHInstaller zip)
1. Use the correct `arm9loaderhax.bin`
1. Copy `arm9loaderhax.bin` from the Luma3DS zip to the root of your SD card
2. Reboot holding select and continue
## <a name="ts_safe_a9lh_screen" />SafeA9LHInstaller shows a glitched screen
This happens occasionally, but the reason is unknown. The buttons will still work, but the screen will be glitched looking
1. Follow instructions as normal
1. Press (Select) and arm9loaderhax will be installed
2. The console will reboot
+ If the console does not reboot, wait 10 seconds, then power off your 3DS by holding down the power button
## <a name="ts_steelhax" />After System Transfering steelhax, it crashes to a black screen on _3DS #2_
This is because you selected the wrong version in the steelhax installer.
1. Download the [otherapp payload](https://smealum.github.io/3ds/#otherapp) corresponding to **3DS #2's** version
+ Ignore the NFIRM being downgraded
+ Use the version displayed in settings
2. Rename the otherapp payload to `steelhax_payload.bin`
3. Copy it `steelhax_payload.bin` to the root of **3DS #2's** SD Card
+ Overwrite any existing files
4. Hold (B) while launching **Steel Diver: Sub Wars**
## <a name="ts_dsiware" />After doing the DSiWare Downgrade, my hacked save is gone
3. Reboot **3DS #1** while holding Start to launch Hourglass9
4. Go to SysNAND Backup/Restore and restore SysNAND from `NANDmin.bin` (the one made before the system transfer)
1. If you don't have the game at all, link the NNID you bought the game with to **3DS #2** and download it on **3DS #2**
2. On **3DS #1**, do [DSiWare Downgrade - Section III - Installing the save](dsiware-downgrade#section-iii---installing-the-save)
3. On **3DS #1**, go to System Settings, "Data Management", "DSiWare", then copy your DSiWare game to your SD card
4. Either put **3DS #1**'s SD card in **3DS #2**, or rename the `Nintendo 3DS` on **3DS #2**'s SD card and copy the `Nintendo 3DS` folder from **3DS #1**'s SD card to **3DS #2**'s SD card
5. On **3DS #2**, go to System Settings, "Data Management", "DSiWare", then copy your DSiWare game to the system
6. Return your SD cards to normal, then continue with the DSiWare Downgrade
## <a name="ts_d9_backup" />Decrypt9 or Hourglass9 won't restore / can't find my NAND backup
1. Make sure you do not have any folder named "Decrypt9" on **the root** of your SD card
3. Try checking your SD card file system with something like `fsck.vfat <sd partition path>` (on *nix) or `CHKDSK <sd drive letter> /F` (on Windows)
4. Try backing up your SD card files, then formatting it and copying them back
5. Try a different SD card
## <a name="ts_sys_down" />Black screen on SysNAND boot
1. Try booting with your SD card out, and then reinserting it after booting.
1. Power off your 3DS by holding down the power button.
2. Take out the SD card.
3. Power on the 3DS.
4. When the home menu appears, reinsert your SD card.
5. If this worked, you should Clear Home Menu's extdata by navigating to the following folder on your SD card: `/Nintendo 3DS/(32 Character ID)/(32 Character ID)/extdata/00000000/`
+ EUR Region: Delete `00000098`
+ JPN Region: Delete `00000082`
+ USA Region: Delete `0000008f`
+ CHN Region: Delete `000000A1`
+ KOR Region: Delete `000000A9`
+ TWN Region: Delete `000000B1`
1. Try booting without any cartridges inserted (including flashcarts)
2. If you have a hardmod and a NAND backup, flash the backup back to SysNAND.
3. Try booting into recovery mode and updating your system.
*This probably will not work for an Old 3DS downgraded to 2.1.0*
**This will BRICK a New 3DS downgraded to 2.1.0**
1. Power off your 3DS by holding down the power button.
2. Hold L+R+A+Up.
3. Power on the 3DS.
4. If you enter safe mode, update your 3DS *only if you have an entrypoint for the latest FW version and it is possible to downgrade from it* and attempt the downgrade again.
4. Your 3DS may be bricked. For support, ask for help at [#3dshacks on Rizon IRC](https://gate.omicron.pw/) or [3DS Hacking on Discord](https://discord.gg/MWxPgEp).
## <a name="ts_sys_a9lh" />Black screen on SysNAND boot after installing arm9loaderhax
1. Ensure you have a working payload.
1. Check for the existence of `arm9loaderhax.bin` in the root of your SD card.
2. Try resetting Luma's config and fix options
1. Delete `/luma/config.bin` from your SD card
2. Set your options when it boots
3. Test booting Hourglass9
1. On Luma3DS, hold Start on boot
4. Try deleting home menu's extdata
1. Clear Home Menu's extdata by navigating to the following folder on your SD card: `/Nintendo 3DS/(32 Character ID)/(32 Character ID)/extdata/00000000/`
+ EUR Region: Delete `00000098`
+ JPN Region: Delete `00000082`
+ USA Region: Delete `0000008f`
+ CHN Region: Delete `000000A1`
+ KOR Region: Delete `000000A9`
+ TWN Region: Delete `000000B1`
5. Try booting without any cartridges inserted (including flashcarts)
7. Try [this test payload](https://mega.nz/#!YxMiGDhB!VZLv2XPSqFFzEhf4kGMXAdQtSpIGvnp2vu2W1j4o7cc/) .
1. Rename `/arm9loaderhax.bin`, if it exists, to something else.
2. Place the `arm9loaderhax.bin` from the archive linked above in your SD root.
3. Insert your SD card into your 3DS and power on.
4. Press (A). Your 3DS should power off; this means arm9loaderhax is working and something else is broken; your device is **not** bricked.
8. If you previously downgraded with Gateway, ensure that you are using the latest Luma3DS version (v6.2.3 or higher, at the least)
9. Try following [9.2.0 ctrtransfer](9.2.0-ctrtransfer) starting on Step 4.
10. Ask for help at [#3dshacks on Rizon IRC](https://gate.omicron.pw/) or [3DS Hacking on Discord](https://discord.gg/MWxPgEp).
## <a name="ts_sys_blue" />Blue screen on boot (bootrom error)
1. Your 3DS is bricked
2. You will need to get a [hardmod](https://gbatemp.net/threads/414498/) or repair / replace the device

49
_pages/Updating-A9LH.md Normal file
View file

@ -0,0 +1,49 @@
---
title: "Updating A9LH"
permalink: /updating-a9lh.html
---
### Last Update: 29 Sep 2016
The actual installation of arm9loaderhax itself consists of payload files installed into the NFIRM partitions on your device's NAND chip, which is soldered to the motherboard itself. These payloads are updated rarely and only really serve the purpose of launching `arm9loaderhax.bin` from the SD Card, which is, in our case, Luma3DS.
{: .notice}
So far, arm9loaderhax itself has only been majorly updated once.
{: .notice--info}
The old version of arm9loaderhax (sometimes referred to as "v1" because it was installed using SafeA9LHInstaller v1) was the latest version of [Delebile's initial implementation](https://github.com/delebile/arm9loaderhax).
{: .notice--info}
The new version of arm9loaderhax (sometimes referred to as "v2" because it is installed using SafeA9LHInstaller v2 or FIRM81 because of its use of 8.1's NFIRM files to make room for larger payloads) is the latest version of [AuroraWright's Fork](https://github.com/AuroraWright/arm9loaderhax) of [Delebile's initial implementation](https://github.com/delebile/arm9loaderhax).
{: .notice--info}
These steps will also update your various payloads and the AES key database.
{: .notice--success}
#### What you need
* [`aeskeydb.bin`](torrents/aeskeydb.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:18b3a17f78e2376e05feaa150749d9fd689b25dc"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* [`data_input_v3.zip`](torrents/data_input_v3.torrent) - <code class="highlighterrouge"><a href="magnet:?xt=urn:btih:a1195c9f7ab650fa7c7bf020b51fc19ea8d9440c"><i class="fa fa-magnet" aria-hidden="true"></i></a></code>
* The latest release of [arm9loaderhax](https://github.com/AuroraWright/arm9loaderhax/releases/latest)
* The latest release of [SafeA9LHInstaller](https://github.com/AuroraWright/SafeA9LHInstaller/releases/latest)
* The latest release of [Hourglass9](https://github.com/d0k3/Hourglass9/releases/latest)
#### Instructions
**For all of these instructions, OVERWRITE any existing files on your SD card.**
1. Delete any existing `aeskeydb.bin` from the root of your SD card
4. Delete the `a9lh` folder from the root of your SD card if it exists
2. Copy `aeskeydb.bin` to the `/files9/` folder on your SD card
3. Copy `Hourglass9.bin` from the Hourglass9 zip to the `/luma/payloads/` folder on your SD card and rename `Hourglass9.bin` to `start_Hourglass9.bin`
5. Copy `arm9loaderhax.bin` from the SafeA9LHInstaller zip to the `/luma/payloads` folder on your SD card
6. Rename `arm9loaderhax.bin` in `/luma/payloads` to `down_safea9lhinstaller.bin`
7. Copy the `a9lh` folder from `data_input_v3.zip` to the root of your SD Card
7. Copy _the contents of_ the arm9loaderhax zip to `a9lh` folder on your SD card
9. Reinsert your SD card into your 3DS
10. Boot the device while holding D-Pad down
11. Press (Select) to update arm9loaderhax
12. Power off the device and put your SD card back in your computer
13. Delete the `a9lh` folder from the root of your SD card
14. Delete `down_safea9lhinstaller.bin` from `/luma/payloads`
15. Reinsert your SD card into your 3DS and boot

15
_pages/Why-Ads.md Normal file
View file

@ -0,0 +1,15 @@
---
title: "Why Ads?"
permalink: /why-ads.html
---
This project is the culmination of hundreds upon hundreds of hours of constant work.
I maintain this guide, for free, and ensure it is always up to date. Because of this effort, I feel that it is fair for me to attempt to gain a meager income from my work (I receive next to no donations anymore).
This site costs you nothing to use, and all that I display are text-based non-intrusive ads. If you still have a problem with this, feel free to block these ads.
If you do block ads, I would like to also remind you of the [Donations](donations) page, but once again that is optional too.
Thanks,<br>
Plailect

21
_sass/_animations.scss Normal file
View file

@ -0,0 +1,21 @@
/* ==========================================================================
ANIMATIONS
========================================================================== */
@-webkit-keyframes intro {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes intro {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}

238
_sass/_archive.scss Normal file
View file

@ -0,0 +1,238 @@
/* ==========================================================================
ARCHIVE
========================================================================== */
.archive {
margin-bottom: 2em;
@include breakpoint($medium) {
@include span(12 of 12);
}
@include breakpoint($large) {
@include span(10 of 12 last);
@include prefix(0.5 of 12);
}
a {
color: inherit;
text-decoration: none;
}
}
.archive__subtitle {
margin: 1.414em 0 0;
padding-bottom: 0.5em;
font-size: $type-size-5;
color: mix(#fff, $gray, 25%);
border-bottom: 1px solid $border-color;
+ .list__item .archive__item-title {
margin-top: 0.5em;
}
}
.archive__item-title {
margin-bottom: 0.25em;
font-family: $sans-serif-narrow;
a + a {
opacity: 0.5;
}
}
/* remove border*/
.page__content {
.archive__item-title {
margin-top: 1em;
border-bottom: none;
}
}
.archive__item-excerpt {
margin-top: 0;
font-size: $type-size-6;
& + p {
text-indent: 0;
}
}
.archive__item-teaser {
border-radius: $border-radius;
overflow: hidden;
img {
width: 100%;
}
}
.archive__item:hover {
.archive__item-teaser {
box-shadow: 0 0 10px rgba(#000, 0.25);
}
.archive__item-title {
text-decoration: underline;
}
}
/*
List view
========================================================================== */
.list__item {
@include breakpoint($medium) {
padding-right: $right-sidebar-width-narrow;
}
@include breakpoint($large) {
padding-right: $right-sidebar-width;
}
@include breakpoint($x-large) {
padding-right: $right-sidebar-width-wide;
}
.page__meta {
margin: 0 0 4px;
}
}
/*
Grid view
========================================================================== */
.grid__item {
margin-bottom: 2em;
.page__meta {
margin: 0 0 4px;
}
.archive__item-title {
margin-top: 0.5em;
font-size: $type-size-5;
}
.archive__item-excerpt {
display: none;
}
@include breakpoint($small) {
@include gallery(5 of 10);
.archive__item-teaser {
max-height: 200px;
}
}
@include breakpoint($medium) {
margin-left: 0; /* reset before mixin does its thing*/
margin-right: 0; /* reset before mixin does its thing*/
@include gallery(2.5 of 10);
.archive__item-teaser {
max-height: 120px;
}
.archive__item-excerpt {
display: block;
font-size: $type-size-6;
}
}
}
/*
Features
========================================================================== */
.feature__wrapper {
@include clearfix();
margin-bottom: 2em;
border-bottom: 1px solid $border-color;
}
.feature__item {
margin-bottom: 2em;
font-size: 1.25rem;
@include breakpoint($small) {
margin-bottom: 0;
@include gallery(4 of 12);
.feature__item-teaser {
max-height: 200px;
overflow: hidden;
}
}
&--left {
@include full();
font-size: 1.25rem;
.archive__item-teaser {
margin-bottom: 2em;
}
@include breakpoint($small) {
.archive__item-teaser {
@include span(5 of 12);
}
.archive__item-body {
@include span(7 of 12 last);
@include prefix(0.5 of 12);
@include suffix(1 of 12);
}
}
}
&--right {
@include full();
font-size: 1.25rem;
.archive__item-teaser {
margin-bottom: 2em;
}
@include breakpoint($small) {
text-align: right;
.archive__item-teaser {
@include span(5 of 12 rtl);
}
.archive__item-body {
@include span(7 of 12 last rtl);
@include prefix(0.5 of 12);
@include suffix(1 of 12);
}
}
}
&--center {
@include full();
font-size: 1.25rem;
.archive__item-teaser {
margin-bottom: 2em;
}
@include breakpoint($small) {
text-align: center;
.archive__item-teaser {
margin: 0 auto;
width: span(5 of 12);
}
.archive__item-body {
margin: 0 auto;
width: span(7 of 12);
}
}
}
}

315
_sass/_base.scss Normal file
View file

@ -0,0 +1,315 @@
/* ==========================================================================
BASE ELEMENTS
========================================================================== */
html {
/* sticky footer fix */
position: relative;
min-height: 100%;
}
body {
margin: 0;
padding: 0;
color: $text-color;
font-family: $global-font-family;
line-height: 1.5;
&.overflow--hidden {
/* when primary navigation is visible, the content in the background won't scroll */
overflow: hidden;
}
}
h1, h2, h3, h4, h5, h6 {
margin: 2em 0 0.5em;
line-height: 1.2;
font-family: $header-font-family;
font-weight: bold;
}
h1 {
margin-top: 0;
font-size: $type-size-3;
}
h2 {
font-size: $type-size-4;
}
h3 {
font-size: $type-size-5;
}
h4 {
font-size: $type-size-6;
}
h5 {
font-size: $type-size-6;
}
h6 {
font-size: $type-size-6;
}
small, .small {
font-size: $type-size-6;
}
p {
margin-bottom: 1.3em;
}
u,
ins {
text-decoration: none;
border-bottom: 1px solid $text-color;
a {
color: inherit;
}
}
del a {
color: inherit;
}
/* reduce orphans and widows when printing */
p, pre, blockquote, ul, ol, dl, figure, table, fieldset {
orphans: 3;
widows: 3;
}
/* abbreviations */
abbr[title],
abbr[data-original-title] {
text-decoration: none;
cursor: help;
border-bottom: 1px dotted $text-color;
}
/* blockquotes */
blockquote {
margin: 2em 1em 2em 0;
padding-left: 1em;
padding-right: 1em;
font-style: italic;
border-left: 0.25em solid $primary-color;
cite {
font-style: italic;
&:before {
content: "\2014";
padding-right: 5px;
}
}
}
/* links */
a {
&:focus {
@extend %tab-focus;
}
&:hover,
&:active {
outline: 0;
}
}
/* code */
tt, code, kbd, samp, pre {
font-family: $monospace;
}
pre {
overflow-x: auto; /* add scrollbars to wide code blocks*/
}
p > code,
a > code,
li > code,
figcaption > code,
td > code {
padding-top: 0.1rem;
padding-bottom: 0.1rem;
font-size: $type-size-6;
background: $code-background-color;
border: 1px solid $lighter-gray;
border-radius: $border-radius;
box-shadow: $box-shadow;
&:before, &:after {
letter-spacing: -0.2em;
content: "\00a0"; /* non-breaking space*/
}
}
/* horizontal rule */
hr {
display: block;
margin: 1em 0;
border: 0;
border-top: 1px solid $border-color;
}
/* lists */
ul li,
ol li {
margin-bottom: 0.5em;
}
li ul,
li ol {
margin-top: 0.5em;
}
/*
Media and embeds
========================================================================== */
/* Figures and images */
figure {
display: -webkit-box;
display: flex;
-webkit-box-pack: justify;
justify-content: space-between;
-webkit-box-align: start;
align-items: flex-start;
flex-wrap: wrap;
margin: 2em 0;
img,
iframe,
.fluid-width-video-wrapper {
margin-bottom: 1em;
}
img {
width: 100%;
border-radius: $border-radius;
-webkit-transition: $global-transition;
transition: $global-transition;
}
> a {
display: block;
}
&.half {
> a,
> img {
@include breakpoint($small) {
width: calc(50% - 0.5em);
}
}
figcaption {
width: 100%;
}
}
&.third {
> a,
> img {
@include breakpoint($small) {
width: calc(33.3333% - 0.5em);
}
}
figcaption {
width: 100%;
}
}
}
/* Figure captions */
figcaption {
margin-bottom: 0.5em;
color: mix(#fff, $text-color, 25%);
font-family: $caption-font-family;
font-size: $type-size-6;
a {
color: inherit;
text-decoration: none;
border-bottom: 1px solid $light-gray;
-webkit-transition: $global-transition;
transition: $global-transition;
&:hover {
color: #000;
border-bottom-color: #000;
}
}
}
/* Fix IE9 SVG bug */
svg:not(:root) {
overflow: hidden;
}
/*
Navigation lists
========================================================================== */
/**
* Removes margins, padding, and bullet points from navigation lists
*
* Example usage:
* <nav>
* <ul>
* <li><a href="#link-1">Link 1</a></li>
* <li><a href="#link-2">Link 2</a></li>
* <li><a href="#link-3">Link 3</a></li>
* </ul>
* </nav>
*/
nav {
ul {
margin: 0;
padding: 0;
}
li {
list-style: none;
}
a {
text-decoration: none;
}
/* override white-space for nested lists */
ul li,
ol li {
margin-bottom: 0;
}
li ul,
li ol {
margin-top: 0;
}
}
/*
Global animation transition
========================================================================== */
b, i, strong, em, blockquote, p, q, span, figure, img, h1, h2, header, input, a, tr, td, form button, input[type="submit"], .btn, .highlight, .archive__item-teaser {
-webkit-transition: $global-transition;
transition: $global-transition;
}

153
_sass/_buttons.scss Normal file
View file

@ -0,0 +1,153 @@
/* ==========================================================================
BUTTONS
========================================================================== */
/*
Default button
========================================================================== */
.btn {
/* default button */
display: inline-block;
margin-bottom: 0.25em;
padding: 0.5em 1em;
color: #fff !important;
font-family: $sans-serif;
font-size: $type-size-6;
font-weight: bold;
text-align: center;
text-decoration: none;
background-color: $primary-color;
border: 0 !important;
border-radius: $border-radius;
cursor: pointer;
&:hover {
background-color: mix(white, #000, 20%);
}
.icon {
margin-right: 0.5em;
}
.icon + .hidden {
margin-left: -0.5em; /* override for hidden text*/
}
/* fills width of parent container */
&--block {
display: block;
width: 100%;
+ .btn--block {
margin-top: 0.25em;
}
}
/* for dark backgrounds */
&--inverse {
color: $gray !important;
border: 1px solid $light-gray !important; /* override*/
background-color: #fff;
&:hover {
color: #fff !important;
border-color: $gray;
}
}
/* light outline */
&--light-outline {
border: 1px solid #fff !important; /* override*/
background-color: transparent;
}
/* information */
&--info {
background-color: $info-color;
&:hover {
background-color: mix(#000, $info-color, 20%);
}
}
/* warning */
&--warning {
background-color: $warning-color;
&:hover {
background-color: mix(#000, $warning-color, 20%);
}
}
/* success */
&--success {
background-color: $success-color;
&:hover {
background-color: mix(#000, $success-color, 20%);
}
}
/* danger */
&--danger {
background-color: $danger-color;
&:hover {
background-color: mix(#000, $danger-color, 20%);
}
}
/* disabled */
&--disabled {
pointer-events: none;
cursor: not-allowed;
filter: alpha(opacity=65);
box-shadow: none;
opacity: 0.65;
}
/* social buttons */
$social:
(facebook, $facebook-color),
(twitter, $twitter-color),
(google-plus, $google-plus-color),
(linkedin, $linkedin-color);
@each $socialnetwork, $color in $social {
&--#{$socialnetwork} {
background-color: $color;
&:hover {
background-color: mix(#000, $color, 20%);
}
}
}
/* extra large button */
&--x-large {
font-size: $type-size-4;
}
/* large button */
&--large {
font-size: $type-size-5;
}
/* small button */
&--small {
font-size: $type-size-7;
}
}

80
_sass/_footer.scss Normal file
View file

@ -0,0 +1,80 @@
/* ==========================================================================
FOOTER
========================================================================== */
.page__footer {
@include full();
@include clearfix;
/* sticky footer fix start */
position: absolute;
bottom: 0;
width: 100%;
clear: both;
height: auto;
/* sticky footer fix end */
margin-top: 3em;
color: mix(#fff, $gray, 25%);
-webkit-animation: intro 0.3s both;
animation: intro 0.3s both;
-webkit-animation-delay: 0.45s;
animation-delay: 0.45s;
background-color: $lighter-gray;
border-top: 1px solid $light-gray;
footer {
@include container;
@include clearfix;
margin-top: 2em;
padding: 0 1em 2em;
@include breakpoint($x-large) {
max-width: $x-large;
}
}
a {
color: inherit;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
.fa {
color: mix(#fff, $gray, 25%);
}
}
.page__footer-copyright {
font-family: $global-font-family;
font-size: $type-size-7;
}
.page__footer-follow {
ul {
margin: 0;
padding: 0;
list-style-type: none;
}
li {
display: inline-block;
padding-top: 5px;
padding-bottom: 5px;
font-family: $sans-serif-narrow;
font-size: $type-size-6;
text-transform: uppercase;
}
li + li:before {
content: "";
padding-right: 5px;
}
a {
padding-right: 10px;
font-weight: bold;
}
}

391
_sass/_forms.scss Normal file
View file

@ -0,0 +1,391 @@
/* ==========================================================================
Forms
========================================================================== */
form {
margin: 0 0 5px 0;
fieldset {
margin-bottom: 5px;
padding: 0;
border-width: 0;
}
legend {
display: block;
width: 100%;
margin-bottom: 5px * 2;
*margin-left: -7px;
padding: 0;
color: $text-color;
border: 0;
border-bottom: 1px solid mix(#fff, #000, 80%);
white-space: normal;
}
p {
margin-bottom: 5px / 2;
}
ul {
list-style-type: none;
margin: 0 0 5px 0;
padding: 0;
}
br {
display: none;
}
}
label,
input,
button,
select,
textarea {
vertical-align: baseline;
*vertical-align: middle;
}
input,
button,
select,
textarea {
box-sizing: border-box;
font-family: $sans-serif;
}
label {
display: block;
margin-bottom: 0.25em;
color: $text-color;
cursor: pointer;
small {
font-size: $type-size-6;
}
input,
textarea,
select {
display: block;
}
}
input,
textarea,
select {
display: inline-block;
width: 100%;
padding: 0.25em;
margin-bottom: 0.5em;
color: $text-color;
background-color: #fff;
border: 1px solid mix(#fff, #000, 80%);
border-radius: $border-radius;
box-shadow: $box-shadow;
&:hover {
border-color: mix(#fff, $primary-color, 50%);
}
}
.input-mini {
width: 60px;
}
.input-small {
width: 90px;
}
input[type="image"],
input[type="checkbox"],
input[type="radio"] {
width: auto;
height: auto;
padding: 0;
margin: 3px 0;
*margin-top: 0;
line-height: normal;
cursor: pointer;
border-radius: 0;
border: 0 \9;
}
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box;
padding: 0;
*width: 13px;
*height: 13px;
}
input[type="image"] {
border: 0;
box-shadow: none;
}
input[type="file"] {
width: auto;
padding: initial;
line-height: initial;
border: initial;
background-color: transparent;
background-color: initial;
box-shadow: none;
}
input[type="button"],
input[type="reset"],
input[type="submit"] {
width: auto;
height: auto;
cursor: pointer;
*overflow: visible;
}
select,
input[type="file"] {
*margin-top: 4px;
}
select {
width: auto;
background-color: #fff;
}
select[multiple],
select[size] {
height: auto;
}
textarea {
resize: vertical;
height: auto;
overflow: auto;
vertical-align: top;
}
input[type="hidden"] {
display: none;
}
.form {
position: relative;
}
.radio,
.checkbox {
padding-left: 18px;
font-weight: normal;
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
float: left;
margin-left: -18px;
}
.radio.inline,
.checkbox.inline {
display: inline-block;
padding-top: 5px;
margin-bottom: 0;
vertical-align: middle;
}
.radio.inline + .radio.inline,
.checkbox.inline + .checkbox.inline {
margin-left: 10px;
}
/*
Disabled state
========================================================================== */
input[disabled],
select[disabled],
textarea[disabled],
input[readonly],
select[readonly],
textarea[readonly] {
opacity: 0.5;
cursor: not-allowed;
}
/*
Focus & active state
========================================================================== */
input:focus,
textarea:focus {
border-color: $primary-color;
outline: 0;
outline: thin dotted \9;
}
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus,
select:focus {
box-shadow: none;
}
/*
Help text
========================================================================== */
.help-block,
.help-inline {
color: $info-color;
}
.help-block {
display: block;
margin-bottom: 1em;
line-height: 1em;
}
.help-inline {
display: inline-block;
vertical-align: middle;
padding-left: 5px;
}
/*
.form-inline
========================================================================== */
.form-inline input,
.form-inline textarea,
.form-inline select {
display: inline-block;
margin-bottom: 0;
}
.form-inline label {
display: inline-block;
}
.form-inline .radio,
.form-inline .checkbox,
.form-inline .radio {
padding-left: 0;
margin-bottom: 0;
vertical-align: middle;
}
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
float: left;
margin-left: 0;
margin-right: 3px; }
/*
.form-search
========================================================================== */
.form-search input,
.form-search textarea,
.form-search select {
display: inline-block;
margin-bottom: 0;
}
.form-search .search-query {
padding-left: 14px;
padding-right: 14px;
margin-bottom: 0;
border-radius: 14px;
}
.form-search label {
display: inline-block;
}
.form-search .radio,
.form-search .checkbox,
.form-inline .radio {
padding-left: 0;
margin-bottom: 0;
vertical-align: middle;
}
.form-search .radio input[type="radio"],
.form-search .checkbox input[type="checkbox"] {
float: left;
margin-left: 0;
margin-right: 3px;
}
/*
.form--loading
========================================================================== */
.form--loading:before {
content: '';
}
.form--loading .form__spinner {
display: block;
}
.form:before {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, 0.7);
z-index: 10;
}
.form__spinner {
display: none;
position: absolute;
top: 50%;
left: 50%;
z-index: 11;
}
/*
Google search form
========================================================================== */
#goog-fixurl {
ul {
list-style: none;
margin-left: 0;
padding-left: 0;
li {
list-style-type: none;
}
}
}
#goog-wm-qt {
width: auto;
margin-right: 10px;
margin-bottom: 20px;
padding: 8px 20px;
display: inline-block;
font-size: $type-size-6;
background-color: #fff;
color: #000;
border-width: 2px !important;
border-style: solid !important;
border-color: lighten(#000,50);
border-radius: $border-radius;
}
#goog-wm-sb {
@extend .btn;
}

53
_sass/_masthead.scss Normal file
View file

@ -0,0 +1,53 @@
/* ==========================================================================
MASTHEAD
========================================================================== */
.masthead {
position: relative;
border-bottom: 1px solid $border-color;
-webkit-animation: intro 0.3s both;
animation: intro 0.3s both;
-webkit-animation-delay: 0.15s;
animation-delay: 0.15s;
z-index: 20;
&__inner-wrap {
@include container;
@include clearfix;
padding: 1em 1em 1em;
font-family: $sans-serif-narrow;
@include breakpoint($x-large) {
max-width: $x-large;
}
nav {
z-index: 10;
}
a {
text-decoration: none;
}
}
}
.masthead__menu {
ul {
margin: 0;
padding: 0;
clear: both;
list-style-type: none;
}
}
.masthead__menu-item {
display: block;
list-style-type: none;
white-space: nowrap;
&--lg {
padding-right: 2em;
font-weight: 700;
}
}

53
_sass/_mixins.scss Normal file
View file

@ -0,0 +1,53 @@
/* ==========================================================================
MIXINS
========================================================================== */
%tab-focus {
/* Default*/
outline: thin dotted $warning-color;
/* Webkit*/
outline: 5px auto $warning-color;
outline-offset: -2px;
}
/*
em function
========================================================================== */
@function em($target, $context: $doc-font-size) {
@return ($target / $context) * 1em;
}
/*
Bourbon clearfix
========================================================================== */
/*
* Provides an easy way to include a clearfix for containing floats.
* link http://cssmojo.com/latest_new_clearfix_so_far/
*
* example scss - Usage
*
* .element {
* @include clearfix;
* }
*
* example css - CSS Output
*
* .element::after {
* clear: both;
* content: "";
* display: table;
* }
*/
@mixin clearfix {
clear: both;
&::after {
clear: both;
content: "";
display: table;
}
}

432
_sass/_navigation.scss Normal file
View file

@ -0,0 +1,432 @@
/* ==========================================================================
NAVIGATION
========================================================================== */
/*
Breadcrumb navigation links
========================================================================== */
.breadcrumbs {
@include container;
@include clearfix;
margin-top: 0;
margin-bottom: 0;
padding-left: 2em;
padding-right: 2em;
font-family: $sans-serif;
-webkit-animation: intro 0.3s both;
animation: intro 0.3s both;
-webkit-animation-delay: 0.30s;
animation-delay: 0.30s;
@include breakpoint($large) {
padding-left: 1em;
padding-right: 1em;
}
@include breakpoint($x-large) {
max-width: $x-large;
}
ol {
padding: 0;
list-style: none;
font-size: $type-size-6;
@include breakpoint($large) {
@include span(10 of 12 last);
}
@include breakpoint($x-large) {
@include prefix(0.5 of 12);
}
}
li {
display: inline;
}
.current {
font-weight: bold;
}
}
/*
Post pagination navigation links
========================================================================== */
.pagination {
@include full();
@include clearfix();
margin-top: 1em;
padding-top: 1em;
ul {
margin: 0;
padding: 0;
list-style-type: none;
font-family: $sans-serif;
}
li {
display: block;
float: left;
margin-left: -1px;
a {
margin-bottom: 0.25em;
padding: 0.5em 1em;
font-family: $sans-serif;
font-size: 14px;
font-weight: bold;
line-height: 1.5;
text-align: center;
text-decoration: none;
color: mix(#fff, $gray, 25%);
border: 1px solid $light-gray;
border-radius: 0;
&:hover {
color: $link-color-hover;
}
&.current {
color: #fff;
background: $primary-color;
}
&.disabled {
color: mix(#fff, $gray, 75%);
pointer-events: none;
cursor: not-allowed;
}
}
&:first-child {
margin-left: 0;
a {
border-top-left-radius: $border-radius;
border-bottom-left-radius: $border-radius;
}
}
&:last-child {
a {
border-top-right-radius: $border-radius;
border-bottom-right-radius: $border-radius;
}
}
}
/* next/previous buttons */
&--pager {
display: block;
padding: 1em 2em;
float: left;
width: 50%;
font-family: $sans-serif;
font-size: $type-size-5;
font-weight: bold;
text-align: center;
text-decoration: none;
color: mix(#fff, $gray, 50%);
border: 1px solid $light-gray;
border-radius: $border-radius;
&:hover {
color: $link-color-hover;
}
&:first-child {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
&:last-child {
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
&.disabled {
color: mix(#fff, $gray, 75%);
pointer-events: none;
cursor: not-allowed;
}
}
}
.page__content + .pagination,
.page__meta + .pagination,
.page__share + .pagination,
.page__comments + .pagination {
margin-top: 2em;
padding-top: 2em;
border-top: 1px solid $border-color;
}
/*
Priority plus navigation
========================================================================== */
.greedy-nav {
position: relative;
min-width: 250px;
background: $background-color;
a {
display: block;
margin: 0 1rem;
padding: 0.5rem 0;
color: $masthead-link-color;
text-decoration: none;
&:hover {
color: $masthead-link-color-hover;
}
}
button {
position: absolute;
height: 100%;
right: 0;
padding: 0 0.5rem;
border: 0;
outline: none;
background-color: $primary-color;
color: #fff;
cursor: pointer;
}
.visible-links {
display: table;
li {
display: table-cell;
vertical-align: middle;
&:first-child {
font-weight: bold;
a {
margin-left: 0;
}
}
&:last-child {
a {
margin-right: 0;
}
}
}
a {
position: relative;
&:before {
content: "";
position: absolute;
left: 0;
bottom: 0;
height: 4px;
background: mix(#fff, $primary-color, 50%);
width: 100%;
-webkit-transition: $global-transition;
transition: $global-transition;
-webkit-transform: scaleX(0);
-ms-transform: scaleX(0);
transform: scaleX(0); /* hide*/
}
&:hover:before {
-webkit-transform: scaleX(1);
-ms-transform: scaleX(1);
transform: scaleX(1); /* reveal*/
}
}
}
.hidden-links {
position: absolute;
top: 100%;
right: 0;
margin-top: 15px;
padding: 5px;
border: 1px solid $border-color;
border-radius: $border-radius;
background: #fff;
box-shadow: 0 0 10px rgba(#000, 0.25);
a {
margin: 0;
padding: 10px 20px;
font-size: $type-size-5;
&:hover {
color: $masthead-link-color-hover;
background: mix(#fff, $primary-color, 75%);
}
}
&:before {
content: "";
position: absolute;
top: -11px;
right: 10px;
width: 0;
border-style: solid;
border-width: 0 10px 10px;
border-color: $border-color transparent;
display: block;
z-index: 0;
}
&:after {
content: "";
position: absolute;
top: -10px;
right: 10px;
width: 0;
border-style: solid;
border-width: 0 10px 10px;
border-color: #fff transparent;
display: block;
z-index: 1;
}
li {
display: block;
border-bottom: 1px solid $border-color;
&:last-child {
border-bottom: none;
}
}
}
}
/*
Navigation list
========================================================================== */
.nav__list {
font-size: 1rem;
ul {
margin-bottom: 1em;
}
a {
display: block;
padding: 0.125em 0;
color: inherit;
&:hover {
text-decoration: underline;
}
}
.active {
margin-left: -0.5em;
padding-left: 0.5em;
padding-right: 0.5em;
color: #fff;
font-weight: bold;
background: $primary-color;
border-radius: $border-radius;
&:hover {
color: #fff;
}
}
}
.nav__title {
margin: 0;
padding: 0.5rem 1rem;
font-family: $sans-serif-narrow;
font-size: $type-size-5;
font-weight: bold;
}
.nav__sub-title {
display: block;
margin: 0.5rem 0;
padding: 0.5rem 0;
font-family: $sans-serif-narrow;
font-size: $type-size-6;
font-weight: bold;
text-transform: uppercase;
border-bottom: 1px solid $border-color;
}
/*
Table of contents navigation
========================================================================== */
.toc {
font-family: $sans-serif-narrow;
color: $gray;
text-transform: uppercase;
letter-spacing: 1px;
background-color: #fff;
border: 1px solid $border-color;
border-radius: $border-radius;
box-shadow: $box-shadow;
.nav__title {
color: #fff;
font-size: $type-size-6;
background: $primary-color;
border-top-left-radius: $border-radius;
border-top-right-radius: $border-radius;
}
}
.toc__menu {
margin: 0;
padding: 0;
width: 100%;
list-style: none;
font-size: 0.8rem;
a {
display: block;
padding: 0.5rem 1rem;
color: $gray;
font-size: $type-size-7;
font-weight: bold;
line-height: 1.5;
border-bottom: 1px solid $border-color;
&:hover {
color: #000;
background: $lighter-gray;
}
}
> li:last-child {
a {
border-bottom: none;
}
}
li ul > li a {
padding-left: 2rem;
font-weight: normal;
}
/* hide sub sub links on small screens*/
li > ul li {
display: none;
@include breakpoint($medium) {
display: block;
}
}
}

99
_sass/_notices.scss Normal file
View file

@ -0,0 +1,99 @@
/* ==========================================================================
NOTICE TEXT BLOCKS
========================================================================== */
/**
* Default Kramdown usage (no indents!):
* <div class="notice" markdown="1">
* #### Headline for the Notice
* Text for the notice
* </div>
*/
@mixin notice($notice-color) {
margin: 2em 0 !important; /* override*/
padding: 1em;
font-family: $global-font-family;
font-size: $type-size-6 !important;
text-indent: initial; /* override*/
background-color: mix(#fff, $notice-color, 90%);
border-radius: $border-radius;
box-shadow: 0 1px 1px rgba($notice-color, 0.25);
h4 {
margin-top: 0 !important; /* override*/
margin-bottom: 0.75em;
}
@at-root .page__content #{&} h4 {
/* using at-root to override .page-content h4 font size*/
margin-bottom: 0;
font-size: 1em;
}
p {
&:last-child {
margin-bottom: 0 !important; /* override*/
}
}
h4 + p {
/* remove space above paragraphs that appear directly after notice headline*/
margin-top: 0;
padding-top: 0;
}
a {
color: $notice-color;
&:hover {
color: mix(#000, $notice-color, 40%);
}
}
code {
background-color: mix(#fff, $notice-color, 95%)
}
ul {
&:last-child {
margin-bottom: 0; /* override*/
}
}
}
/* Default notice */
.notice {
@include notice($light-gray);
}
/* Primary notice */
.notice--primary {
@include notice($primary-color);
}
/* Info notice */
.notice--info {
@include notice($info-color);
}
/* Warning notice */
.notice--warning {
@include notice($warning-color);
}
/* Success notice */
.notice--success {
@include notice($success-color);
}
/* Danger notice */
.notice--danger {
@include notice($danger-color);
}

Some files were not shown because too many files have changed in this diff Show more