├── .gitignore ├── publish ├── manifest.txt ├── cr │ ├── manifest.txt │ └── micropub-photo-app-flow.png ├── pr │ ├── manifest.txt │ └── micropub-photo-app-flow.png ├── rec │ ├── manifest.txt │ └── micropub-photo-app-flow.png └── micropub-photo-app-flow.png ├── errata ├── README.md └── index.php ├── draft ├── source │ ├── app-list-view.png │ ├── app-create-post.png │ ├── app-choose-photo.png │ ├── app-upload-finished.png │ ├── micropub-photo-app-flow.png │ ├── micropub-photo-app-flow.psd │ └── add-paragraph-ids.js └── micropub-photo-app-flow.png ├── github └── hook.php ├── implementation-reports ├── index.php ├── clients │ └── index.php ├── servers │ └── index.php ├── README.md ├── inkblot.md ├── shpub.md ├── omnibear.md ├── todayposter.md ├── dobrado.md ├── p3k.md ├── micropublish.md ├── inkstone.md ├── slater.md ├── ownyourgram.md ├── ownyourswarm.md ├── screech.md ├── wunderpub.md ├── quill.md └── CLIENT-TEMPLATE.md ├── assets ├── font-awesome-4.6.3 │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ └── css │ │ ├── font-awesome.min.css │ │ └── font-awesome.css ├── webclip.css └── webclip.js ├── w3c.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── implementations ├── index.php └── index.md ├── styles.css ├── user-stories ├── reading-recent-posts.md ├── user-posts-a-note.md ├── user-posts-a-file.md ├── SWAT0.md └── responses.md ├── README.md └── index.php /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /publish/manifest.txt: -------------------------------------------------------------------------------- 1 | index.html 2 | micropub-photo-app-flow.png 3 | -------------------------------------------------------------------------------- /publish/cr/manifest.txt: -------------------------------------------------------------------------------- 1 | index.html 2 | micropub-photo-app-flow.png 3 | -------------------------------------------------------------------------------- /publish/pr/manifest.txt: -------------------------------------------------------------------------------- 1 | index.html 2 | micropub-photo-app-flow.png 3 | -------------------------------------------------------------------------------- /publish/rec/manifest.txt: -------------------------------------------------------------------------------- 1 | index.html 2 | micropub-photo-app-flow.png 3 | -------------------------------------------------------------------------------- /errata/README.md: -------------------------------------------------------------------------------- 1 | Micropub Errata 2 | =============== 3 | 4 | No errata have been reported. 5 | 6 | -------------------------------------------------------------------------------- /errata/index.php: -------------------------------------------------------------------------------- 1 | &1'); 4 | echo 'ok'; 5 | -------------------------------------------------------------------------------- /implementation-reports/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Micropub 5 | 6 | 11 | 12 | 13 | 14 |
15 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /draft/source/add-paragraph-ids.js: -------------------------------------------------------------------------------- 1 | function addParagraphIDs() { 2 | $("section").each(function(){ 3 | var section_id = $(this).attr("id"); 4 | var counter = 1; 5 | $(this).find("p").each(function(){ 6 | var paragraph_id = section_id + "-p-" + counter; 7 | counter++; 8 | $(this).attr("id", paragraph_id); 9 | }); 10 | var counter = 1; 11 | $(this).find("li").each(function(){ 12 | var paragraph_id = section_id + "-li-" + counter; 13 | counter++; 14 | $(this).attr("id", paragraph_id); 15 | }); 16 | }); 17 | } 18 | -------------------------------------------------------------------------------- /assets/webclip.css: -------------------------------------------------------------------------------- 1 | .webclip-toolbar{position:absolute;top:0;display:'';opacity:1;color:#fff;background-color:#000;-webkit-transition:all .2s;transition:all .2s;font-size:12px;font-weight:500;margin:0;padding:0;padding-left:.5em;padding-right:.5em;border-radius:4px;list-style-type:none}.webclip-toolbar:after{content:'';position:absolute;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-color:#000 transparent transparent;border-style:solid;top:50%;margin-top:12px}.webclip-toolbar .webclip-item{padding:.5em 8px;cursor:pointer;display:inline-block;-ms-user-select:none;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.webclip-toolbar.hide{display:none;opacity:0} -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #fefefe; 3 | font-family: "Helvetica Neue", Helvetica, sans-serif; 4 | font-size: 14pt; 5 | } 6 | .page { 7 | max-width: 500px; 8 | margin: 0 auto; 9 | } 10 | a { 11 | color: #78b35c; 12 | } 13 | a:hover { 14 | color: #93c57c; 15 | } 16 | h1 { 17 | text-align: center; 18 | } 19 | .subtitle { 20 | padding: 20px 30px; 21 | font-size: 16pt; 22 | background-color: #93c57c; 23 | border: 1px #78b35c solid; 24 | border-radius: 4px; 25 | } 26 | ul.links { 27 | margin: 0; 28 | margin-top: 20px; 29 | padding: 0; 30 | list-style-type: none; 31 | } 32 | ul.links li { 33 | margin: 0; 34 | padding: 0; 35 | padding-top: 16px; 36 | } 37 | ul.links .main { 38 | text-align: center; 39 | font-size: 18pt; 40 | padding-top: 26px; 41 | padding-bottom: 16px; 42 | } 43 | -------------------------------------------------------------------------------- /user-stories/reading-recent-posts.md: -------------------------------------------------------------------------------- 1 | # Reading a user's recent posts 2 | 3 | From https://www.w3.org/wiki/Socialwg/Social_API/User_stories#Reading_a_user.27s_recent_posts 4 | 5 | > 1. Iris finds a comment by Sam on one of her photos funny. She'd like to read more posts by Sam. 6 | > 2. Iris reads the latest notes by Sam. She also reviews his latest photos. 7 | 8 | In order for Sam's comment to appear on Iris' photo, his server sent a [webmention](http://indiewebcamp.com/webmention) to her server, which parsed the [h-entry](http://indiewebcamp.com/h-entry) on Sam's site and [displayed it as a comment](http://indiewebcamp.com/comments-presentation) on her original post. 9 | 10 | Iris sees Sam's comment on her website, and clicks his name which takes her to Sam's home page where she sees his notes and photos. 11 | 12 | An alternate version of this could be Iris adds Sam's home page to her [reader](http://indiewebcamp.com/reader), which looks for an [h-feed](http://indiewebcamp.com/h-feed) on the home page, or linked from a rel=feed link. 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Micropub 2 | This repo contains the Micropub spec as well as issues and discussion related to the spec. 3 | 4 | Please make edits to the file `draft/source/index.html`, and the public file `draft/index.html` will be updated when a new draft is ready to publish. 5 | 6 | ## Implementation Reports 7 | 8 | See [implementation reports](implementation-reports/). 9 | 10 | ## User Stories 11 | 12 | This repo also contains descriptions of how to use Micropub to fulfill the W3C SocialWG list of [user stories](https://www.w3.org/wiki/Socialwg/Social_API/User_stories). 13 | 14 | * [SWAT0](user-stories/SWAT0.md) 15 | * [User Posts a Note](user-stories/user-posts-a-note.md) 16 | * [User Posts a File](user-stories/user-posts-a-file.md) 17 | * [Responses](user-stories/responses.md) 18 | * [Reading Recent Posts](user-stories/reading-recent-posts.md) 19 | 20 | ## License 21 | 22 | Per CC0, to the extent possible under law, the editor(s) and contributors have waived all copyright and related or neighboring rights to this work. In addition, as of 2015-05-03, the editor(s) and contributors (2015-04-07 onward) have made this specification available under the Open Web Foundation Agreement Version 1.0. 23 | 24 | All contributions to this repository fall under the same license as the Micropub specification. 25 | -------------------------------------------------------------------------------- /implementation-reports/README.md: -------------------------------------------------------------------------------- 1 | # Micropub Implementation Reports 2 | 3 | * [Server Implementation Report Summary](https://micropub.rocks/implementation-reports/servers/) 4 | * [Client Implementation Report Summary](https://micropub.rocks/implementation-reports/clients/) 5 | 6 | ## Servers 7 | 8 | Implementation Reports for servers are published through the test suite at https://micropub.rocks/ 9 | 10 | To submit a report, sign in to the tool and use it to test your implementation. You can submit a report through the website. 11 | 12 | You can view the raw submitted reports here: https://micropub.rocks/reports 13 | 14 | A summary is available at https://micropub.rocks/implementation-reports/servers/summary/ updated manually. 15 | 16 | ## Clients 17 | 18 | You can use the test suite at https://micropub.rocks/ to test your client. In doing so, the tool will build the implementation report for you, which you can then copy and paste as a new file in this repository. 19 | 20 | To submit a report for your Micropub client, use the `CLIENT-TEMPLATE.md` file as a template and fill out the information based on your implementation. You can copy and paste the results from https://micropub.rocks after running the tests. Submit a pull request to this repository, or link to your completed file in a [new issue](https://github.com/w3c/micropub/issues). 21 | 22 | View the summary of submitted reports here: https://micropub.rocks/implementation-reports/clients/ 23 | -------------------------------------------------------------------------------- /user-stories/user-posts-a-note.md: -------------------------------------------------------------------------------- 1 | # User Posts a Note 2 | 3 | From https://www.w3.org/wiki/Socialwg/Social_API/User_stories#User_posts_a_note 4 | 5 | > 1. Eric writes a short note to be shared with his followers. 6 | > 2. After posting the note, he notices a spelling error. He edits the note and re-posts it. 7 | > 3. Later, Eric decides that the information in the note is incorrect. He deletes the note. 8 | 9 | ## 1. Posting a note 10 | 11 | Eric's client application makes a POST request to his Micropub endpoint: 12 | 13 | ``` 14 | POST /micropub HTTP/1.1 15 | Host: eric.me 16 | Content-type: application/x-www-form-urlencoded 17 | Authorization: Bearer xx-micropub-access-token-xx 18 | 19 | h=entry 20 | &content=Helo+World 21 | ``` 22 | 23 | The endpoint responds with the location of the note that was just created: 24 | 25 | ``` 26 | HTTP/1.1 201 Created 27 | Location: https://eric.me/entry/1 28 | ``` 29 | 30 | ## 2. Updating a note 31 | 32 | To update the note, the application references the note by its URL. 33 | 34 | ``` 35 | POST /micropub HTTP/1.1 36 | Host: eric.me 37 | Content-type: application/x-www-form-urlencoded 38 | Authorization: Bearer xx-micropub-access-token-xx 39 | 40 | mp-action=edit 41 | &url=https://eric.me/entry/1 42 | &update[properties][content]=Hello+World 43 | ``` 44 | 45 | The server acknowledges the successful update of the note: 46 | 47 | ``` 48 | HTTP/1.1 204 No Content 49 | ``` 50 | 51 | ## 3. Deleting a note 52 | 53 | To delete the note, the application references the note by its URL and indicates the action: 54 | 55 | ``` 56 | POST /micropub HTTP/1.1 57 | Host: eric.me 58 | Content-type: application/x-www-form-urlencoded 59 | Authorization: Bearer xx-micropub-access-token-xx 60 | 61 | mp-action=delete 62 | &url=https://eric.me/entry/1 63 | ``` 64 | 65 | The server acknowledges the successful deletion of the note: 66 | 67 | ``` 68 | HTTP/1.1 204 No Content 69 | ``` 70 | 71 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Micropub 5 | 51 | 52 | 53 | 54 |
55 | 56 |

Micropub

57 | 58 |
Micropub is an open API standard that is used to create posts on one's own domain using third-party clients.
59 | 60 | 74 | 75 |
76 | 77 | 78 | -------------------------------------------------------------------------------- /assets/webclip.js: -------------------------------------------------------------------------------- 1 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.WebClip=e():t.WebClip=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return t[o].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){var n=document.createElement("ul"),o=this;return n.classList.add("webclip-toolbar"),this.plugins.map(function(t){var e=document.createElement("li");if(e.classList.add("webclip-item"),e.setAttribute("title",t.description||t.name),t.icon){var i=document.createElement("i");e.classList.add("webclip-icon","fa","fa-"+t.icon),e.appendChild(i)}else e.textContent=t.name.charAt(0).toUpperCase();e.addEventListener("click",function(e){t.action(o.selectedContent,o.selection.getRangeAt(0).cloneRange())}),n.appendChild(e)}),this.el.appendChild(n)}function l(t){setTimeout(t,100)}var s=function(){function t(t,e){for(var n=0;n 1. Maria uploads a photo of her car and shares it with her friends. 6 | > 2. Maria decides that the picture is too big and crops it to just show the car. She uploads a new version to replace the original. 7 | > 3. Maria realizes the photo includes her license plate number, which she would rather not share for privacy reasons. She deletes the photo. 8 | 9 | Micropub handles file uploads using the HTTP multipart/form-data content type. The 10 | examples below are meant to be a representation of the data over the wire. In practice, 11 | creators and consumers don't ever actually see this level of detail, since almost 12 | every language and environment handles multipart encoding and decoding at a relatively 13 | low level. 14 | 15 | For example, PHP's cURL library builds the multipart request by default when passing 16 | and array of key/value properties to the `CURLOPT_POSTFIELDS` property. Similarly, 17 | multipart requests are decoded automatically, making the standard string properties 18 | available in the `$_POST` variable as normal, while the files are automatically 19 | downloaded to a temp folder and referencable with the `$_FILES` variable. 20 | 21 | 22 | ## 1. Posting a photo 23 | 24 | Maria's client application makes a POST request to her Micropub endpoint: 25 | 26 | ``` 27 | POST /micropub HTTP/1.1 28 | Host: maria.me 29 | Content-Type: multipart/form-data; boundary=AaB03x 30 | Authorization: Bearer xx-micropub-access-token-xx 31 | 32 | --AaB03x 33 | Content-Disposition: form-data; name="h" 34 | 35 | entry 36 | --AaB03x 37 | Content-Disposition: form-data; name="photo"; filename="car.jpg" 38 | Content-Type: image/jpeg 39 | 40 | ... encoded contents of car.jpg ... 41 | --AaB03x-- 42 | ``` 43 | 44 | The endpoint creates a URL with the photo, and responds with the URL: 45 | 46 | ``` 47 | HTTP/1.1 201 Created 48 | Location: https://maria.me/entry/1 49 | ``` 50 | 51 | Note that this URL actually corresponds to an HTML page of the h-entry that contains 52 | the photo, it is not the actual JPG file itself. The location of the JPG file can be 53 | found by parsing the URL for the h-entry microformat and looking for the "photo" 54 | property. 55 | 56 | 57 | ## 2. Updating a photo 58 | 59 | To replace the photo, the application references the original entry by its URL. 60 | 61 | ``` 62 | POST /micropub HTTP/1.1 63 | Host: maria.me 64 | Content-Type: multipart/form-data; boundary=AaB03x 65 | Authorization: Bearer xx-micropub-access-token-xx 66 | 67 | --AaB03x 68 | Content-Disposition: form-data; name="mp-action" 69 | 70 | edit 71 | --AaB03x 72 | Content-Disposition: form-data; name="url" 73 | 74 | https://maria.me/entry/1 75 | --AaB03x 76 | Content-Disposition: form-data; name="update[properties][photo]"; filename="car-cropped.jpg" 77 | Content-Type: image/jpeg 78 | 79 | ... encoded contents of car-cropped.jpg ... 80 | --AaB03x-- 81 | ``` 82 | 83 | The server acknowledges the successful update of the photo: 84 | 85 | ``` 86 | HTTP/1.1 204 No Content 87 | ``` 88 | 89 | 90 | ## 3. Deleting a photo 91 | 92 | To delete the photo, the application references the URL and indicates the action: 93 | 94 | ``` 95 | POST /micropub HTTP/1.1 96 | Host: maria.me 97 | Content-type: application/x-www-form-urlencoded 98 | Authorization: Bearer xx-micropub-access-token-xx 99 | 100 | mp-action=delete 101 | &delete-of=https://maria.me/entry/1 102 | ``` 103 | 104 | The server acknowledges the successful deletion: 105 | 106 | ``` 107 | HTTP/1.1 204 No Content 108 | ``` 109 | 110 | -------------------------------------------------------------------------------- /implementation-reports/shpub.md: -------------------------------------------------------------------------------- 1 | # shpub 2 | 3 | Implementation Home Page URL: http://cweiske.de/shpub.htm 4 | 5 | Source code repo URL(s) (optional): 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): php 9 | 10 | Developer(s): [Christian Weiske](https://cweiske.de/) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks 14 | * [x] Self-reported 15 | 16 | ## Discovery 17 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | * [x] The client sends the access token in the HTTP `Authorization` header. 21 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 22 | * [x] The client requests one or more `scope` values when obtaining user authorization. 23 | * `post` 24 | 25 | ## Syntax 26 | * [x] Creates posts using `x-www-form-urlencoded` syntax. 27 | * [x] Creates posts using JSON syntax. 28 | * [x] Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 29 | * [x] Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 30 | * [ ] Creates posts using JSON syntax including a nested Microformats2 object. 31 | * [x] Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 32 | 33 | ## Creating Posts 34 | * [x] Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. 35 | * [ ] Allows creating posts with a photo including image alt text. 36 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 37 | * [x] Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 38 | 39 | ## Media Endpoint 40 | * [x] Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 41 | * [x] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 42 | 43 | ## Updates 44 | * [x] Supports replacing all values of a property (e.g. replacing the post content). 45 | * [x] Supports adding a value to a property (e.g. adding a tag). 46 | * [x] Supports removing a value from a property (e.g. removing a specific tag). 47 | * [x] Supports removing a property. 48 | * [x] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 49 | 50 | ## Deletes 51 | * [x] Sends deletion requests using `x-www-form-urlencoded` syntax. 52 | * [x] Sends deletion requests using JSON syntax. 53 | * [x] Sends undeletion requests using `x-www-form-urlencoded` syntax. 54 | * [x] Sends undeletion requests using JSON syntax. 55 | 56 | ## Querying 57 | * [x] Queries the Micropub endpoint with `q=config` 58 | * [x] Looks in the response for the Media Endpoint 59 | * [] Looks in the response for syndication targets 60 | * [x] Queries the Micropub endpoint with `q=syndicate-to` 61 | * [ ] Queries the Micropub endpoint for a post's source content without specifying a list of properties 62 | * [ ] Queries the Micropub endpoint for a post's source content looking only for specific properties 63 | 64 | ## Extensions 65 | 66 | Every extension property is supported with the `-x` / `--xprop` command line parameter. 67 | 68 | ## Vocabularies 69 | 70 | Any property is supported with the `-x` / `--xprop` command line parameter. 71 | 72 | By default, h-entries are posted. 73 | 74 | ## Other Notes 75 | 76 | The user may choose if he wants to use JSON or form encoding to post. 77 | 78 | The user may choose to ignore the media endpoint for each request. 79 | -------------------------------------------------------------------------------- /implementation-reports/omnibear.md: -------------------------------------------------------------------------------- 1 | # Omnibear 2 | 3 | Implementation Home Page URL: http://omnibear.com 4 | 5 | Source code repo URL(s) (optional): https://github.com/keithjgrant/omnibear 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): JavaScript 9 | 10 | Developer(s): [Keith J. Grant](http://keithjgrant.com) 11 | 12 | Answers are: 13 | * [ ] Confirmed via micropub.rocks 14 | * [x] Self-reported 15 | 16 | ## Discovery 17 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | * [x] The client sends the access token in the HTTP `Authorization` header. 21 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 22 | * [x] The client requests one or more `scope` values when obtaining user authorization. 23 | * create 24 | 25 | ## Syntax 26 | * [ ] Creates posts using `x-www-form-urlencoded` syntax. 27 | * [ ] Creates posts using JSON syntax. 28 | * [ ] Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 29 | * [ ] Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 30 | * [ ] Creates posts using JSON syntax including a nested Microformats2 object. 31 | * [ ] Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 32 | 33 | Note: Current version creates posts using `multipart/form-data`, though it does not include a file. 34 | 35 | ## Creating Posts 36 | * [ ] Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. 37 | * [ ] Allows creating posts with a photo including image alt text. 38 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 39 | * [ ] Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 40 | 41 | ## Media Endpoint 42 | * [ ] Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 43 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 44 | 45 | ## Updates 46 | * [ ] Supports replacing all values of a property (e.g. replacing the post content). 47 | * [ ] Supports adding a value to a property (e.g. adding a tag). 48 | * [ ] Supports removing a value from a property (e.g. removing a specific tag). 49 | * [ ] Supports removing a property. 50 | * [ ] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 51 | 52 | ## Deletes 53 | * [ ] Sends deletion requests using `x-www-form-urlencoded` syntax. 54 | * [ ] Sends deletion requests using JSON syntax. 55 | * [ ] Sends undeletion requests using `x-www-form-urlencoded` syntax. 56 | * [ ] Sends undeletion requests using JSON syntax. 57 | 58 | ## Querying 59 | * [ ] Queries the Micropub endpoint with `q=config` 60 | * [ ] Looks in the response for the Media Endpoint 61 | * [ ] Looks in the response for syndication targets 62 | * [ ] Queries the Micropub endpoint with `q=syndicate-to` 63 | * [ ] Queries the Micropub endpoint for a post's source content without specifying a list of properties 64 | * [ ] Queries the Micropub endpoint for a post's source content looking only for specific properties 65 | 66 | ## Extensions 67 | 68 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 69 | 70 | * `mp-slug` 71 | 72 | ## Vocabularies 73 | 74 | Please list all vocabularies and properties the client supports, if applicable. 75 | 76 | * Notes, Articles, Bookmarks, Likes, Reposts (http://microformats.org/wiki/h-entry) 77 | * content 78 | * category 79 | * in-reply-to 80 | * mp-slug 81 | * like-of 82 | * repost-of 83 | -------------------------------------------------------------------------------- /implementation-reports/todayposter.md: -------------------------------------------------------------------------------- 1 | # TodayPoster 2 | 3 | Implementation Home Page URL: https://github.com/bryanluby/TodayPoster 4 | 5 | Source code repo URL(s) (optional): https://github.com/bryanluby/TodayPoster 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): Objective-C 9 | 10 | Developer(s): [Bryan Luby](https://github.com/bryanluby) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks 14 | 15 | ## Discovery 16 | * [ ] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 17 | 18 | ## Authentication 19 | * [x] The client sends the access token in the HTTP `Authorization` header. 20 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 21 | * [ ] The client requests one or more `scope` values when obtaining user authorization. 22 | * create 23 | 24 | ## Syntax 25 | * [x] 100: Creates posts using `x-www-form-urlencoded` syntax. 26 | * [ ] 200: Creates posts using JSON syntax. 27 | * [ ] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 28 | * [ ] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 29 | * [ ] 202: Creates posts with HTML content. (JSON) 30 | * [ ] 204: Creates posts using JSON syntax including a nested Microformats2 object. 31 | * [ ] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 32 | 33 | ## Creating Posts 34 | * [ ] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 35 | * [ ] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 36 | * [ ] 205: Allows creating posts with a photo including image alt text. 37 | * [ ] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 38 | * [ ] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 39 | 40 | ## Media Endpoint 41 | * [ ] 700: Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 42 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 43 | 44 | ## Updates 45 | * [ ] 400: Supports replacing all values of a property (e.g. replacing the post content). 46 | * [ ] 401: Supports adding a value to a property (e.g. adding a tag). 47 | * [ ] 402: Supports removing a value from a property (e.g. removing a specific tag). 48 | * [ ] 403: Supports removing a property. 49 | * [ ] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 50 | 51 | ## Deletes 52 | * [ ] 500: Sends deletion requests using `x-www-form-urlencoded` syntax. 53 | * [ ] 500: Sends deletion requests using JSON syntax. 54 | * [ ] 502: Sends undeletion requests using `x-www-form-urlencoded` syntax. 55 | * [ ] 502: Sends undeletion requests using JSON syntax. 56 | 57 | ## Querying 58 | * [ ] 600: Queries the Micropub endpoint with `q=config` 59 | * [ ] Looks in the response for the Media Endpoint 60 | * [ ] Looks in the response for syndication targets 61 | * [ ] 601: Queries the Micropub endpoint with `q=syndicate-to` 62 | * [ ] 602: Queries the Micropub endpoint for a post's source content without specifying a list of properties 63 | * [ ] 603: Queries the Micropub endpoint for a post's source content looking only for specific properties 64 | 65 | ## Extensions 66 | 67 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 68 | 69 | ## Vocabularies 70 | 71 | Please list all vocabularies and properties the client supports, if applicable. 72 | 73 | ## Other Notes 74 | 75 | Please use this space to document anything else significant about your implementation. 76 | -------------------------------------------------------------------------------- /implementation-reports/dobrado.md: -------------------------------------------------------------------------------- 1 | # Dobrado 2 | 3 | Implementation Home Page URL: https://dobrado.net 4 | 5 | Source code repo URL(s) (optional): https://gitlab.com/dobrado 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): PHP, Javascript 9 | 10 | Developer(s): [Malcolm Blaney](https://unicyclic.com/mal) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks 14 | 15 | ## Discovery 16 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 17 | 18 | ## Authentication 19 | * [x] The client sends the access token in the HTTP `Authorization` header. 20 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 21 | * [x] The client requests one or more `scope` values when obtaining user authorization. 22 | * create 23 | 24 | ## Syntax 25 | * [ ] 100: Creates posts using `x-www-form-urlencoded` syntax. 26 | * [x] 200: Creates posts using JSON syntax. 27 | * [ ] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 28 | * [x] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 29 | * [x] 202: Creates posts with HTML content. (JSON) 30 | * [ ] 204: Creates posts using JSON syntax including a nested Microformats2 object. 31 | * [ ] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 32 | 33 | ## Creating Posts 34 | * [ ] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 35 | * [ ] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 36 | * [ ] 205: Allows creating posts with a photo including image alt text. 37 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 38 | * [ ] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 39 | 40 | ## Media Endpoint 41 | * [ ] 700: Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 42 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 43 | 44 | ## Updates 45 | * [ ] 400: Supports replacing all values of a property (e.g. replacing the post content). 46 | * [ ] 401: Supports adding a value to a property (e.g. adding a tag). 47 | * [ ] 402: Supports removing a value from a property (e.g. removing a specific tag). 48 | * [ ] 403: Supports removing a property. 49 | * [ ] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 50 | 51 | ## Deletes 52 | * [ ] 500: Sends deletion requests using `x-www-form-urlencoded` syntax. 53 | * [ ] 500: Sends deletion requests using JSON syntax. 54 | * [ ] 502: Sends undeletion requests using `x-www-form-urlencoded` syntax. 55 | * [ ] 502: Sends undeletion requests using JSON syntax. 56 | 57 | ## Querying 58 | * [ ] 600: Queries the Micropub endpoint with `q=config` 59 | * [ ] Looks in the response for the Media Endpoint 60 | * [ ] Looks in the response for syndication targets 61 | * [ ] 601: Queries the Micropub endpoint with `q=syndicate-to` 62 | * [ ] 602: Queries the Micropub endpoint for a post's source content without specifying a list of properties 63 | * [ ] 603: Queries the Micropub endpoint for a post's source content looking only for specific properties 64 | 65 | ## Extensions 66 | 67 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 68 | 69 | ## Vocabularies 70 | 71 | Please list all vocabularies and properties the client supports, if applicable. 72 | 73 | * Posts, Replies, Likes, Reposts (http://microformats.org/wiki/h-entry) 74 | * content 75 | * content[html] 76 | * name 77 | * photo 78 | * category 79 | * in-reply-to 80 | * like-of 81 | * repost-of 82 | * mp-syndicate-to 83 | 84 | -------------------------------------------------------------------------------- /implementation-reports/p3k.md: -------------------------------------------------------------------------------- 1 | # p3k 2 | 3 | Implementation Home Page URL: http://p3k.io/ 4 | 5 | Source code repo URL(s) (optional): 6 | * [ ] 100% open source implementation 7 | 8 | Programming Language(s): PHP 9 | 10 | Developer(s): [Aaron Parecki](https://aaronparecki.com) 11 | 12 | Answers are: 13 | * [ ] Confirmed via micropub.rocks 14 | * [x] Self-reported 15 | 16 | ## Discovery 17 | * [ ] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | This client uses Cookie authentication, as it is not a generic Micropub client and is tied to the p3k user's browser login session. 21 | 22 | * [ ] The client sends the access token in the HTTP `Authorization` header. 23 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 24 | * [ ] The client requests one or more `scope` values when obtaining user authorization. 25 | * (list scopes requested here) 26 | 27 | ## Syntax 28 | * [ ] Creates posts using `x-www-form-urlencoded` syntax. 29 | * [ ] Creates posts using JSON syntax. 30 | * [ ] Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 31 | * [ ] Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 32 | * [ ] Creates posts using JSON syntax including a nested Microformats2 object. 33 | * [ ] Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 34 | 35 | ## Creating Posts 36 | * [ ] Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. 37 | * [ ] Allows creating posts with a photo including image alt text. 38 | * [ ] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 39 | * [ ] Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 40 | 41 | ## Media Endpoint 42 | * [ ] Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 43 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 44 | 45 | ## Updates 46 | * [x] Supports replacing all values of a property (e.g. replacing the post content). 47 | * [ ] Supports adding a value to a property (e.g. adding a tag). 48 | * [ ] Supports removing a value from a property (e.g. removing a specific tag). 49 | * [ ] Supports removing a property. 50 | * [x] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 51 | 52 | ## Deletes 53 | * [x] Sends deletion requests using `x-www-form-urlencoded` syntax. 54 | * [ ] Sends deletion requests using JSON syntax. 55 | * [ ] Sends undeletion requests using `x-www-form-urlencoded` syntax. 56 | * [ ] Sends undeletion requests using JSON syntax. 57 | 58 | ## Querying 59 | * [ ] Queries the Micropub endpoint with `q=config` 60 | * [ ] Looks in the response for the Media Endpoint 61 | * [ ] Looks in the response for syndication targets 62 | * [x] Queries the Micropub endpoint with `q=syndicate-to` 63 | * [ ] Queries the Micropub endpoint for a post's source content without specifying a list of properties 64 | * [x] Queries the Micropub endpoint for a post's source content looking only for specific properties 65 | 66 | ## Extensions 67 | 68 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 69 | 70 | ## Vocabularies 71 | 72 | Please list all vocabularies and properties the client supports, if applicable. 73 | 74 | * h-entry 75 | 76 | ## Other Notes 77 | 78 | p3k does not have an interface for creating posts. Instead, it relies on users using an external client such as Quill. There is a minimal editing UI in p3k for editing specific properties of posts. This interface is built in to the p3k software, and makes Micropub requests to its own endpoint. 79 | 80 | ![editing interface](https://media.aaronpk.com/Screen-Shot-2017-02-23-11-21-30.png) 81 | 82 | -------------------------------------------------------------------------------- /implementation-reports/micropublish.md: -------------------------------------------------------------------------------- 1 | # Micropublish 2 | 3 | Implementation Home Page URL: https://micropublish.net 4 | 5 | Source code repo URL(s) (optional): https://github.com/barryf/micropublish 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): Ruby 9 | 10 | Developer(s): [Barry Frost](https://barryfrost.com) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks 14 | * [ ] Self-reported 15 | 16 | ## Discovery 17 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | * [x] The client sends the access token in the HTTP `Authorization` header. 21 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 22 | * [x] The client requests one or more `scope` values when obtaining user authorization. 23 | * `post` 24 | * `create update delete undelete` 25 | 26 | ## Syntax 27 | * [x] 100: Creates posts using `x-www-form-urlencoded` syntax. 28 | * [x] 200: Creates posts using JSON syntax. 29 | * [x] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 30 | * [x] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 31 | * [x] 202: Creates posts with HTML content. (JSON) 32 | * [x] 204: Creates posts using JSON syntax including a nested Microformats2 object. 33 | * [ ] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 34 | 35 | ## Creating Posts 36 | * [ ] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 37 | * [ ] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 38 | * [ ] 205: Allows creating posts with a photo including image alt text. 39 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 40 | * [x] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 41 | 42 | ## Media Endpoint 43 | * [ ] 700: Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 44 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 45 | 46 | ## Updates 47 | * [x] 400: Supports replacing all values of a property (e.g. replacing the post content). 48 | * [x] 401: Supports adding a value to a property (e.g. adding a tag). 49 | * [x] 402: Supports removing a value from a property (e.g. removing a specific tag). 50 | * [x] 403: Supports removing a property. 51 | * [x] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 52 | 53 | ## Deletes 54 | * [ ] 500: Sends deletion requests using `x-www-form-urlencoded` syntax. 55 | * [x] 500: Sends deletion requests using JSON syntax. 56 | * [ ] 502: Sends undeletion requests using `x-www-form-urlencoded` syntax. 57 | * [x] 502: Sends undeletion requests using JSON syntax. 58 | 59 | ## Querying 60 | * [x] 600: Queries the Micropub endpoint with `q=config` 61 | * [ ] Looks in the response for the Media Endpoint 62 | * [x] Looks in the response for syndication targets 63 | * [ ] 601: Queries the Micropub endpoint with `q=syndicate-to` 64 | * [x] 602: Queries the Micropub endpoint for a post's source content without specifying a list of properties 65 | * [x] 603: Queries the Micropub endpoint for a post's source content looking only for specific properties 66 | 67 | ## Extensions 68 | 69 | * `mp-slug` 70 | 71 | ## Vocabularies 72 | 73 | * h-entry (Note, Article, RSVP, Bookmark, Reply, Repost, Like, Check-in) 74 | * in-reply-to 75 | * repost-of 76 | * like-of 77 | * bookmark-of 78 | * rsvp 79 | * name 80 | * content 81 | * content[html] 82 | * summary 83 | * published 84 | * category 85 | * syndication 86 | * location (h-card) 87 | 88 | ## Other Notes 89 | 90 | The above results were confirmed using the Micropub.rocks test suite. 91 | -------------------------------------------------------------------------------- /implementation-reports/inkstone.md: -------------------------------------------------------------------------------- 1 | # InkStone 2 | 3 | Implementation Home Page URL: https://inklings.io/inkstone 4 | 5 | Source code repo URL(s) (optional): https://github.io/dissolve/inkstone 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): javascript, php 9 | 10 | Developer(s): [Ben Roberts](https://ben.thatmustbe.mee) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks 14 | * [ ] Self-reported 15 | 16 | ## Discovery 17 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | * [x] The client sends the access token in the HTTP `Authorization` header. 21 | * [x] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 22 | * [x] The client requests one or more `scope` values when obtaining user authorization. 23 | * create (though customizable after first login / requires relogin) 24 | 25 | ## Syntax 26 | * [x] 100: Creates posts using `x-www-form-urlencoded` syntax. 27 | * [x] 200: Creates posts using JSON syntax. 28 | * [x] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 29 | * [x] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 30 | * [x] 202: Creates posts with HTML content. (JSON) 31 | * [ ] 204: Creates posts using JSON syntax including a nested Microformats2 object. 32 | * [ ] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 33 | 34 | ## Creating Posts 35 | * [x] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 36 | * [x] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 37 | * [x] 205: Allows creating posts with a photo including image alt text. 38 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 39 | * [x] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 40 | 41 | ## Media Endpoint 42 | * [x] 700: Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 43 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 44 | 45 | ## Updates 46 | * [x] 400: Supports replacing all values of a property (e.g. replacing the post content). 47 | * [x] 401: Supports adding a value to a property (e.g. adding a tag). 48 | * [x] 402: Supports removing a value from a property (e.g. removing a specific tag). 49 | * [x] 403: Supports removing a property. 50 | * [x] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 51 | 52 | ## Deletes 53 | * [x] 500: Sends deletion requests using `x-www-form-urlencoded` syntax. 54 | * [x] 500: Sends deletion requests using JSON syntax. 55 | * [x] 502: Sends undeletion requests using `x-www-form-urlencoded` syntax. 56 | * [x] 502: Sends undeletion requests using JSON syntax. 57 | 58 | ## Querying 59 | * [x] 600: Queries the Micropub endpoint with `q=config` 60 | * [x] Looks in the response for the Media Endpoint 61 | * [x] Looks in the response for syndication targets 62 | * [x] 601: Queries the Micropub endpoint with `q=syndicate-to` 63 | * [x] 602: Queries the Micropub endpoint for a post's source content without specifying a list of properties 64 | * [x] 603: Queries the Micropub endpoint for a post's source content looking only for specific properties 65 | 66 | ## Extensions 67 | 68 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 69 | 70 | Can configure input fields in settings once logged in, so user can add support for Post Status, and Visibility on their own. 71 | 72 | ## Vocabularies 73 | 74 | h-entry by default , configurable to any other vocabulary 75 | 76 | ## Other Notes 77 | 78 | For handling of results, this implementation uses Request.ok which is true for all HTTP 2XX 79 | 80 | 81 | -------------------------------------------------------------------------------- /implementation-reports/slater.md: -------------------------------------------------------------------------------- 1 | # Slater 2 | 3 | Implementation Home Page URL: https://github.com/martymcguire/slater 4 | 5 | Source code repo URL(s) (optional): https://github.com/martymcguire/slater 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): Python 9 | 10 | Developer(s): [Name](https://martymcgui.re) 11 | 12 | Answers are: 13 | * [ ] Confirmed via micropub.rocks 14 | * [x] Self-reported 15 | 16 | ## Discovery 17 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | * [x] The client sends the access token in the HTTP `Authorization` header. 21 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 22 | * [x] The client requests one or more `scope` values when obtaining user authorization. 23 | * post 24 | 25 | ## Syntax 26 | * [x] Creates posts using `x-www-form-urlencoded` syntax. 27 | * [ ] Creates posts using JSON syntax. 28 | * [x] Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 29 | * [ ] Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 30 | * [ ] Creates posts using JSON syntax including a nested Microformats2 object. 31 | * [ ] Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 32 | 33 | ## Creating Posts 34 | * [x] Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. 35 | * [ ] Allows creating posts with a photo including image alt text. 36 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 37 | * [ ] Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 38 | 39 | ## Media Endpoint 40 | * [ ] Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 41 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 42 | 43 | ## Updates 44 | * [ ] Supports replacing all values of a property (e.g. replacing the post content). 45 | * [ ] Supports adding a value to a property (e.g. adding a tag). 46 | * [ ] Supports removing a value from a property (e.g. removing a specific tag). 47 | * [ ] Supports removing a property. 48 | * [ ] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 49 | 50 | ## Deletes 51 | * [ ] Sends deletion requests using `x-www-form-urlencoded` syntax. 52 | * [ ] Sends deletion requests using JSON syntax. 53 | * [ ] Sends undeletion requests using `x-www-form-urlencoded` syntax. 54 | * [ ] Sends undeletion requests using JSON syntax. 55 | 56 | ## Querying 57 | * [ ] Queries the Micropub endpoint with `q=config` 58 | * [ ] Looks in the response for the Media Endpoint 59 | * [ ] Looks in the response for syndication targets 60 | * [ ] Queries the Micropub endpoint with `q=syndicate-to` 61 | * [ ] Queries the Micropub endpoint for a post's source content without specifying a list of properties 62 | * [ ] Queries the Micropub endpoint for a post's source content looking only for specific properties 63 | 64 | ## Extensions 65 | 66 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 67 | 68 | Planned extension: query micropub endpoint for a list of venues with name and url to `h-card`. For example: `?q=venues` would return a JSON array similar to: 69 | 70 | [ 71 | { "name": "Jeff's Pizza", "url": "https://example.com/venues/jeffspizza" }, 72 | { "name": "Two Turnip Theater", "url": "https://example.com/venues/twoturniptheater" } 73 | ] 74 | 75 | ## Vocabularies 76 | 77 | Please list all vocabularies and properties the client supports, if applicable. 78 | 79 | * h-event 80 | * name 81 | * start 82 | * end 83 | * location (text field but supports location as `geo:` url or as url to an `h-card`) 84 | * category[] 85 | * content (text) 86 | 87 | ## Other Notes 88 | 89 | Implementation is a WIP as far as supporting media. Location extension is a WIP. 90 | -------------------------------------------------------------------------------- /implementation-reports/ownyourgram.md: -------------------------------------------------------------------------------- 1 | # OwnYourGram 2 | 3 | Implementation Home Page URL: https://ownyourgram.com/ 4 | 5 | Source code repo URL(s) (optional): https://github.com/aaronpk/OwnYourGram 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): PHP 9 | 10 | Developer(s): [Aaron Parecki](https://aaronparecki.com) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks 14 | * [ ] Self-reported 15 | 16 | ## Discovery 17 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | * [x] The client sends the access token in the HTTP `Authorization` header. 21 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 22 | * [x] The client requests one or more `scope` values when obtaining user authorization. 23 | * create 24 | 25 | ## Syntax 26 | * [ ] 100: Creates posts using `x-www-form-urlencoded` syntax. 27 | * [x] 200: Creates posts using JSON syntax. 28 | * [ ] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 29 | * [x] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 30 | * [ ] 202: Creates posts with HTML content. (JSON) 31 | * [x] 204: Creates posts using JSON syntax including a nested Microformats2 object. 32 | * [x] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 33 | 34 | ## Creating Posts 35 | * [ ] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 36 | * [x] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 37 | * [ ] 205: Allows creating posts with a photo including image alt text. 38 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 39 | * [x] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 40 | 41 | ## Media Endpoint 42 | * [ ] Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 43 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 44 | 45 | ## Updates 46 | * [ ] Supports replacing all values of a property (e.g. replacing the post content). 47 | * [ ] Supports adding a value to a property (e.g. adding a tag). 48 | * [ ] Supports removing a value from a property (e.g. removing a specific tag). 49 | * [ ] Supports removing a property. 50 | * [ ] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 51 | 52 | ## Deletes 53 | * [ ] Sends deletion requests using `x-www-form-urlencoded` syntax. 54 | * [ ] Sends deletion requests using JSON syntax. 55 | * [ ] Sends undeletion requests using `x-www-form-urlencoded` syntax. 56 | * [ ] Sends undeletion requests using JSON syntax. 57 | 58 | ## Querying 59 | * [ ] 600: Queries the Micropub endpoint with `q=config` 60 | * [ ] Looks in the response for the Media Endpoint 61 | * [ ] Looks in the response for syndication targets 62 | * [x] 601: Queries the Micropub endpoint with `q=syndicate-to` 63 | * [ ] 602: Queries the Micropub endpoint for a post's source content without specifying a list of properties 64 | * [ ] 603: Queries the Micropub endpoint for a post's source content looking only for specific properties 65 | 66 | ## Extensions 67 | 68 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 69 | 70 | ## Vocabularies 71 | 72 | Please list all vocabularies and properties the client supports, if applicable. 73 | 74 | * Photos and Videos (http://microformats.org/wiki/h-entry) 75 | * content 76 | * published 77 | * photo 78 | * video 79 | * category 80 | * location 81 | * mp-syndicate-to 82 | 83 | ## Other Notes 84 | 85 | * Since OwnYourGram *always* sends a photo (or photo with video), it will never make a form-encoded request, so does not pass the 1xx tests. By default, it makes multipart requests unless the user opts in to sending JSON requests. 86 | -------------------------------------------------------------------------------- /implementation-reports/ownyourswarm.md: -------------------------------------------------------------------------------- 1 | # OwnYourSwarm 2 | 3 | Implementation Home Page URL: https://ownyourswarm.p3k.io/ 4 | 5 | Source code repo URL(s): https://github.com/aaronpk/OwnYourSwarm 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): PHP 9 | 10 | Developer(s): [Aaron Parecki](https://aaronparecki.com/) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks 14 | * [ ] Self-reported 15 | 16 | ## Discovery 17 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | * [x] The client sends the access token in the HTTP `Authorization` header. 21 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 22 | * [x] The client requests one or more `scope` values when obtaining user authorization. 23 | * create 24 | * update 25 | 26 | ## Syntax 27 | * [ ] 100: Creates posts using `x-www-form-urlencoded` syntax. 28 | * [x] 200: Creates posts using JSON syntax. 29 | * [ ] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 30 | * [x] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 31 | ** Sends person-tags as nested h-cards if any people were tagged in the checkin 32 | * [x] 202: Creates posts with HTML content. (JSON) 33 | ** When the checkin includes a mention of another person, the content is sent as HTML with a hyperlink to the user mentioned 34 | * [x] 204: Creates posts using JSON syntax including a nested Microformats2 object. 35 | * [ ] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 36 | 37 | ## Creating Posts 38 | * [ ] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 39 | * [x] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 40 | * [ ] 205: Allows creating posts with a photo including image alt text. 41 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 42 | * [ ] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 43 | 44 | ## Media Endpoint 45 | * [ ] 700: Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 46 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 47 | 48 | ## Updates 49 | * [ ] 400: Supports replacing all values of a property (e.g. replacing the post content). 50 | * [ ] 401: Supports adding a value to a property (e.g. adding a tag). 51 | * [ ] 402: Supports removing a value from a property (e.g. removing a specific tag). 52 | * [ ] 403: Supports removing a property. 53 | * [ ] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 54 | 55 | ## Deletes 56 | * [ ] 500: Sends deletion requests using `x-www-form-urlencoded` syntax. 57 | * [ ] 500: Sends deletion requests using JSON syntax. 58 | * [ ] 502: Sends undeletion requests using `x-www-form-urlencoded` syntax. 59 | * [ ] 502: Sends undeletion requests using JSON syntax. 60 | 61 | ## Querying 62 | * [ ] 600: Queries the Micropub endpoint with `q=config` 63 | * [ ] Looks in the response for the Media Endpoint 64 | * [ ] Looks in the response for syndication targets 65 | * [ ] 601: Queries the Micropub endpoint with `q=syndicate-to` 66 | * [ ] 602: Queries the Micropub endpoint for a post's source content without specifying a list of properties 67 | * [ ] 603: Queries the Micropub endpoint for a post's source content looking only for specific properties 68 | 69 | ## Extensions 70 | 71 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 72 | 73 | ## Vocabularies 74 | 75 | Please list all vocabularies and properties the client supports, if applicable. 76 | 77 | * h-entry 78 | * with checkin: h-card 79 | 80 | ## Other Notes 81 | 82 | OwnYourSwarm intentionally only sends JSON requests, since it will always be creating an h-entry with a nested h-card for the venue. 83 | -------------------------------------------------------------------------------- /implementation-reports/screech.md: -------------------------------------------------------------------------------- 1 | # Screech 2 | 3 | Implementation Home Page URL: https://github.com/martymcguire/screech 4 | 5 | Source code repo URL(s) (optional): https://github.com/martymcguire/screech 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): Python, JavaScript 9 | 10 | Developer(s): [Name](https://martymcgui.re) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks 14 | * [ ] Self-reported 15 | 16 | ## Discovery 17 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | * [x] The client sends the access token in the HTTP `Authorization` header. 21 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 22 | * [x] The client requests one or more `scope` values when obtaining user authorization. 23 | * create 24 | 25 | ## Syntax 26 | * [x] 100: Creates posts using `x-www-form-urlencoded` syntax. 27 | * [ ] 200: Creates posts using JSON syntax. 28 | * [x] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 29 | * [ ] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 30 | * [ ] 202: Creates posts with HTML content. (JSON) 31 | * [ ] 204: Creates posts using JSON syntax including a nested Microformats2 object. 32 | * [x] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 33 | 34 | ## Creating Posts 35 | * [ ] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 36 | * [ ] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 37 | * [ ] 205: Allows creating posts with a photo including image alt text. 38 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 39 | * [ ] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 40 | 41 | ## Media Endpoint 42 | * [ ] 700: Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 43 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 44 | 45 | ## Updates 46 | * [ ] 400: Supports replacing all values of a property (e.g. replacing the post content). 47 | * [ ] 401: Supports adding a value to a property (e.g. adding a tag). 48 | * [ ] 402: Supports removing a value from a property (e.g. removing a specific tag). 49 | * [ ] 403: Supports removing a property. 50 | * [ ] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 51 | 52 | ## Deletes 53 | * [ ] 500: Sends deletion requests using `x-www-form-urlencoded` syntax. 54 | * [ ] 500: Sends deletion requests using JSON syntax. 55 | * [ ] 502: Sends undeletion requests using `x-www-form-urlencoded` syntax. 56 | * [ ] 502: Sends undeletion requests using JSON syntax. 57 | 58 | ## Querying 59 | * [x] 600: Queries the Micropub endpoint with `q=config` 60 | * [x] Looks in the response for the Media Endpoint 61 | * [ ] Looks in the response for syndication targets 62 | * [ ] 601: Queries the Micropub endpoint with `q=syndicate-to` 63 | * [ ] 602: Queries the Micropub endpoint for a post's source content without specifying a list of properties 64 | * [ ] 603: Queries the Micropub endpoint for a post's source content looking only for specific properties 65 | 66 | ## Extensions 67 | 68 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 69 | 70 | None. 71 | 72 | ## Vocabularies 73 | 74 | Please list all vocabularies and properties the client supports, if applicable. 75 | 76 | * h-entry 77 | * audio 78 | * name 79 | * content (text) 80 | * category[] 81 | * slug 82 | * additional properties computed from the id3 or other metadata in the uploaded audio file: 83 | * id3-duration (seconds) 84 | * id3-enclosure-length (file size in bytes) 85 | * id3-artist (artist name) 86 | * id3-album (album name) 87 | * id3-title (track title) 88 | * id3-track (track number) 89 | 90 | ## Other Notes 91 | 92 | Media endpoint query is supported but media endpoint uploads are not yet implemented. 93 | -------------------------------------------------------------------------------- /implementation-reports/wunderpub.md: -------------------------------------------------------------------------------- 1 | # Wunderpub 2 | 3 | Implementation Home Page URL: https://github.com/aaronpk/Wunderpub 4 | 5 | Source code repo URL(s) (optional): https://github.com/aaronpk/Wunderpub 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): Ruby 9 | 10 | Developer(s): [Aaron Parecki](https://aaronparecki.com) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks 14 | * [ ] Self-reported 15 | 16 | ## Discovery 17 | * [ ] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | ** The endpoint and access token are hardcoded in a config file 19 | 20 | ## Authentication 21 | * [x] The client sends the access token in the HTTP `Authorization` header. 22 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 23 | * [ ] The client requests one or more `scope` values when obtaining user authorization. 24 | * n/a, the client assumes the user generated the scope with the appropriate value already 25 | 26 | ## Syntax 27 | * [x] 100: Creates posts using `x-www-form-urlencoded` syntax. 28 | * [x] 200: Creates posts using JSON syntax. 29 | * [x] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 30 | * [x] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 31 | * [ ] 202: Creates posts with HTML content. (JSON) 32 | * [x] 204: Creates posts using JSON syntax including a nested Microformats2 object. 33 | * [ ] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 34 | 35 | ## Creating Posts 36 | * [x] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 37 | * [x] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 38 | * [ ] 205: Allows creating posts with a photo including image alt text. 39 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 40 | * [x] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 41 | 42 | ## Media Endpoint 43 | * [ ] Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 44 | * [ ] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 45 | 46 | ## Updates 47 | * [ ] Supports replacing all values of a property (e.g. replacing the post content). 48 | * [ ] Supports adding a value to a property (e.g. adding a tag). 49 | * [ ] Supports removing a value from a property (e.g. removing a specific tag). 50 | * [ ] Supports removing a property. 51 | * [ ] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 52 | 53 | ## Deletes 54 | * [ ] Sends deletion requests using `x-www-form-urlencoded` syntax. 55 | * [ ] Sends deletion requests using JSON syntax. 56 | * [ ] Sends undeletion requests using `x-www-form-urlencoded` syntax. 57 | * [ ] Sends undeletion requests using JSON syntax. 58 | 59 | ## Querying 60 | * [x] Queries the Micropub endpoint with `q=config` 61 | * [ ] Looks in the response for the Media Endpoint 62 | * [ ] Looks in the response for syndication targets 63 | * [ ] Queries the Micropub endpoint with `q=syndicate-to` 64 | * [ ] Queries the Micropub endpoint for a post's source content without specifying a list of properties 65 | * [ ] Queries the Micropub endpoint for a post's source content looking only for specific properties 66 | 67 | ## Extensions 68 | 69 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 70 | 71 | ## Vocabularies 72 | 73 | Please list all vocabularies and properties the client supports, if applicable. 74 | 75 | * [h-entry](http://microformats.org/wiki/h-entry) 76 | * content 77 | * name 78 | * photo 79 | * category 80 | * mp-syndicate-to 81 | * ate/drank with a nested `h-food` object 82 | 83 | ## Other Notes 84 | 85 | There is no UI for this app, it is a cron job that syncs data in the background. 86 | 87 | When posting photos, Wunderlist already provides a URL that the photo is available at, so the app uses that photo URL as the value of the "photo" property, skipping the need to upload it to the user's Media endpoint as a separate step. 88 | -------------------------------------------------------------------------------- /implementation-reports/quill.md: -------------------------------------------------------------------------------- 1 | # Quill 2 | 3 | Implementation Home Page URL: https://quill.p3k.io/ 4 | 5 | Source code repo URL(s) (optional): https://github.com/aaronpk/Quill 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): PHP, Javascript 9 | 10 | Developer(s): [Aaron Parecki](https://aaronparecki.com) 11 | 12 | Answers are: 13 | * [x] Confirmed via micropub.rocks (except for specified entries) 14 | * [ ] Self-reported 15 | 16 | ## Discovery 17 | * [x] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 18 | 19 | ## Authentication 20 | * [x] The client sends the access token in the HTTP `Authorization` header. 21 | * [x] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 22 | * [x] The client requests one or more `scope` values when obtaining user authorization. 23 | * `create` 24 | 25 | ## Syntax 26 | * [x] 100: Creates posts using `x-www-form-urlencoded` syntax. 27 | * [x] 200: Creates posts using JSON syntax. 28 | * [x] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 29 | * [x] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 30 | * [x] 202: Creates posts with HTML content. (JSON) 31 | * [x] 204: Creates posts using JSON syntax including a nested Microformats2 object. 32 | * [x] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 33 | 34 | ## Creating Posts 35 | * [x] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 36 | * [x] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 37 | * [x] 205: Allows creating posts with a photo including image alt text. 38 | * [x] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 39 | * [x] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 40 | 41 | ## Media Endpoint 42 | * [x] 700: Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 43 | * [x] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 44 | 45 | ## Updates 46 | * [x] Supports replacing all values of a property (e.g. replacing the post content). 47 | * [ ] Supports adding a value to a property (e.g. adding a tag). 48 | * [ ] Supports removing a value from a property (e.g. removing a specific tag). 49 | * [ ] Supports removing a property. 50 | * [x] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 51 | ** Update support is self-reported. Quill only supports editing specific post types, and the test suite requires updates that Quill does not support. 52 | 53 | ## Deletes 54 | * [ ] Sends deletion requests using `x-www-form-urlencoded` syntax. 55 | * [ ] Sends deletion requests using JSON syntax. 56 | * [ ] Sends undeletion requests using `x-www-form-urlencoded` syntax. 57 | * [ ] Sends undeletion requests using JSON syntax. 58 | 59 | ## Querying 60 | * [x] 600: Queries the Micropub endpoint with `q=config` 61 | * [x] Looks in the response for the Media Endpoint 62 | * [x] Looks in the response for syndication targets 63 | * [x] 601: Queries the Micropub endpoint with `q=syndicate-to` 64 | * [x] 602: Queries the Micropub endpoint for a post's source content without specifying a list of properties 65 | * [x] 603: Queries the Micropub endpoint for a post's source content looking only for specific properties 66 | 67 | ## Extensions 68 | 69 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 70 | 71 | * `mp-slug` 72 | * `post-status` 73 | 74 | ## Vocabularies 75 | 76 | Please list all vocabularies and properties the client supports, if applicable. 77 | 78 | * Notes, Articles, Bookmarks, Likes, Reposts (http://microformats.org/wiki/h-entry) 79 | * content 80 | * content[html] 81 | * name 82 | * photo 83 | * category 84 | * in-reply-to 85 | * location (as a `geo://` URI, and as plaintext) 86 | * post-status (published, draft) 87 | * mp-syndicate-to 88 | * mp-slug 89 | * bookmark-of 90 | * like-of 91 | * repost-of 92 | * Events (http://microformats.org/wiki/h-event) 93 | * name 94 | * start 95 | * end 96 | * location (plaintext) 97 | * category 98 | * Itinerary 99 | * h-entry with an `itinerary` property containing one or more `h-leg` objects 100 | * Reviews (http://microformats.org/wiki/h-review) 101 | * h-product 102 | * rating 103 | * content 104 | * summary 105 | 106 | -------------------------------------------------------------------------------- /implementation-reports/CLIENT-TEMPLATE.md: -------------------------------------------------------------------------------- 1 | This file is a template implementation report for Micropub clients. Copy this file to a new `.md` file and change the name to your project name (lowercase with hyphens between words). Fill out the information based on the details of your implementation. It's okay to not check all the boxes, we are more interested in knowing how much of the spec is implemented than getting everyone to tick every box. When you are finished, submit a pull request or link to your file in a [new issue](https://github.com/w3c/micropub/issues). 2 | 3 | For items that have a number next to the checkbox, the number corresponds with the test number on [micropub.rocks](https://micropub.rocks/). You can use that tool to check whether you support the feature properly. To mark a statement as true, add an `x` between the brackets, e.g. `[x]`. If the statement does not apply to your implementation, use `[na]` and add a sentence explaining why it does not apply. 4 | 5 | Any items in the list below with double square brackets, (e.g. `[[ ]]`) will need to be self-reported, as there is no automated test that will check those off. Any items with single square brackets will be checked off for you as you progress through the tests on https://micropub.rocks. When a specific test corresponds with a checkbox, the test number is noted in the list. Some items such as authentication will be checked off from multiple tests. 6 | 7 | Please remove this top section before submitting your report. 8 | 9 | # Implementation Name (Replace this header) 10 | 11 | Implementation Home Page URL: 12 | 13 | Source code repo URL(s) (optional): 14 | * [ ] 100% open source implementation 15 | 16 | Programming Language(s): 17 | 18 | Developer(s): [Name](https://you.example.com) 19 | 20 | Answers are: 21 | * [ ] Confirmed via micropub.rocks 22 | * [ ] Self-reported 23 | 24 | ## Discovery 25 | * [ ] The client discovers the Micropub endpoint given the profile URL of a user (e.g. the sign-in form asks the user to enter their URL, which is used to find the Micropub endpoint) 26 | 27 | ## Authentication 28 | * [ ] The client sends the access token in the HTTP `Authorization` header. 29 | * [ ] The client sends the access token in the post body for `x-www-form-urlencoded` requests. 30 | * [ ] The client requests one or more `scope` values when obtaining user authorization. 31 | * (list scopes requested here) 32 | 33 | ## Syntax 34 | * [ ] 100: Creates posts using `x-www-form-urlencoded` syntax. 35 | * [ ] 200: Creates posts using JSON syntax. 36 | * [ ] 101: Creates posts using `x-www-form-urlencoded` syntax with multiple values of the same property name (e.g. tags). 37 | * [ ] 201: Creates posts using JSON syntax with multiple values of the same property name (e.g. tags). 38 | * [ ] 202: Creates posts with HTML content. (JSON) 39 | * [ ] 204: Creates posts using JSON syntax including a nested Microformats2 object. 40 | * [ ] 300: Creates posts including a file by sending the request as `multipart/form-data` to the Micropub endpoint. 41 | 42 | ## Creating Posts 43 | * [ ] 104: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (form-encoded) 44 | * [ ] 203: Allows creating posts with a photo referenced by URL rather than uploading the photo as a Multipart request. (JSON) 45 | * [ ] 205: Allows creating posts with a photo including image alt text. 46 | * [ ] Recognizes HTTP 201 and 202 with a `Location` header as a successful response from the Micropub endpoint. 47 | * [ ] 105: Allows the user to specify one or more syndication endpoints from their list of endpoints discovered in the `q=config` or `q=syndicate-to` query. 48 | 49 | ## Media Endpoint 50 | * [ ] 700: Checks to see if the Micropub endpoint specifies a Media Endpoint, and uploads photos there instead. 51 | * [[ ]] Uses multipart requests only as a fallback when there is no Media Endpoint specified. 52 | 53 | ## Updates 54 | * [ ] 400: Supports replacing all values of a property (e.g. replacing the post content). 55 | * [ ] 401: Supports adding a value to a property (e.g. adding a tag). 56 | * [ ] 402: Supports removing a value from a property (e.g. removing a specific tag). 57 | * [ ] 403: Supports removing a property. 58 | * [[ ]] Recognizes HTTP 200, 201 and 204 as a successful response from the Micropub endpoint. 59 | 60 | ## Deletes 61 | * [ ] 500: Sends deletion requests using `x-www-form-urlencoded` syntax. 62 | * [ ] 500: Sends deletion requests using JSON syntax. 63 | * [ ] 502: Sends undeletion requests using `x-www-form-urlencoded` syntax. 64 | * [ ] 502: Sends undeletion requests using JSON syntax. 65 | 66 | ## Querying 67 | * [ ] 600: Queries the Micropub endpoint with `q=config` 68 | * [[ ]] Looks in the response for the Media Endpoint 69 | * [[ ]] Looks in the response for syndication targets 70 | * [ ] 601: Queries the Micropub endpoint with `q=syndicate-to` 71 | * [ ] 602: Queries the Micropub endpoint for a post's source content without specifying a list of properties 72 | * [ ] 603: Queries the Micropub endpoint for a post's source content looking only for specific properties 73 | 74 | ## Extensions 75 | 76 | Please list any [Micropub extensions](https://indieweb.org/Micropub-extensions) that the client supports. 77 | 78 | ## Vocabularies 79 | 80 | Please list all vocabularies and properties the client supports, if applicable. 81 | 82 | ## Other Notes 83 | 84 | Please use this space to document anything else significant about your implementation. 85 | 86 | -------------------------------------------------------------------------------- /user-stories/SWAT0.md: -------------------------------------------------------------------------------- 1 | # SWAT0 2 | 3 | > 1. With his phone, ben takes a photo of aaronpk, tags him in the photo, and posts it to his site. 4 | > 2. aaronpk gets a notification that he's been tagged in a photo. 5 | > 3. kylewm, who is subscribed to benwerd, sees the photo in his reader UI. 6 | > 4. kylewm posts a reply to the photo on his site. 7 | > 5. aaronpk and ben receive notifications that kylewm has commented on the photo. 8 | 9 | From http://indiewebcamp.com/SWAT0, an adaptation of http://www.w3.org/2005/Incubator/federatedsocialweb/wiki/SWAT0 10 | 11 | # 1. Ben takes a photo of aaronpk 12 | 13 | > 1 With his phone, ben takes a photo of aaronpk, tags him in the photo, and posts it to his site. 14 | 15 | Ben takes a photo with his mobile phone, and uses the app's interface to indicate 16 | aaronpk is in the photo. His Micropub client on his phone makes a POST request to his Micropub 17 | endpoint. In addition to the standard h=entry and photo properties, it also includes 18 | a "category" property with a value of aaronpk's URL, which is the way to indicate tagging a person. 19 | See http://indiewebcamp.com/person-tag for more details. 20 | 21 | ``` 22 | POST /micropub HTTP/1.1 23 | Host: ben.thatmustbe.me 24 | Content-Type: multipart/form-data; boundary=AaB03x 25 | Authorization: Bearer xx-micropub-access-token-xx 26 | 27 | --AaB03x 28 | Content-Disposition: form-data; name="h" 29 | 30 | entry 31 | --AaB03x 32 | Content-Disposition: form-data; name="category" 33 | 34 | http://aaronparecki.com/ 35 | --AaB03x 36 | Content-Disposition: form-data; name="content" 37 | 38 | Aaronpk doing intros at IndieWebCamp 2015. 39 | --AaB03x 40 | Content-Disposition: form-data; name="photo"; filename="photo.jpg" 41 | Content-Type: image/jpeg 42 | 43 | ... encoded contents of photo.jpg ... 44 | --AaB03x-- 45 | ``` 46 | 47 | The endpoint creates a URL with the photo, and responds with the URL: 48 | 49 | ``` 50 | HTTP/1.1 201 Created 51 | Location: https://ben.thatmustbe.me/photo/2015/7/12/9/ 52 | ``` 53 | 54 | This URL contains an h-entry with the photo as well as the person tag. A minimal version 55 | of the markup may look like the following. 56 | 57 | ``` 58 |
59 |

Aaronpk doing intros at IndieWebCamp 2015.

60 | 61 | 62 | 65 |
66 | ``` 67 | 68 | 69 | 70 | # 2. Aaron gets a notification 71 | 72 | > 2 aaronpk gets a notification that he's been tagged in a photo. 73 | 74 | When ben's server creates the post, it also sends a webmention to Aaron's home page 75 | since the post contains a link to his site. 76 | 77 | ``` 78 | POST /webmention HTTP/1.1 79 | Host: aaronparecki.com 80 | Content-type: application/x-www-form-urlencoded 81 | 82 | source=https://ben.thatmustbe.me/photo/2015/7/12/9/ 83 | &target=http://aaronparecki.com/ 84 | ``` 85 | 86 | Aaron's server verifies the Webmention, fetching Ben's URL in the process. When checking 87 | for the link to the target URL as part of the verification process, his server 88 | notices the link is in the h-card object in the "category" list. This can be interpreted 89 | as a person tag (http://indiewebcamp.com/person-tagging) and Aaron's server can 90 | treat it different from a generic mention of his home page accordingly. 91 | 92 | Aaron's server recognizes Ben's post as a person tag and sends Aaron a push notification 93 | with the sentence "Ben tagged you in a photo". (The notification mechanism between 94 | Aaron's server and his phone is not part of the spec, and may be handled in any number 95 | of ways from a specific native app to an SMS notification.) 96 | 97 | 98 | # 3. Kyle sees Ben's photo 99 | 100 | > 3 kylewm, who is subscribed to ben, sees the photo in his reader UI. 101 | 102 | Kyle's reader app knows he is subscribed to ben, and so displays all of ben's 103 | posts in the reader UI. The reader can by default poll ben's website for new items, 104 | but this could be enhanced with PubSubHubbub. PuSH is not a requirement for this user 105 | story to be complete, although would provide a more realtime experience. 106 | 107 | Kyle's reader parses ben's website for new h-entry posts, the latest being the 108 | h-entry of this photo. The reader sees the "u-photo" property and and displays the photo 109 | on the page. 110 | 111 | 112 | # 4. Kyle posts a reply 113 | 114 | > 4 kylewm posts a reply to the photo on his site. 115 | 116 | Kyle's reader renders a comment box below the photo. When Kyle types a reply and 117 | hits "submit," his reader makes a Micropub request to his Micropub endpoint. 118 | 119 | ``` 120 | POST /micropub HTTP/1.1 121 | Host: kylewm.com 122 | Content-type: application/x-www-form-urlencoded 123 | Authorization: Bearer xx-micropub-access-token-xx 124 | 125 | h=entry 126 | &in-reply-to=https://ben.thatmustbe.me/photo/2015/7/12/9/ 127 | &content=Much+better+photo,+very+handsome,+not+so+sleepy+:) 128 | ``` 129 | 130 | His website handles the Micropub request, creating a reply post on his website. 131 | 132 | 133 | # 5. Aaron and Ben receive notifications 134 | 135 | > 5 aaronpk and ben receive notifications that kylewm has commented on the photo. 136 | 137 | After Kyle's Micropub endpoint creates the post, his website starts the Webmention 138 | process for the post. 139 | 140 | It sends a Webmention to Ben's post because Ben's post is the `in-reply-to` URL. 141 | 142 | ``` 143 | POST /webmention HTTP/1.1 144 | Host: ben.thatmustbe.me 145 | Content-type: application/x-www-form-urlencoded 146 | 147 | source=https://kylewm.com/2015/07/much-better-photo-very-handsome-not-so-sleepy 148 | &target=https://ben.thatmustbe.me/photo/2015/7/12/9/ 149 | ``` 150 | 151 | Ben's server receives the webmention request, verifies the link exists, and after 152 | parsing Kyle's reply URL, sees that it is an `in-reply-to` mention, meaning this 153 | is considered a "comment". Ben's server sends a notification to Ben that says 154 | "Kyle commented on your photo." 155 | 156 | Ben's server then stores this comment and renders it on the photo's permalink as a 157 | comment (see http://indiewebcamp.com/comments-presentation). Ben's HTML now looks 158 | similar to the below. 159 | 160 | ``` 161 |
162 |

Aaronpk doing intros at IndieWebCamp 2015.

163 | 164 | 165 | 168 | 169 |

Comments

170 | 176 |
177 | ``` 178 | 179 | Because this is an update to the contents of the URL, Ben's server re-sends the 180 | original Webmentions to indicate there was an update to the receiver. This practice 181 | is now known as [salmention](http://indiewebcamp.com/salmention). 182 | 183 | ``` 184 | POST /webmention HTTP/1.1 185 | Host: aaronparecki.com 186 | Content-type: application/x-www-form-urlencoded 187 | 188 | source=https://ben.thatmustbe.me/photo/2015/7/12/9/ 189 | &target=http://aaronparecki.com/ 190 | ``` 191 | 192 | Aaron's Webmention endpoint verifies the Webmention as normal, but recognizes that 193 | this source URL was already registered. Because of that, it then looks at the parsed 194 | Microformats checking for what changed since the first Webmention was sent. It 195 | sees there is a new property, `comment`, containing an h-cite. It constructs the sentence 196 | "Kyle commented on Ben's photo of you" from the following information: 197 | 198 | * Kyle: The `name` of the `author` of the first `comment` 199 | * Ben: The `author` of the main `h-entry`, as discovered by the authorship algorithm (root-level h-card not shown in this example HTML) 200 | * you: Because the `url` property of the `category` `h-card` matches Aaron's home page URL 201 | 202 | Aaron's server sends this notification to him. 203 | 204 | -------------------------------------------------------------------------------- /user-stories/responses.md: -------------------------------------------------------------------------------- 1 | # Responses 2 | 3 | > 1. Alexa posts a short video which is distributed to the inbox streams of her followers. 4 | > 2. Ben thinks it's a good video. He indicates to Alexa and others that he "likes" the video. 5 | > 3. Charles posts a comment on the video. "This is hilarious!" 6 | > 4. Denise indicates that she "likes" Charles's comment. 7 | > 5. Edgar post a comment on the video: "This sucks! Boo!" He thinks better of the sentiment and deletes the comment. 8 | > 6. Felicia indicates that she "likes" the video. She watches again and realizes that Alexa is making some pretty mean jokes about another friend. She indicates that she doesn't, actually, "like" the video. 9 | > 7. Ginny shares the video with her own followers. "Check out this great video by my friend Alexa!" 10 | 11 | From https://www.w3.org/wiki/Socialwg/Social_API/User_stories#Responses 12 | 13 | This user story covers a lot of ground. The examples below combine Micropub, Microformats, 14 | PubSubHubbub, and Webmention. For the sake of simplicity and readability of this document, 15 | I have left out the discovery portion of the specs. (For example, in order to send a Webmention, 16 | the Webmention endpoint must first be discovered from the post URL.) Omitting the 17 | discovery step from this example should not affect the narrative. 18 | 19 | 20 | ## 1. Alexa posts a video 21 | 22 | > 1. Alexa posts a short video... 23 | 24 | Alexa's client application makes a POST request to her Micropub endpoint to upload the video: 25 | 26 | ``` 27 | POST /micropub HTTP/1.1 28 | Host: alexa.me 29 | Content-Type: multipart/form-data; boundary=AaB03x 30 | Authorization: Bearer xx-micropub-access-token-xx 31 | 32 | --AaB03x 33 | Content-Disposition: form-data; name="h" 34 | 35 | entry 36 | --AaB03x 37 | Content-Disposition: form-data; name="video"; filename="video.mp4" 38 | Content-Type: video/mp4 39 | 40 | ... encoded contents of video.mp4 ... 41 | --AaB03x-- 42 | ``` 43 | 44 | The endpoint creates a URL with the video, and responds with the URL: 45 | 46 | ``` 47 | HTTP/1.1 201 Created 48 | Location: https://alexa.me/entry/100 49 | ``` 50 | 51 | Note that this URL actually corresponds to an HTML page of the h-entry that contains 52 | the video, it is not the actual video file itself. The location of the video file can be 53 | found by parsing the URL for the h-entry microformat and looking for the "video" 54 | property. 55 | 56 | > ...which is distributed to the inbox streams of her followers. 57 | 58 | Alexa sends a PubSubHubbub ping to her hub indicating there is new content in her main feed. 59 | 60 | ``` 61 | POST / HTTP/1.1 62 | Host: pubsubhubbub.superfeedr.com 63 | Content-type: application/x-www-form-urlencoded 64 | 65 | hub.mode=publish 66 | &hub.url=https://alexa.me/ 67 | ``` 68 | 69 | The hub is responsible for iterating through the list of subscribers and sending the 70 | update to them. Each subscriber will receive a ping that contains the video update HTML 71 | or a "thin ping" depending on how the subscriber is configured. 72 | 73 | The subscribers will receive the ping from the PubSubHubbub hub, and parse it looking 74 | for an h-entry post. 75 | 76 | 77 | ## 2. Ben likes the video 78 | 79 | > 2. Ben thinks it's a good video. He indicates to Alexa and others that he "likes" the video. 80 | 81 | Ben sees the video in his reader (which may be part of his website or could be a third-party 82 | application), and the reader presents him with a "like" button. He taps the "like" button 83 | which causes the reader to make a Micropub request to his website to create the "like" post. 84 | 85 | ``` 86 | POST /micropub HTTP/1.1 87 | Host: ben.me 88 | Content-type: application/x-www-form-urlencoded 89 | Authorization: Bearer xx-micropub-access-token-xx 90 | 91 | h=entry 92 | &like-of=https://alexa.me/entry/100 93 | ``` 94 | 95 | The Micropub endpoint creates the "like" post and returns the URL. 96 | 97 | ``` 98 | HTTP/1.1 201 Created 99 | Location: https://ben.me/entry/200 100 | ``` 101 | 102 | > ...indicates to Alexa... 103 | 104 | Ben's server, after receiving the Micropub request and creating the post, then sends 105 | a Webmention to Alexa's Webmention endpoint to notify her of the "like". 106 | 107 | ``` 108 | POST /webmention HTTP/1.1 109 | Host: alexa.me 110 | Content-type: application/x-www-form-urlencoded 111 | 112 | source=https://ben.me/entry/200 113 | &target=https://alexa.me/entry/100 114 | ``` 115 | 116 | > ...and others... 117 | 118 | (It's not clear from the story whether "others" refers to Alexa's followers, Ben's 119 | followers, or both.) 120 | 121 | Ben's server publishes this "like" post to anyone following his feed, by sending a 122 | PubSubHubbub ping to his hub. 123 | 124 | ``` 125 | POST / HTTP/1.1 126 | Host: pubsubhubbub.superfeedr.com 127 | Content-type: application/x-www-form-urlencoded 128 | 129 | hub.mode=publish 130 | &hub.url=https://ben.me/ 131 | ``` 132 | 133 | Ben's followers will see his "like" post. 134 | 135 | Separately, Alexa's server verifies and accepts the Webmention of the "like" and includes it on 136 | the entry URL and on the entry when rendered in a list. Alexa's server pings the hub 137 | again to notify subscribers that the post has changed (the post has a new like). 138 | 139 | ``` 140 | POST / HTTP/1.1 141 | Host: pubsubhubbub.superfeedr.com 142 | Content-type: application/x-www-form-urlencoded 143 | 144 | hub.mode=publish 145 | &hub.url=https://alexa.me/ 146 | ``` 147 | 148 | TODO: If the post is no longer on the front page, Alexa's followers won't see Ben's "like" 149 | post from this ping. We may need to add some sort of mechanism for notifying 150 | subscribers of updates to older posts. This may need to be an extension of PubSubHubbub, 151 | or could be accomplished by describing the desired behavior of PubSubHubbub consumers. 152 | 153 | 154 | 155 | ## 3. Charles posts a comment 156 | 157 | > 3. Charles posts a comment on the video. "This is hilarious!" 158 | 159 | Charles comments from his reader, which makes a Micropub request to his website to 160 | create the comment. 161 | 162 | ``` 163 | POST /micropub HTTP/1.1 164 | Host: charles.me 165 | Content-type: application/x-www-form-urlencoded 166 | Authorization: Bearer xx-micropub-access-token-xx 167 | 168 | h=entry 169 | &in-reply-to=https://alexa.me/entry/100 170 | &content=This+is+hilarious! 171 | ``` 172 | 173 | The Micropub endpoint creates the "reply" post and returns the URL. 174 | 175 | ``` 176 | HTTP/1.1 201 Created 177 | Location: https://charles.me/entry/300 178 | ``` 179 | 180 | Charles' server then sends a Webmention to Alexa's server notifying her of the comment. 181 | 182 | ``` 183 | POST /webmention HTTP/1.1 184 | Host: alexa.me 185 | Content-type: application/x-www-form-urlencoded 186 | 187 | source=https://charles.me/entry/300 188 | &target=https://alexa.me/entry/100 189 | ``` 190 | 191 | Alexa's server verifies and accepts the Webmention of the "comment" and includes it on 192 | the entry URL and on the entry when rendered in a list. Alexa's server pings the hub 193 | again to notify subscribers that the post has changed (the post has a new comment). 194 | 195 | ``` 196 | POST / HTTP/1.1 197 | Host: pubsubhubbub.superfeedr.com 198 | Content-type: application/x-www-form-urlencoded 199 | 200 | hub.mode=publish 201 | &hub.url=https://alexa.me/ 202 | ``` 203 | 204 | 205 | ## 4. Denise likes a comment 206 | 207 | > 4. Denise indicates that she "likes" Charles's comment. 208 | 209 | Denise's reader has received the ping about Alexa's updated post, fetching the post 210 | and parsing the h-entry and embedded likes and comments. Denise sees a "like" button 211 | next to Charles' comment and clicks it. This causes her reader to make a Micropub 212 | request to her server, with the "like-of" URL set to the URL of Charles' comment. 213 | 214 | ``` 215 | POST /micropub HTTP/1.1 216 | Host: denise.me 217 | Content-type: application/x-www-form-urlencoded 218 | Authorization: Bearer xx-micropub-access-token-xx 219 | 220 | h=entry 221 | &like-of=https://charles.me/entry/300 222 | ``` 223 | 224 | The Micropub endpoint creates the "like" post and returns the URL. 225 | 226 | ``` 227 | HTTP/1.1 201 Created 228 | Location: https://denise.me/entry/400 229 | ``` 230 | 231 | Denise's server then sends a Webmention to Charles's server notifying him of the like. 232 | 233 | ``` 234 | POST /webmention HTTP/1.1 235 | Host: denise.me 236 | Content-type: application/x-www-form-urlencoded 237 | 238 | source=https://denise.me/entry/400 239 | &target=https://charles.me/entry/300 240 | ``` 241 | 242 | Charles' server verifies and accepts the Webmention of the like, and includes it when 243 | rendering Charles' comment. Because this like was just added, Charles' server treats 244 | this as an update to the post, so sends a Webmention for the comment again. This results 245 | in sending a Webmention to Alexa's server again, the same one that was sent when 246 | Charles originally posted his comment. 247 | 248 | ``` 249 | POST /webmention HTTP/1.1 250 | Host: alexa.me 251 | Content-type: application/x-www-form-urlencoded 252 | 253 | source=https://charles.me/entry/300 254 | &target=https://alexa.me/entry/100 255 | ``` 256 | 257 | Alexa's server verifies and accepts this webmention, parses the microformats on the page 258 | and notices the addition of the new like. Alexa's server can now render Denise's "like" 259 | of Charles' comment when displaying the post. 260 | 261 | 262 | # 5. Deleting a comment 263 | 264 | > 5. Edgar post a comment on the video: "This sucks! Boo!"... 265 | 266 | Edgar comments from his reader, which makes a Micropub request to his website to 267 | create the comment. 268 | 269 | ``` 270 | POST /micropub HTTP/1.1 271 | Host: edgar.me 272 | Content-type: application/x-www-form-urlencoded 273 | Authorization: Bearer xx-micropub-access-token-xx 274 | 275 | h=entry 276 | &in-reply-to=https://alexa.me/entry/100 277 | &content=This+sucks!+Boo! 278 | ``` 279 | 280 | The Micropub endpoint creates the "reply" post and returns the URL. 281 | 282 | ``` 283 | HTTP/1.1 201 Created 284 | Location: https://edgar.me/entry/500 285 | ``` 286 | 287 | Edgar's server then sends a Webmention to Alexa's server notifying her of the comment. 288 | 289 | ``` 290 | POST /webmention HTTP/1.1 291 | Host: alexa.me 292 | Content-type: application/x-www-form-urlencoded 293 | 294 | source=https://edgar.me/entry/500 295 | &target=https://alexa.me/entry/100 296 | ``` 297 | 298 | Alexa's server verifies and accepts the Webmention of the "comment" and includes it on 299 | the entry URL and on the entry when rendered in a list. Alexa's server pings the hub 300 | again to notify subscribers that the post has changed (the post has a new comment). 301 | 302 | ``` 303 | POST / HTTP/1.1 304 | Host: pubsubhubbub.superfeedr.com 305 | Content-type: application/x-www-form-urlencoded 306 | 307 | hub.mode=publish 308 | &hub.url=https://alexa.me/ 309 | ``` 310 | 311 | > ...He thinks better of the sentiment and deletes the comment. 312 | 313 | Edgar clicks the "delete" button from his reader, which makes the Micropub request 314 | to his server to delete the comment. 315 | 316 | ``` 317 | POST /micropub HTTP/1.1 318 | Host: edgar.me 319 | Content-type: application/x-www-form-urlencoded 320 | Authorization: Bearer xx-micropub-access-token-xx 321 | 322 | mp-action=delete 323 | &url=https://edgar.me/entry/500 324 | ``` 325 | 326 | Edgar's server deletes the post, and will return `HTTP 410 Gone` when this URL is 327 | requested in the future. Edgar's server then sends a webmention for the deleted URL. 328 | 329 | ``` 330 | POST /webmention HTTP/1.1 331 | Host: alexa.me 332 | Content-type: application/x-www-form-urlencoded 333 | 334 | source=https://edgar.me/entry/500 335 | &target=https://alexa.me/entry/100 336 | ``` 337 | 338 | Alexa's server fetches `https://edgar.me/entry/500` while verifying the Webmention 339 | and notices the `HTTP 410` status code indicating the comment was deleted. Alexa's 340 | server deletes the comment and sends the PubSubHubbub ping again. 341 | 342 | 343 | # 6. Liking and deleting a like 344 | 345 | > 6. Felicia indicates that she "likes" the video. She watches again and realizes that Alexa is making some pretty mean jokes about another friend. She indicates that she doesn't, actually, "like" the video. 346 | 347 | This part is equivalent to #5 so I will not bother repeating it here. The same pattern 348 | of requests is made, except using "like-of" instead of "in-reply-to". 349 | 350 | 351 | # 7. Sharing a post 352 | 353 | > 7. Ginny shares the video with her own followers. "Check out this great video by my friend Alexa!" 354 | 355 | Ginny, having seen Alexa's video in her reader, clicks the "share" button in her reader. 356 | A "share" dialog appears, giving Ginny a place to enter text for her post, which is pre-filled 357 | with the URL of Alexa's video. Ginny types her note and clicks "post" which causes her 358 | reader to make a Micropub request to her site. 359 | 360 | ``` 361 | POST /micropub HTTP/1.1 362 | Host: ginny.me 363 | Content-type: application/x-www-form-urlencoded 364 | Authorization: Bearer xx-micropub-access-token-xx 365 | 366 | h=entry 367 | &content=Check+out+this+great+video+by+my+friend+Alexa!+https://alexa.me/entry/100 368 | ``` 369 | 370 | Ginny's server creates the post, and renders it as a normal h-entry note that contains 371 | a link to Alexa's video. There is no special markup added around the link since this 372 | is not an explicit comment (in-reply-to). 373 | 374 | Ginny's server sends a Webmention to Alexa's server to announce the link to her post. 375 | 376 | ``` 377 | POST /webmention HTTP/1.1 378 | Host: alexa.me 379 | Content-type: application/x-www-form-urlencoded 380 | 381 | source=https://ginny.me/entry/600 382 | &target=https://alexa.me/entry/100 383 | ``` 384 | 385 | -------------------------------------------------------------------------------- /assets/font-awesome-4.6.3/css/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} 5 | -------------------------------------------------------------------------------- /assets/font-awesome-4.6.3/css/font-awesome.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | /* FONT PATH 6 | * -------------------------- */ 7 | @font-face { 8 | font-family: 'FontAwesome'; 9 | src: url('../fonts/fontawesome-webfont.eot?v=4.6.3'); 10 | src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg'); 11 | font-weight: normal; 12 | font-style: normal; 13 | } 14 | .fa { 15 | display: inline-block; 16 | font: normal normal normal 14px/1 FontAwesome; 17 | font-size: inherit; 18 | text-rendering: auto; 19 | -webkit-font-smoothing: antialiased; 20 | -moz-osx-font-smoothing: grayscale; 21 | } 22 | /* makes the font 33% larger relative to the icon container */ 23 | .fa-lg { 24 | font-size: 1.33333333em; 25 | line-height: 0.75em; 26 | vertical-align: -15%; 27 | } 28 | .fa-2x { 29 | font-size: 2em; 30 | } 31 | .fa-3x { 32 | font-size: 3em; 33 | } 34 | .fa-4x { 35 | font-size: 4em; 36 | } 37 | .fa-5x { 38 | font-size: 5em; 39 | } 40 | .fa-fw { 41 | width: 1.28571429em; 42 | text-align: center; 43 | } 44 | .fa-ul { 45 | padding-left: 0; 46 | margin-left: 2.14285714em; 47 | list-style-type: none; 48 | } 49 | .fa-ul > li { 50 | position: relative; 51 | } 52 | .fa-li { 53 | position: absolute; 54 | left: -2.14285714em; 55 | width: 2.14285714em; 56 | top: 0.14285714em; 57 | text-align: center; 58 | } 59 | .fa-li.fa-lg { 60 | left: -1.85714286em; 61 | } 62 | .fa-border { 63 | padding: .2em .25em .15em; 64 | border: solid 0.08em #eeeeee; 65 | border-radius: .1em; 66 | } 67 | .fa-pull-left { 68 | float: left; 69 | } 70 | .fa-pull-right { 71 | float: right; 72 | } 73 | .fa.fa-pull-left { 74 | margin-right: .3em; 75 | } 76 | .fa.fa-pull-right { 77 | margin-left: .3em; 78 | } 79 | /* Deprecated as of 4.4.0 */ 80 | .pull-right { 81 | float: right; 82 | } 83 | .pull-left { 84 | float: left; 85 | } 86 | .fa.pull-left { 87 | margin-right: .3em; 88 | } 89 | .fa.pull-right { 90 | margin-left: .3em; 91 | } 92 | .fa-spin { 93 | -webkit-animation: fa-spin 2s infinite linear; 94 | animation: fa-spin 2s infinite linear; 95 | } 96 | .fa-pulse { 97 | -webkit-animation: fa-spin 1s infinite steps(8); 98 | animation: fa-spin 1s infinite steps(8); 99 | } 100 | @-webkit-keyframes fa-spin { 101 | 0% { 102 | -webkit-transform: rotate(0deg); 103 | transform: rotate(0deg); 104 | } 105 | 100% { 106 | -webkit-transform: rotate(359deg); 107 | transform: rotate(359deg); 108 | } 109 | } 110 | @keyframes fa-spin { 111 | 0% { 112 | -webkit-transform: rotate(0deg); 113 | transform: rotate(0deg); 114 | } 115 | 100% { 116 | -webkit-transform: rotate(359deg); 117 | transform: rotate(359deg); 118 | } 119 | } 120 | .fa-rotate-90 { 121 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; 122 | -webkit-transform: rotate(90deg); 123 | -ms-transform: rotate(90deg); 124 | transform: rotate(90deg); 125 | } 126 | .fa-rotate-180 { 127 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; 128 | -webkit-transform: rotate(180deg); 129 | -ms-transform: rotate(180deg); 130 | transform: rotate(180deg); 131 | } 132 | .fa-rotate-270 { 133 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; 134 | -webkit-transform: rotate(270deg); 135 | -ms-transform: rotate(270deg); 136 | transform: rotate(270deg); 137 | } 138 | .fa-flip-horizontal { 139 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; 140 | -webkit-transform: scale(-1, 1); 141 | -ms-transform: scale(-1, 1); 142 | transform: scale(-1, 1); 143 | } 144 | .fa-flip-vertical { 145 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; 146 | -webkit-transform: scale(1, -1); 147 | -ms-transform: scale(1, -1); 148 | transform: scale(1, -1); 149 | } 150 | :root .fa-rotate-90, 151 | :root .fa-rotate-180, 152 | :root .fa-rotate-270, 153 | :root .fa-flip-horizontal, 154 | :root .fa-flip-vertical { 155 | filter: none; 156 | } 157 | .fa-stack { 158 | position: relative; 159 | display: inline-block; 160 | width: 2em; 161 | height: 2em; 162 | line-height: 2em; 163 | vertical-align: middle; 164 | } 165 | .fa-stack-1x, 166 | .fa-stack-2x { 167 | position: absolute; 168 | left: 0; 169 | width: 100%; 170 | text-align: center; 171 | } 172 | .fa-stack-1x { 173 | line-height: inherit; 174 | } 175 | .fa-stack-2x { 176 | font-size: 2em; 177 | } 178 | .fa-inverse { 179 | color: #ffffff; 180 | } 181 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 182 | readers do not read off random characters that represent icons */ 183 | .fa-glass:before { 184 | content: "\f000"; 185 | } 186 | .fa-music:before { 187 | content: "\f001"; 188 | } 189 | .fa-search:before { 190 | content: "\f002"; 191 | } 192 | .fa-envelope-o:before { 193 | content: "\f003"; 194 | } 195 | .fa-heart:before { 196 | content: "\f004"; 197 | } 198 | .fa-star:before { 199 | content: "\f005"; 200 | } 201 | .fa-star-o:before { 202 | content: "\f006"; 203 | } 204 | .fa-user:before { 205 | content: "\f007"; 206 | } 207 | .fa-film:before { 208 | content: "\f008"; 209 | } 210 | .fa-th-large:before { 211 | content: "\f009"; 212 | } 213 | .fa-th:before { 214 | content: "\f00a"; 215 | } 216 | .fa-th-list:before { 217 | content: "\f00b"; 218 | } 219 | .fa-check:before { 220 | content: "\f00c"; 221 | } 222 | .fa-remove:before, 223 | .fa-close:before, 224 | .fa-times:before { 225 | content: "\f00d"; 226 | } 227 | .fa-search-plus:before { 228 | content: "\f00e"; 229 | } 230 | .fa-search-minus:before { 231 | content: "\f010"; 232 | } 233 | .fa-power-off:before { 234 | content: "\f011"; 235 | } 236 | .fa-signal:before { 237 | content: "\f012"; 238 | } 239 | .fa-gear:before, 240 | .fa-cog:before { 241 | content: "\f013"; 242 | } 243 | .fa-trash-o:before { 244 | content: "\f014"; 245 | } 246 | .fa-home:before { 247 | content: "\f015"; 248 | } 249 | .fa-file-o:before { 250 | content: "\f016"; 251 | } 252 | .fa-clock-o:before { 253 | content: "\f017"; 254 | } 255 | .fa-road:before { 256 | content: "\f018"; 257 | } 258 | .fa-download:before { 259 | content: "\f019"; 260 | } 261 | .fa-arrow-circle-o-down:before { 262 | content: "\f01a"; 263 | } 264 | .fa-arrow-circle-o-up:before { 265 | content: "\f01b"; 266 | } 267 | .fa-inbox:before { 268 | content: "\f01c"; 269 | } 270 | .fa-play-circle-o:before { 271 | content: "\f01d"; 272 | } 273 | .fa-rotate-right:before, 274 | .fa-repeat:before { 275 | content: "\f01e"; 276 | } 277 | .fa-refresh:before { 278 | content: "\f021"; 279 | } 280 | .fa-list-alt:before { 281 | content: "\f022"; 282 | } 283 | .fa-lock:before { 284 | content: "\f023"; 285 | } 286 | .fa-flag:before { 287 | content: "\f024"; 288 | } 289 | .fa-headphones:before { 290 | content: "\f025"; 291 | } 292 | .fa-volume-off:before { 293 | content: "\f026"; 294 | } 295 | .fa-volume-down:before { 296 | content: "\f027"; 297 | } 298 | .fa-volume-up:before { 299 | content: "\f028"; 300 | } 301 | .fa-qrcode:before { 302 | content: "\f029"; 303 | } 304 | .fa-barcode:before { 305 | content: "\f02a"; 306 | } 307 | .fa-tag:before { 308 | content: "\f02b"; 309 | } 310 | .fa-tags:before { 311 | content: "\f02c"; 312 | } 313 | .fa-book:before { 314 | content: "\f02d"; 315 | } 316 | .fa-bookmark:before { 317 | content: "\f02e"; 318 | } 319 | .fa-print:before { 320 | content: "\f02f"; 321 | } 322 | .fa-camera:before { 323 | content: "\f030"; 324 | } 325 | .fa-font:before { 326 | content: "\f031"; 327 | } 328 | .fa-bold:before { 329 | content: "\f032"; 330 | } 331 | .fa-italic:before { 332 | content: "\f033"; 333 | } 334 | .fa-text-height:before { 335 | content: "\f034"; 336 | } 337 | .fa-text-width:before { 338 | content: "\f035"; 339 | } 340 | .fa-align-left:before { 341 | content: "\f036"; 342 | } 343 | .fa-align-center:before { 344 | content: "\f037"; 345 | } 346 | .fa-align-right:before { 347 | content: "\f038"; 348 | } 349 | .fa-align-justify:before { 350 | content: "\f039"; 351 | } 352 | .fa-list:before { 353 | content: "\f03a"; 354 | } 355 | .fa-dedent:before, 356 | .fa-outdent:before { 357 | content: "\f03b"; 358 | } 359 | .fa-indent:before { 360 | content: "\f03c"; 361 | } 362 | .fa-video-camera:before { 363 | content: "\f03d"; 364 | } 365 | .fa-photo:before, 366 | .fa-image:before, 367 | .fa-picture-o:before { 368 | content: "\f03e"; 369 | } 370 | .fa-pencil:before { 371 | content: "\f040"; 372 | } 373 | .fa-map-marker:before { 374 | content: "\f041"; 375 | } 376 | .fa-adjust:before { 377 | content: "\f042"; 378 | } 379 | .fa-tint:before { 380 | content: "\f043"; 381 | } 382 | .fa-edit:before, 383 | .fa-pencil-square-o:before { 384 | content: "\f044"; 385 | } 386 | .fa-share-square-o:before { 387 | content: "\f045"; 388 | } 389 | .fa-check-square-o:before { 390 | content: "\f046"; 391 | } 392 | .fa-arrows:before { 393 | content: "\f047"; 394 | } 395 | .fa-step-backward:before { 396 | content: "\f048"; 397 | } 398 | .fa-fast-backward:before { 399 | content: "\f049"; 400 | } 401 | .fa-backward:before { 402 | content: "\f04a"; 403 | } 404 | .fa-play:before { 405 | content: "\f04b"; 406 | } 407 | .fa-pause:before { 408 | content: "\f04c"; 409 | } 410 | .fa-stop:before { 411 | content: "\f04d"; 412 | } 413 | .fa-forward:before { 414 | content: "\f04e"; 415 | } 416 | .fa-fast-forward:before { 417 | content: "\f050"; 418 | } 419 | .fa-step-forward:before { 420 | content: "\f051"; 421 | } 422 | .fa-eject:before { 423 | content: "\f052"; 424 | } 425 | .fa-chevron-left:before { 426 | content: "\f053"; 427 | } 428 | .fa-chevron-right:before { 429 | content: "\f054"; 430 | } 431 | .fa-plus-circle:before { 432 | content: "\f055"; 433 | } 434 | .fa-minus-circle:before { 435 | content: "\f056"; 436 | } 437 | .fa-times-circle:before { 438 | content: "\f057"; 439 | } 440 | .fa-check-circle:before { 441 | content: "\f058"; 442 | } 443 | .fa-question-circle:before { 444 | content: "\f059"; 445 | } 446 | .fa-info-circle:before { 447 | content: "\f05a"; 448 | } 449 | .fa-crosshairs:before { 450 | content: "\f05b"; 451 | } 452 | .fa-times-circle-o:before { 453 | content: "\f05c"; 454 | } 455 | .fa-check-circle-o:before { 456 | content: "\f05d"; 457 | } 458 | .fa-ban:before { 459 | content: "\f05e"; 460 | } 461 | .fa-arrow-left:before { 462 | content: "\f060"; 463 | } 464 | .fa-arrow-right:before { 465 | content: "\f061"; 466 | } 467 | .fa-arrow-up:before { 468 | content: "\f062"; 469 | } 470 | .fa-arrow-down:before { 471 | content: "\f063"; 472 | } 473 | .fa-mail-forward:before, 474 | .fa-share:before { 475 | content: "\f064"; 476 | } 477 | .fa-expand:before { 478 | content: "\f065"; 479 | } 480 | .fa-compress:before { 481 | content: "\f066"; 482 | } 483 | .fa-plus:before { 484 | content: "\f067"; 485 | } 486 | .fa-minus:before { 487 | content: "\f068"; 488 | } 489 | .fa-asterisk:before { 490 | content: "\f069"; 491 | } 492 | .fa-exclamation-circle:before { 493 | content: "\f06a"; 494 | } 495 | .fa-gift:before { 496 | content: "\f06b"; 497 | } 498 | .fa-leaf:before { 499 | content: "\f06c"; 500 | } 501 | .fa-fire:before { 502 | content: "\f06d"; 503 | } 504 | .fa-eye:before { 505 | content: "\f06e"; 506 | } 507 | .fa-eye-slash:before { 508 | content: "\f070"; 509 | } 510 | .fa-warning:before, 511 | .fa-exclamation-triangle:before { 512 | content: "\f071"; 513 | } 514 | .fa-plane:before { 515 | content: "\f072"; 516 | } 517 | .fa-calendar:before { 518 | content: "\f073"; 519 | } 520 | .fa-random:before { 521 | content: "\f074"; 522 | } 523 | .fa-comment:before { 524 | content: "\f075"; 525 | } 526 | .fa-magnet:before { 527 | content: "\f076"; 528 | } 529 | .fa-chevron-up:before { 530 | content: "\f077"; 531 | } 532 | .fa-chevron-down:before { 533 | content: "\f078"; 534 | } 535 | .fa-retweet:before { 536 | content: "\f079"; 537 | } 538 | .fa-shopping-cart:before { 539 | content: "\f07a"; 540 | } 541 | .fa-folder:before { 542 | content: "\f07b"; 543 | } 544 | .fa-folder-open:before { 545 | content: "\f07c"; 546 | } 547 | .fa-arrows-v:before { 548 | content: "\f07d"; 549 | } 550 | .fa-arrows-h:before { 551 | content: "\f07e"; 552 | } 553 | .fa-bar-chart-o:before, 554 | .fa-bar-chart:before { 555 | content: "\f080"; 556 | } 557 | .fa-twitter-square:before { 558 | content: "\f081"; 559 | } 560 | .fa-facebook-square:before { 561 | content: "\f082"; 562 | } 563 | .fa-camera-retro:before { 564 | content: "\f083"; 565 | } 566 | .fa-key:before { 567 | content: "\f084"; 568 | } 569 | .fa-gears:before, 570 | .fa-cogs:before { 571 | content: "\f085"; 572 | } 573 | .fa-comments:before { 574 | content: "\f086"; 575 | } 576 | .fa-thumbs-o-up:before { 577 | content: "\f087"; 578 | } 579 | .fa-thumbs-o-down:before { 580 | content: "\f088"; 581 | } 582 | .fa-star-half:before { 583 | content: "\f089"; 584 | } 585 | .fa-heart-o:before { 586 | content: "\f08a"; 587 | } 588 | .fa-sign-out:before { 589 | content: "\f08b"; 590 | } 591 | .fa-linkedin-square:before { 592 | content: "\f08c"; 593 | } 594 | .fa-thumb-tack:before { 595 | content: "\f08d"; 596 | } 597 | .fa-external-link:before { 598 | content: "\f08e"; 599 | } 600 | .fa-sign-in:before { 601 | content: "\f090"; 602 | } 603 | .fa-trophy:before { 604 | content: "\f091"; 605 | } 606 | .fa-github-square:before { 607 | content: "\f092"; 608 | } 609 | .fa-upload:before { 610 | content: "\f093"; 611 | } 612 | .fa-lemon-o:before { 613 | content: "\f094"; 614 | } 615 | .fa-phone:before { 616 | content: "\f095"; 617 | } 618 | .fa-square-o:before { 619 | content: "\f096"; 620 | } 621 | .fa-bookmark-o:before { 622 | content: "\f097"; 623 | } 624 | .fa-phone-square:before { 625 | content: "\f098"; 626 | } 627 | .fa-twitter:before { 628 | content: "\f099"; 629 | } 630 | .fa-facebook-f:before, 631 | .fa-facebook:before { 632 | content: "\f09a"; 633 | } 634 | .fa-github:before { 635 | content: "\f09b"; 636 | } 637 | .fa-unlock:before { 638 | content: "\f09c"; 639 | } 640 | .fa-credit-card:before { 641 | content: "\f09d"; 642 | } 643 | .fa-feed:before, 644 | .fa-rss:before { 645 | content: "\f09e"; 646 | } 647 | .fa-hdd-o:before { 648 | content: "\f0a0"; 649 | } 650 | .fa-bullhorn:before { 651 | content: "\f0a1"; 652 | } 653 | .fa-bell:before { 654 | content: "\f0f3"; 655 | } 656 | .fa-certificate:before { 657 | content: "\f0a3"; 658 | } 659 | .fa-hand-o-right:before { 660 | content: "\f0a4"; 661 | } 662 | .fa-hand-o-left:before { 663 | content: "\f0a5"; 664 | } 665 | .fa-hand-o-up:before { 666 | content: "\f0a6"; 667 | } 668 | .fa-hand-o-down:before { 669 | content: "\f0a7"; 670 | } 671 | .fa-arrow-circle-left:before { 672 | content: "\f0a8"; 673 | } 674 | .fa-arrow-circle-right:before { 675 | content: "\f0a9"; 676 | } 677 | .fa-arrow-circle-up:before { 678 | content: "\f0aa"; 679 | } 680 | .fa-arrow-circle-down:before { 681 | content: "\f0ab"; 682 | } 683 | .fa-globe:before { 684 | content: "\f0ac"; 685 | } 686 | .fa-wrench:before { 687 | content: "\f0ad"; 688 | } 689 | .fa-tasks:before { 690 | content: "\f0ae"; 691 | } 692 | .fa-filter:before { 693 | content: "\f0b0"; 694 | } 695 | .fa-briefcase:before { 696 | content: "\f0b1"; 697 | } 698 | .fa-arrows-alt:before { 699 | content: "\f0b2"; 700 | } 701 | .fa-group:before, 702 | .fa-users:before { 703 | content: "\f0c0"; 704 | } 705 | .fa-chain:before, 706 | .fa-link:before { 707 | content: "\f0c1"; 708 | } 709 | .fa-cloud:before { 710 | content: "\f0c2"; 711 | } 712 | .fa-flask:before { 713 | content: "\f0c3"; 714 | } 715 | .fa-cut:before, 716 | .fa-scissors:before { 717 | content: "\f0c4"; 718 | } 719 | .fa-copy:before, 720 | .fa-files-o:before { 721 | content: "\f0c5"; 722 | } 723 | .fa-paperclip:before { 724 | content: "\f0c6"; 725 | } 726 | .fa-save:before, 727 | .fa-floppy-o:before { 728 | content: "\f0c7"; 729 | } 730 | .fa-square:before { 731 | content: "\f0c8"; 732 | } 733 | .fa-navicon:before, 734 | .fa-reorder:before, 735 | .fa-bars:before { 736 | content: "\f0c9"; 737 | } 738 | .fa-list-ul:before { 739 | content: "\f0ca"; 740 | } 741 | .fa-list-ol:before { 742 | content: "\f0cb"; 743 | } 744 | .fa-strikethrough:before { 745 | content: "\f0cc"; 746 | } 747 | .fa-underline:before { 748 | content: "\f0cd"; 749 | } 750 | .fa-table:before { 751 | content: "\f0ce"; 752 | } 753 | .fa-magic:before { 754 | content: "\f0d0"; 755 | } 756 | .fa-truck:before { 757 | content: "\f0d1"; 758 | } 759 | .fa-pinterest:before { 760 | content: "\f0d2"; 761 | } 762 | .fa-pinterest-square:before { 763 | content: "\f0d3"; 764 | } 765 | .fa-google-plus-square:before { 766 | content: "\f0d4"; 767 | } 768 | .fa-google-plus:before { 769 | content: "\f0d5"; 770 | } 771 | .fa-money:before { 772 | content: "\f0d6"; 773 | } 774 | .fa-caret-down:before { 775 | content: "\f0d7"; 776 | } 777 | .fa-caret-up:before { 778 | content: "\f0d8"; 779 | } 780 | .fa-caret-left:before { 781 | content: "\f0d9"; 782 | } 783 | .fa-caret-right:before { 784 | content: "\f0da"; 785 | } 786 | .fa-columns:before { 787 | content: "\f0db"; 788 | } 789 | .fa-unsorted:before, 790 | .fa-sort:before { 791 | content: "\f0dc"; 792 | } 793 | .fa-sort-down:before, 794 | .fa-sort-desc:before { 795 | content: "\f0dd"; 796 | } 797 | .fa-sort-up:before, 798 | .fa-sort-asc:before { 799 | content: "\f0de"; 800 | } 801 | .fa-envelope:before { 802 | content: "\f0e0"; 803 | } 804 | .fa-linkedin:before { 805 | content: "\f0e1"; 806 | } 807 | .fa-rotate-left:before, 808 | .fa-undo:before { 809 | content: "\f0e2"; 810 | } 811 | .fa-legal:before, 812 | .fa-gavel:before { 813 | content: "\f0e3"; 814 | } 815 | .fa-dashboard:before, 816 | .fa-tachometer:before { 817 | content: "\f0e4"; 818 | } 819 | .fa-comment-o:before { 820 | content: "\f0e5"; 821 | } 822 | .fa-comments-o:before { 823 | content: "\f0e6"; 824 | } 825 | .fa-flash:before, 826 | .fa-bolt:before { 827 | content: "\f0e7"; 828 | } 829 | .fa-sitemap:before { 830 | content: "\f0e8"; 831 | } 832 | .fa-umbrella:before { 833 | content: "\f0e9"; 834 | } 835 | .fa-paste:before, 836 | .fa-clipboard:before { 837 | content: "\f0ea"; 838 | } 839 | .fa-lightbulb-o:before { 840 | content: "\f0eb"; 841 | } 842 | .fa-exchange:before { 843 | content: "\f0ec"; 844 | } 845 | .fa-cloud-download:before { 846 | content: "\f0ed"; 847 | } 848 | .fa-cloud-upload:before { 849 | content: "\f0ee"; 850 | } 851 | .fa-user-md:before { 852 | content: "\f0f0"; 853 | } 854 | .fa-stethoscope:before { 855 | content: "\f0f1"; 856 | } 857 | .fa-suitcase:before { 858 | content: "\f0f2"; 859 | } 860 | .fa-bell-o:before { 861 | content: "\f0a2"; 862 | } 863 | .fa-coffee:before { 864 | content: "\f0f4"; 865 | } 866 | .fa-cutlery:before { 867 | content: "\f0f5"; 868 | } 869 | .fa-file-text-o:before { 870 | content: "\f0f6"; 871 | } 872 | .fa-building-o:before { 873 | content: "\f0f7"; 874 | } 875 | .fa-hospital-o:before { 876 | content: "\f0f8"; 877 | } 878 | .fa-ambulance:before { 879 | content: "\f0f9"; 880 | } 881 | .fa-medkit:before { 882 | content: "\f0fa"; 883 | } 884 | .fa-fighter-jet:before { 885 | content: "\f0fb"; 886 | } 887 | .fa-beer:before { 888 | content: "\f0fc"; 889 | } 890 | .fa-h-square:before { 891 | content: "\f0fd"; 892 | } 893 | .fa-plus-square:before { 894 | content: "\f0fe"; 895 | } 896 | .fa-angle-double-left:before { 897 | content: "\f100"; 898 | } 899 | .fa-angle-double-right:before { 900 | content: "\f101"; 901 | } 902 | .fa-angle-double-up:before { 903 | content: "\f102"; 904 | } 905 | .fa-angle-double-down:before { 906 | content: "\f103"; 907 | } 908 | .fa-angle-left:before { 909 | content: "\f104"; 910 | } 911 | .fa-angle-right:before { 912 | content: "\f105"; 913 | } 914 | .fa-angle-up:before { 915 | content: "\f106"; 916 | } 917 | .fa-angle-down:before { 918 | content: "\f107"; 919 | } 920 | .fa-desktop:before { 921 | content: "\f108"; 922 | } 923 | .fa-laptop:before { 924 | content: "\f109"; 925 | } 926 | .fa-tablet:before { 927 | content: "\f10a"; 928 | } 929 | .fa-mobile-phone:before, 930 | .fa-mobile:before { 931 | content: "\f10b"; 932 | } 933 | .fa-circle-o:before { 934 | content: "\f10c"; 935 | } 936 | .fa-quote-left:before { 937 | content: "\f10d"; 938 | } 939 | .fa-quote-right:before { 940 | content: "\f10e"; 941 | } 942 | .fa-spinner:before { 943 | content: "\f110"; 944 | } 945 | .fa-circle:before { 946 | content: "\f111"; 947 | } 948 | .fa-mail-reply:before, 949 | .fa-reply:before { 950 | content: "\f112"; 951 | } 952 | .fa-github-alt:before { 953 | content: "\f113"; 954 | } 955 | .fa-folder-o:before { 956 | content: "\f114"; 957 | } 958 | .fa-folder-open-o:before { 959 | content: "\f115"; 960 | } 961 | .fa-smile-o:before { 962 | content: "\f118"; 963 | } 964 | .fa-frown-o:before { 965 | content: "\f119"; 966 | } 967 | .fa-meh-o:before { 968 | content: "\f11a"; 969 | } 970 | .fa-gamepad:before { 971 | content: "\f11b"; 972 | } 973 | .fa-keyboard-o:before { 974 | content: "\f11c"; 975 | } 976 | .fa-flag-o:before { 977 | content: "\f11d"; 978 | } 979 | .fa-flag-checkered:before { 980 | content: "\f11e"; 981 | } 982 | .fa-terminal:before { 983 | content: "\f120"; 984 | } 985 | .fa-code:before { 986 | content: "\f121"; 987 | } 988 | .fa-mail-reply-all:before, 989 | .fa-reply-all:before { 990 | content: "\f122"; 991 | } 992 | .fa-star-half-empty:before, 993 | .fa-star-half-full:before, 994 | .fa-star-half-o:before { 995 | content: "\f123"; 996 | } 997 | .fa-location-arrow:before { 998 | content: "\f124"; 999 | } 1000 | .fa-crop:before { 1001 | content: "\f125"; 1002 | } 1003 | .fa-code-fork:before { 1004 | content: "\f126"; 1005 | } 1006 | .fa-unlink:before, 1007 | .fa-chain-broken:before { 1008 | content: "\f127"; 1009 | } 1010 | .fa-question:before { 1011 | content: "\f128"; 1012 | } 1013 | .fa-info:before { 1014 | content: "\f129"; 1015 | } 1016 | .fa-exclamation:before { 1017 | content: "\f12a"; 1018 | } 1019 | .fa-superscript:before { 1020 | content: "\f12b"; 1021 | } 1022 | .fa-subscript:before { 1023 | content: "\f12c"; 1024 | } 1025 | .fa-eraser:before { 1026 | content: "\f12d"; 1027 | } 1028 | .fa-puzzle-piece:before { 1029 | content: "\f12e"; 1030 | } 1031 | .fa-microphone:before { 1032 | content: "\f130"; 1033 | } 1034 | .fa-microphone-slash:before { 1035 | content: "\f131"; 1036 | } 1037 | .fa-shield:before { 1038 | content: "\f132"; 1039 | } 1040 | .fa-calendar-o:before { 1041 | content: "\f133"; 1042 | } 1043 | .fa-fire-extinguisher:before { 1044 | content: "\f134"; 1045 | } 1046 | .fa-rocket:before { 1047 | content: "\f135"; 1048 | } 1049 | .fa-maxcdn:before { 1050 | content: "\f136"; 1051 | } 1052 | .fa-chevron-circle-left:before { 1053 | content: "\f137"; 1054 | } 1055 | .fa-chevron-circle-right:before { 1056 | content: "\f138"; 1057 | } 1058 | .fa-chevron-circle-up:before { 1059 | content: "\f139"; 1060 | } 1061 | .fa-chevron-circle-down:before { 1062 | content: "\f13a"; 1063 | } 1064 | .fa-html5:before { 1065 | content: "\f13b"; 1066 | } 1067 | .fa-css3:before { 1068 | content: "\f13c"; 1069 | } 1070 | .fa-anchor:before { 1071 | content: "\f13d"; 1072 | } 1073 | .fa-unlock-alt:before { 1074 | content: "\f13e"; 1075 | } 1076 | .fa-bullseye:before { 1077 | content: "\f140"; 1078 | } 1079 | .fa-ellipsis-h:before { 1080 | content: "\f141"; 1081 | } 1082 | .fa-ellipsis-v:before { 1083 | content: "\f142"; 1084 | } 1085 | .fa-rss-square:before { 1086 | content: "\f143"; 1087 | } 1088 | .fa-play-circle:before { 1089 | content: "\f144"; 1090 | } 1091 | .fa-ticket:before { 1092 | content: "\f145"; 1093 | } 1094 | .fa-minus-square:before { 1095 | content: "\f146"; 1096 | } 1097 | .fa-minus-square-o:before { 1098 | content: "\f147"; 1099 | } 1100 | .fa-level-up:before { 1101 | content: "\f148"; 1102 | } 1103 | .fa-level-down:before { 1104 | content: "\f149"; 1105 | } 1106 | .fa-check-square:before { 1107 | content: "\f14a"; 1108 | } 1109 | .fa-pencil-square:before { 1110 | content: "\f14b"; 1111 | } 1112 | .fa-external-link-square:before { 1113 | content: "\f14c"; 1114 | } 1115 | .fa-share-square:before { 1116 | content: "\f14d"; 1117 | } 1118 | .fa-compass:before { 1119 | content: "\f14e"; 1120 | } 1121 | .fa-toggle-down:before, 1122 | .fa-caret-square-o-down:before { 1123 | content: "\f150"; 1124 | } 1125 | .fa-toggle-up:before, 1126 | .fa-caret-square-o-up:before { 1127 | content: "\f151"; 1128 | } 1129 | .fa-toggle-right:before, 1130 | .fa-caret-square-o-right:before { 1131 | content: "\f152"; 1132 | } 1133 | .fa-euro:before, 1134 | .fa-eur:before { 1135 | content: "\f153"; 1136 | } 1137 | .fa-gbp:before { 1138 | content: "\f154"; 1139 | } 1140 | .fa-dollar:before, 1141 | .fa-usd:before { 1142 | content: "\f155"; 1143 | } 1144 | .fa-rupee:before, 1145 | .fa-inr:before { 1146 | content: "\f156"; 1147 | } 1148 | .fa-cny:before, 1149 | .fa-rmb:before, 1150 | .fa-yen:before, 1151 | .fa-jpy:before { 1152 | content: "\f157"; 1153 | } 1154 | .fa-ruble:before, 1155 | .fa-rouble:before, 1156 | .fa-rub:before { 1157 | content: "\f158"; 1158 | } 1159 | .fa-won:before, 1160 | .fa-krw:before { 1161 | content: "\f159"; 1162 | } 1163 | .fa-bitcoin:before, 1164 | .fa-btc:before { 1165 | content: "\f15a"; 1166 | } 1167 | .fa-file:before { 1168 | content: "\f15b"; 1169 | } 1170 | .fa-file-text:before { 1171 | content: "\f15c"; 1172 | } 1173 | .fa-sort-alpha-asc:before { 1174 | content: "\f15d"; 1175 | } 1176 | .fa-sort-alpha-desc:before { 1177 | content: "\f15e"; 1178 | } 1179 | .fa-sort-amount-asc:before { 1180 | content: "\f160"; 1181 | } 1182 | .fa-sort-amount-desc:before { 1183 | content: "\f161"; 1184 | } 1185 | .fa-sort-numeric-asc:before { 1186 | content: "\f162"; 1187 | } 1188 | .fa-sort-numeric-desc:before { 1189 | content: "\f163"; 1190 | } 1191 | .fa-thumbs-up:before { 1192 | content: "\f164"; 1193 | } 1194 | .fa-thumbs-down:before { 1195 | content: "\f165"; 1196 | } 1197 | .fa-youtube-square:before { 1198 | content: "\f166"; 1199 | } 1200 | .fa-youtube:before { 1201 | content: "\f167"; 1202 | } 1203 | .fa-xing:before { 1204 | content: "\f168"; 1205 | } 1206 | .fa-xing-square:before { 1207 | content: "\f169"; 1208 | } 1209 | .fa-youtube-play:before { 1210 | content: "\f16a"; 1211 | } 1212 | .fa-dropbox:before { 1213 | content: "\f16b"; 1214 | } 1215 | .fa-stack-overflow:before { 1216 | content: "\f16c"; 1217 | } 1218 | .fa-instagram:before { 1219 | content: "\f16d"; 1220 | } 1221 | .fa-flickr:before { 1222 | content: "\f16e"; 1223 | } 1224 | .fa-adn:before { 1225 | content: "\f170"; 1226 | } 1227 | .fa-bitbucket:before { 1228 | content: "\f171"; 1229 | } 1230 | .fa-bitbucket-square:before { 1231 | content: "\f172"; 1232 | } 1233 | .fa-tumblr:before { 1234 | content: "\f173"; 1235 | } 1236 | .fa-tumblr-square:before { 1237 | content: "\f174"; 1238 | } 1239 | .fa-long-arrow-down:before { 1240 | content: "\f175"; 1241 | } 1242 | .fa-long-arrow-up:before { 1243 | content: "\f176"; 1244 | } 1245 | .fa-long-arrow-left:before { 1246 | content: "\f177"; 1247 | } 1248 | .fa-long-arrow-right:before { 1249 | content: "\f178"; 1250 | } 1251 | .fa-apple:before { 1252 | content: "\f179"; 1253 | } 1254 | .fa-windows:before { 1255 | content: "\f17a"; 1256 | } 1257 | .fa-android:before { 1258 | content: "\f17b"; 1259 | } 1260 | .fa-linux:before { 1261 | content: "\f17c"; 1262 | } 1263 | .fa-dribbble:before { 1264 | content: "\f17d"; 1265 | } 1266 | .fa-skype:before { 1267 | content: "\f17e"; 1268 | } 1269 | .fa-foursquare:before { 1270 | content: "\f180"; 1271 | } 1272 | .fa-trello:before { 1273 | content: "\f181"; 1274 | } 1275 | .fa-female:before { 1276 | content: "\f182"; 1277 | } 1278 | .fa-male:before { 1279 | content: "\f183"; 1280 | } 1281 | .fa-gittip:before, 1282 | .fa-gratipay:before { 1283 | content: "\f184"; 1284 | } 1285 | .fa-sun-o:before { 1286 | content: "\f185"; 1287 | } 1288 | .fa-moon-o:before { 1289 | content: "\f186"; 1290 | } 1291 | .fa-archive:before { 1292 | content: "\f187"; 1293 | } 1294 | .fa-bug:before { 1295 | content: "\f188"; 1296 | } 1297 | .fa-vk:before { 1298 | content: "\f189"; 1299 | } 1300 | .fa-weibo:before { 1301 | content: "\f18a"; 1302 | } 1303 | .fa-renren:before { 1304 | content: "\f18b"; 1305 | } 1306 | .fa-pagelines:before { 1307 | content: "\f18c"; 1308 | } 1309 | .fa-stack-exchange:before { 1310 | content: "\f18d"; 1311 | } 1312 | .fa-arrow-circle-o-right:before { 1313 | content: "\f18e"; 1314 | } 1315 | .fa-arrow-circle-o-left:before { 1316 | content: "\f190"; 1317 | } 1318 | .fa-toggle-left:before, 1319 | .fa-caret-square-o-left:before { 1320 | content: "\f191"; 1321 | } 1322 | .fa-dot-circle-o:before { 1323 | content: "\f192"; 1324 | } 1325 | .fa-wheelchair:before { 1326 | content: "\f193"; 1327 | } 1328 | .fa-vimeo-square:before { 1329 | content: "\f194"; 1330 | } 1331 | .fa-turkish-lira:before, 1332 | .fa-try:before { 1333 | content: "\f195"; 1334 | } 1335 | .fa-plus-square-o:before { 1336 | content: "\f196"; 1337 | } 1338 | .fa-space-shuttle:before { 1339 | content: "\f197"; 1340 | } 1341 | .fa-slack:before { 1342 | content: "\f198"; 1343 | } 1344 | .fa-envelope-square:before { 1345 | content: "\f199"; 1346 | } 1347 | .fa-wordpress:before { 1348 | content: "\f19a"; 1349 | } 1350 | .fa-openid:before { 1351 | content: "\f19b"; 1352 | } 1353 | .fa-institution:before, 1354 | .fa-bank:before, 1355 | .fa-university:before { 1356 | content: "\f19c"; 1357 | } 1358 | .fa-mortar-board:before, 1359 | .fa-graduation-cap:before { 1360 | content: "\f19d"; 1361 | } 1362 | .fa-yahoo:before { 1363 | content: "\f19e"; 1364 | } 1365 | .fa-google:before { 1366 | content: "\f1a0"; 1367 | } 1368 | .fa-reddit:before { 1369 | content: "\f1a1"; 1370 | } 1371 | .fa-reddit-square:before { 1372 | content: "\f1a2"; 1373 | } 1374 | .fa-stumbleupon-circle:before { 1375 | content: "\f1a3"; 1376 | } 1377 | .fa-stumbleupon:before { 1378 | content: "\f1a4"; 1379 | } 1380 | .fa-delicious:before { 1381 | content: "\f1a5"; 1382 | } 1383 | .fa-digg:before { 1384 | content: "\f1a6"; 1385 | } 1386 | .fa-pied-piper-pp:before { 1387 | content: "\f1a7"; 1388 | } 1389 | .fa-pied-piper-alt:before { 1390 | content: "\f1a8"; 1391 | } 1392 | .fa-drupal:before { 1393 | content: "\f1a9"; 1394 | } 1395 | .fa-joomla:before { 1396 | content: "\f1aa"; 1397 | } 1398 | .fa-language:before { 1399 | content: "\f1ab"; 1400 | } 1401 | .fa-fax:before { 1402 | content: "\f1ac"; 1403 | } 1404 | .fa-building:before { 1405 | content: "\f1ad"; 1406 | } 1407 | .fa-child:before { 1408 | content: "\f1ae"; 1409 | } 1410 | .fa-paw:before { 1411 | content: "\f1b0"; 1412 | } 1413 | .fa-spoon:before { 1414 | content: "\f1b1"; 1415 | } 1416 | .fa-cube:before { 1417 | content: "\f1b2"; 1418 | } 1419 | .fa-cubes:before { 1420 | content: "\f1b3"; 1421 | } 1422 | .fa-behance:before { 1423 | content: "\f1b4"; 1424 | } 1425 | .fa-behance-square:before { 1426 | content: "\f1b5"; 1427 | } 1428 | .fa-steam:before { 1429 | content: "\f1b6"; 1430 | } 1431 | .fa-steam-square:before { 1432 | content: "\f1b7"; 1433 | } 1434 | .fa-recycle:before { 1435 | content: "\f1b8"; 1436 | } 1437 | .fa-automobile:before, 1438 | .fa-car:before { 1439 | content: "\f1b9"; 1440 | } 1441 | .fa-cab:before, 1442 | .fa-taxi:before { 1443 | content: "\f1ba"; 1444 | } 1445 | .fa-tree:before { 1446 | content: "\f1bb"; 1447 | } 1448 | .fa-spotify:before { 1449 | content: "\f1bc"; 1450 | } 1451 | .fa-deviantart:before { 1452 | content: "\f1bd"; 1453 | } 1454 | .fa-soundcloud:before { 1455 | content: "\f1be"; 1456 | } 1457 | .fa-database:before { 1458 | content: "\f1c0"; 1459 | } 1460 | .fa-file-pdf-o:before { 1461 | content: "\f1c1"; 1462 | } 1463 | .fa-file-word-o:before { 1464 | content: "\f1c2"; 1465 | } 1466 | .fa-file-excel-o:before { 1467 | content: "\f1c3"; 1468 | } 1469 | .fa-file-powerpoint-o:before { 1470 | content: "\f1c4"; 1471 | } 1472 | .fa-file-photo-o:before, 1473 | .fa-file-picture-o:before, 1474 | .fa-file-image-o:before { 1475 | content: "\f1c5"; 1476 | } 1477 | .fa-file-zip-o:before, 1478 | .fa-file-archive-o:before { 1479 | content: "\f1c6"; 1480 | } 1481 | .fa-file-sound-o:before, 1482 | .fa-file-audio-o:before { 1483 | content: "\f1c7"; 1484 | } 1485 | .fa-file-movie-o:before, 1486 | .fa-file-video-o:before { 1487 | content: "\f1c8"; 1488 | } 1489 | .fa-file-code-o:before { 1490 | content: "\f1c9"; 1491 | } 1492 | .fa-vine:before { 1493 | content: "\f1ca"; 1494 | } 1495 | .fa-codepen:before { 1496 | content: "\f1cb"; 1497 | } 1498 | .fa-jsfiddle:before { 1499 | content: "\f1cc"; 1500 | } 1501 | .fa-life-bouy:before, 1502 | .fa-life-buoy:before, 1503 | .fa-life-saver:before, 1504 | .fa-support:before, 1505 | .fa-life-ring:before { 1506 | content: "\f1cd"; 1507 | } 1508 | .fa-circle-o-notch:before { 1509 | content: "\f1ce"; 1510 | } 1511 | .fa-ra:before, 1512 | .fa-resistance:before, 1513 | .fa-rebel:before { 1514 | content: "\f1d0"; 1515 | } 1516 | .fa-ge:before, 1517 | .fa-empire:before { 1518 | content: "\f1d1"; 1519 | } 1520 | .fa-git-square:before { 1521 | content: "\f1d2"; 1522 | } 1523 | .fa-git:before { 1524 | content: "\f1d3"; 1525 | } 1526 | .fa-y-combinator-square:before, 1527 | .fa-yc-square:before, 1528 | .fa-hacker-news:before { 1529 | content: "\f1d4"; 1530 | } 1531 | .fa-tencent-weibo:before { 1532 | content: "\f1d5"; 1533 | } 1534 | .fa-qq:before { 1535 | content: "\f1d6"; 1536 | } 1537 | .fa-wechat:before, 1538 | .fa-weixin:before { 1539 | content: "\f1d7"; 1540 | } 1541 | .fa-send:before, 1542 | .fa-paper-plane:before { 1543 | content: "\f1d8"; 1544 | } 1545 | .fa-send-o:before, 1546 | .fa-paper-plane-o:before { 1547 | content: "\f1d9"; 1548 | } 1549 | .fa-history:before { 1550 | content: "\f1da"; 1551 | } 1552 | .fa-circle-thin:before { 1553 | content: "\f1db"; 1554 | } 1555 | .fa-header:before { 1556 | content: "\f1dc"; 1557 | } 1558 | .fa-paragraph:before { 1559 | content: "\f1dd"; 1560 | } 1561 | .fa-sliders:before { 1562 | content: "\f1de"; 1563 | } 1564 | .fa-share-alt:before { 1565 | content: "\f1e0"; 1566 | } 1567 | .fa-share-alt-square:before { 1568 | content: "\f1e1"; 1569 | } 1570 | .fa-bomb:before { 1571 | content: "\f1e2"; 1572 | } 1573 | .fa-soccer-ball-o:before, 1574 | .fa-futbol-o:before { 1575 | content: "\f1e3"; 1576 | } 1577 | .fa-tty:before { 1578 | content: "\f1e4"; 1579 | } 1580 | .fa-binoculars:before { 1581 | content: "\f1e5"; 1582 | } 1583 | .fa-plug:before { 1584 | content: "\f1e6"; 1585 | } 1586 | .fa-slideshare:before { 1587 | content: "\f1e7"; 1588 | } 1589 | .fa-twitch:before { 1590 | content: "\f1e8"; 1591 | } 1592 | .fa-yelp:before { 1593 | content: "\f1e9"; 1594 | } 1595 | .fa-newspaper-o:before { 1596 | content: "\f1ea"; 1597 | } 1598 | .fa-wifi:before { 1599 | content: "\f1eb"; 1600 | } 1601 | .fa-calculator:before { 1602 | content: "\f1ec"; 1603 | } 1604 | .fa-paypal:before { 1605 | content: "\f1ed"; 1606 | } 1607 | .fa-google-wallet:before { 1608 | content: "\f1ee"; 1609 | } 1610 | .fa-cc-visa:before { 1611 | content: "\f1f0"; 1612 | } 1613 | .fa-cc-mastercard:before { 1614 | content: "\f1f1"; 1615 | } 1616 | .fa-cc-discover:before { 1617 | content: "\f1f2"; 1618 | } 1619 | .fa-cc-amex:before { 1620 | content: "\f1f3"; 1621 | } 1622 | .fa-cc-paypal:before { 1623 | content: "\f1f4"; 1624 | } 1625 | .fa-cc-stripe:before { 1626 | content: "\f1f5"; 1627 | } 1628 | .fa-bell-slash:before { 1629 | content: "\f1f6"; 1630 | } 1631 | .fa-bell-slash-o:before { 1632 | content: "\f1f7"; 1633 | } 1634 | .fa-trash:before { 1635 | content: "\f1f8"; 1636 | } 1637 | .fa-copyright:before { 1638 | content: "\f1f9"; 1639 | } 1640 | .fa-at:before { 1641 | content: "\f1fa"; 1642 | } 1643 | .fa-eyedropper:before { 1644 | content: "\f1fb"; 1645 | } 1646 | .fa-paint-brush:before { 1647 | content: "\f1fc"; 1648 | } 1649 | .fa-birthday-cake:before { 1650 | content: "\f1fd"; 1651 | } 1652 | .fa-area-chart:before { 1653 | content: "\f1fe"; 1654 | } 1655 | .fa-pie-chart:before { 1656 | content: "\f200"; 1657 | } 1658 | .fa-line-chart:before { 1659 | content: "\f201"; 1660 | } 1661 | .fa-lastfm:before { 1662 | content: "\f202"; 1663 | } 1664 | .fa-lastfm-square:before { 1665 | content: "\f203"; 1666 | } 1667 | .fa-toggle-off:before { 1668 | content: "\f204"; 1669 | } 1670 | .fa-toggle-on:before { 1671 | content: "\f205"; 1672 | } 1673 | .fa-bicycle:before { 1674 | content: "\f206"; 1675 | } 1676 | .fa-bus:before { 1677 | content: "\f207"; 1678 | } 1679 | .fa-ioxhost:before { 1680 | content: "\f208"; 1681 | } 1682 | .fa-angellist:before { 1683 | content: "\f209"; 1684 | } 1685 | .fa-cc:before { 1686 | content: "\f20a"; 1687 | } 1688 | .fa-shekel:before, 1689 | .fa-sheqel:before, 1690 | .fa-ils:before { 1691 | content: "\f20b"; 1692 | } 1693 | .fa-meanpath:before { 1694 | content: "\f20c"; 1695 | } 1696 | .fa-buysellads:before { 1697 | content: "\f20d"; 1698 | } 1699 | .fa-connectdevelop:before { 1700 | content: "\f20e"; 1701 | } 1702 | .fa-dashcube:before { 1703 | content: "\f210"; 1704 | } 1705 | .fa-forumbee:before { 1706 | content: "\f211"; 1707 | } 1708 | .fa-leanpub:before { 1709 | content: "\f212"; 1710 | } 1711 | .fa-sellsy:before { 1712 | content: "\f213"; 1713 | } 1714 | .fa-shirtsinbulk:before { 1715 | content: "\f214"; 1716 | } 1717 | .fa-simplybuilt:before { 1718 | content: "\f215"; 1719 | } 1720 | .fa-skyatlas:before { 1721 | content: "\f216"; 1722 | } 1723 | .fa-cart-plus:before { 1724 | content: "\f217"; 1725 | } 1726 | .fa-cart-arrow-down:before { 1727 | content: "\f218"; 1728 | } 1729 | .fa-diamond:before { 1730 | content: "\f219"; 1731 | } 1732 | .fa-ship:before { 1733 | content: "\f21a"; 1734 | } 1735 | .fa-user-secret:before { 1736 | content: "\f21b"; 1737 | } 1738 | .fa-motorcycle:before { 1739 | content: "\f21c"; 1740 | } 1741 | .fa-street-view:before { 1742 | content: "\f21d"; 1743 | } 1744 | .fa-heartbeat:before { 1745 | content: "\f21e"; 1746 | } 1747 | .fa-venus:before { 1748 | content: "\f221"; 1749 | } 1750 | .fa-mars:before { 1751 | content: "\f222"; 1752 | } 1753 | .fa-mercury:before { 1754 | content: "\f223"; 1755 | } 1756 | .fa-intersex:before, 1757 | .fa-transgender:before { 1758 | content: "\f224"; 1759 | } 1760 | .fa-transgender-alt:before { 1761 | content: "\f225"; 1762 | } 1763 | .fa-venus-double:before { 1764 | content: "\f226"; 1765 | } 1766 | .fa-mars-double:before { 1767 | content: "\f227"; 1768 | } 1769 | .fa-venus-mars:before { 1770 | content: "\f228"; 1771 | } 1772 | .fa-mars-stroke:before { 1773 | content: "\f229"; 1774 | } 1775 | .fa-mars-stroke-v:before { 1776 | content: "\f22a"; 1777 | } 1778 | .fa-mars-stroke-h:before { 1779 | content: "\f22b"; 1780 | } 1781 | .fa-neuter:before { 1782 | content: "\f22c"; 1783 | } 1784 | .fa-genderless:before { 1785 | content: "\f22d"; 1786 | } 1787 | .fa-facebook-official:before { 1788 | content: "\f230"; 1789 | } 1790 | .fa-pinterest-p:before { 1791 | content: "\f231"; 1792 | } 1793 | .fa-whatsapp:before { 1794 | content: "\f232"; 1795 | } 1796 | .fa-server:before { 1797 | content: "\f233"; 1798 | } 1799 | .fa-user-plus:before { 1800 | content: "\f234"; 1801 | } 1802 | .fa-user-times:before { 1803 | content: "\f235"; 1804 | } 1805 | .fa-hotel:before, 1806 | .fa-bed:before { 1807 | content: "\f236"; 1808 | } 1809 | .fa-viacoin:before { 1810 | content: "\f237"; 1811 | } 1812 | .fa-train:before { 1813 | content: "\f238"; 1814 | } 1815 | .fa-subway:before { 1816 | content: "\f239"; 1817 | } 1818 | .fa-medium:before { 1819 | content: "\f23a"; 1820 | } 1821 | .fa-yc:before, 1822 | .fa-y-combinator:before { 1823 | content: "\f23b"; 1824 | } 1825 | .fa-optin-monster:before { 1826 | content: "\f23c"; 1827 | } 1828 | .fa-opencart:before { 1829 | content: "\f23d"; 1830 | } 1831 | .fa-expeditedssl:before { 1832 | content: "\f23e"; 1833 | } 1834 | .fa-battery-4:before, 1835 | .fa-battery-full:before { 1836 | content: "\f240"; 1837 | } 1838 | .fa-battery-3:before, 1839 | .fa-battery-three-quarters:before { 1840 | content: "\f241"; 1841 | } 1842 | .fa-battery-2:before, 1843 | .fa-battery-half:before { 1844 | content: "\f242"; 1845 | } 1846 | .fa-battery-1:before, 1847 | .fa-battery-quarter:before { 1848 | content: "\f243"; 1849 | } 1850 | .fa-battery-0:before, 1851 | .fa-battery-empty:before { 1852 | content: "\f244"; 1853 | } 1854 | .fa-mouse-pointer:before { 1855 | content: "\f245"; 1856 | } 1857 | .fa-i-cursor:before { 1858 | content: "\f246"; 1859 | } 1860 | .fa-object-group:before { 1861 | content: "\f247"; 1862 | } 1863 | .fa-object-ungroup:before { 1864 | content: "\f248"; 1865 | } 1866 | .fa-sticky-note:before { 1867 | content: "\f249"; 1868 | } 1869 | .fa-sticky-note-o:before { 1870 | content: "\f24a"; 1871 | } 1872 | .fa-cc-jcb:before { 1873 | content: "\f24b"; 1874 | } 1875 | .fa-cc-diners-club:before { 1876 | content: "\f24c"; 1877 | } 1878 | .fa-clone:before { 1879 | content: "\f24d"; 1880 | } 1881 | .fa-balance-scale:before { 1882 | content: "\f24e"; 1883 | } 1884 | .fa-hourglass-o:before { 1885 | content: "\f250"; 1886 | } 1887 | .fa-hourglass-1:before, 1888 | .fa-hourglass-start:before { 1889 | content: "\f251"; 1890 | } 1891 | .fa-hourglass-2:before, 1892 | .fa-hourglass-half:before { 1893 | content: "\f252"; 1894 | } 1895 | .fa-hourglass-3:before, 1896 | .fa-hourglass-end:before { 1897 | content: "\f253"; 1898 | } 1899 | .fa-hourglass:before { 1900 | content: "\f254"; 1901 | } 1902 | .fa-hand-grab-o:before, 1903 | .fa-hand-rock-o:before { 1904 | content: "\f255"; 1905 | } 1906 | .fa-hand-stop-o:before, 1907 | .fa-hand-paper-o:before { 1908 | content: "\f256"; 1909 | } 1910 | .fa-hand-scissors-o:before { 1911 | content: "\f257"; 1912 | } 1913 | .fa-hand-lizard-o:before { 1914 | content: "\f258"; 1915 | } 1916 | .fa-hand-spock-o:before { 1917 | content: "\f259"; 1918 | } 1919 | .fa-hand-pointer-o:before { 1920 | content: "\f25a"; 1921 | } 1922 | .fa-hand-peace-o:before { 1923 | content: "\f25b"; 1924 | } 1925 | .fa-trademark:before { 1926 | content: "\f25c"; 1927 | } 1928 | .fa-registered:before { 1929 | content: "\f25d"; 1930 | } 1931 | .fa-creative-commons:before { 1932 | content: "\f25e"; 1933 | } 1934 | .fa-gg:before { 1935 | content: "\f260"; 1936 | } 1937 | .fa-gg-circle:before { 1938 | content: "\f261"; 1939 | } 1940 | .fa-tripadvisor:before { 1941 | content: "\f262"; 1942 | } 1943 | .fa-odnoklassniki:before { 1944 | content: "\f263"; 1945 | } 1946 | .fa-odnoklassniki-square:before { 1947 | content: "\f264"; 1948 | } 1949 | .fa-get-pocket:before { 1950 | content: "\f265"; 1951 | } 1952 | .fa-wikipedia-w:before { 1953 | content: "\f266"; 1954 | } 1955 | .fa-safari:before { 1956 | content: "\f267"; 1957 | } 1958 | .fa-chrome:before { 1959 | content: "\f268"; 1960 | } 1961 | .fa-firefox:before { 1962 | content: "\f269"; 1963 | } 1964 | .fa-opera:before { 1965 | content: "\f26a"; 1966 | } 1967 | .fa-internet-explorer:before { 1968 | content: "\f26b"; 1969 | } 1970 | .fa-tv:before, 1971 | .fa-television:before { 1972 | content: "\f26c"; 1973 | } 1974 | .fa-contao:before { 1975 | content: "\f26d"; 1976 | } 1977 | .fa-500px:before { 1978 | content: "\f26e"; 1979 | } 1980 | .fa-amazon:before { 1981 | content: "\f270"; 1982 | } 1983 | .fa-calendar-plus-o:before { 1984 | content: "\f271"; 1985 | } 1986 | .fa-calendar-minus-o:before { 1987 | content: "\f272"; 1988 | } 1989 | .fa-calendar-times-o:before { 1990 | content: "\f273"; 1991 | } 1992 | .fa-calendar-check-o:before { 1993 | content: "\f274"; 1994 | } 1995 | .fa-industry:before { 1996 | content: "\f275"; 1997 | } 1998 | .fa-map-pin:before { 1999 | content: "\f276"; 2000 | } 2001 | .fa-map-signs:before { 2002 | content: "\f277"; 2003 | } 2004 | .fa-map-o:before { 2005 | content: "\f278"; 2006 | } 2007 | .fa-map:before { 2008 | content: "\f279"; 2009 | } 2010 | .fa-commenting:before { 2011 | content: "\f27a"; 2012 | } 2013 | .fa-commenting-o:before { 2014 | content: "\f27b"; 2015 | } 2016 | .fa-houzz:before { 2017 | content: "\f27c"; 2018 | } 2019 | .fa-vimeo:before { 2020 | content: "\f27d"; 2021 | } 2022 | .fa-black-tie:before { 2023 | content: "\f27e"; 2024 | } 2025 | .fa-fonticons:before { 2026 | content: "\f280"; 2027 | } 2028 | .fa-reddit-alien:before { 2029 | content: "\f281"; 2030 | } 2031 | .fa-edge:before { 2032 | content: "\f282"; 2033 | } 2034 | .fa-credit-card-alt:before { 2035 | content: "\f283"; 2036 | } 2037 | .fa-codiepie:before { 2038 | content: "\f284"; 2039 | } 2040 | .fa-modx:before { 2041 | content: "\f285"; 2042 | } 2043 | .fa-fort-awesome:before { 2044 | content: "\f286"; 2045 | } 2046 | .fa-usb:before { 2047 | content: "\f287"; 2048 | } 2049 | .fa-product-hunt:before { 2050 | content: "\f288"; 2051 | } 2052 | .fa-mixcloud:before { 2053 | content: "\f289"; 2054 | } 2055 | .fa-scribd:before { 2056 | content: "\f28a"; 2057 | } 2058 | .fa-pause-circle:before { 2059 | content: "\f28b"; 2060 | } 2061 | .fa-pause-circle-o:before { 2062 | content: "\f28c"; 2063 | } 2064 | .fa-stop-circle:before { 2065 | content: "\f28d"; 2066 | } 2067 | .fa-stop-circle-o:before { 2068 | content: "\f28e"; 2069 | } 2070 | .fa-shopping-bag:before { 2071 | content: "\f290"; 2072 | } 2073 | .fa-shopping-basket:before { 2074 | content: "\f291"; 2075 | } 2076 | .fa-hashtag:before { 2077 | content: "\f292"; 2078 | } 2079 | .fa-bluetooth:before { 2080 | content: "\f293"; 2081 | } 2082 | .fa-bluetooth-b:before { 2083 | content: "\f294"; 2084 | } 2085 | .fa-percent:before { 2086 | content: "\f295"; 2087 | } 2088 | .fa-gitlab:before { 2089 | content: "\f296"; 2090 | } 2091 | .fa-wpbeginner:before { 2092 | content: "\f297"; 2093 | } 2094 | .fa-wpforms:before { 2095 | content: "\f298"; 2096 | } 2097 | .fa-envira:before { 2098 | content: "\f299"; 2099 | } 2100 | .fa-universal-access:before { 2101 | content: "\f29a"; 2102 | } 2103 | .fa-wheelchair-alt:before { 2104 | content: "\f29b"; 2105 | } 2106 | .fa-question-circle-o:before { 2107 | content: "\f29c"; 2108 | } 2109 | .fa-blind:before { 2110 | content: "\f29d"; 2111 | } 2112 | .fa-audio-description:before { 2113 | content: "\f29e"; 2114 | } 2115 | .fa-volume-control-phone:before { 2116 | content: "\f2a0"; 2117 | } 2118 | .fa-braille:before { 2119 | content: "\f2a1"; 2120 | } 2121 | .fa-assistive-listening-systems:before { 2122 | content: "\f2a2"; 2123 | } 2124 | .fa-asl-interpreting:before, 2125 | .fa-american-sign-language-interpreting:before { 2126 | content: "\f2a3"; 2127 | } 2128 | .fa-deafness:before, 2129 | .fa-hard-of-hearing:before, 2130 | .fa-deaf:before { 2131 | content: "\f2a4"; 2132 | } 2133 | .fa-glide:before { 2134 | content: "\f2a5"; 2135 | } 2136 | .fa-glide-g:before { 2137 | content: "\f2a6"; 2138 | } 2139 | .fa-signing:before, 2140 | .fa-sign-language:before { 2141 | content: "\f2a7"; 2142 | } 2143 | .fa-low-vision:before { 2144 | content: "\f2a8"; 2145 | } 2146 | .fa-viadeo:before { 2147 | content: "\f2a9"; 2148 | } 2149 | .fa-viadeo-square:before { 2150 | content: "\f2aa"; 2151 | } 2152 | .fa-snapchat:before { 2153 | content: "\f2ab"; 2154 | } 2155 | .fa-snapchat-ghost:before { 2156 | content: "\f2ac"; 2157 | } 2158 | .fa-snapchat-square:before { 2159 | content: "\f2ad"; 2160 | } 2161 | .fa-pied-piper:before { 2162 | content: "\f2ae"; 2163 | } 2164 | .fa-first-order:before { 2165 | content: "\f2b0"; 2166 | } 2167 | .fa-yoast:before { 2168 | content: "\f2b1"; 2169 | } 2170 | .fa-themeisle:before { 2171 | content: "\f2b2"; 2172 | } 2173 | .fa-google-plus-circle:before, 2174 | .fa-google-plus-official:before { 2175 | content: "\f2b3"; 2176 | } 2177 | .fa-fa:before, 2178 | .fa-font-awesome:before { 2179 | content: "\f2b4"; 2180 | } 2181 | .sr-only { 2182 | position: absolute; 2183 | width: 1px; 2184 | height: 1px; 2185 | padding: 0; 2186 | margin: -1px; 2187 | overflow: hidden; 2188 | clip: rect(0, 0, 0, 0); 2189 | border: 0; 2190 | } 2191 | .sr-only-focusable:active, 2192 | .sr-only-focusable:focus { 2193 | position: static; 2194 | width: auto; 2195 | height: auto; 2196 | margin: 0; 2197 | overflow: visible; 2198 | clip: auto; 2199 | } 2200 | --------------------------------------------------------------------------------