From 19f6782ef4a09195abf9c45acde992e5b3147853 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sat, 16 Jan 2016 10:32:55 +0000 Subject: Deploy to GitHub Pages --- Crypto-Macaroon-Serializer-Base64.html | 4 + Crypto-Macaroon-Verifier.html | 13 + Crypto-Macaroon.html | 5 + benchmark.html | 610 ++++++++++++++++++++++++++++ doc-index.html | 4 + frames.html | 30 ++ haddock-util.js | 344 ++++++++++++++++ hmacaroons.haddock | Bin 0 -> 13790 bytes hslogo-16.png | Bin 0 -> 1684 bytes index-frames.html | 4 + index.html | 9 + mini_Crypto-Macaroon-Serializer-Base64.html | 4 + mini_Crypto-Macaroon-Verifier.html | 4 + mini_Crypto-Macaroon.html | 4 + minus.gif | Bin 0 -> 56 bytes ocean.css | 600 +++++++++++++++++++++++++++ plus.gif | Bin 0 -> 59 bytes synopsis.png | Bin 0 -> 11327 bytes 18 files changed, 1635 insertions(+) create mode 100644 Crypto-Macaroon-Serializer-Base64.html create mode 100644 Crypto-Macaroon-Verifier.html create mode 100644 Crypto-Macaroon.html create mode 100644 benchmark.html create mode 100644 doc-index.html create mode 100644 frames.html create mode 100644 haddock-util.js create mode 100644 hmacaroons.haddock create mode 100644 hslogo-16.png create mode 100644 index-frames.html create mode 100644 index.html create mode 100644 mini_Crypto-Macaroon-Serializer-Base64.html create mode 100644 mini_Crypto-Macaroon-Verifier.html create mode 100644 mini_Crypto-Macaroon.html create mode 100644 minus.gif create mode 100644 ocean.css create mode 100644 plus.gif create mode 100644 synopsis.png diff --git a/Crypto-Macaroon-Serializer-Base64.html b/Crypto-Macaroon-Serializer-Base64.html new file mode 100644 index 0000000..3a8aa14 --- /dev/null +++ b/Crypto-Macaroon-Serializer-Base64.html @@ -0,0 +1,4 @@ +Crypto.Macaroon.Serializer.Base64

hmacaroons-0.5.0.0: Haskell implementation of macaroons

Copyright(c) 2015 Julien Tanguy
LicenseBSD3
Maintainerjulien.tanguy@jhome.fr
Stabilityexperimental
Portabilityportable
Safe HaskellNone
LanguageHaskell2010

Crypto.Macaroon.Serializer.Base64

Description

Base64 serializer/deserializer

Documentation

serialize :: Macaroon -> ByteString

Serialize a macaroon in an URL-safe Base64 encoding

deserialize :: ByteString -> Either String Macaroon

Deserialize a macaroon from a base64url-encoded ByteString

\ No newline at end of file diff --git a/Crypto-Macaroon-Verifier.html b/Crypto-Macaroon-Verifier.html new file mode 100644 index 0000000..b58f97c --- /dev/null +++ b/Crypto-Macaroon-Verifier.html @@ -0,0 +1,13 @@ +Crypto.Macaroon.Verifier

hmacaroons-0.5.0.0: Haskell implementation of macaroons

Copyright(c) 2015 Julien Tanguy
LicenseBSD3
Maintainerjulien.tanguy@jhome.fr
Stabilityexperimental
Portabilityportable
Safe HaskellNone
LanguageHaskell2010

Crypto.Macaroon.Verifier

Description

 

Documentation

verify :: (Functor m, MonadIO m) => Secret -> [Caveat -> m VerifierResult] -> Macaroon -> m (Either ValidationError Macaroon)

Verify a Macaroon's signature and caveats, given the corresponding Secret + and verifiers.

A verifier is a function of type + MonadIO m => Caveat -> m VerifierResult.

It should return:

  • Unrelated if the caveat is not related to the verifier + (for instance a time verifier is given an action caveat);
  • Refused (ParseError reason) if the verifier is related to the + caveat, but failed to parse it completely;
  • Refused (ValidatorError reason) if the verifier is related to the + caveat, parsed it and invalidated it;
  • Verified if the verifier has successfully verified the + given caveat

data VerifierResult

Type representing the result of a validator

Constructors

Verified

The caveat is correctly parsed and verified

Refused ValidationError

The caveat is refused (Either a parse error or a validation error

Unrelated

The given verifier does not verify the caveat

data ValidationError

Type representing different validation errors. + Only ParseError and ValidatorError are exported, SigMismatch and + NoVerifier are used internally and should not be used by the user

Constructors

ParseError String

A verifier had a parse error

ValidatorError String

A verifier failed

Instances

Eq ValidationError 
Show ValidationError 
Monoid ValidationError

The Monoid instance is written so SigMismatch is an annihilator, + and NoVerifier is the identity element

\ No newline at end of file diff --git a/Crypto-Macaroon.html b/Crypto-Macaroon.html new file mode 100644 index 0000000..963fcaa --- /dev/null +++ b/Crypto-Macaroon.html @@ -0,0 +1,5 @@ +Crypto.Macaroon

hmacaroons-0.5.0.0: Haskell implementation of macaroons

Copyright(c) 2015 Julien Tanguy
LicenseBSD3
Maintainerjulien.tanguy@jhome.fr
Stabilityexperimental
Portabilityportable
Safe HaskellNone
LanguageHaskell2010

Crypto.Macaroon

Description

Pure haskell implementations of macaroons.

Warning: this implementation has not been audited by security experts. +Do not use in production

References:

Types

data Macaroon

Main structure of a macaroon

Instances

Eq Macaroon

Constant-time Eq instance

Show Macaroon

show instance conforming to the inspect "specification"

NFData Macaroon

NFData instance for use in the benchmark

data Caveat

Caveat structure

Instances

Eq Caveat

Constant-time Eq instance

Show Caveat

show instance conforming to the inspect "specification"

NFData Caveat

NFData instance for use in the benchmark

type Secret = ByteString

Type alias for Macaroons secret keys

type Key = ByteString

Type alias for Macaroons and Caveat and identifiers

type Location = ByteString

Type alias for Macaroons and Caveat locations

type Sig = ByteString

Type alias for Macaroons signatures

Accessing functions

Macaroons

location :: Macaroon -> Location

Target location

identifier :: Macaroon -> Key

Macaroon Identifier

caveats :: Macaroon -> [Caveat]

List of caveats

signature :: Macaroon -> Sig

Macaroon HMAC signature

Caveats

cl :: Caveat -> Location

Caveat target location

cid :: Caveat -> Key

Caveat identifier

vid :: Caveat -> Key

Caveat verification key identifier

Create Macaroons

create :: Secret -> Key -> Location -> Macaroon

Create a Macaroon from its key, identifier and location

inspect :: Macaroon -> String

Inspect a macaroon's contents. For debugging purposes.

addFirstPartyCaveat :: Key -> Macaroon -> Macaroon

Add a first party Caveat to a Macaroon, with its identifier

Serialize

Verify

\ No newline at end of file diff --git a/benchmark.html b/benchmark.html new file mode 100644 index 0000000..bb218eb --- /dev/null +++ b/benchmark.html @@ -0,0 +1,610 @@ + + + + + criterion report + + + + + + + +
+
+

criterion performance measurements

+ +

overview

+ +

want to understand this report?

+ +
+ +

Crypto.Macaroon/create

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
lower boundestimateupper bound
OLS regressionxxxxxxxxx
R² goodness-of-fitxxxxxxxxx
Mean execution time1.1654644382453032e-51.2600205848891467e-51.3603312414896145e-5
Standard deviation3.003924313903839e-63.5028611160687134e-64.226311433630701e-6
+ + +

Outlying measurements have severe + (0.979908058912253%) + effect on estimated standard deviation.

+
+

Crypto.Macaroon/mint

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
lower boundestimateupper bound
OLS regressionxxxxxxxxx
R² goodness-of-fitxxxxxxxxx
Mean execution time1.926374087710549e-52.0415738325732072e-52.1426448032743204e-5
Standard deviation2.731769151469443e-63.4477868085704054e-64.392710894614489e-6
+ + +

Outlying measurements have severe + (0.943016050183587%) + effect on estimated standard deviation.

+
+ +

understanding this report

+ +

In this report, each function benchmarked by criterion is assigned + a section of its own. The charts in each section are active; if + you hover your mouse over data points and annotations, you will see + more details.

+ +
    +
  • The chart on the left is a + kernel + density estimate (also known as a KDE) of time + measurements. This graphs the probability of any given time + measurement occurring. A spike indicates that a measurement of a + particular time occurred; its height indicates how often that + measurement was repeated.
  • + +
  • The chart on the right is the raw data from which the kernel + density estimate is built. The x axis indicates the + number of loop iterations, while the y axis shows measured + execution time for the given number of loop iterations. The + line behind the values is the linear regression prediction of + execution time for a given number of iterations. Ideally, all + measurements will be on (or very near) this line.
  • +
+ +

Under the charts is a small table. + The first two rows are the results of a linear regression run + on the measurements displayed in the right-hand chart.

+ +
    +
  • OLS regression indicates the + time estimated for a single loop iteration using an ordinary + least-squares regression model. This number is more accurate + than the mean estimate below it, as it more effectively + eliminates measurement overhead and other constant factors.
  • +
  • R² goodness-of-fit is a measure of how + accurately the linear regression model fits the observed + measurements. If the measurements are not too noisy, R² + should lie between 0.99 and 1, indicating an excellent fit. If + the number is below 0.99, something is confounding the accuracy + of the linear model.
  • +
  • Mean execution time and standard deviation are + statistics calculated from execution time + divided by number of iterations.
  • +
+ +

We use a statistical technique called + the bootstrap + to provide confidence intervals on our estimates. The + bootstrap-derived upper and lower bounds on estimates let you see + how accurate we believe those estimates to be. (Hover the mouse + over the table headers to see the confidence levels.)

+ +

A noisy benchmarking environment can cause some or many + measurements to fall far from the mean. These outlying + measurements can have a significant inflationary effect on the + estimate of the standard deviation. We calculate and display an + estimate of the extent to which the standard deviation has been + inflated by outliers.

+ + + +
+
+ + + diff --git a/doc-index.html b/doc-index.html new file mode 100644 index 0000000..39b7f10 --- /dev/null +++ b/doc-index.html @@ -0,0 +1,4 @@ +hmacaroons-0.5.0.0: Haskell implementation of macaroons (Index)

hmacaroons-0.5.0.0: Haskell implementation of macaroons

Index

addFirstPartyCaveatCrypto.Macaroon
CaveatCrypto.Macaroon
caveatsCrypto.Macaroon
cidCrypto.Macaroon
clCrypto.Macaroon
createCrypto.Macaroon
deserializeCrypto.Macaroon.Serializer.Base64, Crypto.Macaroon
identifierCrypto.Macaroon
inspectCrypto.Macaroon
KeyCrypto.Macaroon
LocationCrypto.Macaroon
locationCrypto.Macaroon
MacaroonCrypto.Macaroon
ParseErrorCrypto.Macaroon.Verifier, Crypto.Macaroon
RefusedCrypto.Macaroon.Verifier, Crypto.Macaroon
SecretCrypto.Macaroon
serializeCrypto.Macaroon.Serializer.Base64, Crypto.Macaroon
SigCrypto.Macaroon
signatureCrypto.Macaroon
UnrelatedCrypto.Macaroon.Verifier, Crypto.Macaroon
ValidationErrorCrypto.Macaroon.Verifier, Crypto.Macaroon
ValidatorErrorCrypto.Macaroon.Verifier, Crypto.Macaroon
VerifiedCrypto.Macaroon.Verifier, Crypto.Macaroon
VerifierResultCrypto.Macaroon.Verifier, Crypto.Macaroon
verifyCrypto.Macaroon.Verifier, Crypto.Macaroon
vidCrypto.Macaroon
\ No newline at end of file diff --git a/frames.html b/frames.html new file mode 100644 index 0000000..1b4e38d --- /dev/null +++ b/frames.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + diff --git a/haddock-util.js b/haddock-util.js new file mode 100644 index 0000000..9a6fccf --- /dev/null +++ b/haddock-util.js @@ -0,0 +1,344 @@ +// Haddock JavaScript utilities + +var rspace = /\s\s+/g, + rtrim = /^\s+|\s+$/g; + +function spaced(s) { return (" " + s + " ").replace(rspace, " "); } +function trim(s) { return s.replace(rtrim, ""); } + +function hasClass(elem, value) { + var className = spaced(elem.className || ""); + return className.indexOf( " " + value + " " ) >= 0; +} + +function addClass(elem, value) { + var className = spaced(elem.className || ""); + if ( className.indexOf( " " + value + " " ) < 0 ) { + elem.className = trim(className + " " + value); + } +} + +function removeClass(elem, value) { + var className = spaced(elem.className || ""); + className = className.replace(" " + value + " ", " "); + elem.className = trim(className); +} + +function toggleClass(elem, valueOn, valueOff, bool) { + if (bool == null) { bool = ! hasClass(elem, valueOn); } + if (bool) { + removeClass(elem, valueOff); + addClass(elem, valueOn); + } + else { + removeClass(elem, valueOn); + addClass(elem, valueOff); + } + return bool; +} + + +function makeClassToggle(valueOn, valueOff) +{ + return function(elem, bool) { + return toggleClass(elem, valueOn, valueOff, bool); + } +} + +toggleShow = makeClassToggle("show", "hide"); +toggleCollapser = makeClassToggle("collapser", "expander"); + +function toggleSection(id) +{ + var b = toggleShow(document.getElementById("section." + id)); + toggleCollapser(document.getElementById("control." + id), b); + rememberCollapsed(id, b); + return b; +} + +var collapsed = {}; +function rememberCollapsed(id, b) +{ + if(b) + delete collapsed[id] + else + collapsed[id] = null; + + var sections = []; + for(var i in collapsed) + { + if(collapsed.hasOwnProperty(i)) + sections.push(i); + } + // cookie specific to this page; don't use setCookie which sets path=/ + document.cookie = "collapsed=" + escape(sections.join('+')); +} + +function restoreCollapsed() +{ + var cookie = getCookie("collapsed"); + if(!cookie) + return; + + var ids = cookie.split('+'); + for(var i in ids) + { + if(document.getElementById("section." + ids[i])) + toggleSection(ids[i]); + } +} + +function setCookie(name, value) { + document.cookie = name + "=" + escape(value) + ";path=/;"; +} + +function clearCookie(name) { + document.cookie = name + "=;path=/;expires=Thu, 01-Jan-1970 00:00:01 GMT;"; +} + +function getCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for(var i=0;i < ca.length;i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) { + return unescape(c.substring(nameEQ.length,c.length)); + } + } + return null; +} + + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + if (parent.window.synopsis.location.replace) { + // In Firefox this avoids adding the change to the history. + parent.window.synopsis.location.replace(filename); + } else { + parent.window.synopsis.location = filename; + } + } +} + +function addMenuItem(html) { + var menu = document.getElementById("page-menu"); + if (menu) { + var btn = menu.firstChild.cloneNode(false); + btn.innerHTML = html; + menu.appendChild(btn); + } +} + +function adjustForFrames() { + var bodyCls; + + if (parent.location.href == window.location.href) { + // not in frames, so add Frames button + addMenuItem("Frames"); + bodyCls = "no-frame"; + } + else { + bodyCls = "in-frame"; + } + addClass(document.body, bodyCls); +} + +function reframe() { + setCookie("haddock-reframe", document.URL); + window.location = "frames.html"; +} + +function postReframe() { + var s = getCookie("haddock-reframe"); + if (s) { + parent.window.main.location = s; + clearCookie("haddock-reframe"); + } +} + +function styles() { + var i, a, es = document.getElementsByTagName("link"), rs = []; + for (i = 0; a = es[i]; i++) { + if(a.rel.indexOf("style") != -1 && a.title) { + rs.push(a); + } + } + return rs; +} + +function addStyleMenu() { + var as = styles(); + var i, a, btns = ""; + for(i=0; a = as[i]; i++) { + btns += "
  • " + + a.title + "
  • " + } + if (as.length > 1) { + var h = "
    " + + "Style ▾" + + "" + + "
    "; + addMenuItem(h); + } +} + +function setActiveStyleSheet(title) { + var as = styles(); + var i, a, found; + for(i=0; a = as[i]; i++) { + a.disabled = true; + // need to do this always, some browsers are edge triggered + if(a.title == title) { + found = a; + } + } + if (found) { + found.disabled = false; + setCookie("haddock-style", title); + } + else { + as[0].disabled = false; + clearCookie("haddock-style"); + } + styleMenu(false); +} + +function resetStyle() { + var s = getCookie("haddock-style"); + if (s) setActiveStyleSheet(s); +} + + +function styleMenu(show) { + var m = document.getElementById('style-menu'); + if (m) toggleShow(m, show); +} + + +function pageLoad() { + addStyleMenu(); + adjustForFrames(); + resetStyle(); + restoreCollapsed(); +} + diff --git a/hmacaroons.haddock b/hmacaroons.haddock new file mode 100644 index 0000000..396db6f Binary files /dev/null and b/hmacaroons.haddock differ diff --git a/hslogo-16.png b/hslogo-16.png new file mode 100644 index 0000000..0ff8579 Binary files /dev/null and b/hslogo-16.png differ diff --git a/index-frames.html b/index-frames.html new file mode 100644 index 0000000..23d7ff8 --- /dev/null +++ b/index-frames.html @@ -0,0 +1,4 @@ +hmacaroons-0.5.0.0: Haskell implementation of macaroons

    Modules

    \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..806d141 --- /dev/null +++ b/index.html @@ -0,0 +1,9 @@ +hmacaroons-0.5.0.0: Haskell implementation of macaroons

    hmacaroons-0.5.0.0: Haskell implementation of macaroons

    hmacaroons-0.5.0.0: Haskell implementation of macaroons

    Hmacaroons is a pure haskell implementation of macaroons. It aims to +provide compatibility at a serialized level with the +reference implementation and +the python implementation

    WARNING: This library has not been audited by security experts. +There is no error handling at the moment, everything is silently accepted

    It is developed in the purpose of exploration purposes, and would need +much more attention if it were to be used in production.

    References

    Papers and articles

    Implementations

    \ No newline at end of file diff --git a/mini_Crypto-Macaroon-Serializer-Base64.html b/mini_Crypto-Macaroon-Serializer-Base64.html new file mode 100644 index 0000000..2ceba26 --- /dev/null +++ b/mini_Crypto-Macaroon-Serializer-Base64.html @@ -0,0 +1,4 @@ +Crypto.Macaroon.Serializer.Base64

    Crypto.Macaroon.Serializer.Base64

    \ No newline at end of file diff --git a/mini_Crypto-Macaroon-Verifier.html b/mini_Crypto-Macaroon-Verifier.html new file mode 100644 index 0000000..d31b570 --- /dev/null +++ b/mini_Crypto-Macaroon-Verifier.html @@ -0,0 +1,4 @@ +Crypto.Macaroon.Verifier

    Crypto.Macaroon.Verifier

    \ No newline at end of file diff --git a/mini_Crypto-Macaroon.html b/mini_Crypto-Macaroon.html new file mode 100644 index 0000000..f1b4f71 --- /dev/null +++ b/mini_Crypto-Macaroon.html @@ -0,0 +1,4 @@ +Crypto.Macaroon

    Crypto.Macaroon

    Types

    data Caveat

    type Secret

    type Key

    type Sig

    Accessing functions

    Macaroons

    Caveats

    Create Macaroons

    Serialize

    Verify

    \ No newline at end of file diff --git a/minus.gif b/minus.gif new file mode 100644 index 0000000..1deac2f Binary files /dev/null and b/minus.gif differ diff --git a/ocean.css b/ocean.css new file mode 100644 index 0000000..1110b40 --- /dev/null +++ b/ocean.css @@ -0,0 +1,600 @@ +/* @group Fundamentals */ + +* { margin: 0; padding: 0 } + +/* Is this portable? */ +html { + background-color: white; + width: 100%; + height: 100%; +} + +body { + background: white; + color: black; + text-align: left; + min-height: 100%; + position: relative; +} + +p { + margin: 0.8em 0; +} + +ul, ol { + margin: 0.8em 0 0.8em 2em; +} + +dl { + margin: 0.8em 0; +} + +dt { + font-weight: bold; +} +dd { + margin-left: 2em; +} + +a { text-decoration: none; } +a[href]:link { color: rgb(196,69,29); } +a[href]:visited { color: rgb(171,105,84); } +a[href]:hover { text-decoration:underline; } + +/* @end */ + +/* @group Fonts & Sizes */ + +/* Basic technique & IE workarounds from YUI 3 + For reasons, see: + http://yui.yahooapis.com/3.1.1/build/cssfonts/fonts.css + */ + +body { + font:13px/1.4 sans-serif; + *font-size:small; /* for IE */ + *font:x-small; /* for IE in quirks mode */ +} + +h1 { font-size: 146.5%; /* 19pt */ } +h2 { font-size: 131%; /* 17pt */ } +h3 { font-size: 116%; /* 15pt */ } +h4 { font-size: 100%; /* 13pt */ } +h5 { font-size: 100%; /* 13pt */ } + +select, input, button, textarea { + font:99% sans-serif; +} + +table { + font-size:inherit; + font:100%; +} + +pre, code, kbd, samp, tt, .src { + font-family:monospace; + *font-size:108%; + line-height: 124%; +} + +.links, .link { + font-size: 85%; /* 11pt */ +} + +#module-header .caption { + font-size: 182%; /* 24pt */ +} + +.info { + font-size: 85%; /* 11pt */ +} + +#table-of-contents, #synopsis { + /* font-size: 85%; /* 11pt */ +} + + +/* @end */ + +/* @group Common */ + +.caption, h1, h2, h3, h4, h5, h6 { + font-weight: bold; + color: rgb(78,98,114); + margin: 0.8em 0 0.4em; +} + +* + h1, * + h2, * + h3, * + h4, * + h5, * + h6 { + margin-top: 2em; +} + +h1 + h2, h2 + h3, h3 + h4, h4 + h5, h5 + h6 { + margin-top: inherit; +} + +ul.links { + list-style: none; + text-align: left; + float: right; + display: inline-table; + margin: 0 0 0 1em; +} + +ul.links li { + display: inline; + border-left: 1px solid #d5d5d5; + white-space: nowrap; + padding: 0; +} + +ul.links li a { + padding: 0.2em 0.5em; +} + +.hide { display: none; } +.show { display: inherit; } +.clear { clear: both; } + +.collapser { + background-image: url(minus.gif); + background-repeat: no-repeat; +} +.expander { + background-image: url(plus.gif); + background-repeat: no-repeat; +} +p.caption.collapser, +p.caption.expander { + background-position: 0 0.4em; +} +.collapser, .expander { + padding-left: 14px; + margin-left: -14px; + cursor: pointer; +} + +pre { + padding: 0.25em; + margin: 0.8em 0; + background: rgb(229,237,244); + overflow: auto; + border-bottom: 0.25em solid white; + /* white border adds some space below the box to compensate + for visual extra space that paragraphs have between baseline + and the bounding box */ +} + +.src { + background: #f0f0f0; + padding: 0.2em 0.5em; +} + +.keyword { font-weight: normal; } +.def { font-weight: bold; } + + +/* @end */ + +/* @group Page Structure */ + +#content { + margin: 0 auto; + padding: 0 2em 6em; +} + +#package-header { + background: rgb(41,56,69); + border-top: 5px solid rgb(78,98,114); + color: #ddd; + padding: 0.2em; + position: relative; + text-align: left; +} + +#package-header .caption { + background: url(hslogo-16.png) no-repeat 0em; + color: white; + margin: 0 2em; + font-weight: normal; + font-style: normal; + padding-left: 2em; +} + +#package-header a:link, #package-header a:visited { color: white; } +#package-header a:hover { background: rgb(78,98,114); } + +#module-header .caption { + color: rgb(78,98,114); + font-weight: bold; + border-bottom: 1px solid #ddd; +} + +table.info { + float: right; + padding: 0.5em 1em; + border: 1px solid #ddd; + color: rgb(78,98,114); + background-color: #fff; + max-width: 40%; + border-spacing: 0; + position: relative; + top: -0.5em; + margin: 0 0 0 2em; +} + +.info th { + padding: 0 1em 0 0; +} + +div#style-menu-holder { + position: relative; + z-index: 2; + display: inline; +} + +#style-menu { + position: absolute; + z-index: 1; + overflow: visible; + background: #374c5e; + margin: 0; + text-align: center; + right: 0; + padding: 0; + top: 1.25em; +} + +#style-menu li { + display: list-item; + border-style: none; + margin: 0; + padding: 0; + color: #000; + list-style-type: none; +} + +#style-menu li + li { + border-top: 1px solid #919191; +} + +#style-menu a { + width: 6em; + padding: 3px; + display: block; +} + +#footer { + background: #ddd; + border-top: 1px solid #aaa; + padding: 0.5em 0; + color: #666; + text-align: center; + position: absolute; + bottom: 0; + width: 100%; + height: 3em; +} + +/* @end */ + +/* @group Front Matter */ + +#table-of-contents { + float: right; + clear: right; + background: #faf9dc; + border: 1px solid #d8d7ad; + padding: 0.5em 1em; + max-width: 20em; + margin: 0.5em 0 1em 1em; +} + +#table-of-contents .caption { + text-align: center; + margin: 0; +} + +#table-of-contents ul { + list-style: none; + margin: 0; +} + +#table-of-contents ul ul { + margin-left: 2em; +} + +#description .caption { + display: none; +} + +#synopsis { + display: none; +} + +.no-frame #synopsis { + display: block; + position: fixed; + right: 0; + height: 80%; + top: 10%; + padding: 0; + max-width: 75%; +} + +#synopsis .caption { + float: left; + width: 29px; + color: rgba(255,255,255,0); + height: 110px; + margin: 0; + font-size: 1px; + padding: 0; +} + +#synopsis p.caption.collapser { + background: url(synopsis.png) no-repeat -64px -8px; +} + +#synopsis p.caption.expander { + background: url(synopsis.png) no-repeat 0px -8px; +} + +#synopsis ul { + height: 100%; + overflow: auto; + padding: 0.5em; + margin: 0; +} + +#synopsis ul ul { + overflow: hidden; +} + +#synopsis ul, +#synopsis ul li.src { + background-color: #faf9dc; + white-space: nowrap; + list-style: none; + margin-left: 0; +} + +/* @end */ + +/* @group Main Content */ + +#interface div.top { margin: 2em 0; } +#interface h1 + div.top, +#interface h2 + div.top, +#interface h3 + div.top, +#interface h4 + div.top, +#interface h5 + div.top { + margin-top: 1em; +} +#interface p.src .link { + float: right; + color: #919191; + border-left: 1px solid #919191; + background: #f0f0f0; + padding: 0 0.5em 0.2em; + margin: 0 -0.5em 0 0.5em; +} + +#interface td.src .link { + float: right; + color: #919191; + border-left: 1px solid #919191; + background: #f0f0f0; + padding: 0 0.5em 0.2em; + margin: 0 -0.5em 0 0.5em; +} + +#interface span.fixity { + color: #919191; + border-left: 1px solid #919191; + padding: 0.2em 0.5em 0.2em 0.5em; + margin: 0 -1em 0 1em; +} + +#interface span.rightedge { + border-left: 1px solid #919191; + padding: 0.2em 0 0.2em 0; + margin: 0 0 0 1em; +} + +#interface table { border-spacing: 2px; } +#interface td { + vertical-align: top; + padding-left: 0.5em; +} +#interface td.src { + white-space: nowrap; +} +#interface td.doc p { + margin: 0; +} +#interface td.doc p + p { + margin-top: 0.8em; +} + +.clearfix:after { + clear: both; + content: " "; + display: block; + height: 0; + visibility: hidden; +} + +.subs dl { + margin: 0; +} + +.subs dt { + float: left; + clear: left; + display: block; + margin: 1px 0; +} + +.subs dd { + float: right; + width: 90%; + display: block; + padding-left: 0.5em; + margin-bottom: 0.5em; +} + +.subs dd.empty { + display: none; +} + +.subs dd p { + margin: 0; +} + +/* Render short-style data instances */ +.inst ul { + height: 100%; + padding: 0.5em; + margin: 0; +} + +.inst, .inst li { + list-style: none; + margin-left: 1em; +} + +/* Workaround for bug in Firefox (issue #384) */ +.inst-left { + float: left; +} + +.top p.src { + border-top: 1px solid #ccc; +} + +.subs, .doc { + /* use this selector for one level of indent */ + padding-left: 2em; +} + +.warning { + color: red; +} + +.arguments { + margin-top: -0.4em; +} +.arguments .caption { + display: none; +} + +.fields { padding-left: 1em; } + +.fields .caption { display: none; } + +.fields p { margin: 0 0; } + +/* this seems bulky to me +.methods, .constructors { + background: #f8f8f8; + border: 1px solid #eee; +} +*/ + +/* @end */ + +/* @group Auxillary Pages */ + + +.extension-list { + list-style-type: none; + margin-left: 0; +} + +#mini { + margin: 0 auto; + padding: 0 1em 1em; +} + +#mini > * { + font-size: 93%; /* 12pt */ +} + +#mini #module-list .caption, +#mini #module-header .caption { + font-size: 125%; /* 15pt */ +} + +#mini #interface h1, +#mini #interface h2, +#mini #interface h3, +#mini #interface h4 { + font-size: 109%; /* 13pt */ + margin: 1em 0 0; +} + +#mini #interface .top, +#mini #interface .src { + margin: 0; +} + +#mini #module-list ul { + list-style: none; + margin: 0; +} + +#alphabet ul { + list-style: none; + padding: 0; + margin: 0.5em 0 0; + text-align: center; +} + +#alphabet li { + display: inline; + margin: 0 0.25em; +} + +#alphabet a { + font-weight: bold; +} + +#index .caption, +#module-list .caption { font-size: 131%; /* 17pt */ } + +#index table { + margin-left: 2em; +} + +#index .src { + font-weight: bold; +} +#index .alt { + font-size: 77%; /* 10pt */ + font-style: italic; + padding-left: 2em; +} + +#index td + td { + padding-left: 1em; +} + +#module-list ul { + list-style: none; + margin: 0 0 0 2em; +} + +#module-list li { + clear: right; +} + +#module-list span.collapser, +#module-list span.expander { + background-position: 0 0.3em; +} + +#module-list .package { + float: right; +} + +/* @end */ diff --git a/plus.gif b/plus.gif new file mode 100644 index 0000000..2d15c14 Binary files /dev/null and b/plus.gif differ diff --git a/synopsis.png b/synopsis.png new file mode 100644 index 0000000..85fb86e Binary files /dev/null and b/synopsis.png differ -- cgit v1.2.3