Initial migration and edits for EVM Sidechains documentation (#1544)

* Initial migration and edits for EVM Sidechains documentation

* Fix broken link

* Incorporate review feedback and fix indentaton for code snippets and images within steps

* Incorporate review feedback

* Fix indentation within steps
This commit is contained in:
Amarantha Kulkarni
2022-10-17 18:33:33 -07:00
committed by GitHub
parent 22cf651220
commit a87a06620c
21 changed files with 553 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
---
html: intro-to-evm-sidechain.html
parent: xrpl-interoperability.html
blurb: Introduction to the EVM compatible XRP Ledger Sidechain
labels:
- Interoperability
status: not_enabled
---
# Introduction to EVM Compatible XRP Ledger Sidechain
The Etherium Virtual Machine (EVM) compatible XRP Ledger sidechain is a secure and fast public blockchain that brings all kinds of web3 applications to the XRP Ledger community.
- Explorer: [https://evm-sidechain.xrpl.org](https://evm-sidechain.xrpl.org/)
- Public RPC: [https://rpc.evm-sidechain.xrpl.org](https://evm-sidechain.xrpl.org/)
The EVM Sidechain is a powerful latest generation blockchain with the following features:
- Supports up to 1000 transactions per second, thus handling large loads and throughput.
- Has a low transaction confirmation time, on average, as a block is produced every 5 seconds.
- Once a block is added to the chain and confirmed, it is considered final (1 block finalization time).
- Provides full Ethereum Virtual Machine (EVM) compatibility, enabling you to connect your wallet and interact or deploy smart contracts written in Solidity.
## Consensus
The EVM Sidechain runs on a proof-of-stake (PoS) consensus algorithm. Staking is when you pledge your coins to be used for verifying transactions. The proof-of-stake model allows you to stake cryptocurrency (also referred to as "coins") and create your own validator nodes. Your coins are locked up while you stake them, but you can unstake them if you want to trade your coins.
In a proof-of-stake blockchain, mining power depends on the amount of coins a validator is staking. Participants who stake more coins are more likely to be chosen to add new blocks.
If you are interested in staking cryptocurrency and running your own validator, see [Join EVM Sidechain Devnet](join-evm-sidechain-devnet.html) for more information.
The underlying technology for the XRP Ledger EVM Sidechain consensus is [Tendermint](https://tendermint.com/), a Byzantine-Fault Tolerant engine for building blockchains.
The blockchain uses the `cosmos-sdk` library on top of Tendermint to create and customize the blockchain using its built-in modules. The EVM sidechain uses the [Ethermint](https://github.com/evmos/ethermint) `cosmos-sdk` module, which provides EVM compatibility
## Interoperability Using the EVM Sidechain
The EVM sidechain is directly connected to XRP Ledger through the XRP Ledger bridge ([https://bridge.devnet.xrpl.](https://bridge.devnet.xrpl.org/). Through this bridge component, you can move your XRP to the EVM Sidechain and use its features.
## See Also
[Get Started with EVM Sidechain](get-started-evm-sidechain.html)

View File

@@ -0,0 +1,13 @@
---
html: xrpl-interoperability.html
parent: concepts.html
blurb: Learn about capabilities that bring programmability and ability to interact with other chains to the XRP Ledger.
template: pagetype-category.html.jinja
labels:
- Interoperability
status: not_enabled
---
# Interoperability
The XRP Ledger is known for its transaction throughput, speed, and low fees. With the addition of programmabilty and interoperability, developers can access features such as smart contracts and can build apps with cross-chain interoperability.

View File

@@ -0,0 +1,47 @@
---
html: connect-metamask-to-xrpl-evm-sidechain.html
parent: get-started-evm-sidechain.html
blurb: Learn how to connect MetaMask wallet to the EVM Sidechain for the XRP Ledger.
labels:
- Development, Interoperability
status: not_enabled
---
# Connect MetaMask to XRP Ledger Sidechain
MetaMask is an extension for accessing Harmony-enabled distributed applications (_dapps_) from your browser. The extension injects the XRP Ledger EVM sidechain Web3 API into every website's Javascript context, so that Web3 applications can read from the blockchain.
This tutorial walks through the process of installing MetaMask, configuring it on the XRP Ledger EVM sidechain network, and importing an existing account using a previously generated private key.
## 1. Installing MetaMask
Install the MetaMask extension on your browser from **[https://metamask.io/download/](https://metamask.io/download/)**. The extension supports most desktop browsers.
## 2. Create an Account on MetaMask
To create a new account on MetaMask:
1. Click the MetaMask icon.
![Create an account on MetaMask](img/evm-sidechain-create-metamask-account.png "Create an account on MetaMask")
2. Choose **Create Account**.
3. Enter the Account Name.
4. Click **Create**.
### 3. Adding XRP Ledger EVM Sidechain to MetaMask
To add XRP Ledger EVM Sidechain to MetaMask:
1. Open the MetaMask extension.
2. Use the drop-down menu to choose **Add Network**.
![Add the EVM Sidechain network to MetaMask](img/evm-sidechain-add-metamask-network.png "Add the EVM Sidechain network to MetaMask")
3. Enter the XRP Ledger Devnet endpoint information.
* **Network Name**: XRP Ledger EVM Sidechain
* **New RPC URL**: http://rpc.evm-sidechain.xrpl.org
* **Chain ID**: 1440001
* **Currency Symbol**: XRP
* **Block Explorer**: https://evm-sidechain.xrpl.org

View File

@@ -0,0 +1,107 @@
---
html: evm-sidechain-run-a-validator-node.html
parent: evm-sidechains.html
blurb: Learn how to run a validator node on the EVM Sidechain Devnet.
labels:
- Development, Interoperability
status: not_enabled
---
# Run a Validator Node on an EVM Sidechain
## Create Your Validator
Use your node consensus public key (`exrpvalconspub...`) to create a new validator by staking XRP tokens. You can find your validator pubkey by running:
```bash
exrpd tendermint show-validator
```
To create your validator on Devnet, use the following command:
```bash
exrpd tx staking create-validator \
--amount=1000000000000000000000axrp \
--pubkey=$(exrpd tendermint show-validator) \
--moniker="<your_custom_moniker>" \
--chain-id=<chain_id> \
--commission-rate="0.05" \
--commission-max-rate="0.10" \
--commission-max-change-rate="0.01" \
--min-self-delegation="1000000" \
--gas="auto" \
--gas-prices="0.025aphoton" \
--from=<key_name>
```
**Note** When specifying commission parameters, the `commission-max-change-rate` is used to measure % *point* change over the `commission-rate`. For example, 1% to 2% is a 100% rate increase, but only 1 percentage point.
**Note** `Min-self-delegation` is a strictly positive integer that represents the minimum amount of self-delegated voting power your validator must always have. A `min-self-delegation` of `1000000` means your validator will never have a self-delegation lower than `1 axrp`.
You can confirm that you are in the validator set by using a third-party explorer.
## Edit Validator Description
You can edit your validator's public description. This info is to identify your validator, and is relied on by delegators when they decide to stake XRP tokens to a particular validator. Make sure to provide input for every flag below. If a flag is not included in the command, the field defaults to empty (`--moniker` defaults to the machine name), if the field has never been set, or remains the same, if it has been set in the past.
The <key_name> specifies which validator you are editing. If you choose to not include certain flags, remember that the --from flag must be included to identify the validator to update.
The `--identity` can be used as to verify identity with systems like Keybase or UPort. When using with Keybase `--identity` must be populated with a 16-digit string that is generated with a [keybase.io](https://keybase.io/) account. It is a cryptographically secure method of verifying your identity across multiple online networks. The Keybase API allows us to retrieve your Keybase avatar. This is how you can add a logo to your validator profile.
```bash
exrpd tx staking edit-validator
--moniker="<your_custom_moniker>" \
--website="https://xrpl.org" \
--identity=6A0D65E29A4CBC8E \
--details="<your_validator_description>" \
--chain-id=<chain_id> \
--gas="auto" \
--gas-prices="0.025axrp" \
--from=<key_name> \
--commission-rate="0.10"
```
Note that the `commission-rate` value must adhere to the following invariants:
* Must be between 0 and the validator's `commission-max-rate`
* Must not exceed the validator's `commission-max-change-rate` which is the maximum % point change rate **per day**. In other words, a validator can only change its commission once per day and within `commission-max-change-rate` bounds.
## View Validator Description
View the validator's information with this command:
```bash
exrpd query staking validator <account>
```
## Track Validator Signing Information
To track a validator's signatures from past transactions use the `signing-info` command.
```bash
exrpd query slashing signing-info <validator-pubkey> --chain-id=<chain_id>
```
## Unjail Validator
When a validator is "jailed" for downtime, you must submit an `Unjail` transaction from the operator account in order to restore block proposer awards (depending on the zone fee distribution).
```bash
exrpd tx slashing unjail --from=<key_name> --chain-id=<chain_id>
```
## Confirm Your Validator is Running
Your validator is active if the following command returns anything:
```bash
exrpd query tendermint-validator-set | grep "$(exrpd tendermint show-address)"
```
You should now see your validator in one of the Exrp explorers. You are looking for the `bech32` encoded `address` in the `~/.exprd/config/priv_validator.json` file.
**Note** To be in the validator set, you must have more total voting power than the 100th validator.
## Halting Your Validator
When attempting to perform routine maintenance or planning for an upcoming coordinated upgrade, it can be useful to have your validator systematically and gracefully halt. Set the `halt-height` to the height at which you want your node to shut down, or pass the `--halt-height` flag to `exrpd`. The node shuts down with a 0 exit code at that given height after committing the block.

View File

@@ -0,0 +1,65 @@
---
html: evm-sidechain-validator-security.html
parent: join-evm-sidechain-devnet.html
blurb: Learn how to join the XRP Ledger EVM Sidechain Devnet.
labels:
- Development, Interoperability
status: not_enabled
---
# EVM Sidechain Validator Security
Each validator candidate is encouraged to run its operations independently, as diverse setups increase the resilience of the network. Validator candidates should commence their setup phase now, in order to be on time for launch.
## Horcrux
Horcrux is a [multi-party-computation (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) signing service for Tendermint nodes.
- Composed of a cluster of signer nodes in place of the [remote signer](https://docs.tendermint.com/master/nodes/remote-signer.html), thereby enabling High Availability (HA) for block signing through fault tolerance.
- Secures your validator private key by splitting it across multiple private signer nodes using threshold Ed25519 signatures.
- Adds security and availability without sacrificing block sign performance.
For information on how to upgrade your validator infrastructure with Horcrux, refer to the [documentation](https://github.com/strangelove-ventures/horcrux/blob/main/docs/migrating.md).
## Tendermint KMS
Tendermint KMS is a signature service with support for Hardware Security Modules (HSMs), such as YubiHSM2 and Ledger Nano. It is intended to be run alongside XRP Ledger EVM Sidechain validators, ideally on separate physical hosts, providing defense-in-depth for online validator signing keys, double signing protection, and a central signing service that can be used when operating multiple validators in several zones.
## Hardware Security Modules (HSM)
You must ensure that an attacker cannot steal a validator's key. Otherwise, the entire stake delegated to the compromised validator at risk. Hardware security modules (HSM) help mitigate this risk.
HSMs must support `ed25519` signatures for Evmos. The [YubiHSM 2](https://www.yubico.com/products/hardware-security-module/) supports `ed25519` and can be used with this YubiKey [library](https://github.com/iqlusioninc/yubihsm.rs).
**IMPORTANT**: The YubiHSM can protect a private key but **cannot ensure** in a secure setting that it will not sign the same block twice.
## Sentry Nodes (DDOS Protection)
Validators are responsible for ensuring that the network can sustain denial of service attacks.
One recommended way to mitigate these risks is for validators to carefully structure their network topology in a sentry node architecture.
Validator nodes should only connect to full-nodes they trust; either they operate these nodes themselves, or the nodes are run by other validator administrators they know personally. A validator node typically runs in a data center. Most data centers provide direct links to the networks of major cloud providers. The validator can use those links to connect to sentry nodes in the cloud. This shifts the burden of denial-of-service from the validator's node directly to its sentry nodes, and might require new sentry nodes be spun up or activated to mitigate attacks on existing ones.
Sentry nodes can be quickly spun up or change their IP addresses. Because the links to the sentry nodes are in private IP space, an internet-based attacked cannot disturb them directly. This ensures that the validator's block proposals and votes always make it to the rest of the network.
To setup your sentry node architecture:
1. Edit your validator node's `config.toml` file:
```sql
#Comma separated list of nodes to keep persistent connections to
#Do not add private peers to this list if you don't want them advertised
persistent_peers =[list of sentry nodes]
# Set true to enable the peer-exchange reactor
pex = false
```
2. Edit your sentry node's `config.toml` file:
```sql
#Comma separated list of peer IDs to keep private (will not be gossiped to other peers)
#Example ID: 3e16af0cead27979e1fc3dac57d03df3c7a77acc@3.87.179.235:26656
private_peer_ids = "node_ids_of_private_peers"
```

View File

@@ -0,0 +1,116 @@
---
html: get-started-evm-sidechain.html
parent: evm-sidechains.html
blurb: Get started with the EVM compatible sidechain for the XRP Ledger.
labels:
- Development, Interoperability
status: not_enabled
---
# Get Started with the EVM Sidechain
This getting started tutorial walks you through the steps to set up your account and transfer funds using the EVM sidechain bridge.
## 1. Create an Account Using an EVM Compatible Wallet
In order to interact with the network, you need to create an account in the EVM sidechain. To create and manage this account you can use any EVM compatible wallet such as MetaMask.
For instructions on how to install and create an account using MetaMask, then send and receive tokens, see [Connect MetaMask to XRP Ledger EVM Sidechain](connect-metamask-to-xrpl-evm-sidechain.html).
## 2. Move XRP Ledger Devnet Tokens to the EVM Sidechain
Before you can start interacting with the EVM blockchain, you need to transfer some tokens from the XRP Ledger Devnet to the EVM sidechain.
To obtain tokens in the XRP Ledger Devnet, go to the [XRP Faucets](xrp-testnet-faucet.html) page and click *Generate Devnet credentials* to generate a new Devnet account with some test XRP in it.
![Generate XRP Ledger Devnet credentials](img/evm-sidechain-xrpl-devnet-faucet.png "Generate XRP Ledger Devnet credentials")
Note the address and secret associated with your Devnet address. You need this information to set up your preferred XRP Ledger wallet.
## 3. Transfer Funds Using the EVM Sidechain Bridge
Once you have your accounts set up and test fund allocated, you can use the EVM Sidechain bridge to move the test XRP tokens to the EVM Sidechain.
The EVM Sidechain bridge is a tool that allows you to transfer funds between chains in a fast and secure way.
To start using the bridge, go to [https://bridge.devnet.xrpl.org](https://bridge.devnet.xrpl.org/)
### 1. Connect Both Wallets
**Connect Xumm Wallet**
Use your Xumm wallet to interact with the XRP Ledger Devnet chain.
Ensure that you have created an account on the public XRP Ledger Devnet as described in Step 1.
To connect a Xumm wallet to the bridge, go to the [EVM Sidechain bridge](https://bridge.devnet.xrpl.org) and click “Connect with Xumm Wallet”.
![Connect XUMM Wallet](img/evm-sidechain-connect-xumm-wallet.png "Connect XUMM wallet")
**Note:** Ensure that you are connected to XRP Ledger Devnet and that the application that you are connecting with is the correct one.
Follow the instructions on screen to scan the QR code using the Xumm app. The Xumm wallet app displays a confirmation page.
![Connect to XRP Ledger Devnet](img/evm-sidechain-bridge-sign-in.jpg "Connect to XRP Ledger Devnet")
**Connect MetaMask Wallet**
Use your MetaMask wallet to interact with the XRP Ledger EVM Sidechain.
Ensure that you have created a MetaMask account and connected to the public XRP Ledger Devnet as described in [Connect MetaMask to XRP Ledger EVM Sidechain](connect-metamask-to-xrpl-evm-sidechain.html).
To connect a MetaMask wallet to the bridge, go to the [EVM Sidechain bridge](https://bridge.devnet.xrpl.org) and click “Connect with Metamask Wallet”.
![Connect MetaMask Wallet](img/evm-sidechain-connect-metamask.png "Connect MetaMask wallet")
### 2. Initiate the Transfer of Funds
Now that both Xumm and MetaMask wallets are connected to the bridge, you can select the direction of the bridge, the amount to send, and the destination address.
- **Direction of the bridge**: This is the direction of transfer; it can be either EVM sidechain → XRP Ledger Devnet or XRP Ledger Devnet → EVM sidechain. Use the “Switch Network” button to switch the direction of transfer.
- **Amount to send**: This is the amount that you want to transfer to the other side. Note that there is a fee to use the bridge.
- Network fees: The fees required by the network for your transactions.
- Commission: The bridge applies a commission for every transaction completed. This is to prevent spam and distributed denial of service attacks (DDOS).
- **Destination address**: The address on the destination chain where you want to receive funds.
![Initiate the transaction](img/evm-sidechain-initiate-transfer.png "Initiate the transaction")
Enter the details for your transaction and click **Transfer**. Review the details of the transaction carefully before accepting the transaction in the corresponding wallet.
![Approve the transaction](img/evm-sidechain-approve-transaction.png "Approve the transaction")
Depending on the direction of the transfer, you need to approve the transaction in the Xumm Wallet or in the Metamask.
**XRP Ledger Devnet → EVM sidechain**
For this direction you must approve the transaction in your Xumm Wallet. Before doing so, please check that the details are correct:
- Destination address has to be: `radjmEZTb4zsyNUJGV4gcVPXrFTJAuskKa`
- Memo has to be the same address that you entered in the destination field
![Review the transaction](img/evm-sidechain-review-transaction.jpg)
**EVM sidechain → XRP Ledger Devnet**
If this is the case, then you must approve the transaction in your Metamask. Before doing so, please check the details are correct:
- Destination address has to be: `0x8cDE56336E289c028C8f7CF5c20283fF02272182`
![Review the transaction in MetaMask](img/evm-sidechain-metamask-confirmation.png "Review the transaction in MetaMask")
Once you approve the transaction either in Xumm wallet or in Metamask, a loading screen displays. This process can take up to a few minutes.
![Transaction in progress](img/evm-sidechain-transfer-in-progress.png "Transaction in progress")
### 3. Receive the Funds
Following a few minutes of transaction processing time, you are redirected to the **Transaction Confirmation** screen where you can verify the details of the bridge transaction.
- **Origin transaction hash**: Hash of the transaction in the origin chain.
- **Destination transaction hash**: Hash of the transaction in the destination chain.
- **From address**: Origin address of the transfer.
- **To address**: Destination address of the transfer.
- **Receive**: The amount received in the destination address.
![Transaction confirmation](img/evm-sidechain-transaction-confirmation.png "Transaction confirmation")
Your test XRP tokens have been successfully transferred and are now available in the other chain.

View File

@@ -0,0 +1,119 @@
---
html: join-evm-sidechain-devnet.html
parent: evm-sidechains.html
blurb: Learn how to join the XRP Ledger EVM Sidechain Devnet.
labels:
- Development, Interoperability
status: not_enabled
---
# Join the XRP Ledger EVM Sidechain Devnet
This tutorial walks you through the steps to join the existing **XRP Ledger EVM Sidechain Devnet**.
For ease of use, create an alias, `exprd`, to run all commands inside your Docker container.
## Pre-requisites
Before proceeding to initialize the node, ensure that the following pre-requisites are installed and running:
* Docker 19+
* Create an alias to run all commands in this tutorial inside a Docker container:
```bash
alias exrpd="docker run -it --rm -v ~/.exrpd:/root/.exrpd peersyst/xrp-evm-client:latest exrpd"
```
## Initialize Node
The first task is to initialize the node, which creates the necessary validator and node configuration files.
1. Initialize the chain parameters using the following command:
```bash
exrpd config chain-id exrp_1440001-1
```
2. Create or add a key to your node. For this tutorial, we use the `test` keyring:
```bash
exrpd keys add <key_name> --keyring-backend test
```
Note the `key_name` you enter as you need to reference it in subsequent steps.
**Note** For more information on a more secure setup for your validator, refer to [cosmos-sdk keys and keyrings](https://docs.cosmos.network/v0.46/run-node/keyring.html) and [validator security](evm-sidechain-validator-security.html).
3. Initialize the node using the following command:
```bash
exrpd init <your_custom_moniker> --chain-id exrp_1440001-1
```
Monikers can contain only ASCII characters. Using Unicode characters renders your node unreachable.
All these commands create your `~/.exrpd` (i.e `$HOME`) directory with subfolders `config/` and `data/`. In the `config` directory, the most important files for configuration are `app.toml` and `config.toml`.
## Genesis & Seeds
1. Copy the Genesis File.
Download the `genesis.json` file from here and copy it to the `config` directory: `~/.exrpd/config/genesis.json`. This is a genesis file with the chain-id and genesis accounts balances.
```bash
wget [https://raw.githubusercontent.com/Peersyst/xrp-evm-archive/main/devnet/genesis.json](https://raw.githubusercontent.com/Peersyst/xrp-evm-archive/main/devnet/genesis.json) ~/.exrpd/config/
```
Verify the genesis configuration file:
```bash
exrpd validate-genesis
```
2. Add Persistent Peer Nodes
Set the [`persistent_peer`](https://docs.tendermint.com/master/tendermint-core/using-tendermint.html#persistent-peer)s field in `~/.exrpd/config/config.toml` to specify peers with which your node maintains persistent connections. You can retrieve them from the list of available peers on the archive repo ([https://raw.githubusercontent.com/Peersyst/xrp-evm-archive/main/devnet/peers.txt](https://raw.githubusercontent.com/Peersyst/xrp-evm-archive/main/devnet/peers.txt)).
To get a list of entries from the `peers.txt` file in the `PEERS` variable, run the following command:
```bash
PEERS=`curl -sL https://raw.githubusercontent.com/Peersyst/xrp-evm-archive/main/devnet/peers.txt | sort -R | head -n 10 | awk '{print $1}' | paste -s -d, -`
```
Use `sed` to include them in the configuration. You can also add them manually:
```bash
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" ~/.exrpd/config/config.toml
```
## Run a Devnet Validator Node
Run the Devnet validator node using following command:
```bash
exrpd tx staking create-validator \
--amount=1000000000000axrp \
--pubkey=$(exrpd tendermint show-validator) \
--moniker="<your_custom_moniker>" \
--chain-id=<chain_id> \
--commission-rate="0.05" \
--commission-max-rate="0.20" \
--commission-max-change-rate="0.01" \
--min-self-delegation="1000000" \
--gas="auto" \
--gas-prices="0.025axrp" \
--from=<key_name>
```
**Note** For more information on running a validator note, see [Run a validator](evm-sidechain-run-a-validator-node.html)
## Start the Node
Start the node.
```bash
exrpd start
```
Once enough voting power (+2/3) from the genesis validators is up-and-running, the node starts producing blocks.

View File

@@ -1060,6 +1060,22 @@ pages:
- en - en
- ja - ja
- md: concepts/interoperability/xrpl-interoperability.md
targets:
- en
- md: concepts/interoperability/intro-to-evm-sidechain.md
targets:
- en
- name: Hooks
html: https://xrpl-hooks.readme.io/
parent: xrpl-interoperability.html
blurb: Smart contract proposal for the XRP Ledger.
targets:
- en
# Redirect old "the-rippled-server.html" # Redirect old "the-rippled-server.html"
- name: The rippled Server - name: The rippled Server
html: the-rippled-server.html html: the-rippled-server.html
@@ -2071,6 +2087,34 @@ pages:
- en - en
- ja - ja
- name: Interoperability - EVM Sidechain
html: evm-sidechains.html
parent: tutorials.html
blurb: Learn how to interact with the EVM Sidechain Devnet.
template: pagetype-category.html.jinja
targets:
- en
- ja
- md: tutorials/interoperability/get-started-evm-sidechain.md
targets:
- en
- md: tutorials/interoperability/connect-metamask-to-xrpl-evm-sidechain.md
targets:
- en
- md: tutorials/interoperability/join-evm-sidechain-devnet.md
targets:
- en
- md: tutorials/interoperability/evm-sidechain-validator-security.md
targets:
- en
- md: tutorials/interoperability/evm-sidechain-run-a-validator-node.md
targets:
- en
# References ------------------------------------------------------------------- # References -------------------------------------------------------------------

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB