From 81ebd267c89011ca65cd5cfe382e10fabd9017ac Mon Sep 17 00:00:00 2001 From: Yigit Sever Date: Mon, 19 Apr 2021 18:21:06 +0300 Subject: Moving site to separate repo --- site/public/404.html | 3 - site/public/android-chrome-192x192.png | Bin 26249 -> 0 bytes site/public/android-chrome-512x512.png | Bin 80376 -> 0 bytes site/public/apple-touch-icon.png | Bin 24023 -> 0 bytes site/public/block-docs/index.html | 190 ----------------- site/public/elasticlunr.min.js | 10 - site/public/favicon-16x16.png | Bin 878 -> 0 bytes site/public/favicon-32x32.png | Bin 2463 -> 0 bytes site/public/favicon.ico | Bin 15406 -> 0 bytes site/public/gradecoin.png | Bin 197656 -> 0 bytes site/public/gradecoin.pub | 9 - site/public/index.html | 362 -------------------------------- site/public/juice.css | 1 - site/public/jwt/index.html | 182 ---------------- site/public/misc-docs/index.html | 155 -------------- site/public/normalize.css | 349 ------------------------------ site/public/register-docs/index.html | 198 ----------------- site/public/robots.txt | 3 - site/public/search_index.en.js | 1 - site/public/site.css | 57 ----- site/public/sitemap.xml | 21 -- site/public/transaction-docs/index.html | 196 ----------------- 22 files changed, 1737 deletions(-) delete mode 100644 site/public/404.html delete mode 100644 site/public/android-chrome-192x192.png delete mode 100644 site/public/android-chrome-512x512.png delete mode 100644 site/public/apple-touch-icon.png delete mode 100644 site/public/block-docs/index.html delete mode 100644 site/public/elasticlunr.min.js delete mode 100644 site/public/favicon-16x16.png delete mode 100644 site/public/favicon-32x32.png delete mode 100644 site/public/favicon.ico delete mode 100644 site/public/gradecoin.png delete mode 100644 site/public/gradecoin.pub delete mode 100644 site/public/index.html delete mode 100644 site/public/juice.css delete mode 100644 site/public/jwt/index.html delete mode 100644 site/public/misc-docs/index.html delete mode 100644 site/public/normalize.css delete mode 100644 site/public/register-docs/index.html delete mode 100644 site/public/robots.txt delete mode 100644 site/public/search_index.en.js delete mode 100644 site/public/site.css delete mode 100644 site/public/sitemap.xml delete mode 100644 site/public/transaction-docs/index.html (limited to 'site/public') diff --git a/site/public/404.html b/site/public/404.html deleted file mode 100644 index f8414f0..0000000 --- a/site/public/404.html +++ /dev/null @@ -1,3 +0,0 @@ - -404 Not Found -

404 Not Found

diff --git a/site/public/android-chrome-192x192.png b/site/public/android-chrome-192x192.png deleted file mode 100644 index 023ddbd..0000000 Binary files a/site/public/android-chrome-192x192.png and /dev/null differ diff --git a/site/public/android-chrome-512x512.png b/site/public/android-chrome-512x512.png deleted file mode 100644 index 4251933..0000000 Binary files a/site/public/android-chrome-512x512.png and /dev/null differ diff --git a/site/public/apple-touch-icon.png b/site/public/apple-touch-icon.png deleted file mode 100644 index cd8e4c8..0000000 Binary files a/site/public/apple-touch-icon.png and /dev/null differ diff --git a/site/public/block-docs/index.html b/site/public/block-docs/index.html deleted file mode 100644 index 8edc5a0..0000000 --- a/site/public/block-docs/index.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - Blocks | Gradecoin - - - - - - - - - - - - - - - -
- - - - - - - - -
- - -
- - - - - -
-
- -
- Requests -
- - -
- - GET -
- -
- - POST -
- - - -
- Fields -
- - -
- Mining -
- - -
- Hash -
- - -
-
- - - -
- -
Block Documentation
-

A block that was proposed to commit Transactions in transaction_list to the -ledger with a nonce that made hash valid; 6 zeroes at the left hand side of the -hash (24 bytes).

-

We are mining using blake2s algorithm, which produces 256 bit hashes. Hash/second is roughly 20x103 on my machine, a new block can be mined in around 4-6 minutes.

-

Requests

-

GET

-

A HTTP GET request to /block endpoint will return the latest mined block.

-

POST

-

A HTTP POST request with Authorization using JWT will allow you to propose your own blocks.

-

Fields

-
-transaction_list: [array of Fingerprints]
-nonce: unsigned 32-bit integer
-timestamp: ISO 8601 <date>T<time>
-hash: String
-

Mining

-

The mining process for the hash involves;

- -

If the resulting hash is valid, then you can create a Block JSON object with the found nonce and hash.

-

Hash

-

tha field in jwt documentation in fact stands for "The Hash", in the case of a post request for a block, you need to use hash field of the block.

-

ISO 8601 Reference

- - -
- - - -
- - - - - - - - diff --git a/site/public/elasticlunr.min.js b/site/public/elasticlunr.min.js deleted file mode 100644 index 79dad65..0000000 --- a/site/public/elasticlunr.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * elasticlunr - http://weixsong.github.io - * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.6 - * - * Copyright (C) 2017 Oliver Nightingale - * Copyright (C) 2017 Wei Song - * MIT Licensed - * @license - */ -!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o - - - - - Gradecoin - - - - - - - - - - - - - - - - -
- - - - - - - - -
- -
- - -
-

- Mine your own grades -

-

- Gradecoin is the latest cutting edge blockchain technology agile grading framework that drives organic engagement and other buzzwords, with big data mining search engine optimization -

-
-
-
- - -
- ⇩ Learn How ⇩ -
- - - -
- - - -
- - - - - - - - - -
- -
-
-
-
News:
-
Gradecoin is in testnet mode, API is not stable, everything might reset at any time.
-
Transactions are now unique according to their "by" field, sorry for the trouble
-
Blocks now require 5 transactions in them, during testnet phase
-
It was possible (and hilarious) to mine a new block with just 1 transaction, it is now fixed
-
-
-
-

Welcome to Gradecoin!

-

Blockchains are incredibly simple yet can appear very complicated, we will see how they work and practice programming production cryptography code.

-

This server is the sandbox for the PA1, it's currently running the Gradecoin application. Gradecoin is the faux currency we will use to simulate a blockchain network. At the end of the simulation, the amount of Gradecoin you hold will be your PA1 grade.

-

A quick summary: authenticate yourself to the system using public key encryption. -Craft Transaction proposals and tag them using JWTs. -When there are enough transactions then you can propose Blocks in the same way. -Blocks need to be mined beforehand using Proof-of-work, or brute force.

-

Gradecoin offers 3 endpoints at /register, /block and /transaction. You can only send GET requests to /block and /transaction without authorization. -The server is programmed in RESTful architecture, there are no DELETE, PUT or UPDATE operations, though.

-

Gradecoin uses a Proof-of-work block accepting mechanism. It uses single round Blake2s hashing which produces 256-bit (64 hexadecimal characters) output. The target hash is 24 bits or 6 hexadecimal characters of 0. During testing, I could mine a block on average around 4-6 minutes.

-
-

We're expecting you to use existing tools and implementations. Standards are hard. Don't roll your own crypto. Feel free to ask questions. Collaborate.

-
-

You might ask,

-
-

But if nobody has any Gradecoin then how do we have transactions?

-
-

There is a bank! Their public key is 31415926535897932384626433832795028841971693993751058209749445923 and they have some amount of Gradecoin preloaded. It's also the only account that you can send transactions requests to yourself.

-

Coinbase

-

The first transactions of a block is called the coinbase. They are the author of the block proposal and if the block is accepted then they get compensated for their efforts with some Gradecoin.

-

Public Key Signatures

-

Gradecoin uses 2048 bit RSA keypairs.

-

Services

-

/register

-
    -
  • Create your own 2048 bit RSA keypair
  • -
  • Download Gradecoin's Public Key from Moodle
  • -
  • Encrypt your JSON wrapped Public Key, Student ID and one time passwd using Gradecoin's Public Key
  • -
  • Your public key is now in our database and can be used to sign your JWT's during requests
  • -
  • For more information, check the register page
  • -
-

/transaction

-
    -
  • You can offer a Transaction with a POST request -
      -
    • The request should have Authorization
    • -
    • The request header should be signed by the Public Key of the by field in the transaction
    • -
    -
  • -
  • Fetch the list of Transactions with a GET request
  • -
  • For more information, check our transaction page
  • -
-

/block

-
    -
  • -

    Offer a Block with a POST request

    -
      -
    • The request should have Authorization
    • -
    • The transaction_list of the block should be a subset of pending transactions, available on /transaction
    • -
    -
  • -
  • -

    Fetch the last accepted Block with a GET request

    -
  • -
  • -

    For more information, check our block page

    -

    Authorization: The request header should have Bearer JWT.Token signed with Student Public Key

    -
  • -
-

/user

-
    -
  • Meant to be used in the browser, you can see the current list of users and their balance here
  • -
-

Questions

-

This all sound complicated!

-
    -
  • I've drawn inspiration from actual Bitcoin transactions and warp. The simplicity of the system is how little interfaces it has.
  • -
  • Don't know where to start? Gradecoin uses RESTful API; simple curl commands or even your browser will work! This website can help as well.
  • -
  • JWT Debugger and the corresponding RFC.
  • -
  • Remember that you are absolutely encouraged to grab off-the-shelf implementations for every cryptography primitive you will use. You can start by finding a code snippet to generate a RSA keypair?
  • -
  • Check out misc for everything else you might be curious about.
  • -
-

How do you actually earn Gradecoin?

-
    -
  • Register yourself to at /register
  • -
  • Create transactions at /transaction
  • -
  • Create blocks to commit transactions at /block
  • -
  • See how everyone is doing and find people to trade with at /user
  • -
-

I found a bug!

-

Thank you! Please let me know so we can solve it.

-

I hacked the server!

-

That wasn't supposed to happen :( I did not place any intentional vulnerabilities to the system so if you cracked something, it was not intended. Please don't abuse it and let me know so I can patch it.

-

Submission?

-

At the end of the simulation, your Gradecoin balance will be your grade. I will also expect a unique client programmed in either;

-
    -
  • c
  • -
  • c++
  • -
  • perl
  • -
  • rust
  • -
  • python
  • -
  • random assortment of bash scripts
  • -
-

If your favourite programming language is missing please let me know 🤷?

-

Can my friends play?

-

Sadly, no. Student's who are enrolled to the class will receive one-time-passwords for authentication.

-

How and or Why?

- - - -
- - - -
- - -
-Built For ⁂ CENG489 ⁂ Introduction to Computer Security -
- - - - - diff --git a/site/public/juice.css b/site/public/juice.css deleted file mode 100644 index 219f864..0000000 --- a/site/public/juice.css +++ /dev/null @@ -1 +0,0 @@ -.text-center{text-align:center}.pos-absolute{right:0;left:0;position:absolute}.box-shadow{box-shadow:0 2px 10px 2px #ddd}.heading-text{font-family:"Fira Sans", sans-serif;font-size:32px;font-weight:600;padding:10px 0 25px 0;color:var(--primary-text-color)}h1,.title-text{font-family:"Fira Sans", sans-serif;font-size:25px;font-weight:500;color:var(--primary-text-color);border-left:var(--primary-color) 8px solid;padding-left:10px}h2,.subtitle-text{font-family:"Fira Sans", sans-serif;font-size:20px;font-weight:500;color:var(--primary-text-color)}.text{font-family:"Fira Sans", sans-serif;font-size:18px;font-weight:400;line-height:26px;letter-spacing:0.2px;color:var(--primary-text-color)}.subtext{font-family:"Fira Sans", sans-serif;font-size:16px;font-weight:400;letter-spacing:0.1px}.content{padding:0 40px;display:flex;flex-direction:column;justify-content:center;overflow-x:auto}.content pre{overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal;background-color:white;color:#4a4a4a;font-size:.875em;font-family:monospace}.content code{background-color:white;color:#4a4a4a;font-size:.875em;font-weight:normal;padding:0.25em 0.5em;font-family:monospace}.content pre code{padding:0}.content a{color:var(--primary-link-color)}.content a:hover{text-decoration:underline}.content blockquote{border-left:#e2dede 8px solid;margin:0;background-color:#f2f1f0;padding:0 20px}body{padding:0;margin:0;box-sizing:border-box;background-color:var(--secondary-color)}a{text-decoration:none}ul{margin-top:0.5rem}ul>li{padding:0.3rem 0}p>img{width:100%;height:auto}header{background-color:var(--primary-color);color:black;padding:20px 50px;display:flex;align-items:center;justify-content:space-between}.logo{font-family:"Alfa Slab One", serif;font-size:32px;color:var(--primary-text-color);display:flex;align-items:center;margin:0 40px}.logo img{width:60px;margin:0 25px}.nav-item{margin:0 10px;text-decoration:none;font-size:18px;font-weight:bold}.nav-item:hover{color:#000;text-decoration:underline}.hero{display:flex;align-items:center;justify-content:space-evenly;height:100vh;background-color:var(--primary-color);overflow-x:hidden;padding:0 40px}.hero .explore-more{position:absolute;bottom:20px;cursor:pointer}main{display:flex;padding:50px 100px}main .toc{max-width:260px;min-width:240px}main .toc-item{padding:10px 20px;color:#424242}main .toc-item a,main .toc-item-child a{color:var(--secondary-text-color)}main .toc-item a:hover,main .toc-item-child a:hover{cursor:pointer;text-decoration:underline}main .toc-item a.active,main .toc-item-child a.active{color:var(--toc-highlight-text-color)}main .toc-item-child{padding:0 30px 5px;color:#424242}.toc-sticky{border-radius:3px;border-top:5px solid var(--primary-color);background-color:white;position:sticky;position:-webkit-sticky;position:-moz-sticky;position:-ms-sticky;position:-o-sticky;top:10px;padding:10px 0}footer{padding:50px;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:#202020;color:#fcfcfc}footer a{color:#fcfcfc;text-decoration:underline}@media screen and (min-width: 1280px){.content{max-width:60%;min-width:800px}}@media screen and (max-width: 768px){header{padding:10px 30px;flex-direction:column;align-items:center;justify-content:center}.logo{font-size:28px;margin:10px}.logo img{width:45px;margin:0 10px 0 0}.nav-item{margin:0 5px;font-size:14px}.hero{padding:40px 30px}main{padding:30px}.content{padding:0}.explore-more,.toc{display:none}} diff --git a/site/public/jwt/index.html b/site/public/jwt/index.html deleted file mode 100644 index d42d7f3..0000000 --- a/site/public/jwt/index.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - JWT | Gradecoin - - - - - - - - - - - - - - - -
- - - - - - - - -
- - -
- - - - - -
-
- -
- How? -
- - -
- Algorithm -
- - - - - -
-
- - - -
- -
JSON Web Token Documentation
-
-

JSON Web Tokens are representations of claims, or authorization proofs that fit into the Header of HTTP requests.

-
-

How?

-

JWTs are used as the MAC of operations that require authorization:

-
    -
  • block proposal
  • -
  • transaction proposal.
  • -
-

They are send alongside the JSON request body in the Header;

-
-Authorization: Bearer aaaaaa.bbbbbb.ccccc
-
-

Gradecoin uses 3 fields for the JWTs;

-
-{
-"tha": "Hash of the payload, check invididual references",
-"iat": "Issued At, Unix Time",
-"exp": "Expiration Time, epoch"
-}
-
- -

Algorithm

-

We are using RS256, RSASSA-PKCS1-v1_5 using SHA-256. The JWTs you encode with your private RSA key will be decoded using the public key you have authenticated with. You can see how the process works here.

-

References

- - - -
- - - -
- - -
-Built For ⁂ CENG489 ⁂ Introduction to Computer Security -
- - - - - diff --git a/site/public/misc-docs/index.html b/site/public/misc-docs/index.html deleted file mode 100644 index dfd38e2..0000000 --- a/site/public/misc-docs/index.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - Misc | Gradecoin - - - - - - - - - - - - - - - -
- - - - - - - - -
- - -
- - - - - -
-
- - - - - - - - - - -
-
- - - -
- -
Documentation about everything else
-

We thought it might be good to explain some concepts you might have questions about.

-

Fingerprint

-

Definition

-

A fingerprint is a 256 bit 64 character hexadecimal user identifier for users. Fingerprints are used in defining users in transactions and blocks.

-

Fingerprint Generation

-

A user's finger print is generated via applying SHA256 sum of the user's public RSA key.

- - -
- - - -
- - -
-Built For ⁂ CENG489 ⁂ Introduction to Computer Security -
- - - - - diff --git a/site/public/normalize.css b/site/public/normalize.css deleted file mode 100644 index 192eb9c..0000000 --- a/site/public/normalize.css +++ /dev/null @@ -1,349 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ - -/* Document - ========================================================================== */ - -/** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* Sections - ========================================================================== */ - -/** - * Remove the margin in all browsers. - */ - -body { - margin: 0; -} - -/** - * Render the `main` element consistently in IE. - */ - -main { - display: block; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/* Grouping content - ========================================================================== */ - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - -hr { - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -pre { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Remove the gray background on active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - -abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - -b, -strong { - font-weight: bolder; -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -code, -kbd, -samp { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** - * Add the correct font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove the border on images inside links in IE 10. - */ - -img { - border-style: none; -} - -/* Forms - ========================================================================== */ - -/** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - -button, -select { /* 1 */ - text-transform: none; -} - -/** - * Correct the inability to style clickable types in iOS and Safari. - */ - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -/** - * Remove the inner border and padding in Firefox. - */ - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** - * Restore the focus styles unset by the previous rule. - */ - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Correct the padding in Firefox. - */ - -fieldset { - padding: 0.35em 0.75em 0.625em; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - -legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ -} - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - -progress { - vertical-align: baseline; -} - -/** - * Remove the default vertical scrollbar in IE 10+. - */ - -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - -[type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** - * Remove the inner padding in Chrome and Safari on macOS. - */ - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* Interactive - ========================================================================== */ - -/* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - -details { - display: block; -} - -/* - * Add the correct display in all browsers. - */ - -summary { - display: list-item; -} - -/* Misc - ========================================================================== */ - -/** - * Add the correct display in IE 10+. - */ - -template { - display: none; -} - -/** - * Add the correct display in IE 10. - */ - -[hidden] { - display: none; -} diff --git a/site/public/register-docs/index.html b/site/public/register-docs/index.html deleted file mode 100644 index 53d86dd..0000000 --- a/site/public/register-docs/index.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - Register | Gradecoin - - - - - - - - - - - - - - - -
- - - - - - - - -
- - -
- - - - - -
-
- - - - - - - - - - -
-
- - - -
- -
Register Documentation
-

POST request to /register endpoint

-

Lets a user to authenticate themselves to the system. -Only people who are enrolled to the class can open Gradecoin accounts. -This is enforced with your Student ID (e123456) and a one time password you will receive.

-

Authentication Process

-
-

The bytes you are sending over the network are all Base64 Encoded

-
-
    -
  • Gradecoin's Public Key (gradecoin_public_key) is listed on our Moodle page and here. Download and load it it to your client.
  • -
  • Create a JSON object (P_AR) with your metu_id ("e"+6 chars) and public key in base64 (PEM) format (S_PK) reference
  • -
-
-{
-    "student_id": "e123456",
-    "passwd": "15 char secret",
-    "public_key": "---BEGIN PUBLIC KEY..."
-}
-

Cipher Initialization

-
-

Since we are working with AES-128, both key and IV should be 128 bits (or 16 hexadecimal characters)

-
-
    -
  • Pick a short temporary key (k_temp)
  • -
  • Pick a random IV 1 2 (iv).
  • -
-

Encryption

-
    -
  • Encrypt the serialized string of P_AR with 128 bit block AES in CBC mode with Pkcs7 padding using the temporary key (k_temp), the result is C_AR. Encode this with base64.
  • -
  • The temporary key you have picked k_temp is encrypted using RSA with OAEP padding scheme using SHA-256 with gradecoin_public_key, giving us key_ciphertext. Encode this with base64.
  • -
  • Base64 encode the IV (iv) as well.
  • -
-
-

- The available tools and libraries might warn you about how using the primitives given above are "hazardous". They are, crypto is hard. -

-
-
    -
  • The payload JSON object (auth_request) can be serialized now:
  • -
-
-{
-    "c": "C_AR",
-    "iv": "iv",
-    "key": "key_ciphertext"
-}
-
-

If your authentication process was valid, you will be given access and your public key fingerprint that is your address. -You can now sign JWTs to send authorized transaction requests.

- - -
- - - -
- - -
-Built For ⁂ CENG489 ⁂ Introduction to Computer Security -
- - - - - diff --git a/site/public/robots.txt b/site/public/robots.txt deleted file mode 100644 index 7b7f367..0000000 --- a/site/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -User-agent: * -Allow: / -Sitemap: https://gradecoin.xyz/sitemap.xml diff --git a/site/public/search_index.en.js b/site/public/search_index.en.js deleted file mode 100644 index 70a2af7..0000000 --- a/site/public/search_index.en.js +++ /dev/null @@ -1 +0,0 @@ -window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"0":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1,"4":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}},"1":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1,"2":{"docs":{},"df":0,"8":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.7320508075688772}},"df":1}},"5":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1},"6":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2},"8":{"docs":{},"df":0,"t":{"docs":{},"df":0,"2":{"docs":{},"df":0,"1":{"docs":{},"df":0,":":{"docs":{},"df":0,"4":{"docs":{},"df":0,"9":{"docs":{},"df":0,":":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}}}}}}}}}},"2":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1,"0":{"docs":{},"df":0,"4":{"docs":{},"df":0,"8":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}},"x":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"3":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}}},"4":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":2},"5":{"docs":{},"df":0,"6":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":5}}},"3":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":2,"1":{"docs":{},"df":0,"4":{"docs":{},"df":0,"1":{"docs":{},"df":0,"5":{"docs":{},"df":0,"9":{"docs":{},"df":0,"2":{"docs":{},"df":0,"6":{"docs":{},"df":0,"5":{"docs":{},"df":0,"3":{"docs":{},"df":0,"5":{"docs":{},"df":0,"8":{"docs":{},"df":0,"9":{"docs":{},"df":0,"7":{"docs":{},"df":0,"9":{"docs":{},"df":0,"3":{"docs":{},"df":0,"2":{"docs":{},"df":0,"3":{"docs":{},"df":0,"8":{"docs":{},"df":0,"4":{"docs":{},"df":0,"6":{"docs":{},"df":0,"2":{"docs":{},"df":0,"6":{"docs":{},"df":0,"4":{"docs":{},"df":0,"3":{"docs":{},"df":0,"3":{"docs":{},"df":0,"8":{"docs":{},"df":0,"3":{"docs":{},"df":0,"2":{"docs":{},"df":0,"7":{"docs":{},"df":0,"9":{"docs":{},"df":0,"5":{"docs":{},"df":0,"0":{"docs":{},"df":0,"2":{"docs":{},"df":0,"8":{"docs":{},"df":0,"8":{"docs":{},"df":0,"4":{"docs":{},"df":0,"1":{"docs":{},"df":0,"9":{"docs":{},"df":0,"7":{"docs":{},"df":0,"1":{"docs":{},"df":0,"6":{"docs":{},"df":0,"9":{"docs":{},"df":0,"3":{"docs":{},"df":0,"9":{"docs":{},"df":0,"9":{"docs":{},"df":0,"3":{"docs":{},"df":0,"7":{"docs":{},"df":0,"5":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"5":{"docs":{},"df":0,"8":{"docs":{},"df":0,"2":{"docs":{},"df":0,"0":{"docs":{},"df":0,"9":{"docs":{},"df":0,"7":{"docs":{},"df":0,"4":{"docs":{},"df":0,"9":{"docs":{},"df":0,"4":{"docs":{},"df":0,"4":{"docs":{},"df":0,"5":{"docs":{},"df":0,"9":{"docs":{},"df":0,"2":{"docs":{},"df":0,"3":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"2":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}},"4":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":2},"6":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951}},"df":2,"4":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":3}},"8":{"docs":{},"df":0,"6":{"docs":{},"df":0,"0":{"docs":{},"df":0,"1":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}},"a":{"docs":{},"df":0,"a":{"docs":{},"df":0,"a":{"docs":{},"df":0,"a":{"docs":{},"df":0,"a":{"docs":{},"df":0,"a":{"docs":{},"df":0,".":{"docs":{},"df":0,"b":{"docs":{},"df":0,"b":{"docs":{},"df":0,"b":{"docs":{},"df":0,"b":{"docs":{},"df":0,"b":{"docs":{},"df":0,"b":{"docs":{},"df":0,".":{"docs":{},"df":0,"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}},"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772}},"df":1}},"s":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.4142135623730951}},"df":3}}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}}},"d":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":1},"l":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":2}}}}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}}}}}},"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.4142135623730951}},"df":2}}}},"p":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"_":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.7320508075688772}},"df":3}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":2.23606797749979},"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.7320508075688772},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":5}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}},"n":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":2.0}},"df":2}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"6":{"docs":{},"df":0,"4":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":2.23606797749979}},"df":1}}},"h":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":2}}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":2.0},"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":5,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"2":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951}},"df":2}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":4.0},"https://gradecoin.xyz/block-docs/":{"tf":3.0},"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":5,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}}},"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"g":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"y":{"docs":{},"df":0,"\"":{"docs":{},"df":0,":":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"\"":{"docs":{},"df":0,",":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"\"":{"docs":{},"df":0,":":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"\"":{"docs":{},"df":0,",":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"\"":{"docs":{},"df":0,":":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"z":{"docs":{},"df":0,"\"":{"docs":{},"df":0,",":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"\"":{"docs":{},"df":0,":":{"docs":{},"df":0,"2":{"docs":{},"df":0,",":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"\"":{"docs":{},"df":0,":":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"2":{"docs":{},"df":0,"0":{"docs":{},"df":0,"2":{"docs":{},"df":0,"1":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}},"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2,"_":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":1}}},"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}},"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}},"b":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":1,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":3}}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":2.0},"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":2}}}},"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":2}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"f":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772},"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":4}}},"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}}}}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"g":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":2}}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}}},"o":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":3}}}}}},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772}},"df":1}}},"w":{"docs":{},"df":0,"n":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"w":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}},"e":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"+":{"docs":{},"df":0,"6":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}},"1":{"docs":{},"df":0,"2":{"docs":{},"df":0,"3":{"docs":{},"df":0,"4":{"docs":{},"df":0,"5":{"docs":{},"df":0,"6":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":1}}}}}},"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":2.0}},"df":2},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.7320508075688772}},"df":2}}}}},"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":4}}}}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"p":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951}},"df":1}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":2}}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}},"u":{"docs":{},"df":0,"x":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.7320508075688772},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.4142135623730951}},"df":4}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/misc-docs/":{"tf":2.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":2.449489742783178}},"df":4}}}}}}}}},"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}},"t":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/misc-docs/":{"tf":1.4142135623730951}},"df":2}}}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1,"n":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":1}}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"d":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":3.7416573867739413},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":4,"'":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2},"_":{"docs":{},"df":0,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"_":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"h":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/block-docs/":{"tf":3.3166247903554},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.7320508075688772}},"df":4,"/":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}}}}}}},"z":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951}},"df":2}}}},"l":{"docs":{},"df":0,"p":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":3}},"x":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":3}}}}}}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"p":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.4142135623730951}},"df":3}}}},"i":{"docs":{},"df":0,"'":{"docs":{},"df":0,"v":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"a":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951}},"df":1}},"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1}}}}}}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772}},"df":1}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2},"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"v":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"o":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2},"s":{"docs":{},"df":0,"u":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"'":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}},"v":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":2.6457513110645907}},"df":1}},"j":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.4142135623730951}},"df":5}}},"w":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":2.6457513110645907},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.4142135623730951}},"df":5,"'":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},".":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}}}}},"k":{"docs":{},"df":0,"_":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.7320508075688772}},"df":1}}}}},"e":{"docs":{},"df":0,"y":{"docs":{"https://gradecoin.xyz/":{"tf":3.0},"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":3.0}},"df":4,"_":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772}},"df":1}}}}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://gradecoin.xyz/":{"tf":2.0}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"t":{"docs":{},"df":0,"&":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}},"d":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"5":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"_":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/block-docs/":{"tf":2.23606797749979}},"df":2},"u":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":2}}},"s":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":2},"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}}},"w":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":2.0}},"df":1}},"w":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":2}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}},"b":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":2}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772}},"df":1}}}},"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1},"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":2}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"_":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":1}}},"a":{"docs":{},"df":0,"1":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1},"d":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":1},"g":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"w":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}}}},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}}}},"e":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.7320508075688772}},"df":1}}},"k":{"docs":{},"df":0,"c":{"docs":{},"df":0,"s":{"docs":{},"df":0,"1":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1},"7":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"y":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772}},"df":1}}}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/block-docs/":{"tf":1.7320508075688772},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.7320508075688772}},"df":4}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}},"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":3}}}},"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":2,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/":{"tf":2.0}},"df":1}}}},"o":{"docs":{},"df":0,"f":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":2}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772},"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":4}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":3.0},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":2.0}},"df":4,"_":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":2}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}},"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.7320508075688772},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":3}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":2.23606797749979},"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":2}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":3.3166247903554},"https://gradecoin.xyz/block-docs/":{"tf":2.0},"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":2.23606797749979}},"df":5}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":3}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}}},"f":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"2":{"docs":{},"df":0,"5":{"docs":{},"df":0,"6":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}},"a":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":4,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{},"df":0,"_":{"docs":{},"df":0,"p":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}},"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"x":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}},"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772},"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":2},"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951}},"df":3}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":3}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2,"2":{"docs":{},"df":0,"5":{"docs":{},"df":0,"6":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772}},"df":1}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"v":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":2.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951}},"df":1}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":3}}}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2,"'":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"_":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"m":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.7320508075688772}},"df":2}}}}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.7320508075688772}},"df":2}}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"a":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":3,"n":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"v":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1,"t":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.4142135623730951},"https://gradecoin.xyz/jwt/":{"tf":2.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":3,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}}}}}},"o":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":4.242640687119285},"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/jwt/":{"tf":1.4142135623730951},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":2.8284271247461903}},"df":6,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"_":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/block-docs/":{"tf":1.7320508075688772}},"df":2}}}}}}}}}}}}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"x":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.7320508075688772}},"df":1}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}}},"p":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"s":{"docs":{"https://gradecoin.xyz/":{"tf":3.605551275463989},"https://gradecoin.xyz/block-docs/":{"tf":1.7320508075688772},"https://gradecoin.xyz/jwt/":{"tf":2.23606797749979},"https://gradecoin.xyz/misc-docs/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":2.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":6,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772},"https://gradecoin.xyz/misc-docs/":{"tf":1.7320508075688772},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":3,"'":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.4142135623730951}},"df":1}}}}},"v":{"docs":{},"df":0,"1":{"docs":{},"df":0,"_":{"docs":{},"df":0,"5":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}},"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.4142135623730951},"https://gradecoin.xyz/register-docs/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":3}},"u":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"a":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1},"p":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"y":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"'":{"docs":{},"df":0,"r":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}},"b":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}},"l":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":2}}},"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}}}}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"w":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/":{"tf":1.0},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/":{"tf":2.0},"https://gradecoin.xyz/jwt/":{"tf":1.0},"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":3}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}},"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://gradecoin.xyz/":{"tf":1.7320508075688772},"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":2}}}}}}}},"z":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}}}},"title":{"root":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://gradecoin.xyz/block-docs/":{"tf":1.0}},"df":1}}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://gradecoin.xyz/":{"tf":1.0}},"df":1}}}}}}}}},"j":{"docs":{},"df":0,"w":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/jwt/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{"https://gradecoin.xyz/misc-docs/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/register-docs/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://gradecoin.xyz/transaction-docs/":{"tf":1.0}},"df":1}}}}}}}}}}},"documentStore":{"save":true,"docs":{"https://gradecoin.xyz/":{"body":"Welcome to Gradecoin!\nBlockchains are incredibly simple yet can appear very complicated, we will see how they work and practice programming production cryptography code.\nThis server is the sandbox for the PA1, it's currently running the Gradecoin application. Gradecoin is the faux currency we will use to simulate a blockchain network. At the end of the simulation, the amount of Gradecoin you hold will be your PA1 grade.\nA quick summary: authenticate yourself to the system using public key encryption.\nCraft Transaction proposals and tag them using JWTs.\nWhen there are enough transactions then you can propose Blocks in the same way.\nBlocks need to be mined beforehand using Proof-of-work, or brute force.\nGradecoin offers 3 endpoints at /register, /block and /transaction. You can only send GET requests to /block and /transaction without authorization.\nThe server is programmed in RESTful architecture, there are no DELETE, PUT or UPDATE operations, though.\nGradecoin uses a Proof-of-work block accepting mechanism. It uses single round Blake2s hashing which produces 256-bit (64 hexadecimal characters) output. The target hash is 24 bits or 6 hexadecimal characters of 0. During testing, I could mine a block on average around 4-6 minutes.\n\nWe're expecting you to use existing tools and implementations. Standards are hard. Don't roll your own crypto. Feel free to ask questions. Collaborate.\n\nYou might ask,\n\nBut if nobody has any Gradecoin then how do we have transactions?\n\nThere is a bank! Their public key is 31415926535897932384626433832795028841971693993751058209749445923 and they have some amount of Gradecoin preloaded. It's also the only account that you can send transactions requests to yourself.\nCoinbase\nThe first transactions of a block is called the coinbase. They are the author of the block proposal and if the block is accepted then they get compensated for their efforts with some Gradecoin.\nPublic Key Signatures\nGradecoin uses 2048 bit RSA keypairs.\nServices\n/register\n\nCreate your own 2048 bit RSA keypair\nDownload Gradecoin's Public Key from Moodle\nEncrypt your JSON wrapped Public Key, Student ID and one time passwd using Gradecoin's Public Key\nYour public key is now in our database and can be used to sign your JWT's during requests\nFor more information, check the register page\n\n/transaction\n\nYou can offer a Transaction with a POST request\n\nThe request should have Authorization\nThe request header should be signed by the Public Key of the by field in the transaction\n\n\nFetch the list of Transactions with a GET request\nFor more information, check our transaction page\n\n/block\n\n\nOffer a Block with a POST request\n\nThe request should have Authorization\nThe transaction_list of the block should be a subset of pending transactions, available on /transaction\n\n\n\nFetch the last accepted Block with a GET request\n\n\nFor more information, check our block page\nAuthorization: The request header should have Bearer JWT.Token signed with Student Public Key\n\n\n/user\n\nMeant to be used in the browser, you can see the current list of users and their balance here\n\nQuestions\nThis all sound complicated!\n\nI've drawn inspiration from actual Bitcoin transactions and warp. The simplicity of the system is how little interfaces it has.\nDon't know where to start? Gradecoin uses RESTful API; simple curl commands or even your browser will work! This website can help as well.\nJWT Debugger and the corresponding RFC.\nRemember that you are absolutely encouraged to grab off-the-shelf implementations for every cryptography primitive you will use. You can start by finding a code snippet to generate a RSA keypair?\nCheck out misc for everything else you might be curious about.\n\nHow do you actually earn Gradecoin?\n\nRegister yourself to at /register\nCreate transactions at /transaction\nCreate blocks to commit transactions at /block\nSee how everyone is doing and find people to trade with at /user\n\nI found a bug!\nThank you! Please let me know so we can solve it.\nI hacked the server!\nThat wasn't supposed to happen :( I did not place any intentional vulnerabilities to the system so if you cracked something, it was not intended. Please don't abuse it and let me know so I can patch it.\nSubmission?\nAt the end of the simulation, your Gradecoin balance will be your grade. I will also expect a unique client programmed in either;\n\nc\nc++\nperl\nrust\npython\nrandom assortment of bash scripts\n\nIf your favourite programming language is missing please let me know 🤷?\nCan my friends play?\nSadly, no. Student's who are enrolled to the class will receive one-time-passwords for authentication.\nHow and or Why?\n\nBuilt, with Rust\n\n","id":"https://gradecoin.xyz/","title":"Gradecoin"},"https://gradecoin.xyz/block-docs/":{"body":"A block that was proposed to commit Transactions in transaction_list to the\nledger with a nonce that made hash valid; 6 zeroes at the left hand side of the\nhash (24 bytes).\nWe are mining using blake2s algorithm, which produces 256 bit hashes. Hash/second is roughly 20x103 on my machine, a new block can be mined in around 4-6 minutes.\nRequests\nGET\nA HTTP GET request to /block endpoint will return the latest mined block.\nPOST\nA HTTP POST request with Authorization using JWT will allow you to propose your own blocks.\nFields\ntransaction_list: [array of Fingerprints]\nnonce: unsigned 32-bit integer\ntimestamp: ISO 8601 <date>T<time>\nhash: String\nMining\nThe mining process for the hash involves;\n\nCreating a temporary JSON object with transaction_list, timestamp and nonce values\nSerializing it\nCalculating blake2s hash of the serialized string\n\nIf the resulting hash is valid, then you can create a Block JSON object with the found nonce and hash.\nHash\ntha field in jwt documentation in fact stands for \"The Hash\", in the case of a post request for a block, you need to use hash field of the block.\nISO 8601 Reference\n","id":"https://gradecoin.xyz/block-docs/","title":"Blocks"},"https://gradecoin.xyz/jwt/":{"body":"\nJSON Web Tokens are representations of claims, or authorization proofs that fit into the Header of HTTP requests.\n\nHow?\nJWTs are used as the MAC of operations that require authorization:\n\nblock proposal\ntransaction proposal.\n\nThey are send alongside the JSON request body in the Header;\nAuthorization: Bearer aaaaaa.bbbbbb.ccccc\n\nGradecoin uses 3 fields for the JWTs;\n{\n\"tha\": \"Hash of the payload, check invididual references\",\n\"iat\": \"Issued At, Unix Time\",\n\"exp\": \"Expiration Time, epoch\"\n}\n\n\ntha is explained in blocks and transactions documentations.\niat when the JWT was created in Unix Time format\nexp when the JWT will expire & be rejected in Unix Time\n\nAlgorithm\nWe are using RS256, RSASSA-PKCS1-v1_5 using SHA-256. The JWTs you encode with your private RSA key will be decoded using the public key you have authenticated with. You can see how the process works here.\nReferences\n\nRFC, the ultimate reference\nJWT Debugger\n\n","id":"https://gradecoin.xyz/jwt/","title":"JWT"},"https://gradecoin.xyz/misc-docs/":{"body":"We thought it might be good to explain some concepts you might have questions about.\nFingerprint\nDefinition\nA fingerprint is a 256 bit 64 character hexadecimal user identifier for users. Fingerprints are used in defining users in transactions and blocks.\nFingerprint Generation\nA user's finger print is generated via applying SHA256 sum of the user's public RSA key.\n","id":"https://gradecoin.xyz/misc-docs/","title":"Misc"},"https://gradecoin.xyz/register-docs/":{"body":"POST request to /register endpoint\nLets a user to authenticate themselves to the system.\nOnly people who are enrolled to the class can open Gradecoin accounts.\nThis is enforced with your Student ID (e123456) and a one time password you will receive.\nAuthentication Process\n\nThe bytes you are sending over the network are all Base64 Encoded\n\n\nGradecoin's Public Key (gradecoin_public_key) is listed on our Moodle page and here. Download and load it it to your client.\nCreate a JSON object (P_AR) with your metu_id (\"e\"+6 chars) and public key in base64 (PEM) format (S_PK) reference\n\n{\n \"student_id\": \"e123456\",\n \"passwd\": \"15 char secret\",\n \"public_key\": \"---BEGIN PUBLIC KEY...\"\n}\nCipher Initialization\n\nSince we are working with AES-128, both key and IV should be 128 bits (or 16 hexadecimal characters)\n\n\nPick a short temporary key (k_temp)\nPick a random IV 1 2 (iv).\n\nEncryption\n\nEncrypt the serialized string of P_AR with 128 bit block AES in CBC mode with Pkcs7 padding using the temporary key (k_temp), the result is C_AR. Encode this with base64.\nThe temporary key you have picked k_temp is encrypted using RSA with OAEP padding scheme using SHA-256 with gradecoin_public_key, giving us key_ciphertext. Encode this with base64.\nBase64 encode the IV (iv) as well.\n\n\n \n The available tools and libraries might warn you about how using the primitives given above are \"hazardous\". They are, crypto is hard.\n \n\n\nThe payload JSON object (auth_request) can be serialized now:\n\n{\n \"c\": \"C_AR\",\n \"iv\": \"iv\",\n \"key\": \"key_ciphertext\"\n}\n\nIf your authentication process was valid, you will be given access and your public key fingerprint that is your address.\nYou can now sign JWTs to send authorized transaction requests.\n","id":"https://gradecoin.xyz/register-docs/","title":"Register"},"https://gradecoin.xyz/transaction-docs/":{"body":"A transaction request between source and target to move amount Gradecoin.\nRequests\nGET\nA HTTP GET request to /transaction endpoint will return the current list of pending transactions.\nPOST\nA HTTP POST request with Authorization using JWT to /transaction will allow you to propose your own transactions.\nFields\nby: Fingerprint\nsource: Fingerprint\ntarget: Fingerprint\namount: unsigned 16 bit integer\ntimestamp: ISO 8601 <date>T<time>\nHash\ntha field in jwt documentation in fact stands for \"The Hash\", in the case of a post request for a transaction, you need the Md5 hash of the serialized JSON representation of transaction. The resulting JSON string should look something like;\n{\"by\":\"foo\",\"source\":\"bar\",\"target\":\"baz\",\"amount\":2,\"timestamp\":\"2021-04-18T21:49:00\"}\n\nOr; without any whitespace, separated with : and ,.\nBank\nThere is a bank account with Fingerprint 31415926535897932384626433832795028841971693993751058209749445923\n\n \n First 64 digits of Pi\n \n\nThis is the only account that will let you withdraw from them.\nby: this has to be your Fingerprint\nsource: this can be either you or the bank\ntarget: this can be a valid fingerprint or yourself if source is the bank\n...\n","id":"https://gradecoin.xyz/transaction-docs/","title":"Transactions"}},"docInfo":{"https://gradecoin.xyz/":{"body":424,"title":1},"https://gradecoin.xyz/block-docs/":{"body":120,"title":1},"https://gradecoin.xyz/jwt/":{"body":96,"title":1},"https://gradecoin.xyz/misc-docs/":{"body":36,"title":1},"https://gradecoin.xyz/register-docs/":{"body":173,"title":1},"https://gradecoin.xyz/transaction-docs/":{"body":94,"title":1}},"length":6},"lang":"English"}; \ No newline at end of file diff --git a/site/public/site.css b/site/public/site.css deleted file mode 100644 index 6c79aa9..0000000 --- a/site/public/site.css +++ /dev/null @@ -1,57 +0,0 @@ -.content blockquote { - border-left: #689d6a 8px solid; - -} -.content blockquote.tidbit { - border-left: #928f74 8px solid; - font-size: 12px; - color: #282828; -} - -li p { - margin: 2px; -} - -/* OUTER CONTAINER */ -.tcontainer { - width: 100%; - overflow: hidden; /* Hide scroll bar */ -} - -/* MIDDLE CONTAINER */ -.ticker-wrap { - width: 100%; - padding-left: 100%; /* Push contents to right side of screen */ - background-color: #eee; -} - -/* INNER CONTAINER */ -@keyframes ticker { - 0% { transform: translate3d(0, 0, 0); } - 100% { transform: translate3d(-100%, 0, 0); } -} - -.ticker-move { - /* Basically move items from right side of screen to left in infinite loop */ - display: inline-block; - white-space: nowrap; - padding-right: 100%; - animation-iteration-count: infinite; - animation-timing-function: linear; - animation-name: ticker; - animation-duration: 30s; -} - -.ticker-move:hover{ - animation-play-state: paused; /* Pause scroll on mouse hover */ -} - -/* ITEMS */ -.ticker-item { - display: inline-block; /* Lay items in a horizontal line */ - padding: 0 5px; -} - -.ticker-item::before { - content: " ✑ "; -} diff --git a/site/public/sitemap.xml b/site/public/sitemap.xml deleted file mode 100644 index 236beab..0000000 --- a/site/public/sitemap.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - https://gradecoin.xyz/ - - - https://gradecoin.xyz/block-docs/ - - - https://gradecoin.xyz/jwt/ - - - https://gradecoin.xyz/misc-docs/ - - - https://gradecoin.xyz/register-docs/ - - - https://gradecoin.xyz/transaction-docs/ - - diff --git a/site/public/transaction-docs/index.html b/site/public/transaction-docs/index.html deleted file mode 100644 index 593bcfe..0000000 --- a/site/public/transaction-docs/index.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - Transactions | Gradecoin - - - - - - - - - - - - - - - -
- - - - - - - - -
- - -
- - - - - -
-
- -
- Requests -
- - -
- - GET -
- -
- - POST -
- - - -
- Fields -
- - -
- Hash -
- - -
- Bank -
- - -
-
- - - -
- -
Transaction documentation
-

A transaction request between source and target to move amount Gradecoin.

-

Requests

-

GET

-

A HTTP GET request to /transaction endpoint will return the current list of pending transactions.

-

POST

-

A HTTP POST request with Authorization using JWT to /transaction will allow you to propose your own transactions.

-

Fields

-
-by: Fingerprint
-source: Fingerprint
-target: Fingerprint
-amount: unsigned 16 bit integer
-timestamp: ISO 8601 <date>T<time>
-

Hash

-

tha field in jwt documentation in fact stands for "The Hash", in the case of a post request for a transaction, you need the Md5 hash of the serialized JSON representation of transaction. The resulting JSON string should look something like;

-
-{"by":"foo","source":"bar","target":"baz","amount":2,"timestamp":"2021-04-18T21:49:00"}
-
-

Or; without any whitespace, separated with : and ,.

-

Bank

-

There is a bank account with Fingerprint 31415926535897932384626433832795028841971693993751058209749445923

-
-

- First 64 digits of Pi -

-
-

This is the only account that will let you withdraw from them.

-
-by: this has to be your Fingerprint
-source: this can be either you or the bank
-target: this can be a valid fingerprint or yourself if source is the bank
-...
-
- -
- - - -
- - -
-Built For ⁂ CENG489 ⁂ Introduction to Computer Security -
- - - - - -- cgit v1.2.3-70-g09d2