diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 000000000..e69de29bb
diff --git a/2022/08/29/dev-meeting.html b/2022/08/29/dev-meeting.html
new file mode 100644
index 000000000..f2ec8591b
--- /dev/null
+++ b/2022/08/29/dev-meeting.html
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
29 August 2022
+
Meeting Summary
+
+
The meeting took place on 04 September 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
NanoMsg instead of ZeroMQ
+
+
During the meeting, Joseph suggested using Nanomsg instead of ZeroMQ because building ZeroMQ is not easy,
+especially in Windows. Additionally, we can use the pure Go implementation of Nanomsg.
+
+
The format of block events was defined as follows:
+
+
<event_id: 1 byte><event_data: variant><height: 4 bytes><seq_num: 4 bytes>
+
+
+
As a consequence of this, smart contracts events can be defined more easily and
+Infura-like services become simple, as we can just replay the events.
+
+
Reviewing a Pull Request
+
+
Nagaraj’s pull request reviewed.
+
+
Renaming project
+
+
The team discussed renaming (rebranding) the project and decided to create an online survey to
+gather suggestions for a new name.
+Everyone is encouraged to participate in the survey and suggest new names for the project.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2022/09/04/dev-meeting.html b/2022/09/04/dev-meeting.html
new file mode 100644
index 000000000..031db87f7
--- /dev/null
+++ b/2022/09/04/dev-meeting.html
@@ -0,0 +1,511 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
04 September 2022
+
Meeting Summary
+
+
The meeting took place on 29 August 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
Project renamed to Pactus
+
+
During the last meeting, the team conducted an online survey to rename the project.
+A total of 31 responses were received, and the following names were suggested:
+
+
+
+
+ Name
+ Votes
+
+
+
+
+ Sirius
+ 11
+
+
+ Pactus
+ 10
+
+
+ Nova
+ 7
+
+
+ Texo
+ 6
+
+
+ Zemus
+ 6
+
+
+ Helios
+ 6
+
+
+ Tutti
+ 5
+
+
+ Haki
+ 5
+
+
+ Aegeus
+ 4
+
+
+ Virgo
+ 4
+
+
+ Zentora
+ 3
+
+
+ Zinova
+ 3
+
+
+ Xerxes
+ 2
+
+
+ Ledgeria
+ 2
+
+
+ Solidus
+ 2
+
+
+ Welt
+ 2
+
+
+ Ventura
+ 2
+
+
+ Zebra
+ 2
+
+
+ Miranet
+ 2
+
+
+ Monetha
+ 2
+
+
+ FutureHub
+ 1
+
+
+ Muonet
+ 1
+
+
+ Mentha
+ 1
+
+
+ Hypatios
+ 0
+
+
+ Chaintopia
+ 0
+
+
+ Sycee
+ 0
+
+
+ Lepus
+ 0
+
+
+
+
+
After reviewing the responses, the team chose “Pactus” as the new name for the project. 🎉
+The project will be moved to “pactus-project/pactus,” and the team plans to announce it on social media.
+
+
Discussion on GUI
+
+
In terms of the GUI, Joseph suggested using Flutter, and the team agreed.
+To interact with the wallet, gRPC APIs will be provided, and the GUI will use these APIs.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2022/09/18/dev-meeting.html b/2022/09/18/dev-meeting.html
new file mode 100644
index 000000000..180a834a4
--- /dev/null
+++ b/2022/09/18/dev-meeting.html
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
18 September 2022
+
Meeting Summary
+
+
The meeting took place on 18 September 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
Discussion about Testnet
+
+
The team discussed Testnet and related issues, including IP block issues that were found by Hadi.
+Due to sanctions, some IPs are blocked, so the team will run a support node to assist users inside Iran.
+The GUI application had some issues on Windows, but they were fixed and tested by Hadi.
+
+
Discussion about Website
+
+
The website still has some issues, such as the need to rename the animation to “Pactus” and the lack of a logo.
+The community suggested some logos. Additionally, the roadmap page is missing.
+
+
+
+
The team discussed the status of social media platforms, including:
+
+
+ Discord: 70 members
+ Instagram: 87 followers
+ Telegram: 20 followers
+ Linkedin: 20 followers
+ Twitter: Not yet
+
+
+
The team also decided to announce the project on social media on 29 September.
+
+
Consensus parameters
+
+
The team discussed the current consensus parameters:
+
+
+ Total supply: 21 million coins
+ Reward: 1 coin per block
+ Block time: 10 second
+ Committee size: 21 members
+ Bond interval: one hour
+ Unbond interval: 21 days
+ Fee fraction: 0.0001
+ Min fee: 0.0000001
+ Max fee: 0.01
+ Maximum stake: 12381
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2022/09/20/release-0-9-0.html b/2022/09/20/release-0-9-0.html
new file mode 100644
index 000000000..9e86c7f65
--- /dev/null
+++ b/2022/09/20/release-0-9-0.html
@@ -0,0 +1,391 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.9.0 released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.9.0 released
+
20 September 2022
+
Overview
+
+
Pactus Blockchain Release Version 0.9.0
+is now available for download.
+This release includes a new graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Download
+
+
This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch.
+To get started with the Pactus Blockchain Testnet-0, simply download
+the latest version and run the Pactus software.
+
+
Join the Testnet now and get ready for the future!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2022/09/24/testnet-0-launched.html b/2022/09/24/testnet-0-launched.html
new file mode 100644
index 000000000..990d1108a
--- /dev/null
+++ b/2022/09/24/testnet-0-launched.html
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Testnet-0 launch announcement | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Testnet-0 launch announcement
+
24 September 2022
+
+
+
The Pactus blockchain Testnet-0 is now accessible.
+To participate, simply download the Pactus application version 0.9.0 and
+connect to the Testnet without any special configurations.
+For test coins, please visit our Discord channel and share your validator address.
+
+
By taking part in the Testnet, you can familiarize yourself with the Pactus blockchain and
+get ready for the Mainnet launch.
+Testnet participants will also be given higher priority during the Mainnet launch.
+
+
Please share your feedback with us to help improve the user experience in future versions of the software.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2022/10/30/dev-meeting.html b/2022/10/30/dev-meeting.html
new file mode 100644
index 000000000..8e45e2b9a
--- /dev/null
+++ b/2022/10/30/dev-meeting.html
@@ -0,0 +1,414 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
30 October 2022
+
Meeting Summary
+
+
The meeting took place on 30 October 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
In memory of Mahsa Amini
+
+
The meeting started in memory of Mahsa Amini .
+We in the Pactus family stand in solidarity with courageous people who are fighting for equality, equity and freedom in Iran.
+
+
+
+
Launching Block explorer
+
+
The beta version of the block explorer has been launched 🚀 and is now available at
+https://pacscan.org .
+
+
Nagaraj explained the block explorer and some of the features.
+
+
Project road map
+
+
Project road map was discussed.
+
+
IdeaKita pitch deck
+
+
Ali presented the Pactus pitch deck for the IdeaKita in Malaysia.
+The IdeaKita program, under the Malaysia Digital Economy Corporation (MDEC), is designed to
+support entrepreneurs and startups in Malaysia.
+
+
Latest development progress
+
+
The latest pull requests were reviewed:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2022/11/24/release-0-9-1.html b/2022/11/24/release-0-9-1.html
new file mode 100644
index 000000000..81b4893f8
--- /dev/null
+++ b/2022/11/24/release-0-9-1.html
@@ -0,0 +1,406 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.9.1 released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.9.1 released
+
24 November 2022
+
Overview
+
+
Pactus Blockchain Release Version 0.9.1
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Download
+
+
This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch.
+To start using the Pactus Blockchain Testnet-0,
+you can download the latest version from download page
+and join the Testnet.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
+ Blocks can be fully decoded when queried in gRPC
+ The HTTP module now uses gRPC module, making node configuration simpler by removing the CapnP module
+ Reducing the blockchain size by saving blocks by number instead of hash
+ The wallet can hold unconfirmed transactions
+ The wallet can use different gRPC servers
+ The GUI displays committee information
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/03/01/what-is-testnet.html b/2023/03/01/what-is-testnet.html
new file mode 100644
index 000000000..76449ae89
--- /dev/null
+++ b/2023/03/01/what-is-testnet.html
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ What is a Testnet? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
What is a Testnet?
+
01 March 2023
+
Mainnet vs Testnet?
+
+
If you have ever wondered what Testnet is and how it is different from Mainnet, read this article to the end to find out!
+
+
Mainnet and Testnet are two widely used terminologies in the Blockchain ecosystem;
+so it is important to understand the meaning and differences while working in the industry or
+following announcements of the Blockchain projects like Pactus.
+
+
Here’s a quick explanation:
+Before the actual live version of a Blockchain network that is used for real transactions,
+functions and smart-contracts (which is referred as Mainnet),
+there is a test version of the Blockchain network for testing purposes (which is referred as Testnet).
+In Testnet, a safe environment is provided to help developers experiment and test their applications,
+and make sure that everything functions smoothly in the Mainnet version.
+
+
Testnet
+
+
A Testnet is a simulation of a Blockchain, in which developers can test all the functionalities of
+their Blockchain network without risking their assets and convenience of end-users.
+Using Testnet, any possible error, bug or malfunctions can be fixed before the Mainnet launch.
+Testnet also can be an experimental environment for new features, updates and upgrades.
+So several Testnet networks of the same version or newer version of the Mainnet can be implemented on the roadmap.
+
+
What are use cases of Testnet?
+
+
A secure environment to test development ideas and updates.
+So many features and minor details in Pactus project have been successfully developed so far using the Testnet; such as:
+
+
+ extra details and information on Pactus-GUI;
+ well-functioning Pactus Blockchain explorer to access transactions and block details;
+ Upgrades that led to decreasing the size of the Pactus network
+
+
+
Providing a safe testing ground for resolve scalability and security problems, as well as decentralization issues.
+Pactus network is also a secure and purely decentralized network. However in the last updates during the Testnet,
+developers are now able to decrease the database size by approximately 10% without compromising performance.
+They did it by utilizing block height instead of hash to store blocks within the database. (you can find out more
+here ).
+
+
Testing new versions, patches and features on Testnet. it is vital for enhancing the security, load testing,
+Blockchain migration, integration tests, and etc. This is why you can now use the latest version of Pactus-GUI
+that works like clockwork and is extremely secure.
+
+
Testing the functions of cryptocurrency without disrupting the Mainnet. In the Testnet of Pactus Blockchain,
+you as a user or validator can use all the features to send, receive, bond or unbond your assets in the Pactus-GUI.
+
+
Development and simulation of smart contract features and DApps. Note that many Blockchain projects like Pactus,
+can be used as smart-contract platforms. So the Testnet can be designed in different stages to test and improve
+different applications of the network.
+
+
Please note that after a certain period of time, when developers get satisfied with the functionality and debugging process,
+they launch Mainnet. Mainnet has its own independent genesis blocks;
+so the assets and addresses that users use in Testnet are not valid inside the new Mainnet Blockchain anymore.
+In fact the whole Blockchain network starts working from the scratch and users and validators start to
+work with real coins and transactions instead of the simulated ones. But since Testnet has an important effect
+on the health and improvement of the network, in Pactus Blockchain, we have several advantages
+for the people who join the Testnet.
+
+
Why should you join the Testnet?
+
+
There are different contributors in a Blockchain network;
+Some people are developers and programmers that use the Testnet to contribute, enhance and lead the project to a better future.
+Testnet is actually vital for them to perform their changes and try their innovations and ideas.
+
+
But you might also be an end user; you might want to either be a validator and stake your assets to earn more Pactus coins,
+or you might want to learn how to use the network for future personal applications. Either way,
+you might find it handy to give it a try and be familiar with Pactus-GUI and its different features.
+
+
However, there is another advantage for end users who join the Testnet.
+While using the network, running a node or testing the Pactus-GUI in Testnet period, you are contributing to
+the community to find improvement potentials, that’s why there are more advantages contemplated for the Testnet users;
+Soon our Mainnet will be launched and also Pactus network will be announced and listed in well-known exchanges.
+As an early contributor, you will have the advantage of getting some extra initial coins at the beginning of Mainnet launch.
+So that you can use it to run a validator node and earn more from staking your assets. This airdrop is considered
+for every individual who installs Pactus-GUI and starts a node in Testnet.
+
+
There are other positive conditions you may experience as an early contributor.
+
+
+ Advanced and very responsive support for your issues (we dedicate more time to provide you with solutions)
+ Embracing your suggestions, improvement ideas, needs and information you may require to have a better user experience.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/04/21/testnet-0-concluded.html b/2023/04/21/testnet-0-concluded.html
new file mode 100644
index 000000000..eb80333ce
--- /dev/null
+++ b/2023/04/21/testnet-0-concluded.html
@@ -0,0 +1,420 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Story of Testnet-0 | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Story of Testnet-0
+
21 April 2023
+
What is Testnet?
+
+
Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+
Summary of Testnet-0
+
+
In September 2022, we launched Testnet-0 .
+The purpose of this Testnet was to
+check the consensus protocol ,
+test different transaction types,
+and ensure the stability of the blockchain.
+We also wanted to test the sortition algorithm
+to make sure it works properly.
+
+
The committee
+for the Testnet-0 was set to five validators, and more than 19 validators joined during the Testnet period.
+Over 2 million blocks were created, and more than 3.2 million transactions were processed during this time.
+The size of the blockchain is approximately 1 gigabyte.
+The maximum number of transactions recorded in a single block was 386 . With a block time of 10 seconds,
+we can confirm that Pactus blockchain can support up to 30 transactions per second (TPS),
+which is a reasonable number for TPS. Based on real-time statistics available at realtps ,
+we can see that Pactus is among the top 10 blockchains in terms of TPS.
+
+
At this point, the development team decided to end the Testnet-0 and move on to the next one,
+Testnet-1. We are planning to run the Testnet-1 to prepare for the MainNet launch.
+We will provide updates on our progress and share the details of the new Testnet soon.
+
+
+
+
This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+
We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+
We are grateful to all those who participated in Testnet-0, and
+we encourage them to join our next Testnet to help us improve Pactus.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/05/08/release-0-10-0.html b/2023/05/08/release-0-10-0.html
new file mode 100644
index 000000000..fbf3ecfd7
--- /dev/null
+++ b/2023/05/08/release-0-10-0.html
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.10.0 released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.10.0 released
+
08 May 2023
+
Overview
+
+
Pactus Blockchain Version 0.10.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlight
+
+
The main update in this version allows users to set up multiple validators in one node.
+Users can set up to 32 validators in a single node, and each validator can stake up to 1,000 coins.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ removing address from account (#454 )
+ supporting multiple consensus instances (#450 )
+ adding sortition interval to the parameters (#442 )
+
+
+
Fix
+
+
+ gui : check if the node has an active consensus instance (#458 )
+ Use of a Persistent Merkle tree to enhance performance of calculating the
+state hash ; fully tested in Testnet-0 (#432 )
+ GetBlockchainInfo
API in gRPC now returns the total number of validators and accounts (#439 )
+ wallet path as argument (#455 )
+ adding reward addresses to config (#453 )
+ removing committers from the certificate hash (#444 )
+ prevent data race conditions in committee (#452 )
+ using 2^256 for the vrf denominator (#445 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/05/09/testnet-1-launched.html b/2023/05/09/testnet-1-launched.html
new file mode 100644
index 000000000..152526b65
--- /dev/null
+++ b/2023/05/09/testnet-1-launched.html
@@ -0,0 +1,417 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Testnet-1 launch announcement | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Testnet-1 launch announcement
+
09 May 2023
+
Overview
+
+
The Pactus blockchain Testnet-1 is now available for participation.
+This version simulates the Mainnet environment and evaluate the system’s performance, stability,
+and security in a controlled environment.
+The primary goal of this version of Testnet is to determine the efficient and secure committee size for the Mainnet.
+
+
Key Aspects
+
+
+ Simulating the Mainnet environment
+ Determining the actual block creation time
+ Assessing the staking mechanism and consensus protocol
+ Evaluating network usage under different loads
+ Evaluating the syncing process for new nodes joining the network
+ Ensuring network stability with over 1000 validators
+ Evaluating transaction performance
+ Conducting stress tests
+ Performing security tests, including double spend attacks, Sybil attacks
+(nodes with different identities), and forking resistance
+
+
+
Joining Testnet-1
+
+
To join the Testnet, download Pactus software
+version 0.10.0 and
+connect to Testnet without any special configuration or hardware.
+You can run the software on your personal computer or laptop.
+To acquire test coins, visit the Discord channel and
+provide your validator address.
+
+
Benefits for Participation
+
+
By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and
+be well-prepared for the Mainnet launch.
+Testnet participants will also receive higher priority during the Mainnet launch and
+get free coins for initial staking on the Mainnet.
+
+
Your Feedback Matters
+
+
User feedback plays a vital role in the improvement of the Pactus blockchain.
+Share your thoughts and experiences to contribute to the enhancement of future software versions.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/05/29/release-0-11-0.html b/2023/05/29/release-0-11-0.html
new file mode 100644
index 000000000..dbc2e9e7c
--- /dev/null
+++ b/2023/05/29/release-0-11-0.html
@@ -0,0 +1,446 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.11.0 released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.11.0 released
+
29 May 2023
+
Overview
+
+
Pactus Blockchain Version 0.11.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
The main update in this version is the fix for the relay
+connection issue.
+A relay is a peer in the network that facilitates the connection between two peers,
+particularly when they are using home internet.
+
+
Another significant update is that sending a Bond transaction
+is now more user-friendly.
+Users no longer need to set the validator public key if they want to bond Test PAC coins to their validators.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Fix
+
+
+ gui : showing the total number of validators (#474 )
+ network : fixing relay connection issue (#475 )
+ consensus : rejecting vote with round numbers exceeding the limit (#466 )
+ increase failed counter when stream got error (#489 )
+ boosting syncing process (#482 )
+ waiting for proposal in pre-commit phase (#486 )
+ retrieving public key from wallet for bond transactions (#485 )
+ restoring config file to the default (#484 )
+ defining ChainType in genesis to detect the type of network (#483 )
+ reducing the default Argon2d to consume less memory (#480 )
+ adding password option to the start commands (#473 )
+
+
+
Refactor
+
+
+ rename send to transfer. (#469 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/06/19/release-0-12-0.html b/2023/06/19/release-0-12-0.html
new file mode 100644
index 000000000..cebd6fb54
--- /dev/null
+++ b/2023/06/19/release-0-12-0.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.12.0 released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.12.0 released
+
19 June 2023
+
Overview
+
+
Pactus Blockchain Version 0.12.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version is focused on improving the sync time to make it faster.
+This is achieved by implementing a caching mechanism that executes transactions more quickly and
+improves the calculation of total power (stake) of the blockchain in a more effective way.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ add GetAccountByNumber API to get account by number (#511 )
+
+
+
Fix
+
+
+ caching account and validator in store (#513 )
+ get recent blocks by stamp (#509 )
+ closing the mDNS connection upon stopping the network (#508 )
+ updating linkedmap to use generic (#507 )
+ removing state from cache (#506 )
+ Typo in GUI (#499 )
+ supporting localnet (#492 )
+
+
+
Refactor
+
+
+ update total power calculation based on power change(deltas) (#518 )
+ GetValidators return all validators in state validators map (#512 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/07/01/release-0-13-0.html b/2023/07/01/release-0-13-0.html
new file mode 100644
index 000000000..4acebba97
--- /dev/null
+++ b/2023/07/01/release-0-13-0.html
@@ -0,0 +1,435 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.13.0 released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.13.0 released
+
01 July 2023
+
Overview
+
+
Pactus Blockchain Version 0.13.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
Users can now restore the default_wallet
during the node initialization.
+If users have a backup of the seed phrase (mnemonic) for the default_wallet
,
+they can now restore it and re-initialize the node.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Fix
+
+
+ implemented restore wallet base on input seed (#553 )
+ measuring total sent and received bytes (#552 )
+ add validate seed and restore wallet (#533 )
+ HTTP : Missing handlers (#549 )
+ gui : update about dialog and menu items in help (#532 )
+
+
+
Refactor
+
+
+ implementing TestSuite (#535 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/07/05/testnet-500-validators.html b/2023/07/05/testnet-500-validators.html
new file mode 100644
index 000000000..8c6d1ef3a
--- /dev/null
+++ b/2023/07/05/testnet-500-validators.html
@@ -0,0 +1,409 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 500 validators joined Testnet | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
500 validators joined Testnet
+
05 July 2023
+
For a Proof of Stake blockchain, validators are important for
+maintaining the network’s integrity and security. They are similar to miners in Proof of Work blockchains like Bitcoin.
+
+
Pactus as a real Proof of Stake blockchain, has achieved a significant milestone.
+More than 500 validators joined the Testnet
+in less than 2 months.
+This accomplishment proves that Pactus is reliable, resilient, and trustworthy. More importantly, it sets new standards
+in the blockchain world. In fact, the Pactus Testnet is even more decentralized than some well-known blockchains.
+
+
+
+
One key reason why Pactus can accommodate more validators is its powerful
+consensus mechanism .
+The consensus mechanism in Pactus eliminates the need for delegation, making it possible for anyone to become a validator.
+Additionally, the user-friendly application ensures that even those new to blockchain can easily contribute to the network.
+
+
What is the next
+
+
To remain competitive in the market, Pactus recognizes the importance of prioritizing user space.
+We aim to ensure that running Pactus is affordable and accessible to anyone, regardless of their technical expertise or
+available resources.
+
+
To achieve this, the Pactus team constantly monitors network, storage, and computational usage, striving to keep them
+at minimal levels.
+By doing so, we enable more individuals to participate in the Pactus blockchain.
+
+
Currently, the Pactus team is working on optimizing and reducing network usage. This effort will lead to reduced costs,
+especially for users who are using home internet connections.
+
+
Furthermore, we are planning to introduce a pruning mode, allowing users to run the Pactus blockchain with significantly
+less storage.
+Although we believe the storage size is already small, our goal is to enable users to
+retain only the most recent blockchain history.
+This approach ensures that the blockchain size remains as compact as possible by disregarding some history of the blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/07/09/dev-meeting.html b/2023/07/09/dev-meeting.html
new file mode 100644
index 000000000..cde67997b
--- /dev/null
+++ b/2023/07/09/dev-meeting.html
@@ -0,0 +1,415 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
09 July 2023
+
Meeting Summary
+
+
The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
Overview to the Network Module
+
+
The meeting began with an overview of the Network module in Pactus.
+This module uses Libp2p as its underlying network protocol.
+
+
The Network module is agnostic about the content of the message and
+handles two types of messages: Gossip messages, which are broadcasted,
+and Stream messages, which are sent directly to a specific peer.
+The team discussed the relay nodes that enable communication for nodes behind NAT.
+Upon receiving a message, the module publishes an event.
+The two types of events are Gossip events and Steam events.
+
+
+
+
The team discussed the issue of Relay connections resetting, and explored solutions such as
+hole punching or using UDP and IPv6.
+
+
Some users in the Testnet reported high network usage.
+The team discussed implementing metrics for LibP2P to monitor network usage effectively.
+The discussion related to this issue can be found here .
+Additionally, the team discussed the customization of network resources,
+including setting limits for inbound and outbound connections.
+
+
Overview to the Sync Module
+
+
Moving on, the Sync module was discussed.
+Unlike the Network module, the Sync module has full knowledge about the messages and packets.
+The module handles a range of message types, which can be found
+here .
+
+
It was suggested that we need to define metrics for each message type.
+There was also a discussion about the need for reducing the messages to optimize the use of network resources.
+
+
The team decided to continue discussing these topics in future meetings.
+They also plan to work on improving the Network and Sync modules based on these discussions.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/08/01/testnet-1-concluded.html b/2023/08/01/testnet-1-concluded.html
new file mode 100644
index 000000000..3eab07c46
--- /dev/null
+++ b/2023/08/01/testnet-1-concluded.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Story of Testnet-1 | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Story of Testnet-1
+
01 August 2023
+
What is Testnet?
+
+
Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+
Summary
+
+
In May 2023, we launched Testnet-1 .
+The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain.
+The development team also focused on evaluating the network’s performance.
+Additionally, the overall performance of the software and the syncing process were closely examined and assessed.
+
+
The committee for Testnet-1 was set to 21 validators,
+and 584 validators joined during the Testnet period.
+More than 600,000 blocks were created, and more than 1 million transactions were processed during this time.
+The size of the blockchain is about 300 megabytes.
+
+
About 300,000 coins were staked during this period, it was almost 50% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+
+
+
We were able to extract the confirmation time of transactions.
+More than 97% of transactions were confirmed in just one block after submission.
+This indicates that the transaction pool and broadcasting models are working fine.
+
+
+
+
Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases.
+More than 97% of blocks are committed in the first rounds.
+
+
+
+
Major updates
+
+
During Testnet-1, we released three versions(Version
+0.11.0 ,
+0.12.0 ,
+0.13.0 ), and the upgrade process was smooth.
+Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future.
+The consensus failure was resolved by requiring some validators to re-sync their nodes.
+At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible,
+including:
+
+
+ Improving the consensus protocol
+ Reducing the blockchain size
+ Optimizing the network usage
+
+
+
After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.
+
+
+
+
This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+
We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+
We are grateful to all those who participated in Testnet-1, and
+we encourage them to join our next Testnet to help us improve Pactus.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/08/22/dev-report.html b/2023/08/22/dev-report.html
new file mode 100644
index 000000000..515aea65d
--- /dev/null
+++ b/2023/08/22/dev-report.html
@@ -0,0 +1,409 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev report | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev report
+
22 August 2023
+
Abstract
+
+
there is several activities in Pactus github this month, here is a clear report and explain of activities.
+
+
+
+
Linters
+
+
one of new changes in Pactus project is new linters we added this month.
+what is linters?
+linters are just a set of rules for the style of source codes, they force developers to write new codes
+in correct, clean and safe way.
+
+
why we use them?
+the reason we are using linters in Pactus and add new ones, is to make the code more safe,
+and also make it easy to work on for new contributors because we are focus on being decentralized even in development.
+
+
Linters we added till now
+
+
TLA+ spec
+
+
one another new change in Pactus is updating TLA+ spec, which is related to consensus,
+as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.
+
+
link to changes
+
+
if you wish you can learn more about Pactus consensus here.
+
+
Refactoring
+
+
some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries.
+also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.
+
+
one of refactors
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/09/04/introduction-to-pips.html b/2023/09/04/introduction-to-pips.html
new file mode 100644
index 000000000..1ba175ddc
--- /dev/null
+++ b/2023/09/04/introduction-to-pips.html
@@ -0,0 +1,417 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Introduction to PIPs | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Introduction to PIPs
+
04 September 2023
+
Introduction to PIPs
+
+
In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey:
+the Pactus Improvement Proposals, or PIPs.
+
+
+
+
What are PIPs?
+
+
Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform.
+Each PIP has a unique number like PIP-2 ,
+PIP-3 , and so on.
+These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.
+
+
The PIP process
+
+
The PIP process is open, allowing any member of the Pactus community to propose a PIP.
+The author should provide a summary, motivation, and a detailed technical explanation.
+The Pactus Laboratory team will carefully review each PIP.
+Security considerations must be addressed before finalizing a PIP.
+Once finalized, it can be added to the code.
+This process helps avoid unexpected issues during development and maintain consistency and safety.
+
+
The Origins of PIPs
+
+
The Pactus Improvement Proposals (PIPs) was inspired by the
+Ethereum Improvement Proposals (EIPs ) system,
+which had its roots in the Bitcoin Improvement Proposals (BIPs ) and
+Python Enhancement Proposals (PEPs ).
+
+
New Feature Policy
+
+
From now on, all major changes or new features in the Pactus project require a PIP.
+Any implementation must reference its specific PIP.
+Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.
+
+
PIPs Repository
+
+
For a complete list of Pactus Improvement Proposals, visit this link .
+The corresponding GitHub repository is accessible here .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/09/24/dev-report-pre-testnet-2.html b/2023/09/24/dev-report-pre-testnet-2.html
new file mode 100644
index 000000000..9220021ce
--- /dev/null
+++ b/2023/09/24/dev-report-pre-testnet-2.html
@@ -0,0 +1,427 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev Report pre-testnet2 | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev Report pre-testnet2
+
24 September 2023
+
Abstract
+
+
there is several activities in Pactus github in September month, here is a clear report and explain of activities.
+
+
+
+
Implementing PIP 2, 3 and 4
+
+
After starting Pactus Labs and PIPs ,
+we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:
+
+
+
+
Network
+
+
There is some very good change and new features for Pactus network module,
+this list contain a list of important changes in Pactus networking:
+
+
+
+
gRPC and nanomessage services
+
+
We also updated, improved and enhanced gRPC and nanomessage services for better developer experience,
+for third-party and side project developers, here is some changes:
+
+
+
+
Refactoring and other new feature or debugs
+
+
We had some not implemented feature request, not fixed bugs and some issue with new golang version,
+list of this changes:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/09/28/how-sspos-works-in-simple-word.html b/2023/09/28/how-sspos-works-in-simple-word.html
new file mode 100644
index 000000000..a931f9297
--- /dev/null
+++ b/2023/09/28/how-sspos-works-in-simple-word.html
@@ -0,0 +1,461 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How SSPoS (Solid State Proof of Stake) works in simple word | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How SSPoS (Solid State Proof of Stake) works in simple word
+
28 September 2023
+
Abstract
+
+
In all Blockchain protocols, there is a concept called a consensus mechanism.
+This mechanism is used to enable nodes to reach an agreement
+on the state of the Blockchain they are
+maintaining, in order to have a synchronized and integrated Blockchain.
+
+
For now, we have a lot of consensus mechanisms in the Blockchain world.
+Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.
+
+
To explain how it works let’s start with explaining one of the first and simplest
+consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).
+
+
+
+
PoW (Proof of Work)
+
+
In the proof of work model, each node in the network should solve a complex mathematical
+problem that requires lots of computing resources to make a new block.
+
+
In this way, it’s highly unlikely that anyone would be able to change
+past transactions and change Blockchain states such as balances,
+without expending equivalent computational power.
+
+
By doing this we ensure the security and integrity of the Blockchain.
+
+
The concept was adapted from digital tokens by Hal Finney in 2004
+through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).
+
+
Bitcoin uses this consensus model.
+
+
PoS (Proof of Stake)
+
+
On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!
+
+
Validators lock a number of their assets in the Blockchain and they can transfer or use it
+till it is locked which we call staking.
+after each Block is committed one of the validators will be chosen randomly (more amount of stake,
+more chance to be chosen) when a validator is chosen
+it proposes a block and announces it to other nodes to be validated,
+when a supermajority of validators accept the block it’s going to be committed.
+
+
In this system, validators have no incentive to behave maliciously or dishonestly.
+If they do, they risk losing the stake amount.
+
+
More amount of validators in a PoS Blockchain makes it more secure,
+decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.
+
+
Ethereum uses this model.
+
+
DPoS (Delegated Proof of Stake)
+
+
DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm.
+users entrust their stakes to a small group of “delegates”.
+These delegates are responsible for validating transactions
+and creating blocks. The number of delegates is limited
+to ensure accountability and efficiency in the validation process.
+
+
Some Blockchains like Cardano and Tron use DPoS.
+
+
DPoS tries to solve the issue of PoS which when validators
+increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot
+of trust in the hands of a small number of delegates,
+which goes against the principle of “don’t trust, verify”.
+
+
SSPoS (Solid State Proof of Stake)
+
+
BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?
+
+
In Pactus Blockchain, we have something called Solid State Proof of Stake
+and we try to fix the previous model’s issue, let me explain.
+
+
Pactus uses a dynamic committee of validators with a fixed size of 51,
+but the members of the committee randomly change in each round,
+based on stake amount the chance of being chosen is higher. on the other hand,
+the number of validators out on the committee is unlimited, allowing anyone
+to become a validator by staking coins.
+
+
At each block, validators participate in a sortition algorithm by generating a random number
+between zero and the total staked coins. If the number is less
+than the validator’s stake, they can enter the committee and replace the oldest committee member.
+
+
So, in SSPoS models which are a variant of PoS, we can reach a consensus,
+without using high computation resources, having an inefficient
+validation process by increasing validator numbers,
+and also without breaking the principle of “don’t trust, verify”.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/10/15/release-0-15-0.html b/2023/10/15/release-0-15-0.html
new file mode 100644
index 000000000..cb14aab71
--- /dev/null
+++ b/2023/10/15/release-0-15-0.html
@@ -0,0 +1,501 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.15.0 released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.15.0 released
+
15 October 2023
+
Overview
+
+
Pactus Blockchain Version 0.15.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+
Download
+
+
This version is the bootstrap version for
+Testnet-2 .
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
+ If you participated in Testnet-1, ensure to delete your previous working directory and
+ create a new wallet.
+
+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows,
+ or "~/pactus" on Unix-compatible platforms.
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gui : adding the splash screen (#743 )
+ add absentees votes to the certificate (#746 )
+ logger : short stringer for loggers (#732 )
+ implementing pip-7 (#731 )
+ implementing pip-11 (#712 )
+ implementing pip-8 (#711 )
+ implementing pip-9 (#706 )
+ new API to get Public key by address (#704 )
+ Adding address field for AccountInfo (#703 )
+ CreateValidatorEvent and CreateAccountEvent for nanomsg (#702 )
+ implementing PIP-2 and PIP-3 (#699 )
+ Adding Hole Punching to network (#697 )
+ write logs into file (#673 )
+ check protocol support before sending connect/disconnect event (#683 )
+ updating genesis for pre-testnet-2 (#679 )
+ adding udp protocol for network (#672 )
+ implementing pip-4 (#671 )
+ Notifee service events (#628 )
+ adding MinimumStake parameter (#574 )
+ adding Sent and Received bytes per message metrics for peers (#618 )
+ add reason to BlockResponse messages (#607 )
+ Add CalcualteFee in GRPC (#601 )
+ add sent bytes and received bytes metrics to peerset plus update grpc (#606 )
+ added metrics of libp2p with supporting prometheus (#588 )
+ Check node address is valid (#565 )
+ add LastSent and LastReceived properties to peer (#569 )
+
+
+
Fix
+
+
+ data race issue on updating certificate (#747 )
+ network : async connection (#744 )
+ adding query vote timer for CP phase (#738 )
+ trim transactions in proposed block (#737 )
+ fixing query votes and proposal issue (#736 )
+ fixing issue when a block has max transactions (#735 )
+ consensus : anti-entroy mechanism for the consensus (#734 )
+ logger : invalid level parsing error (#733 )
+ cache certificate by height (#730 )
+ fixing a crash on consensus (#729 )
+ consensus : prevent double entry in new height (#728 )
+ resolve consensus halt caused by time discrepancy in network. (#727 )
+ unsorted addresses in wallet listing (#721 )
+ send query votes message, if there is no proposal yet (#723 )
+ fixing logger level issue (#722 )
+ fixing syncing stuck issue (#720 )
+ fixing some minor issues on pre-testnet (#719 )
+ supporting go version 1.21 and higher (#692 )
+ ensure log rotation using tests (#693 )
+ restoring at the first block (#691 )
+ swagger doesn’t work with multiple proto files (#687 )
+ fixing wallet-cli issues (#686 )
+ prevent stripping public key for subsidy transactions (#678 )
+ updating the consensus protocol (#668 )
+ aggregating signature for hello message (#640 )
+ error case for logger (#634 )
+ adding committers to the certificate (#623 )
+ updating sortition executor (#608 )
+ update buf and fixing proto generation issue (#600 )
+ adding block hash to peer (#584 )
+ copy to clipboard option for address and pubkey (#583 )
+ public key aggregate (#576 )
+ remove GetValidators rpc method (#573 )
+ missing swagger ui for grpc get account by number (#564 )
+ incorrect handler for validator by number (#563 )
+
+
+
Refactor
+
+
+ sync : refactoring syncing process (#676 )
+ remove payload prefix from payload transaction type (#669 )
+ change Hello message from broadcasting to direct messaging (#665 )
+ committee : using generic list for validators (#667 )
+ rename SanityCheck to BasicCheck (#643 )
+ cli : Migrating from mow.cli to cobra for wallet (#629 )
+ cli : replacing mow.cli with cobra for daemon (#621 )
+ logger : using fast JSON logger (zerolog) (#613 )
+ Using Generics for calculating Min and Max for numeric type #604 (#609 )
+ Updating LRU cache to version 2 #514 (#602 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/10/15/testnet-2-launched.html b/2023/10/15/testnet-2-launched.html
new file mode 100644
index 000000000..a0d50792b
--- /dev/null
+++ b/2023/10/15/testnet-2-launched.html
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Testnet-2 launch announcement | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Testnet-2 launch announcement
+
15 October 2023
+
Overview
+
+
Exciting news for the Pactus Community: Testnet-2 is has launched!
+The journey through Testnet-1
+brought success and invaluable experiences, with over 500 validators joining the network.
+Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and
+thoroughly address these issues.
+After two months of dedicated work and testing, many problems have been resolved, and
+we feel confident launching the Testnet again.
+Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain.
+Notably, the new consensus mechanism and improved overall network performance.
+
+
At this point, we want to assure the Pactus community that this version of
+the Testnet will not stop until the mainnet launches ,
+and our main focus is on improving its overall performance and launching the Mainnet.
+
+
If you’re new to the concept of Testnet, check out our informative post:
+What is the Testnet?
+
+
Key Focus Areas
+
+
Testnet-2 has important tasks ahead.
+Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient.
+A close eye will be kept on the network’s performance, ensuring it operates as expected.
+For Testnet-2, the committee
+size has been expanded to 51 members.
+Both the committee’s performance and block production will be closely monitored.
+The goal is a blockchain that remains stable and trustworthy,
+even with thousands of validators in the network,
+ensuring it manages its regular duties seamlessly.
+
+
How To Join
+
+
Want to join the Testnet-2? Great! It’s super easy.
+Just download the latest Pactus software and you’re good to go.
+no fancy setups or special gear needed.
+You can run the software straight from your personal computer or laptop.
+Need some test coins? Pop over to our Discord channel and share your validator address there.
+
+
Benefits for Participation
+
+
By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and
+be well-prepared for the Mainnet launch.
+Testnet participants will also receive higher priority during the Mainnet launch and
+get free coins for initial staking on the Mainnet.
+
+
Your Feedback Matters
+
+
User feedback plays a vital role in the improvement of the Pactus blockchain.
+Share your thoughts and experiences to contribute to the enhancement of future software versions.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/10/29/release-0-16-0.html b/2023/10/29/release-0-16-0.html
new file mode 100644
index 000000000..56bf307c0
--- /dev/null
+++ b/2023/10/29/release-0-16-0.html
@@ -0,0 +1,448 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.16.0 Released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.16.0 Released
+
29 October 2023
+
Overview
+
+
Pactus Blockchain Version 0.16.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version allows users to create new addresses for both validators and accounts.
+The networking module has been improved, and users can now set limits on the number of connections.
+A random crash on the agreement protocol has been fixed in this version.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gui : display network ID (#780 )
+ create new validator address (CLI and GUI) (#757 )
+ add community bootstrap nodes to testnet config (#764 )
+ network : implementing connection manager (#773 )
+ network : adding bootstrapper mode to the network config (#760 )
+
+
+
Fix
+
+
+ network : redefine the network limits (#788 )
+ consensus : not increase the vote-box power on duplicated votes (#785 )
+ network : close connection when unable to get supported protocols (#781 )
+ network : enabling peer exchange for bootstrappers (#779 )
+ network : set connection limit for the resource manager (#775 )
+ sync : peer status set to known on sucessfull handshaking (#774 )
+ consensus : strong termination for the binary agreement (#765 )
+ consensus : not increase the voting power on duplicated binary votes (#762 )
+
+
+
Refactor
+
+
+ network : refactoring peer manager (#787 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/11/12/release-0-17-0.html b/2023/11/12/release-0-17-0.html
new file mode 100644
index 000000000..1b9b3509f
--- /dev/null
+++ b/2023/11/12/release-0-17-0.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.17.0 Released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.17.0 Released
+
12 November 2023
+
Overview
+
+
Pactus Blockchain Version 0.17.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
The Testnet has been upgraded and all validators must update their nodes.
+
+
This version will address major networking issues, reduce network usage, and improve overall performance.
+
+
A new node type, “Node Gossips ”, has been introduced to help broadcast and spread messages across the network.
+Node Gossips support the network by delivering messages to non-gossiping nodes.
+This gossip option is disabled by default but can be enabled in the configuration file.
+If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node.
+Please note that this option is still experimental and subject to potential changes in future releases.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After updating the node, the configuration file will be overwritten with a new version.
+You need to make modifications to the config file if you had customized it prior to the update.
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ network : default configs for bootstrap and relay peers (#812 )
+ introducing node gossip type (#811 )
+ sync : adding remote address to the peer info (#804 )
+ network : adding public address to factory (#795 )
+ network : filter private ips (#793 )
+
+
+
Fix
+
+
+ upgrading Testnet (#814 )
+ sync : prevent opening sessions indefinitely (#813 )
+ execution : fixing mistake on calculating unbonded power (#806 )
+ network : check connection threshold on gater (#803 )
+ network : no transient connection (#799 )
+ not close connection for bootstrap nodes (#792 )
+
+
+
Refactor
+
+
+ sync : refactoring sync process (#807 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/12/12/release-0-18-0.html b/2023/12/12/release-0-18-0.html
new file mode 100644
index 000000000..a78b04954
--- /dev/null
+++ b/2023/12/12/release-0-18-0.html
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.18.0 Released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.18.0 Released
+
12 December 2023
+
Overview
+
+
Pactus Blockchain Version 0.18.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version has significantly improved the syncing progress.
+The syncing process concurrently requests blocks from 8 different peers and
+actively connects to the most optimal peers for downloading the blockchain.
+
+
Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.
+
+
Breaking change
+
+
For Unix-based systems, please note that the working directory for root users has changed from /pactus
to /root/pactus
.
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After you update the node, the configuration file will automatically get updated, keeping the old settings.
+If you want to return the configuration file to its default settings,
+just delete the current config file and restart the node.
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ implement pip-14 (#841 )
+ sort wallet addresses (#836 )
+ grpc : endpoints for creating raw transaction (#838 )
+ network reachability API (#834 )
+ implement pip-13 (#835 )
+ subscribing to libp2p eventbus (#831 )
+ implement helper methods for wallet address path (#830 )
+ logger : adding rotate log file after days, compress and maxgae for logger config (#822 )
+ enable bandwidth router metric (#819 )
+
+
+
Fix
+
+
+ network : refining the connection limit (#849 )
+ corrected mistake when retrieving the reward address (#848 )
+ config : restore default config when it is deleted (#847 )
+ cmd : changing home directory for root users (#846 )
+ removing BasicCheck for hash (#845 )
+ disabling libp2p ping protocol (#844 )
+ build docker file (#839 )
+ sync : ignore publishing a block if it is received before (#829 )
+ network : subscribing to the Libp2p event bus (#828 )
+ sync : ignore block request if blocks are already inside the cache (#817 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024/01/04/release-0-19-0.html b/2024/01/04/release-0-19-0.html
new file mode 100644
index 000000000..40ad3cef6
--- /dev/null
+++ b/2024/01/04/release-0-19-0.html
@@ -0,0 +1,462 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.19.0 Released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.19.0 Released
+
04 January 2024
+
Overview
+
+
Pactus Blockchain Version 0.19.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version has improved the overall performance of the blockchain by implementing
+PIP-15 .
+PIP-15 suggests to add caching algorithms to the database for the most frequently used items.
+
+
Additionally, this version has enhanced the connectivity of the nodes in the P2P network.
+
+
Availability Score
+
+
This version comes with the implementation of PIP-19 .
+PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the
+committee .
+Validators with a score less than 0.8 won’t receive the block reward,
+as their proposals will be rejected by other validators.
+The main reason behind this PIP is to prevent users from downgrading
+their node specifications and running Pactus on machines with low resources.
+
+
Breaking change
+
+
The Docker container now contains both daemon and wallet binary files.
+Users who use Docker to run Pacts now need to add the entry point to run Pactus.
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gRPC : defining network and peers info response’s properly (#898 )
+ implementing pip-19 (#899 )
+ network : disabling GosipSub, only FloodSub (#895 )
+ www : adding change proposer round and value to consensus info votes (#892 )
+ network : adding relay service to dial relay nodes (#887 )
+ implementing pip-15 (#843 )
+ check already running by lock file (#871 )
+
+
+
Fix
+
+
+ store : use cache to check if public key exists (#902 )
+ executor : not rejecting bond transaction for bootstrap validator (#901 )
+ GUI : removing unnecessary tags in transaction confirm dialog (#893 )
+ network : close relay connection for public node (#891 )
+ network : refining GossipSubParams for Gossiper node (#882 )
+ sync : adding sequence number to the bundle (#881 )
+ network : turn off mesh for gossiper node (#880 )
+ consensus : check voteset for CP strong termination (#879 )
+ adding querier to query messages (#878 )
+ execution : fixing issue #869 (#870 )
+ fixing logger issue on rotating log file (#859 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024/01/08/mainnet-announcement.html b/2024/01/08/mainnet-announcement.html
new file mode 100644
index 000000000..090f0dd8f
--- /dev/null
+++ b/2024/01/08/mainnet-announcement.html
@@ -0,0 +1,394 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Mainnet announcement | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mainnet announcement
+
08 January 2024
+
The much-awaited Mainnet Launch of The Pactus Blockchain is finally here!
+On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block ,
+will be minted by four Bootstrap validators.
+After that, every 10 seconds, a new block will be added to the blockchain.
+Each block contains the committed transactions in the network.
+The block finality in the Pactus blockchain is immediate.
+It means that there is no need to wait for block confirmation to ensure a transaction is committed.
+
+
Later, more than 2000 community validators will secure the blockchain and make it decentralized.
+These validators are Testnet participants who helped test Pactus during our testing period.
+The community validators will receive the initial staking coins from a Discord Bot named RoboPac.
+
+
To ensure everything works smoothly on the Mainnet, three different Testnets (
+Testnet0 ,
+Testnet1 , and
+Testnet2 ) have been run.
+
+
The Mainnet will never be stopped or interrupted by the core developers of Pactus,
+and validators should primarily participate in and maintain the security of the blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024/01/10/pactus-records-its-ips-in-ipminter.html b/2024/01/10/pactus-records-its-ips-in-ipminter.html
new file mode 100644
index 000000000..b2095e6f4
--- /dev/null
+++ b/2024/01/10/pactus-records-its-ips-in-ipminter.html
@@ -0,0 +1,399 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus records its IPs in IPMINTER | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus records its IPs in IPMINTER
+
10 January 2024
+
+
+
In our continuous pursuit of innovation, the recording of our intellectual property is the
+cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a
+slow and expensive hurdle. That is… until we discovered IPMINTER!
+
+
Pactus profile in IPMINTER
+
+
We are ecstatic to announce that the blockchain-based platform by IPMINTER has
+revolutionized the way we secure our creations.
+
+
Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our
+intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes!
+Plus, the moment we received our exquisite certificate, complete with a QR code directly linking
+to our secure blockchain entry, our confidence in this platform soared.
+
+
Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission
+to protect our inventive proposals. The assurance we’ve experienced using their platform has
+been unparalleled.
+
+
We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward,
+economical, and robust IP recording solution. They have our heartfelt endorsement!
+
+
Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024/01/11/release-0-20-0.html b/2024/01/11/release-0-20-0.html
new file mode 100644
index 000000000..cacd82b3f
--- /dev/null
+++ b/2024/01/11/release-0-20-0.html
@@ -0,0 +1,459 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.20.0 Released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.20.0 Released
+
11 January 2024
+
Overview
+
+
Pactus Blockchain Version 0.20.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
Validator Stake Management
+
+
The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.
+
+
+
+
Improving Network Connectivity
+
+
Some users have reported that UDP packets are being dropped by their Internet Service Providers.
+Therefore, the UDP protocol is disabled by default.
+Users can still activate the UDP protocol by configuring the settings in the file if necessary.
+
+
Also, the experimental Node Gossip feature has been removed in this version.
+Node gossip could cause some validators to become isolated from the rest of the network.
+
+
Relay service
+
+
This version enables users to turn their node into a relay service.
+A relay service node can help users behind NAT to communicate with each other.
+It is disabled by default and can be enabled inside the config file.
+Please note that it is still in an experimental state.
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ implement relay service (#931 )
+ HTTP : Integrate AddRowDouble and update tests (#926 )
+ network : making listen address private in config (#921 )
+ http : adding AvailabilityScore to http module (#917 )
+ network : adding ‘enable_udp’ config (#918 )
+ network : removing gossip node service (#916 )
+ gRPC : adding AvailabilityScore to gRPC (#910 )
+ GUI : unbond and withdraw transaction dialogs (#908 )
+
+
+
Fix
+
+
+ gRPC : adding missing get raw transaction APIs to gRPC gateway (#925 )
+ network : preventing self dial (#924 )
+ fixing time lag on starting node (#923 )
+ network : fixing network deadlock on linux arm64 (#922 )
+ GUI : updating unbond and withdraw dialogs (#911 )
+ fixing gRPC node info issue (#906 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024/01/22/testnet-2-concluded.html b/2024/01/22/testnet-2-concluded.html
new file mode 100644
index 000000000..89505c523
--- /dev/null
+++ b/2024/01/22/testnet-2-concluded.html
@@ -0,0 +1,442 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Story of Testnet-2 | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Story of Testnet-2
+
22 January 2024
+
What is Testnet?
+
+
Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+
Summary
+
+
In October 2023, we launched Testnet-2 .
+The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.
+
+
The committee for Testnet-2 was set to 51 validators,
+and 2084 validators joined during the Testnet period.
+More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network.
+More than 800,000 blocks were created, and about 2 million transactions were processed during this time.
+The size of the blockchain is about 450 megabytes.
+
+
About 500,000 coins were staked during this period, almost 60% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+
Stability of Consensus
+
+
In Testnet-1, we had one consensus failure that caused us to
+conclude the Testnet-1 .
+During Testnet-2, there were no issues with the consensus mechanism, and
+we had no case of failure during the testing period,
+although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor.
+It proved that the consensus mechanism is in a stable situation.
+
+
Networking issues
+
+
In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem.
+In the second blockage, we had no choice but to ask active validators inside the committee to
+update their nodes to overcome the networking issue.
+The development team faced a difficult situation and had to make the proper decision to fix the networking issues.
+On one hand, the networking traffic increased significantly, and on the other hand, we had to
+make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems.
+After examining different scenarios, the networking issues were resolved, and
+no major problems were reported till the end of Testnet.
+
+
Major updates
+
+
During Testnet-2, we introduced several updates, including versions
+0.15.0 ,
+0.16.0 ,
+0.17.0 ,
+0.18.0 ,
+0.19.0 , and
+0.20.0 .
+The update process went smoothly, and with the stability of Version 0.20.0 confirmed,
+the development team shifted its focus to the Mainnet launch.
+
+
+
+
This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+
We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+
We are grateful to all those who participated in Testnets, and we encourage them to join the Mainnet.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024/01/24/mainnet-launched.html b/2024/01/24/mainnet-launched.html
new file mode 100644
index 000000000..f4f9c9498
--- /dev/null
+++ b/2024/01/24/mainnet-launched.html
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Mainnet launched 🚀 | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mainnet launched 🚀
+
24 January 2024
+
Years to Launch
+
+
Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time.
+Pactus Mainnet is the result of years of hard work, research, and innovation.
+It started from one idea:
+
+
A low-cost, truly decentralized blockchain, built by the people for the people,
+where anyone could run and be their own validator.
+
+
We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.
+
+
+
+
We want to thank Pactus community for helping us on the Testnet.
+
+
You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.
+
+
On the Road
+
+
The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!
+
+
We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!
+
+
We Have a Dream
+
+
We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.
+
+
This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.
+
+
And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024/01/31/release-1-0-0.html b/2024/01/31/release-1-0-0.html
new file mode 100644
index 000000000..446ef6de0
--- /dev/null
+++ b/2024/01/31/release-1-0-0.html
@@ -0,0 +1,447 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 1.0.0 (Beijing) Released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 1.0.0 (Beijing) Released
+
31 January 2024
+
Overview
+
+
Pactus Blockchain Version 1.0.0 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+
Highlights
+
+
Mainnet Official Release v1.0.0 (Beijing)
+
+
The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone
+for our community.
+This impressive mainnet release represents the culmination of extensive development efforts.
+Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain,
+enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software
+and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on
+this exciting journey.
+
+
Onboarding validators
+
+
On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in
+Testnet-0 ,
+Testnet-1 , and
+Testnet-2 .
+This marks the beginning of a new chapter in the decentralized world.
+
+
Download
+
+
This version has been implemented for Mainnet
+To start using Pactus Mainnet, download the latest version from the download
+page and join the Mainnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ implement get validator address for grpc (#975 )
+ add bootstrap.json and load in config on build (#964 )
+ add mainnet config and genesis files (#951 )
+ add Consensus-address to network info (#952 )
+ grpc : sign transaction using wallet client (#945 )
+ pactus gui lock support (#947 )
+ consensus : turning consensus to a zero-config module (#942 )
+
+
+
Fix
+
+
+ localnet wallet issue (#970 )
+ sync : remove ReachabilityStatus from agent info (#956 )
+ daemon : keeping previous behavior for password flag, linting CLI messages (#950 )
+ consensus : detect if the system time is behind the network (#939 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024/02/10/release-1-0-1.html b/2024/02/10/release-1-0-1.html
new file mode 100644
index 000000000..ccb1ee04b
--- /dev/null
+++ b/2024/02/10/release-1-0-1.html
@@ -0,0 +1,427 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 1.0.1 (Beijing) Released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 1.0.1 (Beijing) Released
+
10 February 2024
+
Overview
+
+
Pactus Blockchain Version 1.0.1 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
This release is named after the city of Beijing and it
+was unanimously selected by Pactus community.
+
+
+
+
Highlights
+
+
This update fixes several issues identified after the release of
+1.0.0 (Beijing) .
+Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.
+
+
Download
+
+
To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+
How to Upgrade
+
+
If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gui : add connections and moniker fields to main windows (#1090 )
+
+
+
Fix
+
+
+ network : set dial and accept limit in connection gater (#1089 )
+ gui stderr logger in windows os (#1081 )
+ sync : improve syncing process (#1087 )
+ network : redefine resource limits (#1086 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024/02/18/release-1-0-2.html b/2024/02/18/release-1-0-2.html
new file mode 100644
index 000000000..16d072f56
--- /dev/null
+++ b/2024/02/18/release-1-0-2.html
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 1.0.2 (Istanbul) Released | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 1.0.2 (Istanbul) Released
+
18 February 2024
+
Overview
+
+
Pactus Blockchain Version 1.0.2 (Istanbul)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
This release is named after the city of Istanbul and it
+was unanimously selected by Pactus community.
+
+
+
+
Highlights
+
+
This update fixes a major issue that decreases the number of inbound connections of the nodes over time.
+We highly recommend all users to upgrade to the new version for better connectivity.
+
+
Download
+
+
To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+
How to Upgrade
+
+
If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Fix
+
+
+ sync : fix concurrent map read-write crash (#1112 )
+ network : remove disconnected peers from peerMgr (#1110 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/404.html b/404.html
new file mode 100644
index 000000000..da96a1985
--- /dev/null
+++ b/404.html
@@ -0,0 +1,220 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Error 404, Page Not Found | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
404
+
+
Page not found :(
+
The requested page could not be found.
+
+
+
+
diff --git a/CNAME b/CNAME
new file mode 100644
index 000000000..4ad1830d6
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+pactus.org
diff --git a/about/faq/index.html b/about/faq/index.html
new file mode 100644
index 000000000..153932cc7
--- /dev/null
+++ b/about/faq/index.html
@@ -0,0 +1,1486 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ FAQ | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
***
+
+
+
+
+
+
+
+
+ What does "Pactus" mean?
+
+
+
+
+
+
+
+
+ The word "Pactus" is of Latin origin and means "to agree together", "contract", or "transact". In English, the term "Pact" is derived from the Latin word "Pactus".
+
+
+
+
+
+
+
+ Is Pactus a copy of any other blockchain?
+
+
+
+
+
+
+
+
+ No, Pactus is not a copy or a derivative of any other blockchain. It is a new and unique blockchain protocol that has been designed from scratch. The consensus mechanism used in Pactus is unique and specifically created to solve the scalability issue of validators in the Proof of Stake blockchains.
+
+
+
+
+
+
+
+ Did Pactus have an ICO?
+
+
+
+
+
+
+
+
+ No, Pactus didn't have any ICO or Initial Coin Offering.
+
+
+
+
+
+
+
+ Where can I buy Pactus coins?
+
+
+
+
+
+
+
+
+ Pactus does not have any pre-sales coins. The only way to obtain Pactus coins at the moment is by installing the Pactus software and actively participating in block validation. By engaging in the network and contributing to block validation, you will be rewarded with Pactus coins.
+
+
+
+
+
+
+
+ Why was Pactus developed?
+
+
+
+
+
+
+
+
+ Pactus was developed with the goal of scaling blockchain without compromising security and decentralization. To achieve this, Pactus utilizes a unique consensus mechanism that enables the creation of blocks in just 10 seconds. Moreover, Pactus was designed to be more accessible to all users, regardless of their technical expertise or financial resources.
+
+
+
+
+
+
+
+ What problems does Pactus solve that other blockchains don't?
+
+
+
+
+
+
+
+
+ Pactus tries to solve several problems faced by other blockchain networks, including: Scalability: Pactus has a unique consensus mechanism that is specifically designed to address the scalability issue without sacrificing the security and decentralization. Accessibility: Running a node on Pactus is designed to be more accessible to normal users compared to other blockchains. Storage cost: Pactus offers a novel storage solution by allowing users to allocate dedicated storage files, reducing storage costs and simplifying the smart contracts.
+
+
+
+
+
+
+
+ How is Pactus different from Bitcoin?
+
+
+
+
+
+
+
+
+ Pactus and Bitcoin are two different types of blockchain networks. While Bitcoin uses a process called "Proof of Work" to secure its network, Pactus uses a different method called "Proof of Stake". This means that instead of mining, validators are responsible for voting on incoming blocks and must hold a certain amount of the network's coin, known as "stake", as a security deposit to prevent malicious behavior.
+
+
+
+
+
+
+
+ How is Pactus different from Ethereum?
+
+
+
+
+
+
+
+
+ Pactus and Ethereum are both Proof of Stake blockchains, but they differ in their approach to running a validator. Running a validator on Ethereum can be challenging and requires 32 Ethereum coins to stake. In Pactus, there is no fixed amount for staking. Pactus is specifically designed to be more accessible to normal users, and you can run the Pactus blockchain on your personal computer with basic hardware.
+
+
+
+
+
+
+
+
+
+
+
+
+ What are validators?
+
+
+
+
+
+
+
+
+ Validators on Pactus are responsible for processing transactions and creating blocks and, by doing so, helping to secure the network and keep it decentralized. They use their own coins as a stake to ensure the network's security and receive rewards for their contributions.
+
+
+
+
+
+
+
+
+
+ How many validators does Pactus have?
+
+
+
+
+
+
+
+
+ Pactus is a real Proof of Stake blockchain, which means there is no limit on the number of validators in the network. However, a committee of 51 validators is responsible for creating blocks. It's important to note that the committee members are not fixed and they change over time.
+
+
+
+
+
+
+
+
+
+ What are the minimum and maximum amounts I can stake?
+
+
+
+
+
+
+
+
+ In Pactus, there is no minimum limit for staking coins, but the maximum amount you can stake is 1000 coins. If you want to stake more than 1000 coins, you can run a new validator. Running multiple validators keeps the network more decentralized and helps maintain its security and stability.
+
+
+
+
+
+
+
+ What are the minimum hardware requirements?
+
+
+
+
+
+
+
+
+ After thorough testing on multiple machines, we can conclude that the recommended minimum hardware requirements are as follows:
VPS:
* CPU's: 1/2 physical core / 1vCPU
* RAM: 1 GB Ram
* Storage (SSD): 20 GB NVMe Drive
* Network: stable internet connection with 1 TBps speed
PC:
* CPU's: 2 physical cores / 4vCPU
* RAM: 4 GB Ram
* Storage (SSD): 64 GB SSD Drive
* Network: stable internet connection with over 15 MBps speed
**Note** These specifications have been tested and provide an availability score of over 0.9.
+
+
+
+
+
+
+
+
+
+ Why is there a limit for maximum stake?
+
+
+
+
+
+
+
+
+ The limit for the maximum stake per validator enhances decentralization and prevents validators from gaining too much power, which could potentially lead them to control the committee. The maximum staking limit is part of the consensus parameters and can be changed in the future through consensus among the validators.
+
+
+
+
+
+
+
+ Can I run multiple validators on one computer?
+
+
+
+
+
+
+
+
+ The Pactus software allows you to run up to 32 validators on a single node. Running multiple validators may require slightly more memory, but it has no impact on storage, and has a negligible effect on CPU and networking usage. Running multiple validators on a single node enables users to distribute their stake across multiple validators, especially when they want to stake more than the maximum stake per validator. This eliminates the need for additional resources and simplifies node management.
+
+
+
+
+
+
+
+
+
+ How do validators get rewarded?
+
+
+
+
+
+
+
+
+ Once a validator proposes a valid block and it is accepted by the network, the validator receives one coin as a block reward. The reward is an incentive given to validators for their contribution to the network.
+
+
+
+
+
+
+
+
+
+ How much is the block reward in Pactus?
+
+
+
+
+
+
+
+
+ Block reward in Pactus is fixed, and it is always one coin per block. This flat reward scheme helps to ensure simplicity, fairness and better coin distribution.
+
+
+
+
+
+
+
+
+
+
+
+ How many PAC coins are generated per day?
+
+
+
+
+
+
+
+
+ Daily, a total amount of 8640 PAC is generated. This figure translates to 241,000 every 28 days and 3,153,600 per year.
+
+
+
+
+
+
+
+
+
+
+
+
+ How does Pactus blockchain work?
+
+
+
+
+
+
+
+
+ Pactus operates with a committee of validators who are responsible for creating new blocks. The committee consists of 51 validators, however, the members of the committee change randomly over time. Every 10 seconds, a validator in the committee known as the proposer collects all the valid transactions, adds them into a block, and shares it with other validators in the committee. If more than ⅔ of the stakeholders in the committee attest to the proposed block by signing it, the block gets committed and all the transactions inside the block will be executed. This process repeats every 10 seconds.
+
+
+
+
+
+
+
+
+
+
+
+ How can a validator enter to the committee?
+
+
+
+
+
+
+
+
+ To enter the committee in Pactus, validators participate in a sortition process that occurs at each block. In this process, validators generate a provable random number between zero and the total staked coins, and if the number is less than their stake, they can send a transaction known as sortition transaction with the proof of sortition. Once the sortition transaction is included in a block, the validator replaces the oldest committee member.
+
+
+
+
+
+
+
+
+
+ How are block proposers selected in the committee?
+
+
+
+
+
+
+
+
+ The block proposer inside the committee is selected based on the time they entered the committee. This means that the selection process follows a first-come, first-propose order.
+
+
+
+
+
+
+
+
+
+ Can multiple validators enter the committee at once?
+
+
+
+
+
+
+
+
+ The process of sortition in Pactus is random, so it's possible for more than one validator to enter the committee at once, or no validator at all. However, on average, one validator should join the committee at each block.
+
+
+
+
+
+
+
+ Is it possible to have two valid blocks at the same time?
+
+
+
+
+
+
+
+
+ It is not possible to have two valid blocks at the same time in Pactus blockchain. The consensus algorithm in Pactus prevents the possibility of having two block proposers at the same time. This ensures that there will be no fork in the network.
+
+
+
+
+
+
+
+
+
+ How much is the block confirmation in the Pactus Blockchain?
+
+
+
+
+
+
+
+
+ Block confirmation refers to the number of blocks that need to be created before a transaction is considered final and irreversible. In Pactus, block confirmation is immediate, meaning that once a transaction is added to a block, it is considered confirmed and cannot be reversed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ What is the total supply of Pactus coins?
+
+
+
+
+
+
+
+
+ Pactus has a total supply of 42 million coins, and each coin is divided into 1 billion units. $$ 1 \ PAC = 10^9 \ SatoshiPAC $$
+
+
+
+
+
+
+
+ How are Genesis Coins allocated in Pactus?
+
+
+
+
+
+
+
+
+ The initial allocation of Genesis Coins in the Pactus blockchain is distributed as follows:
+ Genesis Coin Allocation for Pactus
+
+
+ Category
+ Coin Allocation
+ Percentage
+
+
+
+
+ Treasury
+ 21 Million coins
+ 50%
+
+
+ Foundation
+ 8.4 Million coins
+ 20%
+
+
+ VC Allocation
+ 6.3 Million coins
+ 15%
+
+
+ Team and Operations
+ 4.2 Million coins
+ 10%
+
+
+ Community
+ 2.1 Million coins
+ 5%
+
+
+
+
+
+
+
+
+
+
+
+
+ What is the Treasury account?
+
+
+
+
+
+
+
+
+ The Treasury account is a special account in Pactus blockchain that holds 21 million coins at the genesis time. It has no key pair associated with it, meaning it cannot be accessed or controlled by anyone. Every time a block is created, one coin from the Treasury account transfers to the proposer account as a block reward.
+
+
+
+
+
+
+
+
+
+ How will the Treasury coins be distributed?
+
+
+
+
+
+
+
+
+ Treasury coins are distributed as block rewards to the block proposers. Every 10 seconds, one coin from the Treasury account transfers to the block proposer account. This process is called "coin minting". As a result, the total number of Pactus coins in circulation gradually increases over time as new blocks are added to the blockchain. Every day, 8,640 coins are minted, resulting in approximately 3 million coins being minted annually by the Treasury account.
+
+
+
+
+
+
+
+
+
+
+
+ How will the Support coins be spent?
+
+
+
+
+
+
+
+
+ The support accounts are designed to provide financial backing for the project. Initially, Pactus Genesis contained only the Treasury accounts without any Backup or Support accounts. The introduction of support coins was a strategic response to the absence of investors, despite the significant progress of the project.
These coins are allocated in several ways:
+ Community :
+ This portion will mainly support the community.
+ As part of this, the participants on Testnets receive initial staking coins to
+ setup their validator and secure the Mainnet.
+
+ Team and Operations :
+ Another portion supports the project team.
+ Team members receive a monthly distribution of these coins, which is estimated to sustain the team for over six years.
+
+ Venture Capital (VC) Allocation :
+ Another portion is set aside for any potential venture capitalists who
+ might show interest in investing in the project in the future.
+
+ Foundation :
+ The foundation coins are reserved for future use, potentially in supporting strong projects that align with Pactus's objectives.
+
+
+Transparency is a key aspect of this allocation, as all movements of these coins are trackable due to the fully transparent nature of the blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
+ What is a Transfer transaction?
+
+
+
+
+
+
+
+
+ A transfer transaction is a type of transaction that allows users to transfer Pactus coin from one account to another.
+
+
+
+
+
+
+
+
+
+ What is a Bond transaction?
+
+
+
+
+
+
+
+
+ A bond transaction is a type of transaction that allows users to become a validator by staking some coins. The amount of stake determines the voting power in the consensus.
+
+
+
+
+
+
+
+
+
+ What is a Sortition transaction?
+
+
+
+
+
+
+
+
+ A sortition transaction is a type of transaction that allows validators to enter the committee.
+
+
+
+
+
+
+
+
+
+ What is an Unbond transaction?
+
+
+
+
+
+
+
+
+ An unbond transaction is a type of transaction that allows users to unbond their validator. Once a validator is unbonded, they can no longer participate in the consensus mechanism.
+
+
+
+
+
+
+
+
+
+ What is a Withdraw transaction?
+
+
+
+
+
+
+
+
+ A withdraw transaction is a type of transaction that allows a validator to withdraw their staked coins from the network.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ How are transaction fees calculated in Pactus?
+
+
+
+
+
+
+
+
+ Transaction fees in Pactus are calculated using a percentage-based fee model. This means that the fee is a percentage of the transferred amount, with a minimum and maximum fee. The percentage, minimum fee, and maximum fee parameters are part of the blockchain parameters and can be changed through a agreement upon all validators.
+
+
+
+
+
+
+
+
+
+ What is the minimum and maximum fee?
+
+
+
+
+
+
+
+
+ These parameters are designed to provide greater control over the fee structure and ensure that fees remain within a certain range. If the calculated fee for a transaction falls below the minimum fee, the minimum fee is used instead. Similarly, if the calculated fee exceeds the maximum fee, the maximum fee is used instead. This helps prevent users from overpaying or underpaying for transactions and provides greater predictability and fairness in the fee structure.
+
+
+
+
+
+
+
+
+
+ Why was a percentage-based fee model chosen for Pactus?
+
+
+
+
+
+
+
+
+ The percentage-based fee model was chosen for Pactus because it provides a more equitable and predictable fee structure for users, as fees are proportional to the transferred amount. It also allows for greater flexibility in adjusting the fee structure to better align with the needs of the blockchain and its users, as the percentage, minimum fee, and maximum fee parameters can be changed through a consensus mechanism agreed upon by all validators.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/about/roadmap/index.html b/about/roadmap/index.html
new file mode 100644
index 000000000..cc0cbeb51
--- /dev/null
+++ b/about/roadmap/index.html
@@ -0,0 +1,716 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Roadmap | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Roadmap
+
+
+
✅ Completed Task
+
🚧 Ongoing Task
+
⏳ Upcoming Task
+
+
+
+
+
+
+
+
+
+
+
+
+ Decentralized Storage Platform
+
+
+
Q1 2025
+
+
+
+
+
+
+
+
+
+ Browser Extension Wallet
+
+
+
Q4 2024
+
+
+
+
+
+
+
+
+
+ Desktop and Mobile Friendly GUI
+
+
+
July 2024
+
+
+
+
+
+
+
+
+
+ CLI tools for controlling Pactus node
+
+
+
Jun 2024
+
+
+
+
+
+
+
+
+
+ First Interactive Block Explorer
+
+
+
March 2024
+
+
+
+
+
+
+
+
+
+ Permanent testnet launch
+
+
+
February 2024
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/about/what-is-pactus/index.html b/about/what-is-pactus/index.html
new file mode 100644
index 000000000..94309943f
--- /dev/null
+++ b/about/what-is-pactus/index.html
@@ -0,0 +1,412 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ What is Pactus? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
What is Pactus?
+
+
+
+
+
+
Pactus is a blockchain focused on decentralization
+ Pactus is built on the principle that a fair and transparent system can only be achieved through decentralization. Unlike many other blockchain platforms, Pactus aims to eliminate the potential for centralization and manipulation by removing the need for delegation and miners. This allows anyone to become a part of the ecosystem and ensures that the platform remains truly decentralized.
+
+
+
+
+
+
+
Pactus is a user-friendly blockchain
+ Pactus aims to create a user-friendly blockchain that can be easily used by anyone, not just tech experts. Our protocol is designed to be simple, easy to maintain, and develop. Pactus offers a simple GUI application that makes it easy for users to run a node.
+
+
+
+
+
+
+
Pactus uses a percentage-based fee model
+ Transaction fees are calculated based on a percentage model with a minimum and maximum fee. These parameters provide greater control over the fee structure and prevent overpaying or underpaying. The percentage-based model ensures fairness and predictability, and can be adjusted through consensus among all validators.
+
+
+
+
+
+
+
Dedicated Decentralized Storage in Pactus
+ In Pactus, users can purchase a dedicated storage file that can be renewed annually, leading to reduced costs for storage and smart contract execution. This unique feature can pave the way for a new protocols in the decentralized platforms.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png
new file mode 100644
index 000000000..6b8b563b7
Binary files /dev/null and b/android-chrome-192x192.png differ
diff --git a/android-chrome-256x256.png b/android-chrome-256x256.png
new file mode 100644
index 000000000..5386e869a
Binary files /dev/null and b/android-chrome-256x256.png differ
diff --git a/apple-touch-icon.png b/apple-touch-icon.png
new file mode 100644
index 000000000..6419a53bc
Binary files /dev/null and b/apple-touch-icon.png differ
diff --git a/ar/2022/08/29/dev-meeting.html b/ar/2022/08/29/dev-meeting.html
new file mode 100644
index 000000000..b0cd0975b
--- /dev/null
+++ b/ar/2022/08/29/dev-meeting.html
@@ -0,0 +1,400 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
29 August 2022
+
Meeting Summary
+
+
The meeting took place on 04 September 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
NanoMsg instead of ZeroMQ
+
+
During the meeting, Joseph suggested using Nanomsg instead of ZeroMQ because building ZeroMQ is not easy,
+especially in Windows. Additionally, we can use the pure Go implementation of Nanomsg.
+
+
The format of block events was defined as follows:
+
+
<event_id: 1 byte><event_data: variant><height: 4 bytes><seq_num: 4 bytes>
+
+
+
As a consequence of this, smart contracts events can be defined more easily and
+Infura-like services become simple, as we can just replay the events.
+
+
Reviewing a Pull Request
+
+
Nagaraj’s pull request reviewed.
+
+
Renaming project
+
+
The team discussed renaming (rebranding) the project and decided to create an online survey to
+gather suggestions for a new name.
+Everyone is encouraged to participate in the survey and suggest new names for the project.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2022/09/04/dev-meeting.html b/ar/2022/09/04/dev-meeting.html
new file mode 100644
index 000000000..e72b93425
--- /dev/null
+++ b/ar/2022/09/04/dev-meeting.html
@@ -0,0 +1,509 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
04 September 2022
+
Meeting Summary
+
+
The meeting took place on 29 August 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
Project renamed to Pactus
+
+
During the last meeting, the team conducted an online survey to rename the project.
+A total of 31 responses were received, and the following names were suggested:
+
+
+
+
+ Name
+ Votes
+
+
+
+
+ Sirius
+ 11
+
+
+ Pactus
+ 10
+
+
+ Nova
+ 7
+
+
+ Texo
+ 6
+
+
+ Zemus
+ 6
+
+
+ Helios
+ 6
+
+
+ Tutti
+ 5
+
+
+ Haki
+ 5
+
+
+ Aegeus
+ 4
+
+
+ Virgo
+ 4
+
+
+ Zentora
+ 3
+
+
+ Zinova
+ 3
+
+
+ Xerxes
+ 2
+
+
+ Ledgeria
+ 2
+
+
+ Solidus
+ 2
+
+
+ Welt
+ 2
+
+
+ Ventura
+ 2
+
+
+ Zebra
+ 2
+
+
+ Miranet
+ 2
+
+
+ Monetha
+ 2
+
+
+ FutureHub
+ 1
+
+
+ Muonet
+ 1
+
+
+ Mentha
+ 1
+
+
+ Hypatios
+ 0
+
+
+ Chaintopia
+ 0
+
+
+ Sycee
+ 0
+
+
+ Lepus
+ 0
+
+
+
+
+
After reviewing the responses, the team chose “Pactus” as the new name for the project. 🎉
+The project will be moved to “pactus-project/pactus,” and the team plans to announce it on social media.
+
+
Discussion on GUI
+
+
In terms of the GUI, Joseph suggested using Flutter, and the team agreed.
+To interact with the wallet, gRPC APIs will be provided, and the GUI will use these APIs.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2022/09/18/dev-meeting.html b/ar/2022/09/18/dev-meeting.html
new file mode 100644
index 000000000..fe35d4f84
--- /dev/null
+++ b/ar/2022/09/18/dev-meeting.html
@@ -0,0 +1,419 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
18 September 2022
+
Meeting Summary
+
+
The meeting took place on 18 September 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
Discussion about Testnet
+
+
The team discussed Testnet and related issues, including IP block issues that were found by Hadi.
+Due to sanctions, some IPs are blocked, so the team will run a support node to assist users inside Iran.
+The GUI application had some issues on Windows, but they were fixed and tested by Hadi.
+
+
Discussion about Website
+
+
The website still has some issues, such as the need to rename the animation to “Pactus” and the lack of a logo.
+The community suggested some logos. Additionally, the roadmap page is missing.
+
+
+
+
The team discussed the status of social media platforms, including:
+
+
+ Discord: 70 members
+ Instagram: 87 followers
+ Telegram: 20 followers
+ Linkedin: 20 followers
+ Twitter: Not yet
+
+
+
The team also decided to announce the project on social media on 29 September.
+
+
Consensus parameters
+
+
The team discussed the current consensus parameters:
+
+
+ Total supply: 21 million coins
+ Reward: 1 coin per block
+ Block time: 10 second
+ Committee size: 21 members
+ Bond interval: one hour
+ Unbond interval: 21 days
+ Fee fraction: 0.0001
+ Min fee: 0.0000001
+ Max fee: 0.01
+ Maximum stake: 12381
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2022/09/20/release-0-9-0.html b/ar/2022/09/20/release-0-9-0.html
new file mode 100644
index 000000000..b62ddfe14
--- /dev/null
+++ b/ar/2022/09/20/release-0-9-0.html
@@ -0,0 +1,389 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.9.0 released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.9.0 released
+
20 September 2022
+
Overview
+
+
Pactus Blockchain Release Version 0.9.0
+is now available for download.
+This release includes a new graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Download
+
+
This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch.
+To get started with the Pactus Blockchain Testnet-0, simply download
+the latest version and run the Pactus software.
+
+
Join the Testnet now and get ready for the future!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2022/09/24/testnet-0-launched.html b/ar/2022/09/24/testnet-0-launched.html
new file mode 100644
index 000000000..e8c07ebb4
--- /dev/null
+++ b/ar/2022/09/24/testnet-0-launched.html
@@ -0,0 +1,385 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Testnet-0 launch announcement | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Testnet-0 launch announcement
+
24 September 2022
+
+
+
The Pactus blockchain Testnet-0 is now accessible.
+To participate, simply download the Pactus application version 0.9.0 and
+connect to the Testnet without any special configurations.
+For test coins, please visit our Discord channel and share your validator address.
+
+
By taking part in the Testnet, you can familiarize yourself with the Pactus blockchain and
+get ready for the Mainnet launch.
+Testnet participants will also be given higher priority during the Mainnet launch.
+
+
Please share your feedback with us to help improve the user experience in future versions of the software.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2022/10/30/dev-meeting.html b/ar/2022/10/30/dev-meeting.html
new file mode 100644
index 000000000..e55a6e2fc
--- /dev/null
+++ b/ar/2022/10/30/dev-meeting.html
@@ -0,0 +1,412 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
30 October 2022
+
Meeting Summary
+
+
The meeting took place on 30 October 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
In memory of Mahsa Amini
+
+
The meeting started in memory of Mahsa Amini .
+We in the Pactus family stand in solidarity with courageous people who are fighting for equality, equity and freedom in Iran.
+
+
+
+
Launching Block explorer
+
+
The beta version of the block explorer has been launched 🚀 and is now available at
+https://pacscan.org .
+
+
Nagaraj explained the block explorer and some of the features.
+
+
Project road map
+
+
Project road map was discussed.
+
+
IdeaKita pitch deck
+
+
Ali presented the Pactus pitch deck for the IdeaKita in Malaysia.
+The IdeaKita program, under the Malaysia Digital Economy Corporation (MDEC), is designed to
+support entrepreneurs and startups in Malaysia.
+
+
Latest development progress
+
+
The latest pull requests were reviewed:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2022/11/24/release-0-9-1.html b/ar/2022/11/24/release-0-9-1.html
new file mode 100644
index 000000000..32b751774
--- /dev/null
+++ b/ar/2022/11/24/release-0-9-1.html
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.9.1 released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.9.1 released
+
24 November 2022
+
Overview
+
+
Pactus Blockchain Release Version 0.9.1
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Download
+
+
This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch.
+To start using the Pactus Blockchain Testnet-0,
+you can download the latest version from download page
+and join the Testnet.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
+ Blocks can be fully decoded when queried in gRPC
+ The HTTP module now uses gRPC module, making node configuration simpler by removing the CapnP module
+ Reducing the blockchain size by saving blocks by number instead of hash
+ The wallet can hold unconfirmed transactions
+ The wallet can use different gRPC servers
+ The GUI displays committee information
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/03/01/what-is-testnet.html b/ar/2023/03/01/what-is-testnet.html
new file mode 100644
index 000000000..7dd1e6182
--- /dev/null
+++ b/ar/2023/03/01/what-is-testnet.html
@@ -0,0 +1,456 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ What is a Testnet? | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
What is a Testnet?
+
01 March 2023
+
Mainnet vs Testnet?
+
+
If you have ever wondered what Testnet is and how it is different from Mainnet, read this article to the end to find out!
+
+
Mainnet and Testnet are two widely used terminologies in the Blockchain ecosystem;
+so it is important to understand the meaning and differences while working in the industry or
+following announcements of the Blockchain projects like Pactus.
+
+
Here’s a quick explanation:
+Before the actual live version of a Blockchain network that is used for real transactions,
+functions and smart-contracts (which is referred as Mainnet),
+there is a test version of the Blockchain network for testing purposes (which is referred as Testnet).
+In Testnet, a safe environment is provided to help developers experiment and test their applications,
+and make sure that everything functions smoothly in the Mainnet version.
+
+
Testnet
+
+
A Testnet is a simulation of a Blockchain, in which developers can test all the functionalities of
+their Blockchain network without risking their assets and convenience of end-users.
+Using Testnet, any possible error, bug or malfunctions can be fixed before the Mainnet launch.
+Testnet also can be an experimental environment for new features, updates and upgrades.
+So several Testnet networks of the same version or newer version of the Mainnet can be implemented on the roadmap.
+
+
What are use cases of Testnet?
+
+
A secure environment to test development ideas and updates.
+So many features and minor details in Pactus project have been successfully developed so far using the Testnet; such as:
+
+
+ extra details and information on Pactus-GUI;
+ well-functioning Pactus Blockchain explorer to access transactions and block details;
+ Upgrades that led to decreasing the size of the Pactus network
+
+
+
Providing a safe testing ground for resolve scalability and security problems, as well as decentralization issues.
+Pactus network is also a secure and purely decentralized network. However in the last updates during the Testnet,
+developers are now able to decrease the database size by approximately 10% without compromising performance.
+They did it by utilizing block height instead of hash to store blocks within the database. (you can find out more
+here ).
+
+
Testing new versions, patches and features on Testnet. it is vital for enhancing the security, load testing,
+Blockchain migration, integration tests, and etc. This is why you can now use the latest version of Pactus-GUI
+that works like clockwork and is extremely secure.
+
+
Testing the functions of cryptocurrency without disrupting the Mainnet. In the Testnet of Pactus Blockchain,
+you as a user or validator can use all the features to send, receive, bond or unbond your assets in the Pactus-GUI.
+
+
Development and simulation of smart contract features and DApps. Note that many Blockchain projects like Pactus,
+can be used as smart-contract platforms. So the Testnet can be designed in different stages to test and improve
+different applications of the network.
+
+
Please note that after a certain period of time, when developers get satisfied with the functionality and debugging process,
+they launch Mainnet. Mainnet has its own independent genesis blocks;
+so the assets and addresses that users use in Testnet are not valid inside the new Mainnet Blockchain anymore.
+In fact the whole Blockchain network starts working from the scratch and users and validators start to
+work with real coins and transactions instead of the simulated ones. But since Testnet has an important effect
+on the health and improvement of the network, in Pactus Blockchain, we have several advantages
+for the people who join the Testnet.
+
+
Why should you join the Testnet?
+
+
There are different contributors in a Blockchain network;
+Some people are developers and programmers that use the Testnet to contribute, enhance and lead the project to a better future.
+Testnet is actually vital for them to perform their changes and try their innovations and ideas.
+
+
But you might also be an end user; you might want to either be a validator and stake your assets to earn more Pactus coins,
+or you might want to learn how to use the network for future personal applications. Either way,
+you might find it handy to give it a try and be familiar with Pactus-GUI and its different features.
+
+
However, there is another advantage for end users who join the Testnet.
+While using the network, running a node or testing the Pactus-GUI in Testnet period, you are contributing to
+the community to find improvement potentials, that’s why there are more advantages contemplated for the Testnet users;
+Soon our Mainnet will be launched and also Pactus network will be announced and listed in well-known exchanges.
+As an early contributor, you will have the advantage of getting some extra initial coins at the beginning of Mainnet launch.
+So that you can use it to run a validator node and earn more from staking your assets. This airdrop is considered
+for every individual who installs Pactus-GUI and starts a node in Testnet.
+
+
There are other positive conditions you may experience as an early contributor.
+
+
+ Advanced and very responsive support for your issues (we dedicate more time to provide you with solutions)
+ Embracing your suggestions, improvement ideas, needs and information you may require to have a better user experience.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/04/21/testnet-0-concluded.html b/ar/2023/04/21/testnet-0-concluded.html
new file mode 100644
index 000000000..f141c25f2
--- /dev/null
+++ b/ar/2023/04/21/testnet-0-concluded.html
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Story of Testnet-0 | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Story of Testnet-0
+
21 April 2023
+
What is Testnet?
+
+
Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+
Summary of Testnet-0
+
+
In September 2022, we launched Testnet-0 .
+The purpose of this Testnet was to
+check the consensus protocol ,
+test different transaction types,
+and ensure the stability of the blockchain.
+We also wanted to test the sortition algorithm
+to make sure it works properly.
+
+
The committee
+for the Testnet-0 was set to five validators, and more than 19 validators joined during the Testnet period.
+Over 2 million blocks were created, and more than 3.2 million transactions were processed during this time.
+The size of the blockchain is approximately 1 gigabyte.
+The maximum number of transactions recorded in a single block was 386 . With a block time of 10 seconds,
+we can confirm that Pactus blockchain can support up to 30 transactions per second (TPS),
+which is a reasonable number for TPS. Based on real-time statistics available at realtps ,
+we can see that Pactus is among the top 10 blockchains in terms of TPS.
+
+
At this point, the development team decided to end the Testnet-0 and move on to the next one,
+Testnet-1. We are planning to run the Testnet-1 to prepare for the MainNet launch.
+We will provide updates on our progress and share the details of the new Testnet soon.
+
+
+
+
This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+
We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+
We are grateful to all those who participated in Testnet-0, and
+we encourage them to join our next Testnet to help us improve Pactus.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/05/08/release-0-10-0.html b/ar/2023/05/08/release-0-10-0.html
new file mode 100644
index 000000000..1359f6fa6
--- /dev/null
+++ b/ar/2023/05/08/release-0-10-0.html
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.10.0 released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.10.0 released
+
08 May 2023
+
Overview
+
+
Pactus Blockchain Version 0.10.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlight
+
+
The main update in this version allows users to set up multiple validators in one node.
+Users can set up to 32 validators in a single node, and each validator can stake up to 1,000 coins.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ removing address from account (#454 )
+ supporting multiple consensus instances (#450 )
+ adding sortition interval to the parameters (#442 )
+
+
+
Fix
+
+
+ gui : check if the node has an active consensus instance (#458 )
+ Use of a Persistent Merkle tree to enhance performance of calculating the
+state hash ; fully tested in Testnet-0 (#432 )
+ GetBlockchainInfo
API in gRPC now returns the total number of validators and accounts (#439 )
+ wallet path as argument (#455 )
+ adding reward addresses to config (#453 )
+ removing committers from the certificate hash (#444 )
+ prevent data race conditions in committee (#452 )
+ using 2^256 for the vrf denominator (#445 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/05/09/testnet-1-launched.html b/ar/2023/05/09/testnet-1-launched.html
new file mode 100644
index 000000000..618e58088
--- /dev/null
+++ b/ar/2023/05/09/testnet-1-launched.html
@@ -0,0 +1,415 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Testnet-1 launch announcement | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Testnet-1 launch announcement
+
09 May 2023
+
Overview
+
+
The Pactus blockchain Testnet-1 is now available for participation.
+This version simulates the Mainnet environment and evaluate the system’s performance, stability,
+and security in a controlled environment.
+The primary goal of this version of Testnet is to determine the efficient and secure committee size for the Mainnet.
+
+
Key Aspects
+
+
+ Simulating the Mainnet environment
+ Determining the actual block creation time
+ Assessing the staking mechanism and consensus protocol
+ Evaluating network usage under different loads
+ Evaluating the syncing process for new nodes joining the network
+ Ensuring network stability with over 1000 validators
+ Evaluating transaction performance
+ Conducting stress tests
+ Performing security tests, including double spend attacks, Sybil attacks
+(nodes with different identities), and forking resistance
+
+
+
Joining Testnet-1
+
+
To join the Testnet, download Pactus software
+version 0.10.0 and
+connect to Testnet without any special configuration or hardware.
+You can run the software on your personal computer or laptop.
+To acquire test coins, visit the Discord channel and
+provide your validator address.
+
+
Benefits for Participation
+
+
By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and
+be well-prepared for the Mainnet launch.
+Testnet participants will also receive higher priority during the Mainnet launch and
+get free coins for initial staking on the Mainnet.
+
+
Your Feedback Matters
+
+
User feedback plays a vital role in the improvement of the Pactus blockchain.
+Share your thoughts and experiences to contribute to the enhancement of future software versions.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/05/29/release-0-11-0.html b/ar/2023/05/29/release-0-11-0.html
new file mode 100644
index 000000000..02f53bbc6
--- /dev/null
+++ b/ar/2023/05/29/release-0-11-0.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.11.0 released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.11.0 released
+
29 May 2023
+
Overview
+
+
Pactus Blockchain Version 0.11.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
The main update in this version is the fix for the relay
+connection issue.
+A relay is a peer in the network that facilitates the connection between two peers,
+particularly when they are using home internet.
+
+
Another significant update is that sending a Bond transaction
+is now more user-friendly.
+Users no longer need to set the validator public key if they want to bond Test PAC coins to their validators.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Fix
+
+
+ gui : showing the total number of validators (#474 )
+ network : fixing relay connection issue (#475 )
+ consensus : rejecting vote with round numbers exceeding the limit (#466 )
+ increase failed counter when stream got error (#489 )
+ boosting syncing process (#482 )
+ waiting for proposal in pre-commit phase (#486 )
+ retrieving public key from wallet for bond transactions (#485 )
+ restoring config file to the default (#484 )
+ defining ChainType in genesis to detect the type of network (#483 )
+ reducing the default Argon2d to consume less memory (#480 )
+ adding password option to the start commands (#473 )
+
+
+
Refactor
+
+
+ rename send to transfer. (#469 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/06/19/release-0-12-0.html b/ar/2023/06/19/release-0-12-0.html
new file mode 100644
index 000000000..0f4cd5e46
--- /dev/null
+++ b/ar/2023/06/19/release-0-12-0.html
@@ -0,0 +1,442 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.12.0 released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.12.0 released
+
19 June 2023
+
Overview
+
+
Pactus Blockchain Version 0.12.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version is focused on improving the sync time to make it faster.
+This is achieved by implementing a caching mechanism that executes transactions more quickly and
+improves the calculation of total power (stake) of the blockchain in a more effective way.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ add GetAccountByNumber API to get account by number (#511 )
+
+
+
Fix
+
+
+ caching account and validator in store (#513 )
+ get recent blocks by stamp (#509 )
+ closing the mDNS connection upon stopping the network (#508 )
+ updating linkedmap to use generic (#507 )
+ removing state from cache (#506 )
+ Typo in GUI (#499 )
+ supporting localnet (#492 )
+
+
+
Refactor
+
+
+ update total power calculation based on power change(deltas) (#518 )
+ GetValidators return all validators in state validators map (#512 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/07/01/release-0-13-0.html b/ar/2023/07/01/release-0-13-0.html
new file mode 100644
index 000000000..aa4037ede
--- /dev/null
+++ b/ar/2023/07/01/release-0-13-0.html
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.13.0 released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.13.0 released
+
01 July 2023
+
Overview
+
+
Pactus Blockchain Version 0.13.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
Users can now restore the default_wallet
during the node initialization.
+If users have a backup of the seed phrase (mnemonic) for the default_wallet
,
+they can now restore it and re-initialize the node.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Fix
+
+
+ implemented restore wallet base on input seed (#553 )
+ measuring total sent and received bytes (#552 )
+ add validate seed and restore wallet (#533 )
+ HTTP : Missing handlers (#549 )
+ gui : update about dialog and menu items in help (#532 )
+
+
+
Refactor
+
+
+ implementing TestSuite (#535 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/07/05/testnet-500-validators.html b/ar/2023/07/05/testnet-500-validators.html
new file mode 100644
index 000000000..bfcc39db6
--- /dev/null
+++ b/ar/2023/07/05/testnet-500-validators.html
@@ -0,0 +1,407 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 500 validators joined Testnet | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
500 validators joined Testnet
+
05 July 2023
+
For a Proof of Stake blockchain, validators are important for
+maintaining the network’s integrity and security. They are similar to miners in Proof of Work blockchains like Bitcoin.
+
+
Pactus as a real Proof of Stake blockchain, has achieved a significant milestone.
+More than 500 validators joined the Testnet
+in less than 2 months.
+This accomplishment proves that Pactus is reliable, resilient, and trustworthy. More importantly, it sets new standards
+in the blockchain world. In fact, the Pactus Testnet is even more decentralized than some well-known blockchains.
+
+
+
+
One key reason why Pactus can accommodate more validators is its powerful
+consensus mechanism .
+The consensus mechanism in Pactus eliminates the need for delegation, making it possible for anyone to become a validator.
+Additionally, the user-friendly application ensures that even those new to blockchain can easily contribute to the network.
+
+
What is the next
+
+
To remain competitive in the market, Pactus recognizes the importance of prioritizing user space.
+We aim to ensure that running Pactus is affordable and accessible to anyone, regardless of their technical expertise or
+available resources.
+
+
To achieve this, the Pactus team constantly monitors network, storage, and computational usage, striving to keep them
+at minimal levels.
+By doing so, we enable more individuals to participate in the Pactus blockchain.
+
+
Currently, the Pactus team is working on optimizing and reducing network usage. This effort will lead to reduced costs,
+especially for users who are using home internet connections.
+
+
Furthermore, we are planning to introduce a pruning mode, allowing users to run the Pactus blockchain with significantly
+less storage.
+Although we believe the storage size is already small, our goal is to enable users to
+retain only the most recent blockchain history.
+This approach ensures that the blockchain size remains as compact as possible by disregarding some history of the blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/07/09/dev-meeting.html b/ar/2023/07/09/dev-meeting.html
new file mode 100644
index 000000000..3f4e2228b
--- /dev/null
+++ b/ar/2023/07/09/dev-meeting.html
@@ -0,0 +1,413 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
09 July 2023
+
Meeting Summary
+
+
The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
Overview to the Network Module
+
+
The meeting began with an overview of the Network module in Pactus.
+This module uses Libp2p as its underlying network protocol.
+
+
The Network module is agnostic about the content of the message and
+handles two types of messages: Gossip messages, which are broadcasted,
+and Stream messages, which are sent directly to a specific peer.
+The team discussed the relay nodes that enable communication for nodes behind NAT.
+Upon receiving a message, the module publishes an event.
+The two types of events are Gossip events and Steam events.
+
+
+
+
The team discussed the issue of Relay connections resetting, and explored solutions such as
+hole punching or using UDP and IPv6.
+
+
Some users in the Testnet reported high network usage.
+The team discussed implementing metrics for LibP2P to monitor network usage effectively.
+The discussion related to this issue can be found here .
+Additionally, the team discussed the customization of network resources,
+including setting limits for inbound and outbound connections.
+
+
Overview to the Sync Module
+
+
Moving on, the Sync module was discussed.
+Unlike the Network module, the Sync module has full knowledge about the messages and packets.
+The module handles a range of message types, which can be found
+here .
+
+
It was suggested that we need to define metrics for each message type.
+There was also a discussion about the need for reducing the messages to optimize the use of network resources.
+
+
The team decided to continue discussing these topics in future meetings.
+They also plan to work on improving the Network and Sync modules based on these discussions.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/08/01/testnet-1-concluded.html b/ar/2023/08/01/testnet-1-concluded.html
new file mode 100644
index 000000000..50c17ffae
--- /dev/null
+++ b/ar/2023/08/01/testnet-1-concluded.html
@@ -0,0 +1,442 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Story of Testnet-1 | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Story of Testnet-1
+
01 August 2023
+
What is Testnet?
+
+
Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+
Summary
+
+
In May 2023, we launched Testnet-1 .
+The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain.
+The development team also focused on evaluating the network’s performance.
+Additionally, the overall performance of the software and the syncing process were closely examined and assessed.
+
+
The committee for Testnet-1 was set to 21 validators,
+and 584 validators joined during the Testnet period.
+More than 600,000 blocks were created, and more than 1 million transactions were processed during this time.
+The size of the blockchain is about 300 megabytes.
+
+
About 300,000 coins were staked during this period, it was almost 50% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+
+
+
We were able to extract the confirmation time of transactions.
+More than 97% of transactions were confirmed in just one block after submission.
+This indicates that the transaction pool and broadcasting models are working fine.
+
+
+
+
Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases.
+More than 97% of blocks are committed in the first rounds.
+
+
+
+
Major updates
+
+
During Testnet-1, we released three versions(Version
+0.11.0 ,
+0.12.0 ,
+0.13.0 ), and the upgrade process was smooth.
+Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future.
+The consensus failure was resolved by requiring some validators to re-sync their nodes.
+At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible,
+including:
+
+
+ Improving the consensus protocol
+ Reducing the blockchain size
+ Optimizing the network usage
+
+
+
After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.
+
+
+
+
This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+
We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+
We are grateful to all those who participated in Testnet-1, and
+we encourage them to join our next Testnet to help us improve Pactus.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/08/22/dev-report.html b/ar/2023/08/22/dev-report.html
new file mode 100644
index 000000000..f5ca5c5cf
--- /dev/null
+++ b/ar/2023/08/22/dev-report.html
@@ -0,0 +1,407 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev report | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev report
+
22 August 2023
+
Abstract
+
+
there is several activities in Pactus github this month, here is a clear report and explain of activities.
+
+
+
+
Linters
+
+
one of new changes in Pactus project is new linters we added this month.
+what is linters?
+linters are just a set of rules for the style of source codes, they force developers to write new codes
+in correct, clean and safe way.
+
+
why we use them?
+the reason we are using linters in Pactus and add new ones, is to make the code more safe,
+and also make it easy to work on for new contributors because we are focus on being decentralized even in development.
+
+
Linters we added till now
+
+
TLA+ spec
+
+
one another new change in Pactus is updating TLA+ spec, which is related to consensus,
+as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.
+
+
link to changes
+
+
if you wish you can learn more about Pactus consensus here.
+
+
Refactoring
+
+
some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries.
+also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.
+
+
one of refactors
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/09/04/introduction-to-pips.html b/ar/2023/09/04/introduction-to-pips.html
new file mode 100644
index 000000000..0a6150c13
--- /dev/null
+++ b/ar/2023/09/04/introduction-to-pips.html
@@ -0,0 +1,415 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Introduction to PIPs | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Introduction to PIPs
+
04 September 2023
+
Introduction to PIPs
+
+
In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey:
+the Pactus Improvement Proposals, or PIPs.
+
+
+
+
What are PIPs?
+
+
Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform.
+Each PIP has a unique number like PIP-2 ,
+PIP-3 , and so on.
+These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.
+
+
The PIP process
+
+
The PIP process is open, allowing any member of the Pactus community to propose a PIP.
+The author should provide a summary, motivation, and a detailed technical explanation.
+The Pactus Laboratory team will carefully review each PIP.
+Security considerations must be addressed before finalizing a PIP.
+Once finalized, it can be added to the code.
+This process helps avoid unexpected issues during development and maintain consistency and safety.
+
+
The Origins of PIPs
+
+
The Pactus Improvement Proposals (PIPs) was inspired by the
+Ethereum Improvement Proposals (EIPs ) system,
+which had its roots in the Bitcoin Improvement Proposals (BIPs ) and
+Python Enhancement Proposals (PEPs ).
+
+
New Feature Policy
+
+
From now on, all major changes or new features in the Pactus project require a PIP.
+Any implementation must reference its specific PIP.
+Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.
+
+
PIPs Repository
+
+
For a complete list of Pactus Improvement Proposals, visit this link .
+The corresponding GitHub repository is accessible here .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/09/24/dev-report-pre-testnet-2.html b/ar/2023/09/24/dev-report-pre-testnet-2.html
new file mode 100644
index 000000000..e4a76762e
--- /dev/null
+++ b/ar/2023/09/24/dev-report-pre-testnet-2.html
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev Report pre-testnet2 | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev Report pre-testnet2
+
24 September 2023
+
Abstract
+
+
there is several activities in Pactus github in September month, here is a clear report and explain of activities.
+
+
+
+
Implementing PIP 2, 3 and 4
+
+
After starting Pactus Labs and PIPs ,
+we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:
+
+
+
+
Network
+
+
There is some very good change and new features for Pactus network module,
+this list contain a list of important changes in Pactus networking:
+
+
+
+
gRPC and nanomessage services
+
+
We also updated, improved and enhanced gRPC and nanomessage services for better developer experience,
+for third-party and side project developers, here is some changes:
+
+
+
+
Refactoring and other new feature or debugs
+
+
We had some not implemented feature request, not fixed bugs and some issue with new golang version,
+list of this changes:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/09/28/how-sspos-works-in-simple-word.html b/ar/2023/09/28/how-sspos-works-in-simple-word.html
new file mode 100644
index 000000000..f87f271cd
--- /dev/null
+++ b/ar/2023/09/28/how-sspos-works-in-simple-word.html
@@ -0,0 +1,459 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How SSPoS (Solid State Proof of Stake) works in simple word | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How SSPoS (Solid State Proof of Stake) works in simple word
+
28 September 2023
+
Abstract
+
+
In all Blockchain protocols, there is a concept called a consensus mechanism.
+This mechanism is used to enable nodes to reach an agreement
+on the state of the Blockchain they are
+maintaining, in order to have a synchronized and integrated Blockchain.
+
+
For now, we have a lot of consensus mechanisms in the Blockchain world.
+Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.
+
+
To explain how it works let’s start with explaining one of the first and simplest
+consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).
+
+
+
+
PoW (Proof of Work)
+
+
In the proof of work model, each node in the network should solve a complex mathematical
+problem that requires lots of computing resources to make a new block.
+
+
In this way, it’s highly unlikely that anyone would be able to change
+past transactions and change Blockchain states such as balances,
+without expending equivalent computational power.
+
+
By doing this we ensure the security and integrity of the Blockchain.
+
+
The concept was adapted from digital tokens by Hal Finney in 2004
+through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).
+
+
Bitcoin uses this consensus model.
+
+
PoS (Proof of Stake)
+
+
On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!
+
+
Validators lock a number of their assets in the Blockchain and they can transfer or use it
+till it is locked which we call staking.
+after each Block is committed one of the validators will be chosen randomly (more amount of stake,
+more chance to be chosen) when a validator is chosen
+it proposes a block and announces it to other nodes to be validated,
+when a supermajority of validators accept the block it’s going to be committed.
+
+
In this system, validators have no incentive to behave maliciously or dishonestly.
+If they do, they risk losing the stake amount.
+
+
More amount of validators in a PoS Blockchain makes it more secure,
+decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.
+
+
Ethereum uses this model.
+
+
DPoS (Delegated Proof of Stake)
+
+
DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm.
+users entrust their stakes to a small group of “delegates”.
+These delegates are responsible for validating transactions
+and creating blocks. The number of delegates is limited
+to ensure accountability and efficiency in the validation process.
+
+
Some Blockchains like Cardano and Tron use DPoS.
+
+
DPoS tries to solve the issue of PoS which when validators
+increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot
+of trust in the hands of a small number of delegates,
+which goes against the principle of “don’t trust, verify”.
+
+
SSPoS (Solid State Proof of Stake)
+
+
BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?
+
+
In Pactus Blockchain, we have something called Solid State Proof of Stake
+and we try to fix the previous model’s issue, let me explain.
+
+
Pactus uses a dynamic committee of validators with a fixed size of 51,
+but the members of the committee randomly change in each round,
+based on stake amount the chance of being chosen is higher. on the other hand,
+the number of validators out on the committee is unlimited, allowing anyone
+to become a validator by staking coins.
+
+
At each block, validators participate in a sortition algorithm by generating a random number
+between zero and the total staked coins. If the number is less
+than the validator’s stake, they can enter the committee and replace the oldest committee member.
+
+
So, in SSPoS models which are a variant of PoS, we can reach a consensus,
+without using high computation resources, having an inefficient
+validation process by increasing validator numbers,
+and also without breaking the principle of “don’t trust, verify”.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/10/15/release-0-15-0.html b/ar/2023/10/15/release-0-15-0.html
new file mode 100644
index 000000000..a76d94b9b
--- /dev/null
+++ b/ar/2023/10/15/release-0-15-0.html
@@ -0,0 +1,499 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.15.0 released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.15.0 released
+
15 October 2023
+
Overview
+
+
Pactus Blockchain Version 0.15.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+
Download
+
+
This version is the bootstrap version for
+Testnet-2 .
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
+ If you participated in Testnet-1, ensure to delete your previous working directory and
+ create a new wallet.
+
+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows,
+ or "~/pactus" on Unix-compatible platforms.
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gui : adding the splash screen (#743 )
+ add absentees votes to the certificate (#746 )
+ logger : short stringer for loggers (#732 )
+ implementing pip-7 (#731 )
+ implementing pip-11 (#712 )
+ implementing pip-8 (#711 )
+ implementing pip-9 (#706 )
+ new API to get Public key by address (#704 )
+ Adding address field for AccountInfo (#703 )
+ CreateValidatorEvent and CreateAccountEvent for nanomsg (#702 )
+ implementing PIP-2 and PIP-3 (#699 )
+ Adding Hole Punching to network (#697 )
+ write logs into file (#673 )
+ check protocol support before sending connect/disconnect event (#683 )
+ updating genesis for pre-testnet-2 (#679 )
+ adding udp protocol for network (#672 )
+ implementing pip-4 (#671 )
+ Notifee service events (#628 )
+ adding MinimumStake parameter (#574 )
+ adding Sent and Received bytes per message metrics for peers (#618 )
+ add reason to BlockResponse messages (#607 )
+ Add CalcualteFee in GRPC (#601 )
+ add sent bytes and received bytes metrics to peerset plus update grpc (#606 )
+ added metrics of libp2p with supporting prometheus (#588 )
+ Check node address is valid (#565 )
+ add LastSent and LastReceived properties to peer (#569 )
+
+
+
Fix
+
+
+ data race issue on updating certificate (#747 )
+ network : async connection (#744 )
+ adding query vote timer for CP phase (#738 )
+ trim transactions in proposed block (#737 )
+ fixing query votes and proposal issue (#736 )
+ fixing issue when a block has max transactions (#735 )
+ consensus : anti-entroy mechanism for the consensus (#734 )
+ logger : invalid level parsing error (#733 )
+ cache certificate by height (#730 )
+ fixing a crash on consensus (#729 )
+ consensus : prevent double entry in new height (#728 )
+ resolve consensus halt caused by time discrepancy in network. (#727 )
+ unsorted addresses in wallet listing (#721 )
+ send query votes message, if there is no proposal yet (#723 )
+ fixing logger level issue (#722 )
+ fixing syncing stuck issue (#720 )
+ fixing some minor issues on pre-testnet (#719 )
+ supporting go version 1.21 and higher (#692 )
+ ensure log rotation using tests (#693 )
+ restoring at the first block (#691 )
+ swagger doesn’t work with multiple proto files (#687 )
+ fixing wallet-cli issues (#686 )
+ prevent stripping public key for subsidy transactions (#678 )
+ updating the consensus protocol (#668 )
+ aggregating signature for hello message (#640 )
+ error case for logger (#634 )
+ adding committers to the certificate (#623 )
+ updating sortition executor (#608 )
+ update buf and fixing proto generation issue (#600 )
+ adding block hash to peer (#584 )
+ copy to clipboard option for address and pubkey (#583 )
+ public key aggregate (#576 )
+ remove GetValidators rpc method (#573 )
+ missing swagger ui for grpc get account by number (#564 )
+ incorrect handler for validator by number (#563 )
+
+
+
Refactor
+
+
+ sync : refactoring syncing process (#676 )
+ remove payload prefix from payload transaction type (#669 )
+ change Hello message from broadcasting to direct messaging (#665 )
+ committee : using generic list for validators (#667 )
+ rename SanityCheck to BasicCheck (#643 )
+ cli : Migrating from mow.cli to cobra for wallet (#629 )
+ cli : replacing mow.cli with cobra for daemon (#621 )
+ logger : using fast JSON logger (zerolog) (#613 )
+ Using Generics for calculating Min and Max for numeric type #604 (#609 )
+ Updating LRU cache to version 2 #514 (#602 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/10/15/testnet-2-launched.html b/ar/2023/10/15/testnet-2-launched.html
new file mode 100644
index 000000000..65cd89ca9
--- /dev/null
+++ b/ar/2023/10/15/testnet-2-launched.html
@@ -0,0 +1,423 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Testnet-2 launch announcement | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Testnet-2 launch announcement
+
15 October 2023
+
Overview
+
+
Exciting news for the Pactus Community: Testnet-2 is has launched!
+The journey through Testnet-1
+brought success and invaluable experiences, with over 500 validators joining the network.
+Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and
+thoroughly address these issues.
+After two months of dedicated work and testing, many problems have been resolved, and
+we feel confident launching the Testnet again.
+Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain.
+Notably, the new consensus mechanism and improved overall network performance.
+
+
At this point, we want to assure the Pactus community that this version of
+the Testnet will not stop until the mainnet launches ,
+and our main focus is on improving its overall performance and launching the Mainnet.
+
+
If you’re new to the concept of Testnet, check out our informative post:
+What is the Testnet?
+
+
Key Focus Areas
+
+
Testnet-2 has important tasks ahead.
+Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient.
+A close eye will be kept on the network’s performance, ensuring it operates as expected.
+For Testnet-2, the committee
+size has been expanded to 51 members.
+Both the committee’s performance and block production will be closely monitored.
+The goal is a blockchain that remains stable and trustworthy,
+even with thousands of validators in the network,
+ensuring it manages its regular duties seamlessly.
+
+
How To Join
+
+
Want to join the Testnet-2? Great! It’s super easy.
+Just download the latest Pactus software and you’re good to go.
+no fancy setups or special gear needed.
+You can run the software straight from your personal computer or laptop.
+Need some test coins? Pop over to our Discord channel and share your validator address there.
+
+
Benefits for Participation
+
+
By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and
+be well-prepared for the Mainnet launch.
+Testnet participants will also receive higher priority during the Mainnet launch and
+get free coins for initial staking on the Mainnet.
+
+
Your Feedback Matters
+
+
User feedback plays a vital role in the improvement of the Pactus blockchain.
+Share your thoughts and experiences to contribute to the enhancement of future software versions.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/10/29/release-0-16-0.html b/ar/2023/10/29/release-0-16-0.html
new file mode 100644
index 000000000..e33c5de47
--- /dev/null
+++ b/ar/2023/10/29/release-0-16-0.html
@@ -0,0 +1,446 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.16.0 Released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.16.0 Released
+
29 October 2023
+
Overview
+
+
Pactus Blockchain Version 0.16.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version allows users to create new addresses for both validators and accounts.
+The networking module has been improved, and users can now set limits on the number of connections.
+A random crash on the agreement protocol has been fixed in this version.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gui : display network ID (#780 )
+ create new validator address (CLI and GUI) (#757 )
+ add community bootstrap nodes to testnet config (#764 )
+ network : implementing connection manager (#773 )
+ network : adding bootstrapper mode to the network config (#760 )
+
+
+
Fix
+
+
+ network : redefine the network limits (#788 )
+ consensus : not increase the vote-box power on duplicated votes (#785 )
+ network : close connection when unable to get supported protocols (#781 )
+ network : enabling peer exchange for bootstrappers (#779 )
+ network : set connection limit for the resource manager (#775 )
+ sync : peer status set to known on sucessfull handshaking (#774 )
+ consensus : strong termination for the binary agreement (#765 )
+ consensus : not increase the voting power on duplicated binary votes (#762 )
+
+
+
Refactor
+
+
+ network : refactoring peer manager (#787 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/11/12/release-0-17-0.html b/ar/2023/11/12/release-0-17-0.html
new file mode 100644
index 000000000..092bd3faa
--- /dev/null
+++ b/ar/2023/11/12/release-0-17-0.html
@@ -0,0 +1,455 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.17.0 Released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.17.0 Released
+
12 November 2023
+
Overview
+
+
Pactus Blockchain Version 0.17.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
The Testnet has been upgraded and all validators must update their nodes.
+
+
This version will address major networking issues, reduce network usage, and improve overall performance.
+
+
A new node type, “Node Gossips ”, has been introduced to help broadcast and spread messages across the network.
+Node Gossips support the network by delivering messages to non-gossiping nodes.
+This gossip option is disabled by default but can be enabled in the configuration file.
+If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node.
+Please note that this option is still experimental and subject to potential changes in future releases.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After updating the node, the configuration file will be overwritten with a new version.
+You need to make modifications to the config file if you had customized it prior to the update.
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ network : default configs for bootstrap and relay peers (#812 )
+ introducing node gossip type (#811 )
+ sync : adding remote address to the peer info (#804 )
+ network : adding public address to factory (#795 )
+ network : filter private ips (#793 )
+
+
+
Fix
+
+
+ upgrading Testnet (#814 )
+ sync : prevent opening sessions indefinitely (#813 )
+ execution : fixing mistake on calculating unbonded power (#806 )
+ network : check connection threshold on gater (#803 )
+ network : no transient connection (#799 )
+ not close connection for bootstrap nodes (#792 )
+
+
+
Refactor
+
+
+ sync : refactoring sync process (#807 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2023/12/12/release-0-18-0.html b/ar/2023/12/12/release-0-18-0.html
new file mode 100644
index 000000000..86999a687
--- /dev/null
+++ b/ar/2023/12/12/release-0-18-0.html
@@ -0,0 +1,456 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.18.0 Released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.18.0 Released
+
12 December 2023
+
Overview
+
+
Pactus Blockchain Version 0.18.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version has significantly improved the syncing progress.
+The syncing process concurrently requests blocks from 8 different peers and
+actively connects to the most optimal peers for downloading the blockchain.
+
+
Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.
+
+
Breaking change
+
+
For Unix-based systems, please note that the working directory for root users has changed from /pactus
to /root/pactus
.
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After you update the node, the configuration file will automatically get updated, keeping the old settings.
+If you want to return the configuration file to its default settings,
+just delete the current config file and restart the node.
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ implement pip-14 (#841 )
+ sort wallet addresses (#836 )
+ grpc : endpoints for creating raw transaction (#838 )
+ network reachability API (#834 )
+ implement pip-13 (#835 )
+ subscribing to libp2p eventbus (#831 )
+ implement helper methods for wallet address path (#830 )
+ logger : adding rotate log file after days, compress and maxgae for logger config (#822 )
+ enable bandwidth router metric (#819 )
+
+
+
Fix
+
+
+ network : refining the connection limit (#849 )
+ corrected mistake when retrieving the reward address (#848 )
+ config : restore default config when it is deleted (#847 )
+ cmd : changing home directory for root users (#846 )
+ removing BasicCheck for hash (#845 )
+ disabling libp2p ping protocol (#844 )
+ build docker file (#839 )
+ sync : ignore publishing a block if it is received before (#829 )
+ network : subscribing to the Libp2p event bus (#828 )
+ sync : ignore block request if blocks are already inside the cache (#817 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2024/01/04/release-0-19-0.html b/ar/2024/01/04/release-0-19-0.html
new file mode 100644
index 000000000..5ca07aa30
--- /dev/null
+++ b/ar/2024/01/04/release-0-19-0.html
@@ -0,0 +1,460 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.19.0 Released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.19.0 Released
+
04 January 2024
+
Overview
+
+
Pactus Blockchain Version 0.19.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version has improved the overall performance of the blockchain by implementing
+PIP-15 .
+PIP-15 suggests to add caching algorithms to the database for the most frequently used items.
+
+
Additionally, this version has enhanced the connectivity of the nodes in the P2P network.
+
+
Availability Score
+
+
This version comes with the implementation of PIP-19 .
+PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the
+committee .
+Validators with a score less than 0.8 won’t receive the block reward,
+as their proposals will be rejected by other validators.
+The main reason behind this PIP is to prevent users from downgrading
+their node specifications and running Pactus on machines with low resources.
+
+
Breaking change
+
+
The Docker container now contains both daemon and wallet binary files.
+Users who use Docker to run Pacts now need to add the entry point to run Pactus.
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gRPC : defining network and peers info response’s properly (#898 )
+ implementing pip-19 (#899 )
+ network : disabling GosipSub, only FloodSub (#895 )
+ www : adding change proposer round and value to consensus info votes (#892 )
+ network : adding relay service to dial relay nodes (#887 )
+ implementing pip-15 (#843 )
+ check already running by lock file (#871 )
+
+
+
Fix
+
+
+ store : use cache to check if public key exists (#902 )
+ executor : not rejecting bond transaction for bootstrap validator (#901 )
+ GUI : removing unnecessary tags in transaction confirm dialog (#893 )
+ network : close relay connection for public node (#891 )
+ network : refining GossipSubParams for Gossiper node (#882 )
+ sync : adding sequence number to the bundle (#881 )
+ network : turn off mesh for gossiper node (#880 )
+ consensus : check voteset for CP strong termination (#879 )
+ adding querier to query messages (#878 )
+ execution : fixing issue #869 (#870 )
+ fixing logger issue on rotating log file (#859 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2024/01/08/mainnet-announcement.html b/ar/2024/01/08/mainnet-announcement.html
new file mode 100644
index 000000000..e2769ffc3
--- /dev/null
+++ b/ar/2024/01/08/mainnet-announcement.html
@@ -0,0 +1,392 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Mainnet announcement | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mainnet announcement
+
08 January 2024
+
The much-awaited Mainnet Launch of The Pactus Blockchain is finally here!
+On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block ,
+will be minted by four Bootstrap validators.
+After that, every 10 seconds, a new block will be added to the blockchain.
+Each block contains the committed transactions in the network.
+The block finality in the Pactus blockchain is immediate.
+It means that there is no need to wait for block confirmation to ensure a transaction is committed.
+
+
Later, more than 2000 community validators will secure the blockchain and make it decentralized.
+These validators are Testnet participants who helped test Pactus during our testing period.
+The community validators will receive the initial staking coins from a Discord Bot named RoboPac.
+
+
To ensure everything works smoothly on the Mainnet, three different Testnets (
+Testnet0 ,
+Testnet1 , and
+Testnet2 ) have been run.
+
+
The Mainnet will never be stopped or interrupted by the core developers of Pactus,
+and validators should primarily participate in and maintain the security of the blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2024/01/10/pactus-records-its-ips-in-ipminter.html b/ar/2024/01/10/pactus-records-its-ips-in-ipminter.html
new file mode 100644
index 000000000..e12928128
--- /dev/null
+++ b/ar/2024/01/10/pactus-records-its-ips-in-ipminter.html
@@ -0,0 +1,397 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus records its IPs in IPMINTER | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus records its IPs in IPMINTER
+
10 January 2024
+
+
+
In our continuous pursuit of innovation, the recording of our intellectual property is the
+cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a
+slow and expensive hurdle. That is… until we discovered IPMINTER!
+
+
Pactus profile in IPMINTER
+
+
We are ecstatic to announce that the blockchain-based platform by IPMINTER has
+revolutionized the way we secure our creations.
+
+
Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our
+intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes!
+Plus, the moment we received our exquisite certificate, complete with a QR code directly linking
+to our secure blockchain entry, our confidence in this platform soared.
+
+
Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission
+to protect our inventive proposals. The assurance we’ve experienced using their platform has
+been unparalleled.
+
+
We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward,
+economical, and robust IP recording solution. They have our heartfelt endorsement!
+
+
Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2024/01/11/release-0-20-0.html b/ar/2024/01/11/release-0-20-0.html
new file mode 100644
index 000000000..7925c2b3e
--- /dev/null
+++ b/ar/2024/01/11/release-0-20-0.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.20.0 Released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.20.0 Released
+
11 January 2024
+
Overview
+
+
Pactus Blockchain Version 0.20.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
Validator Stake Management
+
+
The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.
+
+
+
+
Improving Network Connectivity
+
+
Some users have reported that UDP packets are being dropped by their Internet Service Providers.
+Therefore, the UDP protocol is disabled by default.
+Users can still activate the UDP protocol by configuring the settings in the file if necessary.
+
+
Also, the experimental Node Gossip feature has been removed in this version.
+Node gossip could cause some validators to become isolated from the rest of the network.
+
+
Relay service
+
+
This version enables users to turn their node into a relay service.
+A relay service node can help users behind NAT to communicate with each other.
+It is disabled by default and can be enabled inside the config file.
+Please note that it is still in an experimental state.
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ implement relay service (#931 )
+ HTTP : Integrate AddRowDouble and update tests (#926 )
+ network : making listen address private in config (#921 )
+ http : adding AvailabilityScore to http module (#917 )
+ network : adding ‘enable_udp’ config (#918 )
+ network : removing gossip node service (#916 )
+ gRPC : adding AvailabilityScore to gRPC (#910 )
+ GUI : unbond and withdraw transaction dialogs (#908 )
+
+
+
Fix
+
+
+ gRPC : adding missing get raw transaction APIs to gRPC gateway (#925 )
+ network : preventing self dial (#924 )
+ fixing time lag on starting node (#923 )
+ network : fixing network deadlock on linux arm64 (#922 )
+ GUI : updating unbond and withdraw dialogs (#911 )
+ fixing gRPC node info issue (#906 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2024/01/22/testnet-2-concluded.html b/ar/2024/01/22/testnet-2-concluded.html
new file mode 100644
index 000000000..f774d0248
--- /dev/null
+++ b/ar/2024/01/22/testnet-2-concluded.html
@@ -0,0 +1,440 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Story of Testnet-2 | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Story of Testnet-2
+
22 January 2024
+
What is Testnet?
+
+
Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+
Summary
+
+
In October 2023, we launched Testnet-2 .
+The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.
+
+
The committee for Testnet-2 was set to 51 validators,
+and 2084 validators joined during the Testnet period.
+More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network.
+More than 800,000 blocks were created, and about 2 million transactions were processed during this time.
+The size of the blockchain is about 450 megabytes.
+
+
About 500,000 coins were staked during this period, almost 60% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+
Stability of Consensus
+
+
In Testnet-1, we had one consensus failure that caused us to
+conclude the Testnet-1 .
+During Testnet-2, there were no issues with the consensus mechanism, and
+we had no case of failure during the testing period,
+although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor.
+It proved that the consensus mechanism is in a stable situation.
+
+
Networking issues
+
+
In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem.
+In the second blockage, we had no choice but to ask active validators inside the committee to
+update their nodes to overcome the networking issue.
+The development team faced a difficult situation and had to make the proper decision to fix the networking issues.
+On one hand, the networking traffic increased significantly, and on the other hand, we had to
+make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems.
+After examining different scenarios, the networking issues were resolved, and
+no major problems were reported till the end of Testnet.
+
+
Major updates
+
+
During Testnet-2, we introduced several updates, including versions
+0.15.0 ,
+0.16.0 ,
+0.17.0 ,
+0.18.0 ,
+0.19.0 , and
+0.20.0 .
+The update process went smoothly, and with the stability of Version 0.20.0 confirmed,
+the development team shifted its focus to the Mainnet launch.
+
+
+
+
This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+
We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+
We are grateful to all those who participated in Testnets, and we encourage them to join the Mainnet.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2024/01/24/mainnet-launched.html b/ar/2024/01/24/mainnet-launched.html
new file mode 100644
index 000000000..0bc2d5b45
--- /dev/null
+++ b/ar/2024/01/24/mainnet-launched.html
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Mainnet launched 🚀 | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mainnet launched 🚀
+
24 January 2024
+
Years to Launch
+
+
Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time.
+Pactus Mainnet is the result of years of hard work, research, and innovation.
+It started from one idea:
+
+
A low-cost, truly decentralized blockchain, built by the people for the people,
+where anyone could run and be their own validator.
+
+
We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.
+
+
+
+
We want to thank Pactus community for helping us on the Testnet.
+
+
You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.
+
+
On the Road
+
+
The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!
+
+
We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!
+
+
We Have a Dream
+
+
We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.
+
+
This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.
+
+
And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2024/01/31/release-1-0-0.html b/ar/2024/01/31/release-1-0-0.html
new file mode 100644
index 000000000..a589fdb58
--- /dev/null
+++ b/ar/2024/01/31/release-1-0-0.html
@@ -0,0 +1,445 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 1.0.0 (Beijing) Released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 1.0.0 (Beijing) Released
+
31 January 2024
+
Overview
+
+
Pactus Blockchain Version 1.0.0 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+
Highlights
+
+
Mainnet Official Release v1.0.0 (Beijing)
+
+
The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone
+for our community.
+This impressive mainnet release represents the culmination of extensive development efforts.
+Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain,
+enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software
+and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on
+this exciting journey.
+
+
Onboarding validators
+
+
On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in
+Testnet-0 ,
+Testnet-1 , and
+Testnet-2 .
+This marks the beginning of a new chapter in the decentralized world.
+
+
Download
+
+
This version has been implemented for Mainnet
+To start using Pactus Mainnet, download the latest version from the download
+page and join the Mainnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ implement get validator address for grpc (#975 )
+ add bootstrap.json and load in config on build (#964 )
+ add mainnet config and genesis files (#951 )
+ add Consensus-address to network info (#952 )
+ grpc : sign transaction using wallet client (#945 )
+ pactus gui lock support (#947 )
+ consensus : turning consensus to a zero-config module (#942 )
+
+
+
Fix
+
+
+ localnet wallet issue (#970 )
+ sync : remove ReachabilityStatus from agent info (#956 )
+ daemon : keeping previous behavior for password flag, linting CLI messages (#950 )
+ consensus : detect if the system time is behind the network (#939 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2024/02/10/release-1-0-1.html b/ar/2024/02/10/release-1-0-1.html
new file mode 100644
index 000000000..f39089293
--- /dev/null
+++ b/ar/2024/02/10/release-1-0-1.html
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 1.0.1 (Beijing) Released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 1.0.1 (Beijing) Released
+
10 February 2024
+
Overview
+
+
Pactus Blockchain Version 1.0.1 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
This release is named after the city of Beijing and it
+was unanimously selected by Pactus community.
+
+
+
+
Highlights
+
+
This update fixes several issues identified after the release of
+1.0.0 (Beijing) .
+Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.
+
+
Download
+
+
To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+
How to Upgrade
+
+
If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gui : add connections and moniker fields to main windows (#1090 )
+
+
+
Fix
+
+
+ network : set dial and accept limit in connection gater (#1089 )
+ gui stderr logger in windows os (#1081 )
+ sync : improve syncing process (#1087 )
+ network : redefine resource limits (#1086 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/2024/02/18/release-1-0-2.html b/ar/2024/02/18/release-1-0-2.html
new file mode 100644
index 000000000..8e47bfcf7
--- /dev/null
+++ b/ar/2024/02/18/release-1-0-2.html
@@ -0,0 +1,416 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 1.0.2 (Istanbul) Released | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 1.0.2 (Istanbul) Released
+
18 February 2024
+
Overview
+
+
Pactus Blockchain Version 1.0.2 (Istanbul)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
This release is named after the city of Istanbul and it
+was unanimously selected by Pactus community.
+
+
+
+
Highlights
+
+
This update fixes a major issue that decreases the number of inbound connections of the nodes over time.
+We highly recommend all users to upgrade to the new version for better connectivity.
+
+
Download
+
+
To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+
How to Upgrade
+
+
If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Fix
+
+
+ sync : fix concurrent map read-write crash (#1112 )
+ network : remove disconnected peers from peerMgr (#1110 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/404.html b/ar/404.html
new file mode 100644
index 000000000..966c81ead
--- /dev/null
+++ b/ar/404.html
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Error 404, Page Not Found | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
404
+
+
Page not found :(
+
The requested page could not be found.
+
+
+
+
diff --git a/ar/about/faq/index.html b/ar/about/faq/index.html
new file mode 100644
index 000000000..e3029d29c
--- /dev/null
+++ b/ar/about/faq/index.html
@@ -0,0 +1,1527 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ الأسئلة المتكررة | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
***
+
+
+
+
+
+
+
+
+ ما معنى "بكتوس"؟
+
+
+
+
+
+
+
+
+ كلمة "Pactus" ذات أصل لاتيني
+ وتعني "الاتفاق معًا" أو "عقد" أو "معاملة". في الإنجليزية، يتم استخراج مصطلح "Pact" من الكلمة اللاتينية "Pactus".
+
+
+
+
+
+
+
+ هل بكتوس هي نسخة من أي بلوكشين أخرى؟
+
+
+
+
+
+
+
+
+ لا، بكتوس ليست نسخة أو مشتقة من أي بلوكشين آخر. إنها بروتوكول بلوكشين جديد وفريد تم تصميمه من الصفر. آلية التوافق المستخدمة في بكتوس فريدة وتم إنشاؤها خصيصًا لحل مشكلة قابلية توسع محققي الحصة الأدلة بلوكشين.
+
+
+
+
+
+
+
+ Did Pactus have an ICO?
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ لا، بكتوس ليس لديها ICO (Initial Coin Offering) ولا توجد حسابات محددة مسبقًا أو محظوظة في بكتوس. يبدأ بلوكشين بكتوس من الصفر وتتم طباعة جميع العملات من خلال آلية التوافق. هذا يضمن توزيع العملات بشكل عادل وعدم وجود تمركز للثروة.
+
+
+
+
+
+
+
+ Where can I buy Pactus coins?
+
+
+
+
+
+
+
+
+ Pactus does not have any pre-sales coins. The only way to obtain Pactus coins at the moment is by installing the Pactus software and actively participating in block validation. By engaging in the network and contributing to block validation, you will be rewarded with Pactus coins.
+
+
+
+
+
+
+
+ لماذا تم تطوير بكتوس؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ تم تطوير بكتوس بهدف توسيع مقياس بلوكشين دون التأثير على الأمان والتفرد. ولتحقيق ذلك، يستخدم بكتوس آلية توافق فريدة تمكّن من إنشاء بلوك في 10 ثوانٍ فقط. وعلاوة على ذلك، تم تصميم بكتوس لتكون أكثر إمكانية الوصول لجميع المستخدمين، بغض النظر عن خبراتهم التقنية أو مواردهم المالية.
تعكس التزامنا بالتفرد والعدالة في قرارنا
+ بالبدء في بلوكشين بكتوس من الصفر وضمان طباعة جميع العملات من خلال آلية التوافق، بدلاً من إجراء ICO أو حسابات محظوظة.
+
+
+
+
+
+
+
+ ما المشكلات التي يحلّها بكتوس ولا يحلّها غيرها من البلوكتشينات؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ تحاول بكتوس حلّ العديد من المشاكل التي تواجهها شبكات البلوكتشين الأخرى، بما في ذلك مشكلات القابلية للتوسع، والوصول، والعدالة في التوزيع، وتكلفة التخزين.
مشكلات القابلية للتوسع: تتميز بكتوس بآلية اتفاق فريدة من نوعها تم تصميمها خصيصًا للتعامل مع مشكلة القابلية للتوسع، دون التضحية بالأمان واللامركزية.
الوصول: تم تصميم تشغيل المعالج على بكتوس بحيث يكون أكثر وصولًا للمستخدمين العاديين مقارنة بالبلوكتشينات الأخرى.
العدالة في التوزيع: تمتلك بكتوس نموذجًا عادلاً وشفافًا لتوزيع العملات، بهدف منع تراكم الثروة.
تكلفة التخزين: توفر بكتوس حلًا جديدًا لمشكلة التخزين، حيث يمكن للمستخدمين تخصيص ملفات تخزين مخصصة، مما يقلل من تكلفة التخزين ويبسط العقود الذكية.
+
+
+
+
+
+
+
+ ما الفرق بين بكتوس وبيتكوين؟
+
+
+
+
+
+
+
+
+ بكتوس وبيتكوين هما نوعان مختلفان من شبكات البلوكتشين. بينما يستخدم بيتكوين
+ عملية تسمى "إثبات العمل" لتأمين شبكته، يستخدم بكتوس طريقة مختلفة تسمى "إثبات الحصة". هذا يعني أنه بدلاً من التعدين،
+يكون المصدقون مسؤولين عن التصويت على الكتل الواردة ويجب أن يمتلكوا مبلغًا معينًا من عملة الشبكة، المعروفة باسم "الحصة"، كوديعة أمان لمنع السلوك الخبيث.
+
+
+
+
+
+
+
+ ما الفرق بين بكتوس وإيثيريوم؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ بكتوس و إيثيريوم هما شبكتي بلوكتشين تعتمدان على إثبات الحصة، لكنهما يختلفان في نهجهما لتشغيل المصدق. يمكن أن يكون تشغيل المصدق في إيثيريوم تحديًا ويتطلب حصةً بحد أدنى 32 عملة إيثيريوم. بالمقابل، صُمم بكتوس ليكون أكثر قابلية للاستخدام للمستخدمين العاديين. لا يوجد متطلب حصة دنيا، ويمكنك تشغيل عقدة بكتوس على أي نظام تشغيل بمعدات أساسية. يعكس هذا النهج التزامنا بتعزيز التوزيع وجعل تقنية البلوكتشين متاحة لجمهور أوسع.
+
+
+
+
+
+
+
+
+
+
+
+
+ ما هي المُعالِجين؟
+
+
+
+
+
+
+
+
+ يتحمّل المعالجون في بكتوس مسؤولية معالجة المعاملات وإنشاء الكتل وبالتالي، يساعدون في تأمين الشبكة والحفاظ على انحيازها. يستخدمون عملاتهم الخاصة كرهان لضمان أمان الشبكة وتلقي مكافآت عن مساهماتهم.
+
+
+
+
+
+
+
+
+
+ ما هو عدد المعالجين الذي يدعمه بكتوس؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ بكتوس عبارة عن بلوكتشين حقيقي للإثبات بالحصة، مما يعني أنه لا يوجد حد لعدد المعالجين في الشبكة. ومع ذلك، فإن لجنة مكونة من 21 معالجًا مسؤولة عن إنشاء الكتل. من المهم الإشارة إلى أن أعضاء اللجنة ليسوا ثابتين ويتغيرون مع مرور الوقت.
+
+
+
+
+
+
+
+
+
+ ما هي الحدود الدنيا والعليا للرهان الممكنة؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ في بكتوس، لا يوجد حد أدنى لتجميد العملات، ولكن الحد الأقصى للعملات التي يمكنك تجميدها هو 1000 عملة. إذا كنت ترغب في تجميد أكثر من 1000 عملة، يمكنك تشغيل محقق جديد. تشغيل العديد من المحققين يحافظ على توزيع الشبكة بشكل أفضل ويساعد على الحفاظ على أمانها واستقرارها.
+
+
+
+
+
+
+
+ What are the minimum hardware requirements?
+
+
+
+
+
+
+
+
+ After thorough testing on multiple machines, we can conclude that the reccomended minimum hardware
requirements are as follows:
VPS:
* CPU's: 1/2 physical core / 1vCPU
* RAM: 1 GB Ram
* Storage (SSD): 20 GB NVMe Drive
* Network: stable internet connection with 1 TBps speed
PC:
* CPU's: 2 physical cores / 4vCPU
* RAM: 4 GB Ram
* Storage (SSD): 64 GB SSD Drive
* Network: stable internet connection with over 15 MBps speed
**Note** These specifications have been tested and provide an availabilty score of over 0.9.
+
+
+
+
+
+
+
+
+
+ Why is there a limit for maximum stake?
+
+
+
+
+
+
+
+
+ The limit for the maximum stake per validator enhances decentralization and prevents validators from gaining too much power, which could potentially lead them to control the committee. The maximum staking limit is part of the consensus parameters and can be changed in the future through consensus among the validators.
+
+
+
+
+
+
+
+ Can I run multiple validators on one computer?
+
+
+
+
+
+
+
+
+ The Pactus software allows you to run up to 32 validators on a single node. Running multiple validators may require slightly more memory, but it has no impact on storage, and has a negligible effect on CPU and networking usage. Running multiple validators on a single node enables users to distribute their stake across multiple validators, especially when they want to stake more than the maximum stake per validator. This eliminates the need for additional resources and simplifies node management.
+
+
+
+
+
+
+
+
+
+ كيف يتم مكافأة المعالجين؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ بمجرد أن يقترح المعالج كتلة صالحة ويتم قبولها من قِبل الشبكة، يحصل المعالج على عملة واحدة كمكافأة للكتلة. تعتبر المكافأة حافزًا يتم إعطاؤه للمعالجين على مساهماتهم في أمان وسلامة الشبكة، مما يساعد على الحفاظ على سير العمل بسلاسة.
+
+
+
+
+
+
+
+
+
+ ما هو حجم مكافأة الكتلة في بكتوس؟
+
+
+
+
+
+
+
+
+ تكون مكافأة الكتلة في بكتوس ثابتة، وهي عملة واحدة دائمًا لكل كتلة. تساعد هذه الخطة الثابتة للمكافأة على ضمان البساطة والعدالة وتوزيع العملة بشكل أفضل.
+
+
+
+
+
+
+
+
+
+
+
+ How many PAC coins are generated per day?
+
+
+
+
+
+
+
+
+ Daily, a total amount of 8640 PAC is generated. This figure translates to 241,000 every 28 days and 3,153,600 per year.
+
+
+
+
+
+
+
+
+
+
+
+
+ كيف تعمل بلوكشين بكتوس؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ يعمل بكتوس بواسطة لجنة من المصادقين المسؤولين عن إنشاء كتل جديدة. تتكون اللجنة من 21 مصادقًا، ومع ذلك، تتغير أعضاء اللجنة بشكل عشوائي مع مرور الوقت. كل 10 ثوانٍ، يجمع مصادق في اللجنة يُعرف باسم "المقترح" جميع المعاملات الصالحة، ويضيفها إلى كتلة، ويشاركها مع المصادقين الآخرين في اللجنة. إذا أكد أكثر من 2/3 من أصحاب المصلحة في اللجنة على الكتلة المقترحة بتوقيعهم عليها، يتم تأكيد الكتلة ويتم تنفيذ جميع المعاملات داخل الكتلة. يتكرر هذه العملية كل 10 ثوانٍ.
+
+
+
+
+
+
+
+
+
+
+
+ كيف يمكن لمصادق الانضمام إلى اللجنة؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ للانضمام إلى اللجنة في بكتوس، يشارك المصادقون في عملية قرعة أو تصفية تحدث في كل كتلة. في هذه العملية، يقوم المصادقون بإنشاء رقم عشوائي قابل للإثبات بين الصفر وإجمالي العملات المرهونة، وإذا كان الرقم أقل من مرهوناتهم، يمكنهم إرسال معاملة تسمى معاملة التصفية مع دليل التصفية. بمجرد تضمين معاملة التصفية في كتلة، يحل المصادق محل أقدم عضو في اللجنة.
+
+
+
+
+
+
+
+
+
+ كيف يتم اختيار مقترحي البلوك في اللجنة؟
+
+
+
+
+
+
+
+
+ يتم اختيار مقترح البلوك داخل اللجنة بناءً على وقت دخوله إلى اللجنة. وهذا يعني أن عملية الاختيار تتبع ترتيب "الأولوية لأولئك الذين يدخلون أولاً".
+
+
+
+
+
+
+
+
+
+ هل يمكن للمحققين العديدة الدخول إلى اللجنة في وقت واحد؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ عملية الفرز العشوائي في بكتوس هي عشوائية، لذلك فمن الممكن أن يدخل أكثر من محقق إلى اللجنة في وقت واحد، أو لا يدخل أي محقق على الإطلاق. ومع ذلك، لكي تعتبر عملية الفرز صالحة وتتم إضافتها إلى البلوك، يجب أن تستوفي شرطين: لا يمكن تغيير أكثر من 1/3 من حصة اللجنة، و لا يمكن إزالة محقق لم يتاح له فرصة تقديم اقتراح لبلوك بعد.
+
+
+
+
+
+
+
+ هل من الممكن أن يكون هناك بلوكين صحيحين في نفس الوقت؟
+
+
+
+
+
+
+
+
+ لا يمكن أن يكون هناك بلوكين صحيحين في نفس الوقت في سلسلة بكتوس. يمنع خوارزمية الاتفاق في بكتوس إمكانية وجود اثنين من المقترحين في نفس الوقت. هذا يضمن عدم حدوث فورك في الشبكة.
+
+
+
+
+
+
+
+
+
+ How much is the block confirmation in the Pactus Blockchain?
+
+
+
+
+
+
+
+
+ Block confirmation refers to the number of blocks that need to be created before a transaction is considered final and irreversible. In Pactus, block confirmation is immediate, meaning that once a transaction is added to a block, it is considered confirmed and cannot be reversed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ما هو إجمالي إمدادات عملة بكتوس؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ بكتوس لديها إجمالي إمدادات 21 مليون عملة، وكل عملة مقسمة إلى 1 مليار وحدة. كل 10 ثوانٍ، يتم إنشاء عملة جديدة، مما يؤدي إلى 8،640 عملة جديدة في اليوم وحوالي 3 ملايين في السنة. سيتم إنشاء جميع العملات في غضون 7 سنوات.
+
+
+
+
+
+
+
+ How are Genesis Coins allocated in Pactus?
+
+
+
+
+
+
+
+
+ The initial allocation of Genesis Coins in the Pactus blockchain is distributed as follows:
+ Genesis Coin Allocation for Pactus
+
+
+ Category
+ Coin Allocation
+ Percentage
+
+
+
+
+ Treasury
+ 21 Million coins
+ 50%
+
+
+ Foundation
+ 8.4 Million coins
+ 20%
+
+
+ VC Allocation
+ 6.3 Million coins
+ 15%
+
+
+ Team and Operations
+ 4.2 Million coins
+ 10%
+
+
+ Community
+ 2.1 Million coins
+ 5%
+
+
+
+
+
+
+
+
+
+
+
+
+ ما هو حساب الخزانة؟
+
+
+
+
+
+
+
+
+ حساب الخزانة هو حساب خاص في بلوكشين بكتوس يحتوي على إجمالي إمدادات العملات والذي يبلغ 21 مليون عملة. يتم إنشاؤه في وقت النشأة وليس له زوج مفاتيح مرتبط به، مما يعني عدم إمكانية الوصول إليه أو التحكم فيه من قبل أي شخص. في كل مرة يتم إنشاء بلوك، يتم نقل عملة واحدة من حساب الخزانة إلى حساب المقترح كمكافأة للبلوك.
+
+
+
+
+
+
+
+
+
+ How are Treasury coins distributed?
+
+
+
+
+
+
+
+
+ Treasury coins are distributed as block rewards to the block proposers. Every 10 seconds, one coin from the Treasury account transfers to the block proposer account. This process is called "coin minting". As a result, the total number of Pactus coins in circulation gradually increases over time as new blocks are added to the blockchain. Every day, 8,640 coins are minted, resulting in approximately 3 million coins being minted annually by the Treasury account.
+
+
+
+
+
+
+
+
+
+
+
+ How will the Support coins be spent?
+
+
+
+
+
+
+
+
+ The support accounts are designed to provide financial backing for the project. Initially, Pactus Genesis contained only the Treasury accounts without any Backup or Support accounts. The introduction of support coins was a strategic response to the absence of investors, despite the significant progress of the project.
These coins are allocated in several ways:
+ Community :
+ This portion will mainly support the community.
+ As part of this, the participants on Testnets receive initial staking coins to
+ setup their validator and secure the Mainnet.
+
+ Team and Operations :
+ Another portion supports the project team.
+ Team members receive a monthly distribution of these coins, which is estimated to sustain the team for over six years.
+
+ Venture Capital (VC) Allocation :
+ Another portion is set aside for any potential venture capitalists who
+ might show interest in investing in the project in the future.
+
+ Foundation :
+ The foundation coins are reserved for future use, potentially in supporting strong projects that align with Pactus's objectives.
+
+
+Transparency is a key aspect of this allocation, as all movements of these coins are trackable due to the fully transparent nature of the blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
+ ما هي عملية تحويل الأموال؟
+
+
+
+
+
+
+
+
+ عملية تحويل الأموال هي نوع من العمليات التي تسمح للمستخدمين بتحويل عملات بكتوس من حساب واحد إلى آخر.
+
+
+
+
+
+
+
+
+
+ ما هي عملية الرهن؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ عملية الرهن هي نوع من العمليات التي تسمح لك بأن تصبح محققاً من خلال رهن بعض العملات. عند إرسال عملية رهن، سيصبح عقدك محققًا. يحدد مقدار الرهن قوتك في الاتفاق.
+
+
+
+
+
+
+
+
+
+ ما هي عملية الفرز؟
+
+
+
+
+
+
+
+
+ عملية الفرز هي نوع من العمليات التي تسمح للمحققين بالدخول إلى اللجنة.
+
+
+
+
+
+
+
+
+
+ ما هي عملية الغاء الرهن؟
+
+
+
+
+
+
+
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
+ عملية الغاء الرهن هي نوع من العمليات التي تسمح لك بإلغاء رهنك كمحقق. عند إرسال عملية الغاء الرهن، لن تكون قادراً بعد ذلك على إرسال عمليات الفرز أو الرهن.
+
+
+
+
+
+
+
+
+
+ ما هي عملية السحب؟
+
+
+
+
+
+
+
+
+ عملية السحب هي نوع من العمليات التي تسمح للمحققين بسحب عملاتهم التي تم رهنها من الشبكة.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ كيف يتم حساب رسوم المعاملات في بكتوس؟
+
+
+
+
+
+
+
+
+ تتم حساب رسوم المعاملات في بكتوس باستخدام نموذج رسوم يعتمد على النسبة المئوية. هذا يعني أن الرسوم تشكل نسبة مئوية من المبلغ المحول، مع وجود حد أدنى وحد أقصى للرسوم. معلمات النسبة المئوية والحد الأدنى للرسوم والحد الأقصى للرسوم هي جزء من معلمات بلوكشين ويمكن تغييرها باتفاق بين جميع المحققين.
+
+
+
+
+
+
+
+
+
+ ما هو الحد الأدنى والأقصى للرسوم؟
+
+
+
+
+
+
+
+
+ تم تصميم هذه المعلمات لتوفير مزيد من السيطرة على هيكل الرسوم وضمان بقاء الرسوم داخل نطاق معين. إذا كانت الرسوم المحسوبة للمعاملة تقل عن الحد الأدنى للرسوم، يتم استخدام الحد الأدنى للرسوم بدلاً من ذلك. بالمثل، إذا تجاوزت الرسوم المحسوبة الحد الأقصى للرسوم، يتم استخدام الحد الأقصى للرسوم بدلاً من ذلك. يساعد هذا على منع المستخدمين من دفع رسوم زائدة أو غير كافية للمعاملات ويوفر مزيدًا من الثب
+
+
+
+
+
+
+
+
+
+ لماذا تم اختيار نموذج رسوم يعتمد على النسبة المئوية لـ بكتوس؟
+
+
+
+
+
+
+
+
+ تم اختيار نموذج الرسوم المعتمد على النسبة المئوية لـ بكتوس لأنه يوفر هيكلًا للرسوم أكثر إنصافًا وتوقعًا للمستخدمين، حيث تكون الرسوم متناسبة مع المبلغ المحول. كما أنه يسمح بمرونة أكبر في ضبط هيكل الرسوم لمواءمتها بشكل أفضل مع احتياجات البلوكشين ومستخدميه، حيث يمكن تغيير معلمات النسبة المئوية والحد الأدنى للرسوم والحد الأقصى للرسوم من خلال آلية التوافق المتفق عليها بين جميع المحققين.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/about/roadmap/index.html b/ar/about/roadmap/index.html
new file mode 100644
index 000000000..34a0ea9d2
--- /dev/null
+++ b/ar/about/roadmap/index.html
@@ -0,0 +1,714 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ خارطة الطريق | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
خارطة الطريق
+
+
+
✅ المهمة المكتملة
+
🚧 المهمة الجارية
+
⏳ المهمة القادمة
+
+
+
+
+
+
+
+
+
+
+
+
+ Decentralized Storage Platform
+
+
+
Q1 2025
+
+
+
+
+
+
+
+
+
+ Browser Extension Wallet
+
+
+
Q4 2024
+
+
+
+
+
+
+
+
+
+ Desktop and Mobile Friendly GUI
+
+
+
July 2024
+
+
+
+
+
+
+
+
+
+ CLI tools for controlling Pactus node
+
+
+
Jun 2024
+
+
+
+
+
+
+
+
+
+ First Interactive Block Explorer
+
+
+
March 2024
+
+
+
+
+
+
+
+
+
+ Permanent testnet launch
+
+
+
February 2024
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/about/what-is-pactus/index.html b/ar/about/what-is-pactus/index.html
new file mode 100644
index 000000000..b7b2deb95
--- /dev/null
+++ b/ar/about/what-is-pactus/index.html
@@ -0,0 +1,410 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ما هو بكتوس؟ | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ما هو بكتوس؟
+
+
+
+
+
+
بكتوس هو بلوكشين يركز على التوزيع
+ يعتمد بكتوس على مبدأ أنه يمكن تحقيق نظام عادل وشفاف فقط من خلال التوزيع. على عكس العديد من منصات البلوكشين الأخرى، يهدف بكتوس إلى القضاء على إمكانية المركزية والتلاعب من خلال إزالة الحاجة إلى التفويض والمُعدِّنين. يتيح ذلك لأي شخص أن يصبح جزءًا من النظام البيئي ويضمن أن تظل المنصة موزعة بالفعل.
+
+
+
+
+
+
+
بكتوس هو بلوكشين سهل الاستخدام
+ يهدف بكتوس إلى إنشاء بلوكشين سهل الاستخدام يمكن استخدامه بسهولة من قبل أي شخص، وليس فقط خبراء التقنية. يتم تصميم بروتوكولنا ليكون بسيطًا وسهل الصيانة والتطوير. يقدم بكتوس تطبيق واجهة المستخدم الرسومية البسيطة التي يسهل للمستخدمين تشغيل عقدة.
+
+
+
+
+
+
+
يستخدم بكتوس نموذج رسوم مبني على النسبة المئوية
+ تُحسَب رسوم المعاملات استنادًا إلى نموذج النسبة المئوية مع رسوم دنيا وعليا. توفر هذه المعايير تحكمًا أكبر في هيكل الرسوم وتمنع الدفع الزائد أو الدفع الناقص. يضمن النموذج المبني على النسبة المئوية النزاهة والقدرة على التنبؤ، ويمكن تعديله من خلال الإجماع بين جميع المصادقين.
+
+
+
+
+
+
+
تخزين متفرد ولامركزي في بكتوس
+ في بكتوس، يمكن للمستخدمين شراء ملف تخزين مخصص يمكن تجديده سنويًا، مما يؤدي إلى تخفيض التكاليف المتعلقة بالتخزين وتنفيذ العقود الذكية. يمكن أن تمهد هذه الميزة الفريدة الطريق لبروتوكولات جديدة في المنصات الموزعة.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/android-chrome-192x192.png b/ar/android-chrome-192x192.png
new file mode 100644
index 000000000..8a8e2b6d8
Binary files /dev/null and b/ar/android-chrome-192x192.png differ
diff --git a/ar/android-chrome-256x256.png b/ar/android-chrome-256x256.png
new file mode 100644
index 000000000..827219e8a
Binary files /dev/null and b/ar/android-chrome-256x256.png differ
diff --git a/ar/apple-touch-icon.png b/ar/apple-touch-icon.png
new file mode 100644
index 000000000..1fa36ea07
Binary files /dev/null and b/ar/apple-touch-icon.png differ
diff --git a/ar/assets/css/custom.css b/ar/assets/css/custom.css
new file mode 100644
index 000000000..309f55ddc
--- /dev/null
+++ b/ar/assets/css/custom.css
@@ -0,0 +1 @@
+:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}:root,[data-bs-theme=light]{--pa-blue: #0d6efd;--pa-indigo: #6610f2;--pa-purple: #6f42c1;--pa-pink: #d63384;--pa-red: #dc3545;--pa-orange: #fd7e14;--pa-yellow: #ffc107;--pa-green: #198754;--pa-teal: #20c997;--pa-cyan: #0dcaf0;--pa-black: #000;--pa-white: #fff;--pa-gray: #6c757d;--pa-gray-dark: #343a40;--pa-gray-100: #f8f9fa;--pa-gray-200: #e9ecef;--pa-gray-300: #dee2e6;--pa-gray-400: #ced4da;--pa-gray-500: #adb5bd;--pa-gray-600: #6c757d;--pa-gray-700: #495057;--pa-gray-800: #343a40;--pa-gray-900: #212529;--pa-primary: #021a34;--pa-secondary: #075f94;--pa-success: #198754;--pa-info: #0dcaf0;--pa-warning: #ffc107;--pa-danger: #dc3545;--pa-light: #f8f9fa;--pa-dark: #212529;--pa-primary-rgb: 2, 26, 52;--pa-secondary-rgb: 7, 95, 148;--pa-success-rgb: 25, 135, 84;--pa-info-rgb: 13, 202, 240;--pa-warning-rgb: 255, 193, 7;--pa-danger-rgb: 220, 53, 69;--pa-light-rgb: 248, 249, 250;--pa-dark-rgb: 33, 37, 41;--pa-primary-text-emphasis: #010a15;--pa-secondary-text-emphasis: #03263b;--pa-success-text-emphasis: #0a3622;--pa-info-text-emphasis: #055160;--pa-warning-text-emphasis: #664d03;--pa-danger-text-emphasis: #58151c;--pa-light-text-emphasis: #495057;--pa-dark-text-emphasis: #495057;--pa-primary-bg-subtle: #ccd1d6;--pa-secondary-bg-subtle: #cddfea;--pa-success-bg-subtle: #d1e7dd;--pa-info-bg-subtle: #cff4fc;--pa-warning-bg-subtle: #fff3cd;--pa-danger-bg-subtle: #f8d7da;--pa-light-bg-subtle: #fcfcfd;--pa-dark-bg-subtle: #ced4da;--pa-primary-border-subtle: #9aa3ae;--pa-secondary-border-subtle: #9cbfd4;--pa-success-border-subtle: #a3cfbb;--pa-info-border-subtle: #9eeaf9;--pa-warning-border-subtle: #ffe69c;--pa-danger-border-subtle: #f1aeb5;--pa-light-border-subtle: #e9ecef;--pa-dark-border-subtle: #adb5bd;--pa-white-rgb: 255, 255, 255;--pa-black-rgb: 0, 0, 0;--pa-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--pa-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--pa-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--pa-body-font-family: var(--pa-font-sans-serif);--pa-body-font-size:1rem;--pa-body-font-weight: 400;--pa-body-line-height: 1.5;--pa-body-color: #212529;--pa-body-color-rgb: 33, 37, 41;--pa-body-bg: #fff;--pa-body-bg-rgb: 255, 255, 255;--pa-emphasis-color: #000;--pa-emphasis-color-rgb: 0, 0, 0;--pa-secondary-color: rgba(33, 37, 41, 0.75);--pa-secondary-color-rgb: 33, 37, 41;--pa-secondary-bg: #e9ecef;--pa-secondary-bg-rgb: 233, 236, 239;--pa-tertiary-color: rgba(33, 37, 41, 0.5);--pa-tertiary-color-rgb: 33, 37, 41;--pa-tertiary-bg: #f8f9fa;--pa-tertiary-bg-rgb: 248, 249, 250;--pa-heading-color: inherit;--pa-link-color: #021a34;--pa-link-color-rgb: 2, 26, 52;--pa-link-decoration: underline;--pa-link-hover-color: #02152a;--pa-link-hover-color-rgb: 2, 21, 42;--pa-code-color: #d63384;--pa-highlight-color: #212529;--pa-highlight-bg: #fff3cd;--pa-border-width: 1px;--pa-border-style: solid;--pa-border-color: #dee2e6;--pa-border-color-translucent: rgba(0, 0, 0, 0.175);--pa-border-radius: 0.375rem;--pa-border-radius-sm: 0.25rem;--pa-border-radius-lg: 0.5rem;--pa-border-radius-xl: 1rem;--pa-border-radius-xxl: 2rem;--pa-border-radius-2xl: var(--pa-border-radius-xxl);--pa-border-radius-pill: 50rem;--pa-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--pa-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--pa-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--pa-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--pa-focus-ring-width: 0.25rem;--pa-focus-ring-opacity: 0.25;--pa-focus-ring-color: rgba(2, 26, 52, 0.25);--pa-form-valid-color: #198754;--pa-form-valid-border-color: #198754;--pa-form-invalid-color: #dc3545;--pa-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--pa-body-color: #dee2e6;--pa-body-color-rgb: 222, 226, 230;--pa-body-bg: #212529;--pa-body-bg-rgb: 33, 37, 41;--pa-emphasis-color: #fff;--pa-emphasis-color-rgb: 255, 255, 255;--pa-secondary-color: rgba(222, 226, 230, 0.75);--pa-secondary-color-rgb: 222, 226, 230;--pa-secondary-bg: #343a40;--pa-secondary-bg-rgb: 52, 58, 64;--pa-tertiary-color: rgba(222, 226, 230, 0.5);--pa-tertiary-color-rgb: 222, 226, 230;--pa-tertiary-bg: #2b3035;--pa-tertiary-bg-rgb: 43, 48, 53;--pa-primary-text-emphasis: #677685;--pa-secondary-text-emphasis: #6a9fbf;--pa-success-text-emphasis: #75b798;--pa-info-text-emphasis: #6edff6;--pa-warning-text-emphasis: #ffda6a;--pa-danger-text-emphasis: #ea868f;--pa-light-text-emphasis: #f8f9fa;--pa-dark-text-emphasis: #dee2e6;--pa-primary-bg-subtle: #00050a;--pa-secondary-bg-subtle: #01131e;--pa-success-bg-subtle: #051b11;--pa-info-bg-subtle: #032830;--pa-warning-bg-subtle: #332701;--pa-danger-bg-subtle: #2c0b0e;--pa-light-bg-subtle: #343a40;--pa-dark-bg-subtle: #1a1d20;--pa-primary-border-subtle: #01101f;--pa-secondary-border-subtle: #043959;--pa-success-border-subtle: #0f5132;--pa-info-border-subtle: #087990;--pa-warning-border-subtle: #997404;--pa-danger-border-subtle: #842029;--pa-light-border-subtle: #495057;--pa-dark-border-subtle: #343a40;--pa-heading-color: inherit;--pa-link-color: #677685;--pa-link-hover-color: #85919d;--pa-link-color-rgb: 103, 118, 133;--pa-link-hover-color-rgb: 133, 145, 157;--pa-code-color: #e685b5;--pa-highlight-color: #dee2e6;--pa-highlight-bg: #664d03;--pa-border-color: #495057;--pa-border-color-translucent: rgba(255, 255, 255, 0.15);--pa-form-valid-color: #75b798;--pa-form-valid-border-color: #75b798;--pa-form-invalid-color: #ea868f;--pa-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--pa-body-font-family);font-size:var(--pa-body-font-size);font-weight:var(--pa-body-font-weight);line-height:var(--pa-body-line-height);color:var(--pa-body-color);text-align:var(--pa-body-text-align);background-color:var(--pa-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--pa-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--pa-heading-color)}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + 0.6vw)}@media(min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + 0.3vw)}@media(min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;color:var(--pa-highlight-color);background-color:var(--pa-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 1));text-decoration:underline}a:hover{--pa-link-color-rgb: var(--pa-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--pa-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--pa-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:0.875em;color:var(--pa-body-bg);background-color:var(--pa-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--pa-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--pa-body-bg);border:var(--pa-border-width) solid var(--pa-border-color);border-radius:var(--pa-border-radius);box-shadow:var(--pa-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:var(--pa-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--pa-breakpoint-xs: 0;--pa-breakpoint-sm: 576px;--pa-breakpoint-md: 768px;--pa-breakpoint-lg: 992px;--pa-breakpoint-xl: 1200px;--pa-breakpoint-xxl: 1400px}.row{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--pa-gutter-y));margin-right:calc(-0.5*var(--pa-gutter-x));margin-left:calc(-0.5*var(--pa-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-top:var(--pa-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--pa-gutter-x: 0}.g-0,.gy-0{--pa-gutter-y: 0}.g-1,.gx-1{--pa-gutter-x: 0.25rem}.g-1,.gy-1{--pa-gutter-y: 0.25rem}.g-2,.gx-2{--pa-gutter-x: 0.5rem}.g-2,.gy-2{--pa-gutter-y: 0.5rem}.g-3,.gx-3{--pa-gutter-x: 1rem}.g-3,.gy-3{--pa-gutter-y: 1rem}.g-4,.gx-4{--pa-gutter-x: 1.5rem}.g-4,.gy-4{--pa-gutter-y: 1.5rem}.g-5,.gx-5{--pa-gutter-x: 3rem}.g-5,.gy-5{--pa-gutter-y: 3rem}@media(min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--pa-gutter-x: 0}.g-sm-0,.gy-sm-0{--pa-gutter-y: 0}.g-sm-1,.gx-sm-1{--pa-gutter-x: 0.25rem}.g-sm-1,.gy-sm-1{--pa-gutter-y: 0.25rem}.g-sm-2,.gx-sm-2{--pa-gutter-x: 0.5rem}.g-sm-2,.gy-sm-2{--pa-gutter-y: 0.5rem}.g-sm-3,.gx-sm-3{--pa-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--pa-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--pa-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--pa-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--pa-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--pa-gutter-y: 3rem}}@media(min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--pa-gutter-x: 0}.g-md-0,.gy-md-0{--pa-gutter-y: 0}.g-md-1,.gx-md-1{--pa-gutter-x: 0.25rem}.g-md-1,.gy-md-1{--pa-gutter-y: 0.25rem}.g-md-2,.gx-md-2{--pa-gutter-x: 0.5rem}.g-md-2,.gy-md-2{--pa-gutter-y: 0.5rem}.g-md-3,.gx-md-3{--pa-gutter-x: 1rem}.g-md-3,.gy-md-3{--pa-gutter-y: 1rem}.g-md-4,.gx-md-4{--pa-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--pa-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--pa-gutter-x: 3rem}.g-md-5,.gy-md-5{--pa-gutter-y: 3rem}}@media(min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--pa-gutter-x: 0}.g-lg-0,.gy-lg-0{--pa-gutter-y: 0}.g-lg-1,.gx-lg-1{--pa-gutter-x: 0.25rem}.g-lg-1,.gy-lg-1{--pa-gutter-y: 0.25rem}.g-lg-2,.gx-lg-2{--pa-gutter-x: 0.5rem}.g-lg-2,.gy-lg-2{--pa-gutter-y: 0.5rem}.g-lg-3,.gx-lg-3{--pa-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--pa-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--pa-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--pa-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--pa-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--pa-gutter-y: 3rem}}@media(min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--pa-gutter-x: 0}.g-xl-0,.gy-xl-0{--pa-gutter-y: 0}.g-xl-1,.gx-xl-1{--pa-gutter-x: 0.25rem}.g-xl-1,.gy-xl-1{--pa-gutter-y: 0.25rem}.g-xl-2,.gx-xl-2{--pa-gutter-x: 0.5rem}.g-xl-2,.gy-xl-2{--pa-gutter-y: 0.5rem}.g-xl-3,.gx-xl-3{--pa-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--pa-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--pa-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--pa-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--pa-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--pa-gutter-y: 3rem}}@media(min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--pa-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--pa-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--pa-gutter-x: 0.25rem}.g-xxl-1,.gy-xxl-1{--pa-gutter-y: 0.25rem}.g-xxl-2,.gx-xxl-2{--pa-gutter-x: 0.5rem}.g-xxl-2,.gy-xxl-2{--pa-gutter-y: 0.5rem}.g-xxl-3,.gx-xxl-3{--pa-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--pa-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--pa-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--pa-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--pa-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--pa-gutter-y: 3rem}}.table{--pa-table-color-type: initial;--pa-table-bg-type: initial;--pa-table-color-state: initial;--pa-table-bg-state: initial;--pa-table-color: var(--pa-emphasis-color);--pa-table-bg: var(--pa-body-bg);--pa-table-border-color: var(--pa-border-color);--pa-table-accent-bg: transparent;--pa-table-striped-color: var(--pa-emphasis-color);--pa-table-striped-bg: rgba(var(--pa-emphasis-color-rgb), 0.05);--pa-table-active-color: var(--pa-emphasis-color);--pa-table-active-bg: rgba(var(--pa-emphasis-color-rgb), 0.1);--pa-table-hover-color: var(--pa-emphasis-color);--pa-table-hover-bg: rgba(var(--pa-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--pa-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--pa-table-color-state, var(--pa-table-color-type, var(--pa-table-color)));background-color:var(--pa-table-bg);border-bottom-width:var(--pa-border-width);box-shadow:inset 0 0 0 9999px var(--pa-table-bg-state, var(--pa-table-bg-type, var(--pa-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--pa-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--pa-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--pa-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-active{--pa-table-color-state: var(--pa-table-active-color);--pa-table-bg-state: var(--pa-table-active-bg)}.table-hover>tbody>tr:hover>*{--pa-table-color-state: var(--pa-table-hover-color);--pa-table-bg-state: var(--pa-table-hover-bg)}.table-primary{--pa-table-color: #000;--pa-table-bg: #ccd1d6;--pa-table-border-color: #a3a7ab;--pa-table-striped-bg: #c2c7cb;--pa-table-striped-color: #000;--pa-table-active-bg: #b8bcc1;--pa-table-active-color: #000;--pa-table-hover-bg: #bdc1c6;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-secondary{--pa-table-color: #000;--pa-table-bg: #cddfea;--pa-table-border-color: #a4b2bb;--pa-table-striped-bg: #c3d4de;--pa-table-striped-color: #000;--pa-table-active-bg: #b9c9d3;--pa-table-active-color: #000;--pa-table-hover-bg: #beced8;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-success{--pa-table-color: #000;--pa-table-bg: #d1e7dd;--pa-table-border-color: #a7b9b1;--pa-table-striped-bg: #c7dbd2;--pa-table-striped-color: #000;--pa-table-active-bg: #bcd0c7;--pa-table-active-color: #000;--pa-table-hover-bg: #c1d6cc;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-info{--pa-table-color: #000;--pa-table-bg: #cff4fc;--pa-table-border-color: #a6c3ca;--pa-table-striped-bg: #c5e8ef;--pa-table-striped-color: #000;--pa-table-active-bg: #badce3;--pa-table-active-color: #000;--pa-table-hover-bg: #bfe2e9;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-warning{--pa-table-color: #000;--pa-table-bg: #fff3cd;--pa-table-border-color: #ccc2a4;--pa-table-striped-bg: #f2e7c3;--pa-table-striped-color: #000;--pa-table-active-bg: #e6dbb9;--pa-table-active-color: #000;--pa-table-hover-bg: #ece1be;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-danger{--pa-table-color: #000;--pa-table-bg: #f8d7da;--pa-table-border-color: #c6acae;--pa-table-striped-bg: #eccccf;--pa-table-striped-color: #000;--pa-table-active-bg: #dfc2c4;--pa-table-active-color: #000;--pa-table-hover-bg: #e5c7ca;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-light{--pa-table-color: #000;--pa-table-bg: #f8f9fa;--pa-table-border-color: #c6c7c8;--pa-table-striped-bg: #ecedee;--pa-table-striped-color: #000;--pa-table-active-bg: #dfe0e1;--pa-table-active-color: #000;--pa-table-hover-bg: #e5e6e7;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-dark{--pa-table-color: #fff;--pa-table-bg: #212529;--pa-table-border-color: #4d5154;--pa-table-striped-bg: #2c3034;--pa-table-striped-color: #fff;--pa-table-active-bg: #373b3e;--pa-table-active-color: #fff;--pa-table-hover-bg: #323539;--pa-table-hover-color: #fff;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.btn{--pa-btn-padding-x: 0.75rem;--pa-btn-padding-y: 0.375rem;--pa-btn-font-family: ;--pa-btn-font-size:1rem;--pa-btn-font-weight: 400;--pa-btn-line-height: 1.5;--pa-btn-color: var(--pa-body-color);--pa-btn-bg: transparent;--pa-btn-border-width: var(--pa-border-width);--pa-btn-border-color: transparent;--pa-btn-border-radius: var(--pa-border-radius);--pa-btn-hover-border-color: transparent;--pa-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--pa-btn-disabled-opacity: 0.65;--pa-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--pa-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--pa-btn-padding-y) var(--pa-btn-padding-x);font-family:var(--pa-btn-font-family);font-size:var(--pa-btn-font-size);font-weight:var(--pa-btn-font-weight);line-height:var(--pa-btn-line-height);color:var(--pa-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;border:var(--pa-btn-border-width) solid var(--pa-btn-border-color);border-radius:var(--pa-btn-border-radius);background-color:var(--pa-btn-bg);box-shadow:var(--pa-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--pa-btn-color);background-color:var(--pa-btn-bg);border-color:var(--pa-btn-border-color)}.btn:focus-visible{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--pa-btn-active-color);background-color:var(--pa-btn-active-bg);border-color:var(--pa-btn-active-border-color);box-shadow:var(--pa-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--pa-btn-active-shadow),var(--pa-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--pa-btn-disabled-color);pointer-events:none;background-color:var(--pa-btn-disabled-bg);border-color:var(--pa-btn-disabled-border-color);opacity:var(--pa-btn-disabled-opacity);box-shadow:none}.btn-primary{--pa-btn-color: #fff;--pa-btn-bg: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #02162c;--pa-btn-hover-border-color: #02152a;--pa-btn-focus-shadow-rgb: 40, 60, 82;--pa-btn-active-color: #fff;--pa-btn-active-bg: #02152a;--pa-btn-active-border-color: #021427;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #021a34;--pa-btn-disabled-border-color: #021a34}.btn-secondary{--pa-btn-color: #fff;--pa-btn-bg: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #06517e;--pa-btn-hover-border-color: #064c76;--pa-btn-focus-shadow-rgb: 44, 119, 164;--pa-btn-active-color: #fff;--pa-btn-active-bg: #064c76;--pa-btn-active-border-color: #05476f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #075f94;--pa-btn-disabled-border-color: #075f94}.btn-success{--pa-btn-color: #fff;--pa-btn-bg: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #157347;--pa-btn-hover-border-color: #146c43;--pa-btn-focus-shadow-rgb: 60, 153, 110;--pa-btn-active-color: #fff;--pa-btn-active-bg: #146c43;--pa-btn-active-border-color: #13653f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #198754;--pa-btn-disabled-border-color: #198754}.btn-info{--pa-btn-color: #000;--pa-btn-bg: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #31d2f2;--pa-btn-hover-border-color: #25cff2;--pa-btn-focus-shadow-rgb: 11, 172, 204;--pa-btn-active-color: #000;--pa-btn-active-bg: #3dd5f3;--pa-btn-active-border-color: #25cff2;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #0dcaf0;--pa-btn-disabled-border-color: #0dcaf0}.btn-warning{--pa-btn-color: #000;--pa-btn-bg: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffca2c;--pa-btn-hover-border-color: #ffc720;--pa-btn-focus-shadow-rgb: 217, 164, 6;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffcd39;--pa-btn-active-border-color: #ffc720;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #ffc107;--pa-btn-disabled-border-color: #ffc107}.btn-danger{--pa-btn-color: #fff;--pa-btn-bg: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #bb2d3b;--pa-btn-hover-border-color: #b02a37;--pa-btn-focus-shadow-rgb: 225, 83, 97;--pa-btn-active-color: #fff;--pa-btn-active-bg: #b02a37;--pa-btn-active-border-color: #a52834;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #dc3545;--pa-btn-disabled-border-color: #dc3545}.btn-light{--pa-btn-color: #000;--pa-btn-bg: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #d3d4d5;--pa-btn-hover-border-color: #c6c7c8;--pa-btn-focus-shadow-rgb: 211, 212, 213;--pa-btn-active-color: #000;--pa-btn-active-bg: #c6c7c8;--pa-btn-active-border-color: #babbbc;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #f8f9fa;--pa-btn-disabled-border-color: #f8f9fa}.btn-dark{--pa-btn-color: #fff;--pa-btn-bg: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #424649;--pa-btn-hover-border-color: #373b3e;--pa-btn-focus-shadow-rgb: 66, 70, 73;--pa-btn-active-color: #fff;--pa-btn-active-bg: #4d5154;--pa-btn-active-border-color: #373b3e;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #212529;--pa-btn-disabled-border-color: #212529}.btn-outline-primary{--pa-btn-color: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #021a34;--pa-btn-hover-border-color: #021a34;--pa-btn-focus-shadow-rgb: 2, 26, 52;--pa-btn-active-color: #fff;--pa-btn-active-bg: #021a34;--pa-btn-active-border-color: #021a34;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #021a34;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #021a34;--pa-gradient: none}.btn-outline-secondary{--pa-btn-color: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #075f94;--pa-btn-hover-border-color: #075f94;--pa-btn-focus-shadow-rgb: 7, 95, 148;--pa-btn-active-color: #fff;--pa-btn-active-bg: #075f94;--pa-btn-active-border-color: #075f94;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #075f94;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #075f94;--pa-gradient: none}.btn-outline-success{--pa-btn-color: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #198754;--pa-btn-hover-border-color: #198754;--pa-btn-focus-shadow-rgb: 25, 135, 84;--pa-btn-active-color: #fff;--pa-btn-active-bg: #198754;--pa-btn-active-border-color: #198754;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #198754;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #198754;--pa-gradient: none}.btn-outline-info{--pa-btn-color: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #0dcaf0;--pa-btn-hover-border-color: #0dcaf0;--pa-btn-focus-shadow-rgb: 13, 202, 240;--pa-btn-active-color: #000;--pa-btn-active-bg: #0dcaf0;--pa-btn-active-border-color: #0dcaf0;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #0dcaf0;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #0dcaf0;--pa-gradient: none}.btn-outline-warning{--pa-btn-color: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffc107;--pa-btn-hover-border-color: #ffc107;--pa-btn-focus-shadow-rgb: 255, 193, 7;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffc107;--pa-btn-active-border-color: #ffc107;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #ffc107;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #ffc107;--pa-gradient: none}.btn-outline-danger{--pa-btn-color: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #dc3545;--pa-btn-hover-border-color: #dc3545;--pa-btn-focus-shadow-rgb: 220, 53, 69;--pa-btn-active-color: #fff;--pa-btn-active-bg: #dc3545;--pa-btn-active-border-color: #dc3545;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #dc3545;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #dc3545;--pa-gradient: none}.btn-outline-light{--pa-btn-color: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #f8f9fa;--pa-btn-hover-border-color: #f8f9fa;--pa-btn-focus-shadow-rgb: 248, 249, 250;--pa-btn-active-color: #000;--pa-btn-active-bg: #f8f9fa;--pa-btn-active-border-color: #f8f9fa;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #f8f9fa;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #f8f9fa;--pa-gradient: none}.btn-outline-dark{--pa-btn-color: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #212529;--pa-btn-hover-border-color: #212529;--pa-btn-focus-shadow-rgb: 33, 37, 41;--pa-btn-active-color: #fff;--pa-btn-active-bg: #212529;--pa-btn-active-border-color: #212529;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #212529;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #212529;--pa-gradient: none}.btn-link{--pa-btn-font-weight: 400;--pa-btn-color: var(--pa-link-color);--pa-btn-bg: transparent;--pa-btn-border-color: transparent;--pa-btn-hover-color: var(--pa-link-hover-color);--pa-btn-hover-border-color: transparent;--pa-btn-active-color: var(--pa-link-hover-color);--pa-btn-active-border-color: transparent;--pa-btn-disabled-color: #6c757d;--pa-btn-disabled-border-color: transparent;--pa-btn-box-shadow: 0 0 0 #000;--pa-btn-focus-shadow-rgb: 40, 60, 82;text-decoration:underline}.btn-link:focus-visible{color:var(--pa-btn-color)}.btn-link:hover{color:var(--pa-btn-hover-color)}.btn-lg{--pa-btn-padding-y: 0.5rem;--pa-btn-padding-x: 1rem;--pa-btn-font-size:1.25rem;--pa-btn-border-radius: var(--pa-border-radius-lg)}.btn-sm{--pa-btn-padding-y: 0.25rem;--pa-btn-padding-x: 0.5rem;--pa-btn-font-size:0.875rem;--pa-btn-border-radius: var(--pa-border-radius-sm)}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--pa-dropdown-zindex: 1000;--pa-dropdown-min-width: 10rem;--pa-dropdown-padding-x: 0;--pa-dropdown-padding-y: 0.5rem;--pa-dropdown-spacer: 0.125rem;--pa-dropdown-font-size:1rem;--pa-dropdown-color: var(--pa-body-color);--pa-dropdown-bg: var(--pa-body-bg);--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-border-radius: var(--pa-border-radius);--pa-dropdown-border-width: var(--pa-border-width);--pa-dropdown-inner-border-radius: calc(var(--pa-border-radius) - var(--pa-border-width));--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-divider-margin-y: 0.5rem;--pa-dropdown-box-shadow: var(--pa-box-shadow);--pa-dropdown-link-color: var(--pa-body-color);--pa-dropdown-link-hover-color: var(--pa-body-color);--pa-dropdown-link-hover-bg: var(--pa-tertiary-bg);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: var(--pa-tertiary-color);--pa-dropdown-item-padding-x: 1rem;--pa-dropdown-item-padding-y: 0.25rem;--pa-dropdown-header-color: #6c757d;--pa-dropdown-header-padding-x: 1rem;--pa-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--pa-dropdown-zindex);display:none;min-width:var(--pa-dropdown-min-width);padding:var(--pa-dropdown-padding-y) var(--pa-dropdown-padding-x);margin:0;font-size:var(--pa-dropdown-font-size);color:var(--pa-dropdown-color);text-align:left;list-style:none;background-color:var(--pa-dropdown-bg);background-clip:padding-box;border:var(--pa-dropdown-border-width) solid var(--pa-dropdown-border-color);border-radius:var(--pa-dropdown-border-radius);box-shadow:var(--pa-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--pa-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--pa-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--pa-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--pa-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--pa-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--pa-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--pa-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--pa-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--pa-dropdown-link-hover-color);background-color:var(--pa-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--pa-dropdown-link-active-color);text-decoration:none;background-color:var(--pa-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--pa-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--pa-dropdown-header-padding-y) var(--pa-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--pa-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);color:var(--pa-dropdown-link-color)}.dropdown-menu-dark{--pa-dropdown-color: #dee2e6;--pa-dropdown-bg: #343a40;--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-box-shadow: ;--pa-dropdown-link-color: #dee2e6;--pa-dropdown-link-hover-color: #fff;--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: #adb5bd;--pa-dropdown-header-color: #adb5bd}.nav{--pa-nav-link-padding-x: 1rem;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-link-color);--pa-nav-link-hover-color: var(--pa-link-hover-color);--pa-nav-link-disabled-color: var(--pa-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--pa-nav-link-padding-y) var(--pa-nav-link-padding-x);font-size:var(--pa-nav-link-font-size);font-weight:var(--pa-nav-link-font-weight);color:var(--pa-nav-link-color);text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--pa-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(2,26,52,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--pa-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--pa-nav-tabs-border-width: var(--pa-border-width);--pa-nav-tabs-border-color: var(--pa-border-color);--pa-nav-tabs-border-radius: var(--pa-border-radius);--pa-nav-tabs-link-hover-border-color: var(--pa-secondary-bg) var(--pa-secondary-bg) var(--pa-border-color);--pa-nav-tabs-link-active-color: var(--pa-emphasis-color);--pa-nav-tabs-link-active-bg: var(--pa-body-bg);--pa-nav-tabs-link-active-border-color: var(--pa-border-color) var(--pa-border-color) var(--pa-body-bg);border-bottom:var(--pa-nav-tabs-border-width) solid var(--pa-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--pa-nav-tabs-border-width));border:var(--pa-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--pa-nav-tabs-border-radius);border-top-right-radius:var(--pa-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--pa-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--pa-nav-tabs-link-active-color);background-color:var(--pa-nav-tabs-link-active-bg);border-color:var(--pa-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--pa-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--pa-nav-pills-border-radius: var(--pa-border-radius);--pa-nav-pills-link-active-color: #fff;--pa-nav-pills-link-active-bg: #021a34}.nav-pills .nav-link{border-radius:var(--pa-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--pa-nav-pills-link-active-color);background-color:var(--pa-nav-pills-link-active-bg)}.nav-underline{--pa-nav-underline-gap: 1rem;--pa-nav-underline-border-width: 0.125rem;--pa-nav-underline-link-active-color: var(--pa-emphasis-color);gap:var(--pa-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--pa-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--pa-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--pa-navbar-padding-x: 0;--pa-navbar-padding-y: 0.5rem;--pa-navbar-color: rgba(var(--pa-emphasis-color-rgb), 0.65);--pa-navbar-hover-color: rgba(var(--pa-emphasis-color-rgb), 0.8);--pa-navbar-disabled-color: rgba(var(--pa-emphasis-color-rgb), 0.3);--pa-navbar-active-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-padding-y: 0.3125rem;--pa-navbar-brand-margin-end: 1rem;--pa-navbar-brand-font-size: 1.25rem;--pa-navbar-brand-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-hover-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-nav-link-padding-x: 0.5rem;--pa-navbar-toggler-padding-y: 0.25rem;--pa-navbar-toggler-padding-x: 0.75rem;--pa-navbar-toggler-font-size: 1.25rem;--pa-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--pa-navbar-toggler-border-color: rgba(var(--pa-emphasis-color-rgb), 0.15);--pa-navbar-toggler-border-radius: var(--pa-border-radius);--pa-navbar-toggler-focus-width: 0.25rem;--pa-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--pa-navbar-padding-y) var(--pa-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--pa-navbar-brand-padding-y);padding-bottom:var(--pa-navbar-brand-padding-y);margin-right:var(--pa-navbar-brand-margin-end);font-size:var(--pa-navbar-brand-font-size);color:var(--pa-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--pa-navbar-brand-hover-color)}.navbar-nav{--pa-nav-link-padding-x: 0;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-navbar-color);--pa-nav-link-hover-color: var(--pa-navbar-hover-color);--pa-nav-link-disabled-color: var(--pa-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--pa-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--pa-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--pa-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--pa-navbar-toggler-padding-y) var(--pa-navbar-toggler-padding-x);font-size:var(--pa-navbar-toggler-font-size);line-height:1;color:var(--pa-navbar-color);background-color:rgba(0,0,0,0);border:var(--pa-border-width) solid var(--pa-navbar-toggler-border-color);border-radius:var(--pa-navbar-toggler-border-radius);transition:var(--pa-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--pa-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--pa-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--pa-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--pa-navbar-color: rgba(255, 255, 255, 0.55);--pa-navbar-hover-color: rgba(255, 255, 255, 0.75);--pa-navbar-disabled-color: rgba(255, 255, 255, 0.25);--pa-navbar-active-color: #fff;--pa-navbar-brand-color: #fff;--pa-navbar-brand-hover-color: #fff;--pa-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);--pa-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--pa-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.badge{--pa-badge-padding-x: 0.65em;--pa-badge-padding-y: 0.35em;--pa-badge-font-size:0.75em;--pa-badge-font-weight: 700;--pa-badge-color: #fff;--pa-badge-border-radius: var(--pa-border-radius);display:inline-block;padding:var(--pa-badge-padding-y) var(--pa-badge-padding-x);font-size:var(--pa-badge-font-size);font-weight:var(--pa-badge-font-weight);line-height:1;color:var(--pa-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--pa-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--pa-alert-bg: transparent;--pa-alert-padding-x: 1rem;--pa-alert-padding-y: 1rem;--pa-alert-margin-bottom: 1rem;--pa-alert-color: inherit;--pa-alert-border-color: transparent;--pa-alert-border: var(--pa-border-width) solid var(--pa-alert-border-color);--pa-alert-border-radius: var(--pa-border-radius);--pa-alert-link-color: inherit;position:relative;padding:var(--pa-alert-padding-y) var(--pa-alert-padding-x);margin-bottom:var(--pa-alert-margin-bottom);color:var(--pa-alert-color);background-color:var(--pa-alert-bg);border:var(--pa-alert-border);border-radius:var(--pa-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--pa-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--pa-alert-color: var(--pa-primary-text-emphasis);--pa-alert-bg: var(--pa-primary-bg-subtle);--pa-alert-border-color: var(--pa-primary-border-subtle);--pa-alert-link-color: var(--pa-primary-text-emphasis)}.alert-secondary{--pa-alert-color: var(--pa-secondary-text-emphasis);--pa-alert-bg: var(--pa-secondary-bg-subtle);--pa-alert-border-color: var(--pa-secondary-border-subtle);--pa-alert-link-color: var(--pa-secondary-text-emphasis)}.alert-success{--pa-alert-color: var(--pa-success-text-emphasis);--pa-alert-bg: var(--pa-success-bg-subtle);--pa-alert-border-color: var(--pa-success-border-subtle);--pa-alert-link-color: var(--pa-success-text-emphasis)}.alert-info{--pa-alert-color: var(--pa-info-text-emphasis);--pa-alert-bg: var(--pa-info-bg-subtle);--pa-alert-border-color: var(--pa-info-border-subtle);--pa-alert-link-color: var(--pa-info-text-emphasis)}.alert-warning{--pa-alert-color: var(--pa-warning-text-emphasis);--pa-alert-bg: var(--pa-warning-bg-subtle);--pa-alert-border-color: var(--pa-warning-border-subtle);--pa-alert-link-color: var(--pa-warning-text-emphasis)}.alert-danger{--pa-alert-color: var(--pa-danger-text-emphasis);--pa-alert-bg: var(--pa-danger-bg-subtle);--pa-alert-border-color: var(--pa-danger-border-subtle);--pa-alert-link-color: var(--pa-danger-text-emphasis)}.alert-light{--pa-alert-color: var(--pa-light-text-emphasis);--pa-alert-bg: var(--pa-light-bg-subtle);--pa-alert-border-color: var(--pa-light-border-subtle);--pa-alert-link-color: var(--pa-light-text-emphasis)}.alert-dark{--pa-alert-color: var(--pa-dark-text-emphasis);--pa-alert-bg: var(--pa-dark-bg-subtle);--pa-alert-border-color: var(--pa-dark-border-subtle);--pa-alert-link-color: var(--pa-dark-text-emphasis)}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--pa-primary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--pa-secondary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--pa-success-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--pa-info-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--pa-warning-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--pa-danger-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--pa-light-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--pa-dark-rgb), var(--pa-bg-opacity, 1)) !important}.link-primary{color:RGBA(var(--pa-primary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-primary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(2, 21, 42, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(2, 21, 42, var(--pa-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--pa-secondary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-secondary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(6, 76, 118, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(6, 76, 118, var(--pa-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--pa-success-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-success-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--pa-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--pa-info-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-info-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--pa-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--pa-warning-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-warning-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--pa-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--pa-danger-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-danger-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--pa-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--pa-light-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-light-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--pa-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--pa-dark-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-dark-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--pa-focus-ring-x, 0) var(--pa-focus-ring-y, 0) var(--pa-focus-ring-blur, 0) var(--pa-focus-ring-width) var(--pa-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--pa-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--pa-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--pa-aspect-ratio: 100%}.ratio-4x3{--pa-aspect-ratio: 75%}.ratio-16x9{--pa-aspect-ratio: 56.25%}.ratio-21x9{--pa-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--pa-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:var(--pa-box-shadow) !important}.shadow-sm{box-shadow:var(--pa-box-shadow-sm) !important}.shadow-lg{box-shadow:var(--pa-box-shadow-lg) !important}.shadow-none{box-shadow:none !important}.focus-ring-primary{--pa-focus-ring-color: rgba(var(--pa-primary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-secondary{--pa-focus-ring-color: rgba(var(--pa-secondary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-success{--pa-focus-ring-color: rgba(var(--pa-success-rgb), var(--pa-focus-ring-opacity))}.focus-ring-info{--pa-focus-ring-color: rgba(var(--pa-info-rgb), var(--pa-focus-ring-opacity))}.focus-ring-warning{--pa-focus-ring-color: rgba(var(--pa-warning-rgb), var(--pa-focus-ring-opacity))}.focus-ring-danger{--pa-focus-ring-color: rgba(var(--pa-danger-rgb), var(--pa-focus-ring-opacity))}.focus-ring-light{--pa-focus-ring-color: rgba(var(--pa-light-rgb), var(--pa-focus-ring-opacity))}.focus-ring-dark{--pa-focus-ring-color: rgba(var(--pa-dark-rgb), var(--pa-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-start-0{border-left:0 !important}.border-primary{--pa-border-opacity: 1;border-color:rgba(var(--pa-primary-rgb), var(--pa-border-opacity)) !important}.border-secondary{--pa-border-opacity: 1;border-color:rgba(var(--pa-secondary-rgb), var(--pa-border-opacity)) !important}.border-success{--pa-border-opacity: 1;border-color:rgba(var(--pa-success-rgb), var(--pa-border-opacity)) !important}.border-info{--pa-border-opacity: 1;border-color:rgba(var(--pa-info-rgb), var(--pa-border-opacity)) !important}.border-warning{--pa-border-opacity: 1;border-color:rgba(var(--pa-warning-rgb), var(--pa-border-opacity)) !important}.border-danger{--pa-border-opacity: 1;border-color:rgba(var(--pa-danger-rgb), var(--pa-border-opacity)) !important}.border-light{--pa-border-opacity: 1;border-color:rgba(var(--pa-light-rgb), var(--pa-border-opacity)) !important}.border-dark{--pa-border-opacity: 1;border-color:rgba(var(--pa-dark-rgb), var(--pa-border-opacity)) !important}.border-black{--pa-border-opacity: 1;border-color:rgba(var(--pa-black-rgb), var(--pa-border-opacity)) !important}.border-white{--pa-border-opacity: 1;border-color:rgba(var(--pa-white-rgb), var(--pa-border-opacity)) !important}.border-primary-subtle{border-color:var(--pa-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--pa-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--pa-success-border-subtle) !important}.border-info-subtle{border-color:var(--pa-info-border-subtle) !important}.border-warning-subtle{border-color:var(--pa-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--pa-danger-border-subtle) !important}.border-light-subtle{border-color:var(--pa-light-border-subtle) !important}.border-dark-subtle{border-color:var(--pa-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--pa-border-opacity: 0.1}.border-opacity-25{--pa-border-opacity: 0.25}.border-opacity-50{--pa-border-opacity: 0.5}.border-opacity-75{--pa-border-opacity: 0.75}.border-opacity-100{--pa-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--pa-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + 0.9vw) !important}.fs-3{font-size:calc(1.3rem + 0.6vw) !important}.fs-4{font-size:calc(1.275rem + 0.3vw) !important}.fs-5{font-size:1.25rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{--pa-text-opacity: 1;color:rgba(var(--pa-primary-rgb), var(--pa-text-opacity)) !important}.text-secondary{--pa-text-opacity: 1;color:rgba(var(--pa-secondary-rgb), var(--pa-text-opacity)) !important}.text-success{--pa-text-opacity: 1;color:rgba(var(--pa-success-rgb), var(--pa-text-opacity)) !important}.text-info{--pa-text-opacity: 1;color:rgba(var(--pa-info-rgb), var(--pa-text-opacity)) !important}.text-warning{--pa-text-opacity: 1;color:rgba(var(--pa-warning-rgb), var(--pa-text-opacity)) !important}.text-danger{--pa-text-opacity: 1;color:rgba(var(--pa-danger-rgb), var(--pa-text-opacity)) !important}.text-light{--pa-text-opacity: 1;color:rgba(var(--pa-light-rgb), var(--pa-text-opacity)) !important}.text-dark{--pa-text-opacity: 1;color:rgba(var(--pa-dark-rgb), var(--pa-text-opacity)) !important}.text-black{--pa-text-opacity: 1;color:rgba(var(--pa-black-rgb), var(--pa-text-opacity)) !important}.text-white{--pa-text-opacity: 1;color:rgba(var(--pa-white-rgb), var(--pa-text-opacity)) !important}.text-body{--pa-text-opacity: 1;color:rgba(var(--pa-body-color-rgb), var(--pa-text-opacity)) !important}.text-muted{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-black-50{--pa-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--pa-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-body-tertiary{--pa-text-opacity: 1;color:var(--pa-tertiary-color) !important}.text-body-emphasis{--pa-text-opacity: 1;color:var(--pa-emphasis-color) !important}.text-reset{--pa-text-opacity: 1;color:inherit !important}.text-opacity-25{--pa-text-opacity: 0.25}.text-opacity-50{--pa-text-opacity: 0.5}.text-opacity-75{--pa-text-opacity: 0.75}.text-opacity-100{--pa-text-opacity: 1}.text-primary-emphasis{color:var(--pa-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--pa-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--pa-success-text-emphasis) !important}.text-info-emphasis{color:var(--pa-info-text-emphasis) !important}.text-warning-emphasis{color:var(--pa-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--pa-danger-text-emphasis) !important}.text-light-emphasis{color:var(--pa-light-text-emphasis) !important}.text-dark-emphasis{color:var(--pa-dark-text-emphasis) !important}.link-opacity-10{--pa-link-opacity: 0.1}.link-opacity-10-hover:hover{--pa-link-opacity: 0.1}.link-opacity-25{--pa-link-opacity: 0.25}.link-opacity-25-hover:hover{--pa-link-opacity: 0.25}.link-opacity-50{--pa-link-opacity: 0.5}.link-opacity-50-hover:hover{--pa-link-opacity: 0.5}.link-opacity-75{--pa-link-opacity: 0.75}.link-opacity-75-hover:hover{--pa-link-opacity: 0.75}.link-opacity-100{--pa-link-opacity: 1}.link-opacity-100-hover:hover{--pa-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-primary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-primary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-secondary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-secondary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-success{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-success-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-info{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-info-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-warning{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-warning-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-danger{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-danger-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-light{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-light-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-dark{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-dark-rgb), var(--pa-link-underline-opacity)) !important}.link-underline{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--pa-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--pa-link-underline-opacity: 0}.link-underline-opacity-10{--pa-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--pa-link-underline-opacity: 0.1}.link-underline-opacity-25{--pa-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--pa-link-underline-opacity: 0.25}.link-underline-opacity-50{--pa-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--pa-link-underline-opacity: 0.5}.link-underline-opacity-75{--pa-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--pa-link-underline-opacity: 0.75}.link-underline-opacity-100{--pa-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--pa-link-underline-opacity: 1}.bg-primary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-primary-rgb), var(--pa-bg-opacity)) !important}.bg-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-rgb), var(--pa-bg-opacity)) !important}.bg-success{--pa-bg-opacity: 1;background-color:rgba(var(--pa-success-rgb), var(--pa-bg-opacity)) !important}.bg-info{--pa-bg-opacity: 1;background-color:rgba(var(--pa-info-rgb), var(--pa-bg-opacity)) !important}.bg-warning{--pa-bg-opacity: 1;background-color:rgba(var(--pa-warning-rgb), var(--pa-bg-opacity)) !important}.bg-danger{--pa-bg-opacity: 1;background-color:rgba(var(--pa-danger-rgb), var(--pa-bg-opacity)) !important}.bg-light{--pa-bg-opacity: 1;background-color:rgba(var(--pa-light-rgb), var(--pa-bg-opacity)) !important}.bg-dark{--pa-bg-opacity: 1;background-color:rgba(var(--pa-dark-rgb), var(--pa-bg-opacity)) !important}.bg-black{--pa-bg-opacity: 1;background-color:rgba(var(--pa-black-rgb), var(--pa-bg-opacity)) !important}.bg-white{--pa-bg-opacity: 1;background-color:rgba(var(--pa-white-rgb), var(--pa-bg-opacity)) !important}.bg-body{--pa-bg-opacity: 1;background-color:rgba(var(--pa-body-bg-rgb), var(--pa-bg-opacity)) !important}.bg-transparent{--pa-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-body-tertiary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-tertiary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-opacity-10{--pa-bg-opacity: 0.1}.bg-opacity-25{--pa-bg-opacity: 0.25}.bg-opacity-50{--pa-bg-opacity: 0.5}.bg-opacity-75{--pa-bg-opacity: 0.75}.bg-opacity-100{--pa-bg-opacity: 1}.bg-primary-subtle{background-color:var(--pa-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--pa-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--pa-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--pa-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--pa-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--pa-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--pa-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--pa-dark-bg-subtle) !important}.bg-gradient{background-image:var(--pa-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--pa-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--pa-border-radius-sm) !important}.rounded-2{border-radius:var(--pa-border-radius) !important}.rounded-3{border-radius:var(--pa-border-radius-lg) !important}.rounded-4{border-radius:var(--pa-border-radius-xl) !important}.rounded-5{border-radius:var(--pa-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--pa-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--pa-border-radius-sm) !important;border-top-right-radius:var(--pa-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--pa-border-radius-lg) !important;border-top-right-radius:var(--pa-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--pa-border-radius-xl) !important;border-top-right-radius:var(--pa-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--pa-border-radius-xxl) !important;border-top-right-radius:var(--pa-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--pa-border-radius-pill) !important;border-top-right-radius:var(--pa-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--pa-border-radius-sm) !important;border-bottom-right-radius:var(--pa-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--pa-border-radius-lg) !important;border-bottom-right-radius:var(--pa-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--pa-border-radius-xl) !important;border-bottom-right-radius:var(--pa-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-right-radius:var(--pa-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--pa-border-radius-pill) !important;border-bottom-right-radius:var(--pa-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--pa-border-radius-sm) !important;border-bottom-left-radius:var(--pa-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--pa-border-radius-lg) !important;border-bottom-left-radius:var(--pa-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--pa-border-radius-xl) !important;border-bottom-left-radius:var(--pa-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-left-radius:var(--pa-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--pa-border-radius-pill) !important;border-bottom-left-radius:var(--pa-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--pa-border-radius-sm) !important;border-top-left-radius:var(--pa-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--pa-border-radius-lg) !important;border-top-left-radius:var(--pa-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--pa-border-radius-xl) !important;border-top-left-radius:var(--pa-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--pa-border-radius-xxl) !important;border-top-left-radius:var(--pa-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--pa-border-radius-pill) !important;border-top-left-radius:var(--pa-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media(min-width: 1200px){.fs-1{font-size:2.5rem !important}.fs-2{font-size:2rem !important}.fs-3{font-size:1.75rem !important}.fs-4{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}body{font-family:"Open Sans",sans-serif;font-weight:400;color:var(--text-color);background-color:var(--bg-color);max-width:1200px;margin:0 auto}.btn-primary{color:var(--text-color-reverse);background-color:var(--primary-color);border-color:var(--primary-color)}.btn-outline-primary{color:var(--primary-color);background:none;border-color:var(--primary-color)}.btn-outline-primary:hover{background-color:var(--primary-color);color:var(--text-color-reverse)}.btn-secondary{color:#fff;background-color:var(--secondary-color);border-color:var(--secondary-color)}.navbar .nav-top{height:86px}.navbar .fixed-menu{width:220px}.navbar .logo img{width:200px}a{text-decoration:underline;color:var(--link-color)}a:hover{color:var(--link-hover-color)}a:active{color:var(--link-color)}h1,.h1,h2,.h2{font-weight:500;line-height:1.25;padding-bottom:12px;padding-top:14px}h1,.h1{font-weight:600}h3,.h3{padding-top:16px}.motto .title{font-weight:600;font-size:32px;padding-top:36px}.motto .motto{font-weight:500;font-size:20px}.btn-fixed{border-width:2px;border-style:solid;width:220px;height:46px;text-transform:uppercase;font-weight:700;border-radius:5px 5px 5px 5px;vertical-align:middle;line-height:42px;padding:0;margin:16px;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)}.pactus-video video{max-width:100%;width:100%;margin-left:auto;margin-right:auto;display:block}.highlighter-rouge .highlight pre{background-color:#0d1117;padding:32px 12px 12px 12px;color:#ccc;position:relative;overflow:auto;direction:ltr}.highlighter-rouge .highlight pre button{position:absolute;top:6px;right:8px;padding:2px;background-color:gray;color:#404040;border-radius:5px;border:ridge 1px gray}.highlighter-rouge .highlight pre button:hover{cursor:pointer;background-color:#bcbabb}.nav-tabs{border-color:#0d1117 !important}.nav-tabs .nav-link{border-width:0 !important}.nav-tabs .nav-link:not(.active):hover{color:#fff !important;background-color:gray !important}.nav-tabs .active{color:#fff !important;background-color:#0d1117 !important}table thead tr th{font-weight:700;background-color:var(--bg-color) !important}blockquote{background:#eee;border-left:10px solid #ccc;padding:16px;quotes:"“" "”" "‘" "’"}blockquote:before{color:#ccc;content:open-quote;font-size:64px;line-height:.1em;vertical-align:-0.4em}blockquote p{margin-top:16px}blockquote p:first-child{display:inline;padding-bottom:160px;margin-bottom:160px}.footer{background-color:var(--primary-color);color:var(--text-color-reverse)}.footer .section{font-size:1.75rem;font-weight:500;line-height:1.25;padding-bottom:20px}.footer li{padding-bottom:8px}.footer.anchor a{color:var(--text-color-reverse)}.footer.anchor a:link{color:var(--text-color-reverse);background-color:rgba(0,0,0,0);text-decoration:none}.footer.anchor a:hover{color:var(--text-color-reverse)}.footer .legal{color:var(--text-color-reverse);font-size:12px}.community img{margin:4px}.community_ran img{margin:4px}#btn-back-to-top{background-color:var(--primary-color);color:var(--bg-color);position:fixed;bottom:20px;right:20px;display:none}.edit-bar{padding-top:30px}.edit-bar .edit-btn,.edit-bar .edit-btn>a:hover{color:var(--text-color);text-decoration:none}.all-posts .post-link{padding-bottom:8px}.blog-post .post-date{padding-bottom:10px;color:gray}.blog-post .content{padding-top:22px;min-height:600px}.partners img{padding-top:24px}.hexdump{font-family:monospace;font-size:12px;padding-bottom:1rem}.hexdump .offset{border-right:2px solid #708090;color:#789}.hexdump .ascii{color:dimgray}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.faq h3,.faq .h3{margin-top:20px;padding-top:16px;border-top:1px solid var(--primary-color)}.faq a{text-decoration:none}.faq .group{padding-top:16px}.faq .group .col{font-weight:600;padding-bottom:10px}.faq .separator{padding-top:12px;padding-bottom:12px}.faq .read_more{padding-top:12px}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.toc .btn,.toc a{color:var(--text-color)}.toc .btn-section{padding:.25rem .5rem;font-weight:600;background-color:rgba(0,0,0,0)}.toc .btn-section:hover,.toc .btn-section:focus{background-color:var(--bg-color)}.toc .btn-page a{padding:.1875rem .5rem;margin-top:.125rem;margin-left:1.25rem}.toc .btn-page a:hover,.toc .btn-page a:focus,.toc .btn-page .selected{background-color:var(--bg-color)}.timeline{position:relative}.timeline::after{content:"";position:absolute;width:6px;background-color:#939597;top:0;bottom:0;left:50%;margin-left:-3px}.timeline-card{position:relative;width:50%}.timeline-card .card{border:1px solid rgba(0,0,0,.175);border-radius:5px;background-color:#eee;color:#4c4c4c}.timeline-card .card a{color:#4c4c4c}.timeline-card .card .text-muted{color:#898b8d !important}.timeline-card .card-title{padding-bottom:12px;font-size:1.1rem;font-weight:500}.timeline-card::after{line-height:38px;font-size:24px;position:absolute;text-align:center;width:48px;height:48px;right:-24px;top:15px;border-radius:50%;z-index:1}.timeline-card.completed::after{content:"✅";background-color:#eee;border:5px solid #77b255}.timeline-card.ongoing::after{content:"🚧";background-color:#eee;border:5px solid #ffcb4b}.timeline-card.upcoming::after{content:"⏳";background-color:#eee;border:5px solid #478ec2}.timeline-card.left{padding:0px 50px 20px 0px;left:0}.timeline-card.right{padding:0px 0px 20px 50px;left:50%}.timeline-card.left::before{content:"";position:absolute;height:20px;width:20px;background-color:#eee;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;right:33px;border-right:1px solid rgba(0,0,0,.175);border-top:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{content:"";position:absolute;height:20px;width:20px;background-color:#eee !important;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:33px;z-index:0;left:48px;border-left:1px solid rgba(0,0,0,.175);border-bottom:1px solid rgba(0,0,0,.175)}.timeline-card.right::after{left:-24px}@media screen and (max-width: 600px){.timeline::after{left:31px}.timeline-card{width:100%;padding-left:80px !important;padding-right:25px !important}.timeline-card::before{left:77px !important}.timeline-card.left::after,.timeline-card.right::after{left:8px !important}.timeline-card.left::before{border-right:none;border-top:none;border-left:1px solid rgba(0,0,0,.175);border-bottom:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{right:auto}.timeline-card.right{left:0%}}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.learn h2,.learn .h2{border-top:1px solid var(--primary-color)}[data-bs-theme=dark] blockquote{background:#14171c}[data-bs-theme=dark] .toc .btn-section::before{--svg-color: var(--text)}[data-bs-theme=dark] .fa-linux{color:#fff}/*# sourceMappingURL=custom.css.map */
\ No newline at end of file
diff --git a/ar/assets/css/custom.css.map b/ar/assets/css/custom.css.map
new file mode 100644
index 000000000..a7da8066e
--- /dev/null
+++ b/ar/assets/css/custom.css.map
@@ -0,0 +1 @@
+{"version":3,"sourceRoot":"","sources":["../../_sass/_vars.scss","../../../node_modules/bootstrap/scss/_root.scss","../../../node_modules/bootstrap/scss/vendor/_rfs.scss","../../../node_modules/bootstrap/scss/mixins/_color-mode.scss","../../../node_modules/bootstrap/scss/_reboot.scss","../../../node_modules/bootstrap/scss/_variables.scss","../../../node_modules/bootstrap/scss/mixins/_border-radius.scss","../../../node_modules/bootstrap/scss/_type.scss","../../../node_modules/bootstrap/scss/mixins/_lists.scss","../../../node_modules/bootstrap/scss/_images.scss","../../../node_modules/bootstrap/scss/mixins/_image.scss","../../../node_modules/bootstrap/scss/mixins/_box-shadow.scss","../../../node_modules/bootstrap/scss/_containers.scss","../../../node_modules/bootstrap/scss/mixins/_container.scss","../../../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../../../node_modules/bootstrap/scss/_grid.scss","../../../node_modules/bootstrap/scss/mixins/_grid.scss","../../../node_modules/bootstrap/scss/_tables.scss","../../../node_modules/bootstrap/scss/mixins/_table-variants.scss","../../../node_modules/bootstrap/scss/_buttons.scss","../../../node_modules/bootstrap/scss/mixins/_gradients.scss","../../../node_modules/bootstrap/scss/mixins/_transition.scss","../../../node_modules/bootstrap/scss/mixins/_buttons.scss","../../../node_modules/bootstrap/scss/_transitions.scss","../../../node_modules/bootstrap/scss/_dropdown.scss","../../../node_modules/bootstrap/scss/mixins/_caret.scss","../../../node_modules/bootstrap/scss/_nav.scss","../../../node_modules/bootstrap/scss/_navbar.scss","../../../node_modules/bootstrap/scss/_badge.scss","../../../node_modules/bootstrap/scss/_alert.scss","../../../node_modules/bootstrap/scss/mixins/_clearfix.scss","../../../node_modules/bootstrap/scss/helpers/_color-bg.scss","../../../node_modules/bootstrap/scss/helpers/_colored-links.scss","../../../node_modules/bootstrap/scss/helpers/_focus-ring.scss","../../../node_modules/bootstrap/scss/helpers/_icon-link.scss","../../../node_modules/bootstrap/scss/helpers/_ratio.scss","../../../node_modules/bootstrap/scss/helpers/_position.scss","../../../node_modules/bootstrap/scss/helpers/_stacks.scss","../../../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../../../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../../../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../../../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../../../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../../../node_modules/bootstrap/scss/helpers/_vr.scss","../../../node_modules/bootstrap/scss/mixins/_utilities.scss","../../../node_modules/bootstrap/scss/utilities/_api.scss","../../_sass/_styles.scss","../../_sass/_hexdump.scss","../../_sass/_faq.scss","../../_sass/_toc.scss","../../_sass/_roadmap.scss","../../_sass/_learn.scss","../../_sass/dark_mode.scss"],"names":[],"mappings":"CAGA,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDChEF,4BASI,mRAIA,+MAIA,yKAIA,wOAIA,yRAIA,yPAIA,yRAGF,8BACA,wBAMA,sNACA,0GACA,0FAOA,iDC2OI,oBALI,KDpOR,2BACA,2BAKA,yBACA,gCACA,mBACA,gCAEA,0BACA,iCAEA,6CACA,qCACA,2BACA,qCAEA,2CACA,oCACA,0BACA,oCAGA,4BAEA,yBACA,+BACA,gCAEA,+BACA,qCAMA,yBACA,8BACA,2BAGA,uBACA,yBACA,2BACA,oDAEA,6BACA,+BACA,8BACA,4BACA,6BACA,oDACA,+BAGA,mDACA,4DACA,qDACA,4DAIA,+BACA,8BACA,6CAIA,+BACA,sCACA,iCACA,wCEhHE,qBFsHA,kBAGA,yBACA,mCACA,sBACA,6BAEA,0BACA,uCAEA,gDACA,wCACA,2BACA,kCAEA,8CACA,uCACA,0BACA,iCAGE,yRAIA,yPAIA,yRAGF,4BAEA,yBACA,+BACA,mCACA,yCAEA,yBACA,8BACA,2BAEA,2BACA,yDAEA,+BACA,sCACA,iCACA,wCGxKJ,qBAGE,sBAeE,8CANJ,MAOM,wBAcN,KACE,SACA,uCF6OI,UALI,yBEtOR,uCACA,uCACA,2BACA,qCACA,mCACA,8BACA,0CASF,GACE,cACA,MCmnB4B,QDlnB5B,SACA,wCACA,QCynB4B,ID/mB9B,0CACE,aACA,cCwjB4B,MDrjB5B,YCwjB4B,IDvjB5B,YCwjB4B,IDvjB5B,8BAGF,OFuMQ,iCA5JJ,0BE3CJ,OF8MQ,kBEzMR,OFkMQ,iCA5JJ,0BEtCJ,OFyMQ,gBEpMR,OF6LQ,+BA5JJ,0BEjCJ,OFoMQ,mBE/LR,OFwLQ,iCA5JJ,0BE5BJ,OF+LQ,kBE1LR,OF+KM,UALI,QErKV,OF0KM,UALI,KE1JV,EACE,aACA,cCwV0B,KD9U5B,YACE,iCACA,YACA,8BAMF,QACE,mBACA,kBACA,oBAMF,MAEE,kBAGF,SAGE,aACA,mBAGF,wBAIE,gBAGF,GACE,YC6b4B,IDxb9B,GACE,oBACA,cAMF,WACE,gBAQF,SAEE,YCsa4B,OD9Z9B,aF6EM,UALI,QEjEV,WACE,QCqf4B,QDpf5B,gCACA,wCASF,QAEE,kBFwDI,UALI,OEjDR,cACA,wBAGF,mBACA,eAKA,EACE,gEACA,gBCgNwC,UD9MxC,QACE,oDAWF,4DAEE,cACA,qBAOJ,kBAIE,YCgV4B,yBHlUxB,UALI,IEDV,IACE,cACA,aACA,mBACA,cFEI,UALI,QEQR,SFHI,UALI,QEUN,cACA,kBAIJ,KFVM,UALI,QEiBR,2BACA,qBAGA,OACE,cAIJ,IACE,yBFtBI,UALI,QE6BR,MCu5CkC,kBDt5ClC,iBCu5CkC,qBC5rDhC,qBFwSF,QACE,UF7BE,UALI,IE6CV,OACE,gBAMF,QAEE,sBAQF,MACE,oBACA,yBAGF,QACE,YC4X4B,MD3X5B,eC2X4B,MD1X5B,MC4Z4B,0BD3Z5B,gBAOF,GAEE,mBACA,gCAGF,2BAME,qBACA,mBACA,eAQF,MACE,qBAMF,OAEE,gBAQF,iCACE,UAKF,sCAKE,SACA,oBF5HI,UALI,QEmIR,oBAIF,cAEE,oBAKF,cACE,eAGF,OAGE,iBAGA,gBACE,UAOJ,0IACE,wBAQF,gDAIE,0BAGE,4GACE,eAON,mBACE,UACA,kBAKF,SACE,gBAUF,SACE,YACA,UACA,SACA,SAQF,OACE,WACA,WACA,UACA,cCmN4B,MHpatB,iCEoNN,oBFhXE,0BEyWJ,OFtMQ,kBE+MN,SACE,WAOJ,+OAOE,UAGF,4BACE,YASF,cACE,6BACA,oBAmBF,4BACE,wBAKF,+BACE,UAOF,uBACE,aACA,0BAKF,OACE,qBAKF,OACE,SAOF,QACE,kBACA,eAQF,SACE,wBAQF,SACE,wBGrkBF,MLmQM,UALI,QK5PR,YFwoB4B,IEnoB5B,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBK/OR,eCvDE,eACA,gBD2DF,aC5DE,eACA,gBD8DF,kBACE,qBAEA,mCACE,aFsoB0B,ME5nB9B,YL8MM,UALI,QKvMR,yBAIF,YACE,cFiUO,KH1HH,UALI,QK/LR,wBACE,gBAIJ,mBACE,iBACA,cFuTO,KH1HH,UALI,QKtLR,MFtFS,QEwFT,2BACE,aEhGJ,WCIE,eAGA,YDDF,eACE,QJ6jDkC,OI5jDlC,iBJ6jDkC,kBI5jDlC,2DHGE,sCKLE,WARW,wBDKf,eAGA,YDcF,QAEE,qBAGF,YACE,oBACA,cAGF,gBPyPM,UALI,QOlPR,MJgjDkC,0BOllDlC,mGCHA,sBACA,iBACA,WACA,0CACA,yCACA,kBACA,iBCsDE,yBF5CE,yBACE,UPkee,OSvbnB,yBF5CE,uCACE,UPkee,OSvbnB,yBF5CE,qDACE,UPkee,OSvbnB,0BF5CE,mEACE,UPkee,QSvbnB,0BF5CE,kFACE,UPkee,QUlfvB,MAEI,2JAKF,KCNA,sBACA,iBACA,aACA,eAEA,uCACA,2CACA,0CDEE,OCOF,cACA,WACA,eACA,0CACA,yCACA,8BA+CI,KACE,YAGF,iBApCJ,cACA,WAcA,cACE,cACA,WAFF,cACE,cACA,UAFF,cACE,cACA,mBAFF,cACE,cACA,UAFF,cACE,cACA,UAFF,cACE,cACA,mBA+BE,UAhDJ,cACA,WAqDQ,OAhEN,cACA,kBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,WAuEQ,UAxDV,wBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,WAxDV,yBAwDU,WAxDV,yBAmEM,WAEE,iBAGF,WAEE,iBAPF,WAEE,uBAGF,WAEE,uBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,0BEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,0BEUE,SACE,YAGF,qBApCJ,cACA,WAcA,kBACE,cACA,WAFF,kBACE,cACA,UAFF,kBACE,cACA,mBAFF,kBACE,cACA,UAFF,kBACE,cACA,UAFF,kBACE,cACA,mBA+BE,cAhDJ,cACA,WAqDQ,WAhEN,cACA,kBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,WAuEQ,cAxDV,cAwDU,cAxDV,wBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,eAxDV,yBAwDU,eAxDV,yBAmEM,mBAEE,iBAGF,mBAEE,iBAPF,mBAEE,uBAGF,mBAEE,uBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,oBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,qBCrHV,OAEE,+BACA,4BACA,gCACA,6BAEA,2CACA,iCACA,gDACA,kCACA,mDACA,gEACA,kDACA,8DACA,iDACA,+DAEA,WACA,cZkYO,KYjYP,eZusB4B,IYtsB5B,0CAOA,yBACE,oBAEA,qFACA,oCACA,oBZ+sB0B,uBY9sB1B,2GAGF,aACE,uBAGF,aACE,sBAIJ,qBACE,+DAOF,aACE,iBAUA,4BACE,sBAeF,gCACE,sCAGA,kCACE,sCAOJ,oCACE,sBAGF,qCACE,mBAUF,2CACE,qDACA,+CAMF,yDACE,qDACA,+CAQJ,cACE,qDACA,+CAQA,8BACE,oDACA,8CC5IF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,iBAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,cAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,aAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CDiJA,kBACE,gBACA,iCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,sBACE,gBACA,kCEnKN,KAEE,4BACA,6BACA,uBjBuRI,mBALI,KiBhRR,0BACA,0BACA,qCACA,yBACA,8CACA,mCACA,gDACA,yCACA,6FACA,gCACA,kFAGA,qBACA,wDACA,sCjBsQI,UALI,wBiB/PR,sCACA,sCACA,0BACA,kBACA,qBAEA,sBACA,eACA,iBACA,mEbjBE,0CcfF,iBDkCqB,iBRxBjB,WARW,yBUUX,WFwBJ,mHEpBI,uCFhBN,KEiBQ,iBFqBN,WACE,gCAEA,wCACA,8CAGF,sBAEE,0BACA,kCACA,wCAGF,mBACE,gCCrDF,iBDsDuB,uBACrB,8CACA,UAGE,mEAMJ,8BACE,8CACA,UAGE,mEAMJ,mGAKE,iCACA,yCAGA,+CR3EE,WARW,4BQsFb,yKAGI,sEAON,mDAGE,mCACA,oBACA,2CAEA,iDACA,uCRhGE,WARW,KQoHf,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,eGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,YGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,WGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHmHA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,qCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,uBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,oBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,mBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBHsGF,UACE,0BACA,qCACA,yBACA,mCACA,iDACA,yCACA,kDACA,0CACA,iCACA,4CACA,gCACA,sCAEA,gBduRwC,Uc7QxC,wBACE,0BAGF,gBACE,gCAWJ,QGxIE,2BACA,yBpB8NI,mBALI,QoBvNR,mDHyIF,QG5IE,4BACA,2BpB8NI,mBALI,SoBvNR,mDCnEF,MFgBM,WEfJ,oBFmBI,uCEpBN,MFqBQ,iBElBN,iBACE,UAMF,qBACE,aAIJ,YACE,SACA,gBFDI,WEEJ,iBFEI,uCELN,YFMQ,iBEDN,gCACE,QACA,YFNE,WEOF,gBFHE,uEACE,iBGpBR,sEAME,kBAGF,iBACE,mBCwBE,wBACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WArCJ,sBACA,sCACA,gBACA,qCA0DE,8BACE,cD9CN,eAEE,2BACA,+BACA,2BACA,gCACA,+BtBuQI,wBALI,KsBhQR,0CACA,oCACA,+DACA,qDACA,mDACA,0FACA,6DACA,uCACA,+CACA,+CACA,qDACA,mDACA,sCACA,sCACA,4DACA,mCACA,sCACA,oCACA,qCACA,uCAGA,kBACA,kCACA,aACA,uCACA,kEACA,StB0OI,UALI,6BsBnOR,+BACA,gBACA,gBACA,uCACA,4BACA,6ElBzCE,+CKLE,WARW,8Ba0Df,+BACE,SACA,OACA,qCAwBA,qBACE,qBAEA,qCACE,WACA,OAIJ,mBACE,mBAEA,mCACE,QACA,UV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,yBACE,qBAEA,yCACE,WACA,OAIJ,uBACE,mBAEA,uCACE,QACA,WAUN,uCACE,SACA,YACA,aACA,wCCpFA,gCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WA9BJ,aACA,sCACA,yBACA,qCAmDE,sCACE,cDgEJ,wCACE,MACA,WACA,UACA,aACA,sCClGA,iCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAvBJ,oCACA,eACA,uCACA,uBA4CE,uCACE,cD0EF,iCACE,iBAMJ,0CACE,MACA,WACA,UACA,aACA,uCCnHA,mCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAWA,mCACE,aAGF,oCACE,qBACA,apB0gBsB,OoBzgBtB,epBwgBsB,OoBvgBtB,WAnCN,oCACA,wBACA,uCAsCE,yCACE,cD2FF,oCACE,iBAON,kBACE,SACA,6CACA,gBACA,mDACA,UAMF,eACE,cACA,WACA,4EACA,WACA,YnByb4B,ImBxb5B,oCACA,mBACA,qBACA,mBACA,+BACA,SlBtKE,uDkByKF,0CAEE,0CJ1LF,iBI4LuB,iCAGvB,4CAEE,2CACA,qBJlMF,iBImMuB,kCAGvB,gDAEE,6CACA,oBACA,+BAMJ,oBACE,cAIF,iBACE,cACA,gFACA,gBtBmEI,UALI,SsB5DR,sCACA,mBAIF,oBACE,cACA,4EACA,oCAIF,oBAEE,6BACA,0BACA,+DACA,2BACA,kCACA,qCACA,6DACA,uDACA,sCACA,sCACA,2CACA,oCElPF,KAEE,8BACA,gCAEA,4BACA,0CACA,sDACA,wDAGA,aACA,eACA,eACA,gBACA,gBAGF,UACE,cACA,kExBsQI,UALI,6BwB/PR,2CACA,+BACA,qBACA,gBACA,SLfI,WKgBJ,uFLZI,uCKGN,ULFQ,iBKaN,gCAEE,qCAIF,wBACE,UACA,WrBkhBoB,+BqB9gBtB,sCAEE,wCACA,oBACA,eAQJ,UAEE,mDACA,mDACA,qDACA,4GACA,0DACA,gDACA,wGAGA,oFAEA,oBACE,uDACA,2DpB7CA,wDACA,yDoB+CA,oDAGE,kBACA,wDAIJ,8DAEE,2CACA,mDACA,yDAGF,yBAEE,oDpBjEA,yBACA,0BoB2EJ,WAEE,sDACA,uCACA,uCAGA,qBpB5FE,gDoBgGF,uDAEE,4CNjHF,iBMkHuB,mCASzB,eAEE,6BACA,0CACA,+DAGA,gCAEA,yBACE,gBACA,eACA,uEAEA,8DAEE,iCAIJ,+DAEE,YrB0d0B,IqBzd1B,gDACA,iCAUF,wCAEE,cACA,kBAKF,kDAEE,aACA,YACA,kBAMF,iEACE,WAUF,uBACE,aAEF,qBACE,cC7LJ,QAEE,yBACA,8BACA,4DACA,iEACA,oEACA,gEACA,uCACA,mCACA,qCACA,+DACA,qEACA,uCACA,uCACA,uCACA,uCACA,4QACA,2EACA,2DACA,yCACA,6DAGA,kBACA,aACA,eACA,mBACA,8BACA,8DAMA,2JACE,aACA,kBACA,mBACA,8BAoBJ,cACE,6CACA,gDACA,+CzB4NI,UALI,iCyBrNR,mCACA,qBACA,mBAEA,wCAEE,yCAUJ,YAEE,2BACA,gCAEA,4BACA,4CACA,wDACA,8DAGA,aACA,sBACA,eACA,gBACA,gBAGE,wDAEE,oCAIJ,2BACE,gBASJ,aACE,YtB8gCkC,MsB7gClC,etB6gCkC,MsB5gClC,6BAEA,yDAGE,oCAaJ,iBACE,gBACA,YAGA,mBAIF,gBACE,8EzByII,UALI,mCyBlIR,cACA,6BACA,+BACA,0ErBxIE,qDeHE,WM6IJ,oCNzII,uCMiIN,gBNhIQ,iBM0IN,sBACE,qBAGF,sBACE,qBACA,UACA,sDAMJ,qBACE,qBACA,YACA,aACA,sBACA,kDACA,4BACA,2BACA,qBAGF,mBACE,yCACA,gBb1HE,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,mBAEI,iBACA,2BAEA,+BACE,mBAEA,8CACE,kBAGF,yCACE,kDACA,iDAIJ,sCACE,iBAGF,oCACE,wBACA,gBAGF,mCACE,aAGF,8BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,gDACE,aAGF,8CACE,aACA,YACA,UACA,oBAtDR,eAEI,iBACA,2BAEA,2BACE,mBAEA,0CACE,kBAGF,qCACE,kDACA,iDAIJ,kCACE,iBAGF,gCACE,wBACA,gBAGF,+BACE,aAGF,0BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,4CACE,aAGF,0CACE,aACA,YACA,UACA,mBAiBZ,yCAGE,6CACA,mDACA,sDACA,+BACA,8BACA,oCACA,2DACA,+QAME,0CACE,+QCxRN,OAEE,6BACA,6B1BuRI,qBALI,O0BhRR,4BACA,uBACA,kDAGA,qBACA,4D1B+QI,UALI,0B0BxQR,wCACA,cACA,4BACA,kBACA,mBACA,wBtBJE,4CsBSF,aACE,aAKJ,YACE,kBACA,SChCF,OAEE,2BACA,2BACA,2BACA,+BACA,0BACA,qCACA,6EACA,kDACA,+BAGA,kBACA,4DACA,4CACA,4BACA,oCACA,8BvBHE,4CuBQJ,eAEE,cAIF,YACE,YxB6kB4B,IwB5kB5B,iCAQF,mBACE,cxBo+C8B,KwBj+C9B,8BACE,kBACA,MACA,QACA,UACA,qBAQF,eACE,kDACA,2CACA,yDACA,uDAJF,iBACE,oDACA,6CACA,2DACA,yDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,YACE,+CACA,wCACA,sDACA,oDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,cACE,iDACA,0CACA,wDACA,sDAJF,aACE,gDACA,yCACA,uDACA,qDAJF,YACE,+CACA,wCACA,sDACA,oDC9DF,iBACE,cACA,WACA,WCHF,iBACE,sBACA,iFAFF,mBACE,sBACA,mFAFF,iBACE,sBACA,iFAFF,cACE,sBACA,8EAFF,iBACE,sBACA,iFAFF,gBACE,sBACA,gFAFF,eACE,sBACA,+EAFF,cACE,sBACA,8ECFF,cACE,wEACA,kGAGE,wCAGE,4DACA,sFATN,gBACE,0EACA,oGAGE,4CAGE,6DACA,uFATN,cACE,wEACA,kGAGE,wCAGE,8DACA,wFATN,WACE,qEACA,+FAGE,kCAGE,+DACA,yFATN,cACE,wEACA,kGAGE,wCAGE,+DACA,yFATN,aACE,uEACA,iGAGE,sCAGE,8DACA,wFATN,YACE,sEACA,gGAGE,oCAGE,gEACA,0FATN,WACE,qEACA,+FAGE,kCAGE,6DACA,uFAOR,oBACE,+EACA,yGAGE,oDAEE,kFACA,4GC1BN,kBACE,UAEA,kJCHF,WACE,oBACA,I7B6c4B,Q6B5c5B,mBACA,kFACA,sB7B2c4B,M6B1c5B,2BAEA,eACE,cACA,M7Buc0B,I6Btc1B,O7Bsc0B,I6Brc1B,kBbIE,WaHF,0BbOE,uCaZJ,ebaM,iBaDJ,8DACE,mECnBN,OACE,kBACA,WAEA,eACE,cACA,mCACA,WAGF,SACE,kBACA,MACA,OACA,WACA,YAKF,WACE,wBADF,WACE,uBADF,YACE,0BADF,YACE,kCCrBJ,WACE,eACA,MACA,QACA,OACA,Q/BumCkC,K+BpmCpC,cACE,eACA,QACA,SACA,OACA,Q/B+lCkC,K+BvlChC,YACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,eACE,gBACA,SACA,Q/B6kC8B,KS9iChC,yBsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,yBsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,yBsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,0BsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,0BsBxCA,gBACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,mBACE,gBACA,SACA,Q/B6kC8B,MgC5mCpC,QACE,aACA,mBACA,mBACA,mBAGF,QACE,aACA,cACA,sBACA,mBCRF,2ECIE,qBACA,sBACA,qBACA,uBACA,2BACA,iCACA,8BACA,oBAGA,qGACE,6BCdF,uBACE,kBACA,MACA,QACA,SACA,OACA,QnCgcsC,EmC/btC,WCRJ,+BCCE,uBACA,mBCNF,IACE,qBACA,mBACA,MtCisB4B,uBsChsB5B,eACA,8BACA,QtC2rB4B,IuC/nBtB,gBAOI,mCAPJ,WAOI,8BAPJ,cAOI,iCAPJ,cAOI,iCAPJ,mBAOI,sCAPJ,gBAOI,mCAPJ,aAOI,sBAPJ,WAOI,uBAPJ,YAOI,sBAPJ,oBAOI,8BAPJ,kBAOI,4BAPJ,iBAOI,2BAPJ,kBAOI,iCAPJ,iBAOI,2BAPJ,WAOI,qBAPJ,YAOI,uBAPJ,YAOI,sBAPJ,YAOI,uBAPJ,aAOI,qBAPJ,eAOI,yBAPJ,iBAOI,2BAPJ,kBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,2BAPJ,mBAOI,6BAPJ,oBAOI,8BAPJ,mBAOI,6BAPJ,iBAOI,2BAPJ,mBAOI,6BAPJ,oBAOI,8BAPJ,mBAOI,6BAPJ,UAOI,0BAPJ,gBAOI,gCAPJ,SAOI,yBAPJ,QAOI,wBAPJ,eAOI,+BAPJ,SAOI,yBAPJ,aAOI,6BAPJ,cAOI,8BAPJ,QAOI,wBAPJ,eAOI,+BAPJ,QAOI,wBAPJ,QAOI,2CAPJ,WAOI,8CAPJ,WAOI,8CAPJ,aAOI,2BAjBJ,oBACE,iFADF,sBACE,mFADF,oBACE,iFADF,iBACE,8EADF,oBACE,iFADF,mBACE,gFADF,kBACE,+EADF,iBACE,8EASF,iBAOI,2BAPJ,mBAOI,6BAPJ,mBAOI,6BAPJ,gBAOI,0BAPJ,iBAOI,2BAPJ,OAOI,iBAPJ,QAOI,mBAPJ,SAOI,oBAPJ,UAOI,oBAPJ,WAOI,sBAPJ,YAOI,uBAPJ,SAOI,kBAPJ,UAOI,oBAPJ,WAOI,qBAPJ,OAOI,mBAPJ,QAOI,qBAPJ,SAOI,sBAPJ,kBAOI,2CAPJ,oBAOI,sCAPJ,oBAOI,sCAPJ,QAOI,uFAPJ,UAOI,oBAPJ,YAOI,2FAPJ,cAOI,wBAPJ,YAOI,6FAPJ,cAOI,0BAPJ,eAOI,8FAPJ,iBAOI,2BAPJ,cAOI,4FAPJ,gBAOI,yBAPJ,gBAIQ,uBAGJ,8EAPJ,kBAIQ,uBAGJ,gFAPJ,gBAIQ,uBAGJ,8EAPJ,aAIQ,uBAGJ,2EAPJ,gBAIQ,uBAGJ,8EAPJ,eAIQ,uBAGJ,6EAPJ,cAIQ,uBAGJ,4EAPJ,aAIQ,uBAGJ,2EAPJ,cAIQ,uBAGJ,4EAPJ,cAIQ,uBAGJ,4EAPJ,uBAOI,wDAPJ,yBAOI,0DAPJ,uBAOI,wDAPJ,oBAOI,qDAPJ,uBAOI,wDAPJ,sBAOI,uDAPJ,qBAOI,sDAPJ,oBAOI,qDAPJ,UAOI,4BAPJ,UAOI,4BAPJ,UAOI,4BAPJ,UAOI,4BAPJ,UAOI,4BAjBJ,mBACE,yBADF,mBACE,0BADF,mBACE,yBADF,mBACE,0BADF,oBACE,uBASF,MAOI,qBAPJ,MAOI,qBAPJ,MAOI,qBAPJ,OAOI,sBAPJ,QAOI,sBAPJ,QAOI,0BAPJ,QAOI,uBAPJ,YAOI,2BAPJ,MAOI,sBAPJ,MAOI,sBAPJ,MAOI,sBAPJ,OAOI,uBAPJ,QAOI,uBAPJ,QAOI,2BAPJ,QAOI,wBAPJ,YAOI,4BAPJ,WAOI,yBAPJ,UAOI,8BAPJ,aAOI,iCAPJ,kBAOI,sCAPJ,qBAOI,yCAPJ,aAOI,uBAPJ,aAOI,uBAPJ,eAOI,yBAPJ,eAOI,yBAPJ,WAOI,0BAPJ,aAOI,4BAPJ,mBAOI,kCAPJ,uBAOI,sCAPJ,qBAOI,oCAPJ,wBAOI,kCAPJ,yBAOI,yCAPJ,wBAOI,wCAPJ,wBAOI,wCAPJ,mBAOI,kCAPJ,iBAOI,gCAPJ,oBAOI,8BAPJ,sBAOI,gCAPJ,qBAOI,+BAPJ,qBAOI,oCAPJ,mBAOI,kCAPJ,sBAOI,gCAPJ,uBAOI,uCAPJ,sBAOI,sCAPJ,uBAOI,iCAPJ,iBAOI,2BAPJ,kBAOI,iCAPJ,gBAOI,+BAPJ,mBAOI,6BAPJ,qBAOI,+BAPJ,oBAOI,8BAPJ,aAOI,oBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,YAOI,mBAPJ,KAOI,oBAPJ,KAOI,yBAPJ,KAOI,wBAPJ,KAOI,uBAPJ,KAOI,yBAPJ,KAOI,uBAPJ,QAOI,uBAPJ,MAOI,mDAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,yDAPJ,MAOI,6DAPJ,MAOI,yDAPJ,SAOI,yDAPJ,MAOI,mDAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,yDAPJ,MAOI,6DAPJ,MAOI,yDAPJ,SAOI,yDAPJ,MAOI,wBAPJ,MAOI,6BAPJ,MAOI,4BAPJ,MAOI,2BAPJ,MAOI,6BAPJ,MAOI,2BAPJ,SAOI,2BAPJ,MAOI,0BAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,+BAPJ,MAOI,6BAPJ,SAOI,6BAPJ,MAOI,2BAPJ,MAOI,gCAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,gCAPJ,MAOI,8BAPJ,SAOI,8BAPJ,MAOI,yBAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,4BAPJ,MAOI,8BAPJ,MAOI,4BAPJ,SAOI,4BAPJ,KAOI,qBAPJ,KAOI,0BAPJ,KAOI,yBAPJ,KAOI,wBAPJ,KAOI,0BAPJ,KAOI,wBAPJ,MAOI,qDAPJ,MAOI,+DAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,+DAPJ,MAOI,2DAPJ,MAOI,qDAPJ,MAOI,+DAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,+DAPJ,MAOI,2DAPJ,MAOI,yBAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,4BAPJ,MAOI,8BAPJ,MAOI,4BAPJ,MAOI,2BAPJ,MAOI,gCAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,gCAPJ,MAOI,8BAPJ,MAOI,4BAPJ,MAOI,iCAPJ,MAOI,gCAPJ,MAOI,+BAPJ,MAOI,iCAPJ,MAOI,+BAPJ,MAOI,0BAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,+BAPJ,MAOI,6BAPJ,OAOI,iBAPJ,OAOI,sBAPJ,OAOI,qBAPJ,OAOI,oBAPJ,OAOI,sBAPJ,OAOI,oBAPJ,WAOI,qBAPJ,WAOI,0BAPJ,WAOI,yBAPJ,WAOI,wBAPJ,WAOI,0BAPJ,WAOI,wBAPJ,cAOI,wBAPJ,cAOI,6BAPJ,cAOI,4BAPJ,cAOI,2BAPJ,cAOI,6BAPJ,cAOI,2BAPJ,gBAOI,gDAPJ,MAOI,4CAPJ,MAOI,4CAPJ,MAOI,0CAPJ,MAOI,4CAPJ,MAOI,6BAPJ,MAOI,0BAPJ,YAOI,6BAPJ,YAOI,6BAPJ,YAOI,+BAPJ,UAOI,2BAPJ,WAOI,2BAPJ,WAOI,2BAPJ,aAOI,2BAPJ,SAOI,2BAPJ,WAOI,8BAPJ,MAOI,yBAPJ,OAOI,4BAPJ,SAOI,2BAPJ,OAOI,yBAPJ,YAOI,2BAPJ,UAOI,4BAPJ,aAOI,6BAPJ,sBAOI,gCAPJ,2BAOI,qCAPJ,8BAOI,wCAPJ,gBAOI,oCAPJ,gBAOI,oCAPJ,iBAOI,qCAPJ,WAOI,8BAPJ,aAOI,8BAPJ,YAOI,iEAPJ,cAIQ,qBAGJ,qEAPJ,gBAIQ,qBAGJ,uEAPJ,cAIQ,qBAGJ,qEAPJ,WAIQ,qBAGJ,kEAPJ,cAIQ,qBAGJ,qEAPJ,aAIQ,qBAGJ,oEAPJ,YAIQ,qBAGJ,mEAPJ,WAIQ,qBAGJ,kEAPJ,YAIQ,qBAGJ,mEAPJ,YAIQ,qBAGJ,mEAPJ,WAIQ,qBAGJ,wEAPJ,YAIQ,qBAGJ,2CAPJ,eAIQ,qBAGJ,gCAPJ,eAIQ,qBAGJ,sCAPJ,qBAIQ,qBAGJ,2CAPJ,oBAIQ,qBAGJ,0CAPJ,oBAIQ,qBAGJ,0CAPJ,YAIQ,qBAGJ,yBAjBJ,iBACE,wBADF,iBACE,uBADF,iBACE,wBADF,kBACE,qBASF,uBAOI,iDAPJ,yBAOI,mDAPJ,uBAOI,iDAPJ,oBAOI,8CAPJ,uBAOI,iDAPJ,sBAOI,gDAPJ,qBAOI,+CAPJ,oBAOI,8CAjBJ,iBACE,uBAIA,6BACE,uBANJ,iBACE,wBAIA,6BACE,wBANJ,iBACE,uBAIA,6BACE,uBANJ,iBACE,wBAIA,6BACE,wBANJ,kBACE,qBAIA,8BACE,qBAIJ,eAOI,wCAKF,2BAOI,wCAnBN,eAOI,uCAKF,2BAOI,uCAnBN,eAOI,wCAKF,2BAOI,wCAnBN,wBAIQ,+BAGJ,+FAPJ,0BAIQ,+BAGJ,iGAPJ,wBAIQ,+BAGJ,+FAPJ,qBAIQ,+BAGJ,4FAPJ,wBAIQ,+BAGJ,+FAPJ,uBAIQ,+BAGJ,8FAPJ,sBAIQ,+BAGJ,6FAPJ,qBAIQ,+BAGJ,4FAPJ,gBAIQ,+BAGJ,qGAjBJ,0BACE,+BAIA,sCACE,+BANJ,2BACE,iCAIA,uCACE,iCANJ,2BACE,kCAIA,uCACE,kCANJ,2BACE,iCAIA,uCACE,iCANJ,2BACE,kCAIA,uCACE,kCANJ,4BACE,+BAIA,wCACE,+BAIJ,YAIQ,mBAGJ,8EAPJ,cAIQ,mBAGJ,gFAPJ,YAIQ,mBAGJ,8EAPJ,SAIQ,mBAGJ,2EAPJ,YAIQ,mBAGJ,8EAPJ,WAIQ,mBAGJ,6EAPJ,UAIQ,mBAGJ,4EAPJ,SAIQ,mBAGJ,2EAPJ,UAIQ,mBAGJ,4EAPJ,UAIQ,mBAGJ,4EAPJ,SAIQ,mBAGJ,8EAPJ,gBAIQ,mBAGJ,0CAPJ,mBAIQ,mBAGJ,mFAPJ,kBAIQ,mBAGJ,kFAjBJ,eACE,qBADF,eACE,sBADF,eACE,qBADF,eACE,sBADF,gBACE,mBASF,mBAOI,wDAPJ,qBAOI,0DAPJ,mBAOI,wDAPJ,gBAOI,qDAPJ,mBAOI,wDAPJ,kBAOI,uDAPJ,iBAOI,sDAPJ,gBAOI,qDAPJ,aAOI,+CAPJ,iBAOI,2BAPJ,kBAOI,4BAPJ,kBAOI,4BAPJ,SAOI,+BAPJ,SAOI,+BAPJ,SAOI,iDAPJ,WAOI,2BAPJ,WAOI,oDAPJ,WAOI,iDAPJ,WAOI,oDAPJ,WAOI,oDAPJ,WAOI,qDAPJ,gBAOI,6BAPJ,cAOI,sDAPJ,aAOI,qHAPJ,eAOI,yEAPJ,eAOI,2HAPJ,eAOI,qHAPJ,eAOI,2HAPJ,eAOI,2HAPJ,eAOI,6HAPJ,oBAOI,6EAPJ,kBAOI,+HAPJ,aAOI,yHAPJ,eAOI,6EAPJ,eAOI,+HAPJ,eAOI,yHAPJ,eAOI,+HAPJ,eAOI,+HAPJ,eAOI,iIAPJ,oBAOI,iFAPJ,kBAOI,mIAPJ,gBAOI,2HAPJ,kBAOI,+EAPJ,kBAOI,iIAPJ,kBAOI,2HAPJ,kBAOI,iIAPJ,kBAOI,iIAPJ,kBAOI,mIAPJ,uBAOI,mFAPJ,qBAOI,qIAPJ,eAOI,uHAPJ,iBAOI,2EAPJ,iBAOI,6HAPJ,iBAOI,uHAPJ,iBAOI,6HAPJ,iBAOI,6HAPJ,iBAOI,+HAPJ,sBAOI,+EAPJ,oBAOI,iIAPJ,SAOI,8BAPJ,WAOI,6BAPJ,MAOI,sBAPJ,KAOI,qBAPJ,KAOI,qBAPJ,KAOI,qBAPJ,KAOI,qB9BVR,yB8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,yB8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,yB8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,0B8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,0B8BGI,iBAOI,sBAPJ,eAOI,uBAPJ,gBAOI,sBAPJ,wBAOI,8BAPJ,sBAOI,4BAPJ,qBAOI,2BAPJ,sBAOI,iCAPJ,qBAOI,2BAPJ,cAOI,0BAPJ,oBAOI,gCAPJ,aAOI,yBAPJ,YAOI,wBAPJ,mBAOI,+BAPJ,aAOI,yBAPJ,iBAOI,6BAPJ,kBAOI,8BAPJ,YAOI,wBAPJ,mBAOI,+BAPJ,YAOI,wBAPJ,eAOI,yBAPJ,cAOI,8BAPJ,iBAOI,iCAPJ,sBAOI,sCAPJ,yBAOI,yCAPJ,iBAOI,uBAPJ,iBAOI,uBAPJ,mBAOI,yBAPJ,mBAOI,yBAPJ,eAOI,0BAPJ,iBAOI,4BAPJ,uBAOI,kCAPJ,2BAOI,sCAPJ,yBAOI,oCAPJ,4BAOI,kCAPJ,6BAOI,yCAPJ,4BAOI,wCAPJ,4BAOI,wCAPJ,uBAOI,kCAPJ,qBAOI,gCAPJ,wBAOI,8BAPJ,0BAOI,gCAPJ,yBAOI,+BAPJ,yBAOI,oCAPJ,uBAOI,kCAPJ,0BAOI,gCAPJ,2BAOI,uCAPJ,0BAOI,sCAPJ,2BAOI,iCAPJ,qBAOI,2BAPJ,sBAOI,iCAPJ,oBAOI,+BAPJ,uBAOI,6BAPJ,yBAOI,+BAPJ,wBAOI,8BAPJ,iBAOI,oBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,gBAOI,mBAPJ,SAOI,oBAPJ,SAOI,yBAPJ,SAOI,wBAPJ,SAOI,uBAPJ,SAOI,yBAPJ,SAOI,uBAPJ,YAOI,uBAPJ,UAOI,mDAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,yDAPJ,UAOI,6DAPJ,UAOI,yDAPJ,aAOI,yDAPJ,UAOI,mDAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,yDAPJ,UAOI,6DAPJ,UAOI,yDAPJ,aAOI,yDAPJ,UAOI,wBAPJ,UAOI,6BAPJ,UAOI,4BAPJ,UAOI,2BAPJ,UAOI,6BAPJ,UAOI,2BAPJ,aAOI,2BAPJ,UAOI,0BAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,+BAPJ,UAOI,6BAPJ,aAOI,6BAPJ,UAOI,2BAPJ,UAOI,gCAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,gCAPJ,UAOI,8BAPJ,aAOI,8BAPJ,UAOI,yBAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,4BAPJ,UAOI,8BAPJ,UAOI,4BAPJ,aAOI,4BAPJ,SAOI,qBAPJ,SAOI,0BAPJ,SAOI,yBAPJ,SAOI,wBAPJ,SAOI,0BAPJ,SAOI,wBAPJ,UAOI,qDAPJ,UAOI,+DAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,+DAPJ,UAOI,2DAPJ,UAOI,qDAPJ,UAOI,+DAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,+DAPJ,UAOI,2DAPJ,UAOI,yBAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,4BAPJ,UAOI,8BAPJ,UAOI,4BAPJ,UAOI,2BAPJ,UAOI,gCAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,gCAPJ,UAOI,8BAPJ,UAOI,4BAPJ,UAOI,iCAPJ,UAOI,gCAPJ,UAOI,+BAPJ,UAOI,iCAPJ,UAOI,+BAPJ,UAOI,0BAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,+BAPJ,UAOI,6BAPJ,WAOI,iBAPJ,WAOI,sBAPJ,WAOI,qBAPJ,WAOI,oBAPJ,WAOI,sBAPJ,WAOI,oBAPJ,eAOI,qBAPJ,eAOI,0BAPJ,eAOI,yBAPJ,eAOI,wBAPJ,eAOI,0BAPJ,eAOI,wBAPJ,kBAOI,wBAPJ,kBAOI,6BAPJ,kBAOI,4BAPJ,kBAOI,2BAPJ,kBAOI,6BAPJ,kBAOI,2BAPJ,gBAOI,2BAPJ,cAOI,4BAPJ,iBAOI,8BCtDZ,0BD+CQ,MAOI,4BAPJ,MAOI,0BAPJ,MAOI,6BAPJ,MAOI,6BCnCZ,aD4BQ,gBAOI,0BAPJ,sBAOI,gCAPJ,eAOI,yBAPJ,cAOI,wBAPJ,qBAOI,+BAPJ,eAOI,yBAPJ,mBAOI,6BAPJ,oBAOI,8BAPJ,cAOI,wBAPJ,qBAOI,+BAPJ,cAOI,yBEnBZ,KACE,mCACA,gBACA,wBACA,iCACA,iBACA,cAGF,aACE,gCACA,sCACA,kCAGF,qBACE,2BACA,gBACA,kCAEA,2BACE,sCACA,gCAIJ,eACE,WACA,wCACA,oCAIA,iBACE,YAGF,oBACE,YAGF,kBACE,YAIJ,EACE,0BACA,wBAEA,QACE,8BAGF,SACE,wBAIJ,cAEE,gBACA,iBACA,oBACA,iBAGF,OACE,gBAGF,OACE,iBAIA,cACE,gBACA,eACA,iBAGF,cACE,gBACA,eAKJ,WACE,iBACA,mBACA,YACA,YACA,yBACA,gBACA,8BACA,sBACA,iBACA,UACA,YACA,6CAKA,oBACE,eACA,WACA,iBACA,kBACA,cAIJ,kCACE,yBACA,4BACA,WACA,kBACA,cACA,cAEA,yCACE,kBACA,QACA,UAEA,YACA,sBACA,cACA,kBACA,sBAEA,+CACE,eACA,yBAKN,UACE,gCAEA,oBACE,0BAEA,uCACE,sBACA,iCAIJ,kBACE,sBACA,oCAKF,kBACE,gBACA,4CAQJ,WACE,gBACA,4BACA,aACA,uBAEA,kBACE,WACA,mBACA,eACA,iBACA,sBAGF,aACE,gBAGF,yBACE,eACA,qBACA,oBAIJ,QACE,sCACA,gCAEA,iBACE,kBACA,gBACA,iBACA,oBAGF,WACE,mBAIA,iBACE,gCAGF,sBACE,gCACA,+BACA,qBAGF,uBACE,gCAIJ,eACE,gCACA,eAKF,eACE,WAKF,mBACE,WAIJ,iBACE,sCACA,sBACA,eACA,YACA,WACA,aAGF,UACE,iBAEA,gDAEE,wBACA,qBAKF,sBACE,mBAKF,sBACE,oBACA,WAGF,oBACE,iBACA,iBAKF,cACE,iBCjVJ,SACE,sBACA,eACA,oBAGF,iBACE,+BACA,WAEF,gBACE,c/CRF,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDgD7DA,iBACE,gBACA,iBACA,0CAGF,OACE,qBAGF,YACE,iBAEA,iBACE,gBACA,oBAIJ,gBACE,iBACA,oBAGF,gBACE,iBhDzBJ,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDiD5DA,iBAEE,wBAGF,kBACE,qBACA,gBACA,+BAGF,gDAEE,iCAGF,iBACE,uBACA,mBACA,oBAGF,uEAGE,iCC1BJ,UACE,kBAGA,iBACE,WACA,kBACA,UACA,iBAXS,QAYT,MACA,SACA,SACA,iBAKJ,eACE,kBACA,UAEA,qBACE,kCACA,kBACA,sBACA,cAEA,uBACE,cAGF,iCACE,yBAIJ,2BACE,oBACA,iBACA,gBAIF,sBACE,iBACA,eACA,kBACA,kBACA,WACA,YACA,YACA,SACA,kBACA,UAGF,gCACE,YACA,sBACA,yBAGF,8BACE,aACA,sBACA,yBAGF,+BACE,YACA,sBACA,yBAIF,oBACE,0BACA,OAIF,qBACE,0BACA,SAIF,4BACE,WACA,kBACA,YACA,WACA,sBACA,sBACA,wCACA,SACA,UACA,WACA,wCACA,sCAIF,6BACE,WACA,kBACA,YACA,WACA,iCACA,sBACA,wCACA,SACA,UACA,UACA,uCACA,yCAIF,4BACE,WAKJ,qCAGE,iBACE,UAIF,eACE,WACA,6BACA,8BAGA,uBACE,qBAIF,uDAEE,oBAGF,4BACE,kBACA,gBACA,uCACA,yCAGF,6BACE,WAIF,qBACE,SlDlKN,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDmD7DA,qBACE,0CCHF,gCACE,mBAKA,+CACE,yBAIJ,+BACE","sourcesContent":["$primary-color: #021a34;\n$secondary-color: #075f94;\n\n:root {\n // -- Light\n --primary-color-light: #021a34;\n --secondary-color-light: #075f94;\n\n --bg-color-light: #edeef0;\n --bg-color-reverse-light: #021a34;\n --bg-color-tinted-light: #b0b2b4;\n\n --text-color-light: #4c4c4c;\n --text-color-reverse-light: #edeef0;\n --text-muted-color-light: #4c4c4c;\n\n --link-color-light: #4c4c4c;\n --link-hover-color-light: #6c6c6c;\n\n // -- Dark\n --primary-color-dark: #edeef0;\n --secondary-color-dark: #075f94;\n\n --bg-color-dark: #14171c;\n --bg-color-reverse-dark: #edeef0;\n --bg-color-tinted-dark: #627191;\n\n --text-color-dark: #edeef0;\n --text-color-reverse-dark: #14171c;\n --text-muted-color-dark: #edeef0;\n\n --link-color-dark: #edeef0;\n --link-hover-color-dark: #ffffff;\n}\n\n[data-bs-theme=\"light\"] {\n --primary-color: var(--primary-color-light);\n --secondary-color: var(--secondary-color-light);\n --bg-color-tinted: var(--bg-color-tinted-light);\n\n --bg-color: var(--bg-color-light);\n --bg-color-reverse: var(--bg-color-reverse-light);\n --text-color: var(--text-color-light);\n\n --text-color-reverse: var(--text-color-reverse-light);\n --text-muted-color: var(--text-muted-color-light);\n\n --link-color: var(--link-color-light);\n --link-hover-color: var(--link-hover-color-light);\n}\n\n[data-bs-theme=\"dark\"] {\n --primary-color: var(--primary-color-dark);\n --secondary-color: var(--secondary-color-dark);\n\n --bg-color: var(--bg-color-dark);\n --bg-color-reverse: var(--bg-color-reverse-dark);\n --bg-color-tinted: var(--bg-color-tinted-dark);\n\n --text-color: var(--text-color-dark);\n --text-color-reverse: var(--text-color-reverse-dark);\n --text-muted-color: var(--text-muted-color-dark);\n\n --link-color: var(--link-color-dark);\n --link-hover-color: var(--link-hover-color-dark);\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, ``-`` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on ` `s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `
` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.\n// See https://stackoverflow.com/a/54997118\n\n[list]:not([type=\"date\"]):not([type=\"datetime-local\"]):not([type=\"month\"]):not([type=\"week\"]):not([type=\"time\"])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. ``s, which have `min-width: 0;` by default.\n// So we reset that to ensure fieldsets behave more like a standard block element.\n// See https://github.com/twbs/bootstrap/issues/12359\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n min-width: 0; // 1\n padding: 0; // 2\n margin: 0; // 2\n border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n// This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n// See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n float: left; // 1\n width: 100%;\n padding: 0;\n margin-bottom: $legend-margin-bottom;\n @include font-size($legend-font-size);\n font-weight: $legend-font-weight;\n line-height: inherit;\n\n + * {\n clear: left; // 2\n }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n// 1. This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n// 2. Correct the outline style in Safari.\n\n[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n outline-offset: -2px; // 2\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n\n// 1. Inherit font family and line height for file input buttons\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::file-selector-button {\n font: inherit; // 1\n -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n display: list-item; // 1\n cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,
\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,
\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,
\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,
\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,
\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,
\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,
\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,
\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,
\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,
\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,
\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,
\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,
\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,
\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,
\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,
\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n","//\n// Headings\n//\n.h1 {\n @extend h1;\n}\n\n.h2 {\n @extend h2;\n}\n\n.h3 {\n @extend h3;\n}\n\n.h4 {\n @extend h4;\n}\n\n.h5 {\n @extend h5;\n}\n\n.h6 {\n @extend h6;\n}\n\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n@each $display, $font-size in $display-font-sizes {\n .display-#{$display} {\n @include font-size($font-size);\n font-family: $display-font-family;\n font-style: $display-font-style;\n font-weight: $display-font-weight;\n line-height: $display-line-height;\n }\n}\n\n//\n// Emphasis\n//\n.small {\n @extend small;\n}\n\n.mark {\n @extend mark;\n}\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled();\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled();\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size($initialism-font-size);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-font-size);\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n.blockquote-footer {\n margin-top: -$blockquote-margin-y;\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-footer-font-size);\n color: $blockquote-footer-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `
`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid();\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid();\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer * .5;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n","@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @each $value in $shadow {\n @if $value != null {\n $result: append($result, $value, \"comma\");\n }\n @if $value == none and length($shadow) > 1 {\n @warn \"The keyword 'none' must be used as a single argument.\";\n }\n }\n\n @if (length($result) > 0) {\n box-shadow: $result;\n }\n }\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n // Reset needed for nesting tables\n --#{$prefix}table-color-type: initial;\n --#{$prefix}table-bg-type: initial;\n --#{$prefix}table-color-state: initial;\n --#{$prefix}table-bg-state: initial;\n // End of reset\n --#{$prefix}table-color: #{$table-color};\n --#{$prefix}table-bg: #{$table-bg};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-accent-bg: #{$table-accent-bg};\n --#{$prefix}table-striped-color: #{$table-striped-color};\n --#{$prefix}table-striped-bg: #{$table-striped-bg};\n --#{$prefix}table-active-color: #{$table-active-color};\n --#{$prefix}table-active-bg: #{$table-active-bg};\n --#{$prefix}table-hover-color: #{$table-hover-color};\n --#{$prefix}table-hover-bg: #{$table-hover-bg};\n\n width: 100%;\n margin-bottom: $spacer;\n vertical-align: $table-cell-vertical-align;\n border-color: var(--#{$prefix}table-border-color);\n\n // Target th & td\n // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.\n // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).\n // Another advantage is that this generates less code and makes the selector less specific making it easier to override.\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y $table-cell-padding-x;\n // Following the precept of cascades: https://codepen.io/miriamsuzanne/full/vYNgodb\n color: var(--#{$prefix}table-color-state, var(--#{$prefix}table-color-type, var(--#{$prefix}table-color)));\n background-color: var(--#{$prefix}table-bg);\n border-bottom-width: $table-border-width;\n box-shadow: inset 0 0 0 9999px var(--#{$prefix}table-bg-state, var(--#{$prefix}table-bg-type, var(--#{$prefix}table-accent-bg)));\n }\n\n > tbody {\n vertical-align: inherit;\n }\n\n > thead {\n vertical-align: bottom;\n }\n}\n\n.table-group-divider {\n border-top: calc(#{$table-border-width} * 2) solid $table-group-separator-color; // stylelint-disable-line function-disallowed-list\n}\n\n//\n// Change placement of captions with a class\n//\n\n.caption-top {\n caption-side: top;\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n//\n// When borders are added on all sides of the cells, the corners can render odd when\n// these borders do not have the same color or if they are semi-transparent.\n// Therefor we add top and border bottoms to the `tr`s and left and right borders\n// to the `td`s or `th`s\n\n.table-bordered {\n > :not(caption) > * {\n border-width: $table-border-width 0;\n\n // stylelint-disable-next-line selector-max-universal\n > * {\n border-width: 0 $table-border-width;\n }\n }\n}\n\n.table-borderless {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n border-bottom-width: 0;\n }\n\n > :not(:first-child) {\n border-top-width: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n// For rows\n.table-striped {\n > tbody > tr:nth-of-type(#{$table-striped-order}) > * {\n --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\n --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\n }\n}\n\n// For columns\n.table-striped-columns {\n > :not(caption) > tr > :nth-child(#{$table-striped-columns-order}) {\n --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\n --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\n }\n}\n\n// Active table\n//\n// The `.table-active` class can be added to highlight rows or cells\n\n.table-active {\n --#{$prefix}table-color-state: var(--#{$prefix}table-active-color);\n --#{$prefix}table-bg-state: var(--#{$prefix}table-active-bg);\n}\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover > * {\n --#{$prefix}table-color-state: var(--#{$prefix}table-hover-color);\n --#{$prefix}table-bg-state: var(--#{$prefix}table-hover-bg);\n }\n}\n\n\n// Table variants\n//\n// Table variants set the table cell backgrounds, border colors\n// and the colors of the striped, hovered & active tables\n\n@each $color, $value in $table-variants {\n @include table-variant($color, $value);\n}\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @include media-breakpoint-down($breakpoint) {\n .table-responsive#{$infix} {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n }\n}\n","// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n $table-border-color: mix($color, $background, percentage($table-border-factor));\n\n --#{$prefix}table-color: #{$color};\n --#{$prefix}table-bg: #{$background};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-striped-bg: #{$striped-bg};\n --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$prefix}table-active-bg: #{$active-bg};\n --#{$prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$prefix}table-hover-bg: #{$hover-bg};\n --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: var(--#{$prefix}table-color);\n border-color: var(--#{$prefix}table-border-color);\n }\n}\n// scss-docs-end table-variant\n","//\n// Base styles\n//\n\n.btn {\n // scss-docs-start btn-css-vars\n --#{$prefix}btn-padding-x: #{$btn-padding-x};\n --#{$prefix}btn-padding-y: #{$btn-padding-y};\n --#{$prefix}btn-font-family: #{$btn-font-family};\n @include rfs($btn-font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-font-weight: #{$btn-font-weight};\n --#{$prefix}btn-line-height: #{$btn-line-height};\n --#{$prefix}btn-color: #{$btn-color};\n --#{$prefix}btn-bg: transparent;\n --#{$prefix}btn-border-width: #{$btn-border-width};\n --#{$prefix}btn-border-color: transparent;\n --#{$prefix}btn-border-radius: #{$btn-border-radius};\n --#{$prefix}btn-hover-border-color: transparent;\n --#{$prefix}btn-box-shadow: #{$btn-box-shadow};\n --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity};\n --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5);\n // scss-docs-end btn-css-vars\n\n display: inline-block;\n padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x);\n font-family: var(--#{$prefix}btn-font-family);\n @include font-size(var(--#{$prefix}btn-font-size));\n font-weight: var(--#{$prefix}btn-font-weight);\n line-height: var(--#{$prefix}btn-line-height);\n color: var(--#{$prefix}btn-color);\n text-align: center;\n text-decoration: if($link-decoration == none, null, none);\n white-space: $btn-white-space;\n vertical-align: middle;\n cursor: if($enable-button-pointers, pointer, null);\n user-select: none;\n border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color);\n @include border-radius(var(--#{$prefix}btn-border-radius));\n @include gradient-bg(var(--#{$prefix}btn-bg));\n @include box-shadow(var(--#{$prefix}btn-box-shadow));\n @include transition($btn-transition);\n\n &:hover {\n color: var(--#{$prefix}btn-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n background-color: var(--#{$prefix}btn-hover-bg);\n border-color: var(--#{$prefix}btn-hover-border-color);\n }\n\n .btn-check + &:hover {\n // override for the checkbox/radio buttons\n color: var(--#{$prefix}btn-color);\n background-color: var(--#{$prefix}btn-bg);\n border-color: var(--#{$prefix}btn-border-color);\n }\n\n &:focus-visible {\n color: var(--#{$prefix}btn-hover-color);\n @include gradient-bg(var(--#{$prefix}btn-hover-bg));\n border-color: var(--#{$prefix}btn-hover-border-color);\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\n } @else {\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n }\n }\n\n .btn-check:focus-visible + & {\n border-color: var(--#{$prefix}btn-hover-border-color);\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\n } @else {\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n }\n }\n\n .btn-check:checked + &,\n :not(.btn-check) + &:active,\n &:first-child:active,\n &.active,\n &.show {\n color: var(--#{$prefix}btn-active-color);\n background-color: var(--#{$prefix}btn-active-bg);\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: var(--#{$prefix}btn-active-border-color);\n @include box-shadow(var(--#{$prefix}btn-active-shadow));\n\n &:focus-visible {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow);\n } @else {\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n }\n }\n }\n\n &:disabled,\n &.disabled,\n fieldset:disabled & {\n color: var(--#{$prefix}btn-disabled-color);\n pointer-events: none;\n background-color: var(--#{$prefix}btn-disabled-bg);\n background-image: if($enable-gradients, none, null);\n border-color: var(--#{$prefix}btn-disabled-border-color);\n opacity: var(--#{$prefix}btn-disabled-opacity);\n @include box-shadow(none);\n }\n}\n\n\n//\n// Alternate buttons\n//\n\n// scss-docs-start btn-variant-loops\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @if $color == \"light\" {\n @include button-variant(\n $value,\n $value,\n $hover-background: shade-color($value, $btn-hover-bg-shade-amount),\n $hover-border: shade-color($value, $btn-hover-border-shade-amount),\n $active-background: shade-color($value, $btn-active-bg-shade-amount),\n $active-border: shade-color($value, $btn-active-border-shade-amount)\n );\n } @else if $color == \"dark\" {\n @include button-variant(\n $value,\n $value,\n $hover-background: tint-color($value, $btn-hover-bg-tint-amount),\n $hover-border: tint-color($value, $btn-hover-border-tint-amount),\n $active-background: tint-color($value, $btn-active-bg-tint-amount),\n $active-border: tint-color($value, $btn-active-border-tint-amount)\n );\n } @else {\n @include button-variant($value, $value);\n }\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n// scss-docs-end btn-variant-loops\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n --#{$prefix}btn-font-weight: #{$font-weight-normal};\n --#{$prefix}btn-color: #{$btn-link-color};\n --#{$prefix}btn-bg: transparent;\n --#{$prefix}btn-border-color: transparent;\n --#{$prefix}btn-hover-color: #{$btn-link-hover-color};\n --#{$prefix}btn-hover-border-color: transparent;\n --#{$prefix}btn-active-color: #{$btn-link-hover-color};\n --#{$prefix}btn-active-border-color: transparent;\n --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color};\n --#{$prefix}btn-disabled-border-color: transparent;\n --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows\n --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb};\n\n text-decoration: $link-decoration;\n @if $enable-gradients {\n background-image: none;\n }\n\n &:hover,\n &:focus-visible {\n text-decoration: $link-hover-decoration;\n }\n\n &:focus-visible {\n color: var(--#{$prefix}btn-color);\n }\n\n &:hover {\n color: var(--#{$prefix}btn-hover-color);\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);\n}\n","// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n","// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-bg: #{$background};\n --#{$prefix}btn-border-color: #{$border};\n --#{$prefix}btn-hover-color: #{$hover-color};\n --#{$prefix}btn-hover-bg: #{$hover-background};\n --#{$prefix}btn-hover-border-color: #{$hover-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$disabled-color};\n --#{$prefix}btn-disabled-bg: #{$disabled-background};\n --#{$prefix}btn-disabled-border-color: #{$disabled-border};\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-border-color: #{$color};\n --#{$prefix}btn-hover-color: #{$color-hover};\n --#{$prefix}btn-hover-bg: #{$active-background};\n --#{$prefix}btn-hover-border-color: #{$active-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$color};\n --#{$prefix}btn-disabled-bg: transparent;\n --#{$prefix}btn-disabled-border-color: #{$color};\n --#{$prefix}gradient: none;\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}btn-padding-y: #{$padding-y};\n --#{$prefix}btn-padding-x: #{$padding-x};\n @include rfs($font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-border-radius: #{$border-radius};\n}\n// scss-docs-end btn-size-mixin\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n// scss-docs-start collapse-classes\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n\n &.collapse-horizontal {\n width: 0;\n height: auto;\n @include transition($transition-collapse-width);\n }\n}\n// scss-docs-end collapse-classes\n","// The dropdown wrapper (`
`)\n.dropup,\n.dropend,\n.dropdown,\n.dropstart,\n.dropup-center,\n.dropdown-center {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret();\n}\n\n// The dropdown menu\n.dropdown-menu {\n // scss-docs-start dropdown-css-vars\n --#{$prefix}dropdown-zindex: #{$zindex-dropdown};\n --#{$prefix}dropdown-min-width: #{$dropdown-min-width};\n --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x};\n --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y};\n --#{$prefix}dropdown-spacer: #{$dropdown-spacer};\n @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size);\n --#{$prefix}dropdown-color: #{$dropdown-color};\n --#{$prefix}dropdown-bg: #{$dropdown-bg};\n --#{$prefix}dropdown-border-color: #{$dropdown-border-color};\n --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius};\n --#{$prefix}dropdown-border-width: #{$dropdown-border-width};\n --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius};\n --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg};\n --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y};\n --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow};\n --#{$prefix}dropdown-link-color: #{$dropdown-link-color};\n --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color};\n --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg};\n --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color};\n --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg};\n --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color};\n --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x};\n --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y};\n --#{$prefix}dropdown-header-color: #{$dropdown-header-color};\n --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x};\n --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y};\n // scss-docs-end dropdown-css-vars\n\n position: absolute;\n z-index: var(--#{$prefix}dropdown-zindex);\n display: none; // none by default, but block on \"open\" of the menu\n min-width: var(--#{$prefix}dropdown-min-width);\n padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x);\n margin: 0; // Override default margin of ul\n @include font-size(var(--#{$prefix}dropdown-font-size));\n color: var(--#{$prefix}dropdown-color);\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: var(--#{$prefix}dropdown-bg);\n background-clip: padding-box;\n border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color);\n @include border-radius(var(--#{$prefix}dropdown-border-radius));\n @include box-shadow(var(--#{$prefix}dropdown-box-shadow));\n\n &[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: var(--#{$prefix}dropdown-spacer);\n }\n\n @if $dropdown-padding-y == 0 {\n > .dropdown-item:first-child,\n > li:first-child .dropdown-item {\n @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius));\n }\n > .dropdown-item:last-child,\n > li:last-child .dropdown-item {\n @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius));\n }\n\n }\n}\n\n// scss-docs-start responsive-breakpoints\n// We deliberately hardcode the `bs-` prefix because we check\n// this custom property in JS to determine Popper's positioning\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-start {\n --bs-position: start;\n\n &[data-bs-popper] {\n right: auto;\n left: 0;\n }\n }\n\n .dropdown-menu#{$infix}-end {\n --bs-position: end;\n\n &[data-bs-popper] {\n right: 0;\n left: auto;\n }\n }\n }\n}\n// scss-docs-end responsive-breakpoints\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: var(--#{$prefix}dropdown-spacer);\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropend {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: var(--#{$prefix}dropdown-spacer);\n }\n\n .dropdown-toggle {\n @include caret(end);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropstart {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: var(--#{$prefix}dropdown-spacer);\n }\n\n .dropdown-toggle {\n @include caret(start);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n\n// Dividers (basically an `
`) within the dropdown\n.dropdown-divider {\n height: 0;\n margin: var(--#{$prefix}dropdown-divider-margin-y) 0;\n overflow: hidden;\n border-top: 1px solid var(--#{$prefix}dropdown-divider-bg);\n opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
element\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `
`-specific styles are denoted with `// For s`\n.dropdown-item {\n display: block;\n width: 100%; // For ``s\n padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\n clear: both;\n font-weight: $font-weight-normal;\n color: var(--#{$prefix}dropdown-link-color);\n text-align: inherit; // For ``s\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For ``s\n border: 0; // For ``s\n @include border-radius(var(--#{$prefix}dropdown-item-border-radius, 0));\n\n &:hover,\n &:focus {\n color: var(--#{$prefix}dropdown-link-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n @include gradient-bg(var(--#{$prefix}dropdown-link-hover-bg));\n }\n\n &.active,\n &:active {\n color: var(--#{$prefix}dropdown-link-active-color);\n text-decoration: none;\n @include gradient-bg(var(--#{$prefix}dropdown-link-active-bg));\n }\n\n &.disabled,\n &:disabled {\n color: var(--#{$prefix}dropdown-link-disabled-color);\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: var(--#{$prefix}dropdown-header-padding-y) var(--#{$prefix}dropdown-header-padding-x);\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: var(--#{$prefix}dropdown-header-color);\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\n color: var(--#{$prefix}dropdown-link-color);\n}\n\n// Dark dropdowns\n.dropdown-menu-dark {\n // scss-docs-start dropdown-dark-css-vars\n --#{$prefix}dropdown-color: #{$dropdown-dark-color};\n --#{$prefix}dropdown-bg: #{$dropdown-dark-bg};\n --#{$prefix}dropdown-border-color: #{$dropdown-dark-border-color};\n --#{$prefix}dropdown-box-shadow: #{$dropdown-dark-box-shadow};\n --#{$prefix}dropdown-link-color: #{$dropdown-dark-link-color};\n --#{$prefix}dropdown-link-hover-color: #{$dropdown-dark-link-hover-color};\n --#{$prefix}dropdown-divider-bg: #{$dropdown-dark-divider-bg};\n --#{$prefix}dropdown-link-hover-bg: #{$dropdown-dark-link-hover-bg};\n --#{$prefix}dropdown-link-active-color: #{$dropdown-dark-link-active-color};\n --#{$prefix}dropdown-link-active-bg: #{$dropdown-dark-link-active-bg};\n --#{$prefix}dropdown-link-disabled-color: #{$dropdown-dark-link-disabled-color};\n --#{$prefix}dropdown-header-color: #{$dropdown-dark-header-color};\n // scss-docs-end dropdown-dark-css-vars\n}\n","// scss-docs-start caret-mixins\n@mixin caret-down($width: $caret-width) {\n border-top: $width solid;\n border-right: $width solid transparent;\n border-bottom: 0;\n border-left: $width solid transparent;\n}\n\n@mixin caret-up($width: $caret-width) {\n border-top: 0;\n border-right: $width solid transparent;\n border-bottom: $width solid;\n border-left: $width solid transparent;\n}\n\n@mixin caret-end($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: 0;\n border-bottom: $width solid transparent;\n border-left: $width solid;\n}\n\n@mixin caret-start($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: $width solid;\n border-bottom: $width solid transparent;\n}\n\n@mixin caret(\n $direction: down,\n $width: $caret-width,\n $spacing: $caret-spacing,\n $vertical-align: $caret-vertical-align\n) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down($width);\n } @else if $direction == up {\n @include caret-up($width);\n } @else if $direction == end {\n @include caret-end($width);\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @include caret-start($width);\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// ``s, ``s or ``s.\n\n.nav {\n // scss-docs-start nav-css-vars\n --#{$prefix}nav-link-padding-x: #{$nav-link-padding-x};\n --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\n @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\n --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\n --#{$prefix}nav-link-color: #{$nav-link-color};\n --#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};\n --#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};\n // scss-docs-end nav-css-vars\n\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: var(--#{$prefix}nav-link-padding-y) var(--#{$prefix}nav-link-padding-x);\n @include font-size(var(--#{$prefix}nav-link-font-size));\n font-weight: var(--#{$prefix}nav-link-font-weight);\n color: var(--#{$prefix}nav-link-color);\n text-decoration: if($link-decoration == none, null, none);\n background: none;\n border: 0;\n @include transition($nav-link-transition);\n\n &:hover,\n &:focus {\n color: var(--#{$prefix}nav-link-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n &:focus-visible {\n outline: 0;\n box-shadow: $nav-link-focus-box-shadow;\n }\n\n // Disabled state lightens text\n &.disabled,\n &:disabled {\n color: var(--#{$prefix}nav-link-disabled-color);\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n // scss-docs-start nav-tabs-css-vars\n --#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};\n --#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};\n --#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};\n --#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};\n --#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};\n --#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};\n --#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};\n // scss-docs-end nav-tabs-css-vars\n\n border-bottom: var(--#{$prefix}nav-tabs-border-width) solid var(--#{$prefix}nav-tabs-border-color);\n\n .nav-link {\n margin-bottom: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\n border: var(--#{$prefix}nav-tabs-border-width) solid transparent;\n @include border-top-radius(var(--#{$prefix}nav-tabs-border-radius));\n\n &:hover,\n &:focus {\n // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link\n isolation: isolate;\n border-color: var(--#{$prefix}nav-tabs-link-hover-border-color);\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: var(--#{$prefix}nav-tabs-link-active-color);\n background-color: var(--#{$prefix}nav-tabs-link-active-bg);\n border-color: var(--#{$prefix}nav-tabs-link-active-border-color);\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n // scss-docs-start nav-pills-css-vars\n --#{$prefix}nav-pills-border-radius: #{$nav-pills-border-radius};\n --#{$prefix}nav-pills-link-active-color: #{$nav-pills-link-active-color};\n --#{$prefix}nav-pills-link-active-bg: #{$nav-pills-link-active-bg};\n // scss-docs-end nav-pills-css-vars\n\n .nav-link {\n @include border-radius(var(--#{$prefix}nav-pills-border-radius));\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: var(--#{$prefix}nav-pills-link-active-color);\n @include gradient-bg(var(--#{$prefix}nav-pills-link-active-bg));\n }\n}\n\n\n//\n// Underline\n//\n\n.nav-underline {\n // scss-docs-start nav-underline-css-vars\n --#{$prefix}nav-underline-gap: #{$nav-underline-gap};\n --#{$prefix}nav-underline-border-width: #{$nav-underline-border-width};\n --#{$prefix}nav-underline-link-active-color: #{$nav-underline-link-active-color};\n // scss-docs-end nav-underline-css-vars\n\n gap: var(--#{$prefix}nav-underline-gap);\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n border-bottom: var(--#{$prefix}nav-underline-border-width) solid transparent;\n\n &:hover,\n &:focus {\n border-bottom-color: currentcolor;\n }\n }\n\n .nav-link.active,\n .show > .nav-link {\n font-weight: $font-weight-bold;\n color: var(--#{$prefix}nav-underline-link-active-color);\n border-bottom-color: currentcolor;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n > .nav-link,\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n > .nav-link,\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n.nav-fill,\n.nav-justified {\n .nav-item .nav-link {\n width: 100%; // Make sure button will grow\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n // scss-docs-start navbar-css-vars\n --#{$prefix}navbar-padding-x: #{if($navbar-padding-x == null, 0, $navbar-padding-x)};\n --#{$prefix}navbar-padding-y: #{$navbar-padding-y};\n --#{$prefix}navbar-color: #{$navbar-light-color};\n --#{$prefix}navbar-hover-color: #{$navbar-light-hover-color};\n --#{$prefix}navbar-disabled-color: #{$navbar-light-disabled-color};\n --#{$prefix}navbar-active-color: #{$navbar-light-active-color};\n --#{$prefix}navbar-brand-padding-y: #{$navbar-brand-padding-y};\n --#{$prefix}navbar-brand-margin-end: #{$navbar-brand-margin-end};\n --#{$prefix}navbar-brand-font-size: #{$navbar-brand-font-size};\n --#{$prefix}navbar-brand-color: #{$navbar-light-brand-color};\n --#{$prefix}navbar-brand-hover-color: #{$navbar-light-brand-hover-color};\n --#{$prefix}navbar-nav-link-padding-x: #{$navbar-nav-link-padding-x};\n --#{$prefix}navbar-toggler-padding-y: #{$navbar-toggler-padding-y};\n --#{$prefix}navbar-toggler-padding-x: #{$navbar-toggler-padding-x};\n --#{$prefix}navbar-toggler-font-size: #{$navbar-toggler-font-size};\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-light-toggler-icon-bg)};\n --#{$prefix}navbar-toggler-border-color: #{$navbar-light-toggler-border-color};\n --#{$prefix}navbar-toggler-border-radius: #{$navbar-toggler-border-radius};\n --#{$prefix}navbar-toggler-focus-width: #{$navbar-toggler-focus-width};\n --#{$prefix}navbar-toggler-transition: #{$navbar-toggler-transition};\n // scss-docs-end navbar-css-vars\n\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: var(--#{$prefix}navbar-padding-y) var(--#{$prefix}navbar-padding-x);\n @include gradient-bg();\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n // The `flex-wrap` property is inherited to simplify the expanded navbars\n %container-flex-properties {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n }\n\n > .container,\n > .container-fluid {\n @extend %container-flex-properties;\n }\n\n @each $breakpoint, $container-max-width in $container-max-widths {\n > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {\n @extend %container-flex-properties;\n }\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n padding-top: var(--#{$prefix}navbar-brand-padding-y);\n padding-bottom: var(--#{$prefix}navbar-brand-padding-y);\n margin-right: var(--#{$prefix}navbar-brand-margin-end);\n @include font-size(var(--#{$prefix}navbar-brand-font-size));\n color: var(--#{$prefix}navbar-brand-color);\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap;\n\n &:hover,\n &:focus {\n color: var(--#{$prefix}navbar-brand-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n // scss-docs-start navbar-nav-css-vars\n --#{$prefix}nav-link-padding-x: 0;\n --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\n @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\n --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\n --#{$prefix}nav-link-color: var(--#{$prefix}navbar-color);\n --#{$prefix}nav-link-hover-color: var(--#{$prefix}navbar-hover-color);\n --#{$prefix}nav-link-disabled-color: var(--#{$prefix}navbar-disabled-color);\n // scss-docs-end navbar-nav-css-vars\n\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n &.active,\n &.show {\n color: var(--#{$prefix}navbar-active-color);\n }\n }\n\n .dropdown-menu {\n position: static;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n color: var(--#{$prefix}navbar-color);\n\n a,\n a:hover,\n a:focus {\n color: var(--#{$prefix}navbar-active-color);\n }\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: var(--#{$prefix}navbar-toggler-padding-y) var(--#{$prefix}navbar-toggler-padding-x);\n @include font-size(var(--#{$prefix}navbar-toggler-font-size));\n line-height: 1;\n color: var(--#{$prefix}navbar-color);\n background-color: transparent; // remove default button style\n border: var(--#{$prefix}border-width) solid var(--#{$prefix}navbar-toggler-border-color); // remove default button style\n @include border-radius(var(--#{$prefix}navbar-toggler-border-radius));\n @include transition(var(--#{$prefix}navbar-toggler-transition));\n\n &:hover {\n text-decoration: none;\n }\n\n &:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 var(--#{$prefix}navbar-toggler-focus-width);\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-image: var(--#{$prefix}navbar-toggler-icon-bg);\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--#{$prefix}scroll-height, 75vh);\n overflow-y: auto;\n}\n\n// scss-docs-start navbar-expand-loop\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n // stylelint-disable-next-line scss/selector-no-union-class-name\n {$infix} {\n @include media-breakpoint-up($next) {\n flex-wrap: nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .nav-link {\n padding-right: var(--#{$prefix}navbar-nav-link-padding-x);\n padding-left: var(--#{$prefix}navbar-nav-link-padding-x);\n }\n }\n\n .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n\n .offcanvas {\n // stylelint-disable declaration-no-important\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n @include box-shadow(none);\n @include transition(none);\n // stylelint-enable declaration-no-important\n\n .offcanvas-header {\n display: none;\n }\n\n .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n }\n }\n }\n }\n}\n// scss-docs-end navbar-expand-loop\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n.navbar-light {\n @include deprecate(\"`.navbar-light`\", \"v5.2.0\", \"v6.0.0\", true);\n}\n\n.navbar-dark,\n.navbar[data-bs-theme=\"dark\"] {\n // scss-docs-start navbar-dark-css-vars\n --#{$prefix}navbar-color: #{$navbar-dark-color};\n --#{$prefix}navbar-hover-color: #{$navbar-dark-hover-color};\n --#{$prefix}navbar-disabled-color: #{$navbar-dark-disabled-color};\n --#{$prefix}navbar-active-color: #{$navbar-dark-active-color};\n --#{$prefix}navbar-brand-color: #{$navbar-dark-brand-color};\n --#{$prefix}navbar-brand-hover-color: #{$navbar-dark-brand-hover-color};\n --#{$prefix}navbar-toggler-border-color: #{$navbar-dark-toggler-border-color};\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\n // scss-docs-end navbar-dark-css-vars\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark) {\n .navbar-toggler-icon {\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n // scss-docs-start badge-css-vars\n --#{$prefix}badge-padding-x: #{$badge-padding-x};\n --#{$prefix}badge-padding-y: #{$badge-padding-y};\n @include rfs($badge-font-size, --#{$prefix}badge-font-size);\n --#{$prefix}badge-font-weight: #{$badge-font-weight};\n --#{$prefix}badge-color: #{$badge-color};\n --#{$prefix}badge-border-radius: #{$badge-border-radius};\n // scss-docs-end badge-css-vars\n\n display: inline-block;\n padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x);\n @include font-size(var(--#{$prefix}badge-font-size));\n font-weight: var(--#{$prefix}badge-font-weight);\n line-height: 1;\n color: var(--#{$prefix}badge-color);\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius(var(--#{$prefix}badge-border-radius));\n @include gradient-bg();\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n","//\n// Base styles\n//\n\n.alert {\n // scss-docs-start alert-css-vars\n --#{$prefix}alert-bg: transparent;\n --#{$prefix}alert-padding-x: #{$alert-padding-x};\n --#{$prefix}alert-padding-y: #{$alert-padding-y};\n --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom};\n --#{$prefix}alert-color: inherit;\n --#{$prefix}alert-border-color: transparent;\n --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color);\n --#{$prefix}alert-border-radius: #{$alert-border-radius};\n --#{$prefix}alert-link-color: inherit;\n // scss-docs-end alert-css-vars\n\n position: relative;\n padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x);\n margin-bottom: var(--#{$prefix}alert-margin-bottom);\n color: var(--#{$prefix}alert-color);\n background-color: var(--#{$prefix}alert-bg);\n border: var(--#{$prefix}alert-border);\n @include border-radius(var(--#{$prefix}alert-border-radius));\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n color: var(--#{$prefix}alert-link-color);\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $alert-dismissible-padding-r;\n\n // Adjust close link position\n .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: $stretched-link-z-index + 1;\n padding: $alert-padding-y * 1.25 $alert-padding-x;\n }\n}\n\n\n// scss-docs-start alert-modifiers\n// Generate contextual modifier classes for colorizing the alert\n@each $state in map-keys($theme-colors) {\n .alert-#{$state} {\n --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis);\n --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle);\n --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle);\n --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis);\n }\n}\n// scss-docs-end alert-modifiers\n","// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n","// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\n@each $color, $value in $theme-colors {\n .text-bg-#{$color} {\n color: color-contrast($value) if($enable-important-utilities, !important, null);\n background-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}bg-opacity, 1)) if($enable-important-utilities, !important, null);\n }\n}\n","// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\n@each $color, $value in $theme-colors {\n .link-#{$color} {\n color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n\n @if $link-shade-percentage != 0 {\n &:hover,\n &:focus {\n $hover-color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));\n color: RGBA(#{to-rgb($hover-color)}, var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(to-rgb($hover-color), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n }\n }\n }\n}\n\n// One-off special link helper as a bridge until v6\n.link-body-emphasis {\n color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n\n @if $link-shade-percentage != 0 {\n &:hover,\n &:focus {\n color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, .75)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, .75)) if($enable-important-utilities, !important, null);\n }\n }\n}\n",".focus-ring:focus {\n outline: 0;\n // By default, there is no `--bs-focus-ring-x`, `--bs-focus-ring-y`, or `--bs-focus-ring-blur`, but we provide CSS variables with fallbacks to initial `0` values\n box-shadow: var(--#{$prefix}focus-ring-x, 0) var(--#{$prefix}focus-ring-y, 0) var(--#{$prefix}focus-ring-blur, 0) var(--#{$prefix}focus-ring-width) var(--#{$prefix}focus-ring-color);\n}\n",".icon-link {\n display: inline-flex;\n gap: $icon-link-gap;\n align-items: center;\n text-decoration-color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, .5));\n text-underline-offset: $icon-link-underline-offset;\n backface-visibility: hidden;\n\n > .bi {\n flex-shrink: 0;\n width: $icon-link-icon-size;\n height: $icon-link-icon-size;\n fill: currentcolor;\n @include transition($icon-link-icon-transition);\n }\n}\n\n.icon-link-hover {\n &:hover,\n &:focus-visible {\n > .bi {\n transform: var(--#{$prefix}icon-link-transform, $icon-link-icon-transform);\n }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.ratio {\n position: relative;\n width: 100%;\n\n &::before {\n display: block;\n padding-top: var(--#{$prefix}aspect-ratio);\n content: \"\";\n }\n\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n\n@each $key, $ratio in $aspect-ratios {\n .ratio-#{$key} {\n --#{$prefix}aspect-ratio: #{$ratio};\n }\n}\n","// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n// Responsive sticky top and bottom\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .sticky#{$infix}-top {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n\n .sticky#{$infix}-bottom {\n position: sticky;\n bottom: 0;\n z-index: $zindex-sticky;\n }\n }\n}\n","// scss-docs-start stacks\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n// scss-docs-end stacks\n","//\n// Visually hidden\n//\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n @include visually-hidden();\n}\n","// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n\n // Fix for positioned table caption that could become anonymous cells\n &:not(caption) {\n position: absolute !important;\n }\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::#{$stretched-link-pseudo-element} {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $stretched-link-z-index;\n content: \"\";\n }\n}\n","//\n// Text truncation\n//\n\n.text-truncate {\n @include text-truncate();\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n",".vr {\n display: inline-block;\n align-self: stretch;\n width: $vr-border-width;\n min-height: 1em;\n background-color: currentcolor;\n opacity: $hr-opacity;\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n","@import \"vars\";\n\n// Variable overrides first\n$primary: $primary-color;\n$secondary: $secondary-color;\n$enable-shadows: true;\n$prefix: \"pa-\";\n\n// Required\n@import \"../../node_modules/bootstrap/scss/functions\";\n@import \"../../node_modules/bootstrap/scss/variables\";\n@import \"../../node_modules/bootstrap/scss/variables-dark\";\n@import \"../../node_modules/bootstrap/scss/maps\";\n@import \"../../node_modules/bootstrap/scss/mixins\";\n@import \"../../node_modules/bootstrap/scss/utilities\";\n@import \"../../node_modules/bootstrap/scss/root\";\n@import \"../../node_modules/bootstrap/scss/reboot\";\n\n@import \"../../node_modules/bootstrap/scss/type\";\n@import \"../../node_modules/bootstrap/scss/images\";\n@import \"../../node_modules/bootstrap/scss/containers\";\n@import \"../../node_modules/bootstrap/scss/grid\";\n@import \"../../node_modules/bootstrap/scss/tables\";\n// @import \"../../node_modules/bootstrap/scss/forms\";\n@import \"../../node_modules/bootstrap/scss/buttons\";\n@import \"../../node_modules/bootstrap/scss/transitions\";\n@import \"../../node_modules/bootstrap/scss/dropdown\";\n// @import \"../../node_modules/bootstrap/scss/button-group\";\n@import \"../../node_modules/bootstrap/scss/nav\";\n@import \"../../node_modules/bootstrap/scss/navbar\"; // Requires nav\n// @import \"../../node_modules/bootstrap/scss/card\";\n// @import \"../../node_modules/bootstrap/scss/breadcrumb\";\n// @import \"../../node_modules/bootstrap/scss/accordion\";\n// @import \"../../node_modules/bootstrap/scss/pagination\";\n@import \"../../node_modules/bootstrap/scss/badge\";\n@import \"../../node_modules/bootstrap/scss/alert\";\n// @import \"../../node_modules/bootstrap/scss/progress\";\n// @import \"../../node_modules/bootstrap/scss/list-group\";\n// @import \"../../node_modules/bootstrap/scss/close\";\n// @import \"../../node_modules/bootstrap/scss/toasts\";\n// @import \"../../node_modules/bootstrap/scss/modal\"; // Requires transitions\n// @import \"../../node_modules/bootstrap/scss/tooltip\";\n// @import \"../../node_modules/bootstrap/scss/popover\";\n// @import \"../../node_modules/bootstrap/scss/carousel\";\n// @import \"../../node_modules/bootstrap/scss/spinners\";\n// @import \"../../node_modules/bootstrap/scss/offcanvas\"; // Requires transitions\n// @import \"../../node_modules/bootstrap/scss/placeholders\";\n\n// Helpers\n@import \"../../node_modules/bootstrap/scss/helpers\";\n\n// Utilities\n@import \"../../node_modules/bootstrap/scss/utilities/api\";\n\nbody {\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: var(--text-color);\n background-color: var(--bg-color);\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.btn-primary {\n color: var(--text-color-reverse);\n background-color: var(--primary-color);\n border-color: var(--primary-color);\n}\n\n.btn-outline-primary {\n color: var(--primary-color);\n background: none;\n border-color: var(--primary-color);\n\n &:hover {\n background-color: var(--primary-color);\n color: var(--text-color-reverse);\n }\n}\n\n.btn-secondary {\n color: #ffffff;\n background-color: var(--secondary-color);\n border-color: var(--secondary-color);\n}\n\n.navbar {\n .nav-top {\n height: 86px;\n }\n\n .fixed-menu {\n width: 220px;\n }\n\n .logo img {\n width: 200px;\n }\n}\n\na {\n text-decoration: underline;\n color: var(--link-color);\n\n &:hover {\n color: var(--link-hover-color);\n }\n\n &:active {\n color: var(--link-color);\n }\n}\n\nh1,\nh2 {\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 12px;\n padding-top: 14px;\n}\n\nh1 {\n font-weight: 600;\n}\n\nh3 {\n padding-top: 16px;\n}\n\n.motto {\n .title {\n font-weight: 600;\n font-size: 32px;\n padding-top: 36px;\n }\n\n .motto {\n font-weight: 500;\n font-size: 20px;\n }\n\n}\n\n.btn-fixed {\n border-width: 2px;\n border-style: solid;\n width: 220px;\n height: 46px;\n text-transform: uppercase;\n font-weight: 700;\n border-radius: 5px 5px 5px 5px;\n vertical-align: middle;\n line-height: 42px;\n padding: 0;\n margin: 16px;\n box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075);\n}\n\n\n.pactus-video {\n video {\n max-width: 100%;\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n display: block;\n }\n}\n\n.highlighter-rouge .highlight pre {\n background-color: #0d1117;\n padding: 32px 12px 12px 12px;\n color: #cccccc;\n position: relative;\n overflow: auto;\n direction: ltr;\n\n button {\n position: absolute;\n top: 6px;\n right: 8px;\n\n padding: 2px;\n background-color: #808080;\n color: #404040;\n border-radius: 5px;\n border: ridge 1px #808080;\n\n &:hover {\n cursor: pointer;\n background-color: #bcbabb;\n }\n }\n}\n\n.nav-tabs {\n border-color: #0d1117 !important;\n\n .nav-link {\n border-width: 0 !important;\n\n &:not(.active):hover {\n color: #ffffff !important;\n background-color: #808080 !important;\n }\n }\n\n .active {\n color: #ffffff !important;\n background-color: #0d1117 !important;\n }\n}\n\ntable {\n thead tr th {\n font-weight: 700;\n background-color: var(--bg-color) !important;\n }\n\n // tbody tr:nth-child(2n + 1) td {\n // background-color: #eee;\n // }\n}\n\nblockquote {\n background: #eee;\n border-left: 10px solid #ccc;\n padding: 16px;\n quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n\n &:before {\n color: #ccc;\n content: open-quote;\n font-size: 64px;\n line-height: 0.1em;\n vertical-align: -0.4em;\n }\n\n p {\n margin-top: 16px;\n }\n\n & p:first-child {\n display: inline;\n padding-bottom: 160px;\n margin-bottom: 160px;\n }\n}\n\n.footer {\n background-color: var(--primary-color);\n color: var(--text-color-reverse);\n\n .section {\n font-size: 1.75rem;\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 20px;\n }\n\n li {\n padding-bottom: 8px;\n }\n\n &.anchor {\n a {\n color: var(--text-color-reverse);\n }\n\n a:link {\n color: var(--text-color-reverse);\n background-color: transparent;\n text-decoration: none;\n }\n\n a:hover {\n color: var(--text-color-reverse);\n }\n }\n\n .legal {\n color: var(--text-color-reverse);\n font-size: 12px;\n }\n}\n\n.community {\n img {\n margin: 4px;\n }\n}\n\n.community_ran {\n img {\n margin: 4px;\n }\n}\n\n#btn-back-to-top {\n background-color: var(--primary-color);\n color: var(--bg-color);\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: none;\n}\n\n.edit-bar {\n padding-top: 30px;\n\n .edit-btn,\n .edit-btn>a:hover {\n color: var(--text-color);\n text-decoration: none;\n }\n}\n\n.all-posts {\n .post-link {\n padding-bottom: 8px;\n }\n}\n\n.blog-post {\n .post-date {\n padding-bottom: 10px;\n color: #808080;\n }\n\n .content {\n padding-top: 22px;\n min-height: 600px;\n }\n}\n\n.partners {\n img {\n padding-top: 24px;\n }\n}\n",".hexdump {\n font-family: monospace;\n font-size: 12px;\n padding-bottom: 1rem;\n}\n\n.hexdump .offset {\n border-right: 2px solid #708090;\n color: #778899;\n}\n.hexdump .ascii {\n color: #696969;\n}\n","@import \"vars\";\n\n.faq {\n h3 {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid var(--primary-color);\n }\n\n a {\n text-decoration: none;\n }\n\n .group {\n padding-top: 16px;\n\n .col {\n font-weight: 600;\n padding-bottom: 10px;\n }\n }\n\n .separator {\n padding-top: 12px;\n padding-bottom: 12px;\n }\n\n .read_more {\n padding-top: 12px;\n }\n}\n","@import \"vars\";\n\n.toc {\n\n .btn,\n a {\n color: var(--text-color);\n }\n\n .btn-section {\n padding: 0.25rem 0.5rem;\n font-weight: 600;\n background-color: transparent;\n }\n\n .btn-section:hover,\n .btn-section:focus {\n background-color: var(--bg-color);\n }\n\n .btn-page a {\n padding: 0.1875rem 0.5rem;\n margin-top: 0.125rem;\n margin-left: 1.25rem;\n }\n\n .btn-page a:hover,\n .btn-page a:focus,\n .btn-page .selected {\n background-color: var(--bg-color);\n }\n}\n","$line-color: #939597;\n\n/* The actual timeline (the vertical ruler) */\n.timeline {\n position: relative;\n\n /* The actual timeline (the vertical ruler) */\n &::after {\n content: \"\";\n position: absolute;\n width: 6px;\n background-color: $line-color;\n top: 0;\n bottom: 0;\n left: 50%;\n margin-left: -3px;\n }\n}\n\n/* Container around content */\n.timeline-card {\n position: relative;\n width: 50%;\n\n .card {\n border: 1px solid rgba(0, 0, 0, 0.175);\n border-radius: 5px;\n background-color: #eeeeee;\n color: #4c4c4c;\n\n a {\n color: #4c4c4c;\n }\n\n .text-muted {\n color: #898b8d !important;\n }\n }\n\n .card-title {\n padding-bottom: 12px;\n font-size: 1.1rem;\n font-weight: 500;\n }\n\n /* The circles on the timeline */\n &::after {\n line-height: 38px;\n font-size: 24px;\n position: absolute;\n text-align: center;\n width: 48px;\n height: 48px;\n right: -24px;\n top: 15px;\n border-radius: 50%;\n z-index: 1;\n }\n\n &.completed::after {\n content: \"✅\";\n background-color: #eeeeee;\n border: 5px solid #77b255;\n }\n\n &.ongoing::after {\n content: \"🚧\";\n background-color: #eeeeee;\n border: 5px solid #ffcb4b;\n }\n\n &.upcoming::after {\n content: \"⏳\";\n background-color: #eeeeee;\n border: 5px solid #478ec2;\n }\n\n /* Place the container to the left */\n &.left {\n padding: 0px 50px 20px 0px;\n left: 0;\n }\n\n /* Place the container to the right */\n &.right {\n padding: 0px 0px 20px 50px;\n left: 50%;\n }\n\n /* Add arrows to the left container (pointing right) */\n &.left::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background-color: #eeeeee;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 34px;\n z-index: 0;\n right: 33px;\n border-right: 1px solid rgba(0, 0, 0, 0.175);\n border-top: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Add arrows to the right container (pointing left) */\n &.right::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background-color: #eeeeee !important;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 33px;\n z-index: 0;\n left: 48px;\n border-left: 1px solid rgba(0, 0, 0, 0.175);\n border-bottom: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Fix the circle for containers on the right side */\n &.right::after {\n left: -24px;\n }\n}\n\n/* Media queries - Responsive timeline on screens less than 600px wide */\n@media screen and (max-width: 600px) {\n\n /* Place the timeline to the left */\n .timeline::after {\n left: 31px;\n }\n\n /* Full-width containers */\n .timeline-card {\n width: 100%;\n padding-left: 80px !important;\n padding-right: 25px !important;\n\n /* Make sure that all arrows are pointing leftwards */\n &::before {\n left: 77px !important;\n }\n\n /* Make sure all circles are at the same spot */\n &.left::after,\n &.right::after {\n left: 8px !important;\n }\n\n &.left::before {\n border-right: none;\n border-top: none;\n border-left: 1px solid rgba(0, 0, 0, 0.175);\n border-bottom: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n &.right::before {\n right: auto;\n }\n\n /* Make all right containers behave like the left ones */\n &.right {\n left: 0%;\n }\n }\n}\n","@import \"vars\";\n\n.learn {\n h2 {\n border-top: 1px solid var(--primary-color);\n }\n}\n","@include color-mode(dark) {\n blockquote {\n background: #14171c;\n }\n\n\n .toc {\n .btn-section::before {\n --svg-color: var(--text);\n }\n }\n\n .fa-linux {\n color: #ffffff;\n }\n}\n"],"file":"custom.css"}
\ No newline at end of file
diff --git a/ar/blog/index.html b/ar/blog/index.html
new file mode 100644
index 000000000..07d4b4e8a
--- /dev/null
+++ b/ar/blog/index.html
@@ -0,0 +1,571 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ مدونة | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
جميع المقالات
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- 28 September 2023
+
+
+
+
+
- 24 September 2023
+
+
+
+
+
- 04 September 2023
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- 24 September 2022
+
+
+
+
+
- 20 September 2022
+
+
+
+
+
- 18 September 2022
+
+
+
+
+
- 04 September 2022
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/browserconfig.xml b/ar/browserconfig.xml
new file mode 100644
index 000000000..b3930d0f0
--- /dev/null
+++ b/ar/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #da532c
+
+
+
diff --git a/ar/community/index.html b/ar/community/index.html
new file mode 100644
index 000000000..0025a8762
--- /dev/null
+++ b/ar/community/index.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ المجتمع | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
انضم إلى مجتمع بكتوس
+
+
من خلال الانضمام إلى مجتمع بكتوس، تصبح جزءًا من شبكة عالمية من المبتكرين والمفكرين والفاعلين الذين يتحدون برؤية مشتركة لبناء مستقبل أفضل مع تقنية البلوكشين. سواء كنت مطورًا أو رائد أعمال أو مستثمرًا أو مجرد عاشق للبلوكشين، هناك مكان لك هنا في بكتوس. إذًا، لنتحد ونحدث تغييرًا!
+
+
+
+
To explore the communities managed by members of the community, you can follow the links below.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/contributing/index.html b/ar/contributing/index.html
new file mode 100644
index 000000000..975658593
--- /dev/null
+++ b/ar/contributing/index.html
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ المساهمة | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
المساهمة
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
As an open-source platform, Pactus blockchain empowers from its community.
+Whether you’re a developer, designer, or enthusiast, your contributions can make a meaningful impact.
+
+
There are several ways to support the Pactus project:
+
+
Run a Node
+
+
One of the most effective ways to contribute to the Pactus network is by running a node.
+A “node” is a software program that downloads a copy of the Pactus blockchain and
+ensure the network keeps running safe and decentralized.
+
+
These guides can help you to run and configure your node:
+
+
+
+
Become a Validator
+
+
Validators play an important role in the Pactus blockchain by verifying transactions and
+adding them to the blockchain.
+By becoming a validator, you can earn rewards
+for contributing to the network’s security and decentralization.
+
+
To become a validator, you will need to stake a certain amount of Pactus coins.
+These guides can help you to send a Bond transaction and stake some coins:
+
+
+
+
Develop
+
+
Pactus is an open-source project that welcomes and encourages contributions from developers.
+By contributing to the project, you can help improve the Pactus platform and create new features that
+benefit the entire community.
+
+
You can check our Contributing page
+for more information on how to get involved and contribute to the project.
+
+
Translation
+
+
Another way to contribute to the Pactus project is by translating this website into other languages and
+improving its content.
+
+
Spread the Word
+
+
The more people who know about Pactus, the more opportunities there are for collaboration and growth.
+Share our project on social media, attend Pactus events, or simply tell your friends and colleagues about us.
+
+
+
+
Together, Let’s build a better future for blockchain technology.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/download/index.html b/ar/download/index.html
new file mode 100644
index 000000000..ba9150f29
--- /dev/null
+++ b/ar/download/index.html
@@ -0,0 +1,543 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ تنزيل | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
تحميل بكتوس
+
+
على هذه الصفحة يمكنك العثور على كيفية تحميل والحصول على أحدث إصدار من برنامج بكتوس.
+
+
+
+
🏗️ تجميع من شفرة المصدر
+
+
يتم توزيع مشروع بكتوس كبرنامج مفتوح المصدر، لذا فإن الطريقة المفضلة لتثبيته هي استنساخ شفرة المصدر من مستودع جيت هاب وتجميع شفرة المصدر.
+
+
تتوفر تعليمات تجميع بكتوس على صفحة التثبيت .
+
+
+
+
⬇️ تنزيل الإصدارات المستقرة
+
+
يمكنك أيضًا تنزيل أحدث إصدارات بكتوس المستقرة. يتم تحديث هذه الإصدارات تلقائيًا عند إصدار نسخة جديدة في مستودع جيت هاب .
+
+
واجهة المستخدم الرسومية لـ بكتوس (GUI)
+
+
يمكنك تشغيل بكتوس في وضع واجهة المستخدم الرسومية (GUI) وهو مناسب للمبتدئين والمستخدمين المتقدمين.
+
+
+
+
+
+
+
تطبيق غير موثوق كن على علم بأن الثنائيات المجمعة مسبقًا لا يتم شحنها مع أي
شهادة توقيع الكود . من المحتمل أن تكون الثنائيات المجمعة مسبقًا غير موثوقة على نظام ويندوز و ماك أو إس.
+
+
+
+
بمجرد تنزيل واجهة بكتوس الرسومية (GUI)، يمكنك اتباع هذا البرنامج التعليمي لإعداد عقدتك وتشغيلها:
+ كيفية تشغيل بكتوس في الوضع الرسومي؟
+
+
+
+
واجهة سطر الأوامر لـ بكتوس (CLI)
+
+
يمكن للمستخدم المتقدم تشغيل بكتوس في وضع واجهة سطر الأوامر (CLI).
+
+
+
+
+
+
بمجرد تنزيل بكتوس CLI، يمكنك اتباع هذا البرنامج التعليمي لإعداد عقدتك وتشغيلها:
+ كيفية تشغيل بكتوس في وضع سطر الأوامر؟
+
+
Downloader script
+
+
For Unix-like systems (e.g., Linux, macOS, or MSYS2 on Windows), there is a downloader script available. This script can download the archived file, verify it, and extract it for you. To use it, simply run the following command in your terminal:
+
+
curl --proto '=https' --tlsv1 .2 -sSL https://github.com/pactus-project/pactus/releases/download/v1.0.2/pactus_downloader.sh | sh
+
+
+
+
+
🐳 حاوية دوكر
+
+
يمكن للمستخدم المتقدم الحصول على صورة بكتوس دوكر من Docker Hub .
+
+
يمكنك اتباع هذا البرنامج التعليمي لإعداد عقدتك وتشغيلها باستخدام دوكر:
+ كيفية تشغيل بكتوس باستخدام دوكر؟
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/favicon-128x128.png b/ar/favicon-128x128.png
new file mode 100644
index 000000000..56c2f6cb2
Binary files /dev/null and b/ar/favicon-128x128.png differ
diff --git a/ar/favicon-16x16.png b/ar/favicon-16x16.png
new file mode 100644
index 000000000..4babb6356
Binary files /dev/null and b/ar/favicon-16x16.png differ
diff --git a/ar/favicon-32x32.png b/ar/favicon-32x32.png
new file mode 100644
index 000000000..e22d5d721
Binary files /dev/null and b/ar/favicon-32x32.png differ
diff --git a/ar/favicon-64x64.png b/ar/favicon-64x64.png
new file mode 100644
index 000000000..e8d111c2e
Binary files /dev/null and b/ar/favicon-64x64.png differ
diff --git a/ar/favicon.ico b/ar/favicon.ico
new file mode 100644
index 000000000..64080c0ee
Binary files /dev/null and b/ar/favicon.ico differ
diff --git a/ar/feed.xml b/ar/feed.xml
new file mode 100644
index 000000000..b2da51a3b
--- /dev/null
+++ b/ar/feed.xml
@@ -0,0 +1,1223 @@
+Jekyll 2024-03-10T09:34:38+00:00 https://pactus.org/feed.xml Pactus blockchain Pactus 1.0.2 (Istanbul) Released 2024-02-18T00:00:00+00:00 2024-02-18T00:00:00+00:00 https://pactus.org/2024/02/18/release-1-0-2 Overview
+
+Pactus Blockchain Version 1.0.2 (Istanbul)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+This release is named after the city of Istanbul and it
+was unanimously selected by Pactus community.
+
+
+
+Highlights
+
+This update fixes a major issue that decreases the number of inbound connections of the nodes over time.
+We highly recommend all users to upgrade to the new version for better connectivity.
+
+Download
+
+To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+How to Upgrade
+
+If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Fix
+
+
+ sync : fix concurrent map read-write crash (#1112 )
+ network : remove disconnected peers from peerMgr (#1110 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 1.0.1 (Beijing) Released 2024-02-10T00:00:00+00:00 2024-02-10T00:00:00+00:00 https://pactus.org/2024/02/10/release-1-0-1 Overview
+
+Pactus Blockchain Version 1.0.1 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+This release is named after the city of Beijing and it
+was unanimously selected by Pactus community.
+
+
+
+Highlights
+
+This update fixes several issues identified after the release of
+1.0.0 (Beijing) .
+Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.
+
+Download
+
+To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+How to Upgrade
+
+If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gui : add connections and moniker fields to main windows (#1090 )
+
+
+Fix
+
+
+ network : set dial and accept limit in connection gater (#1089 )
+ gui stderr logger in windows os (#1081 )
+ sync : improve syncing process (#1087 )
+ network : redefine resource limits (#1086 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 1.0.0 (Beijing) Released 2024-01-31T00:00:00+00:00 2024-01-31T00:00:00+00:00 https://pactus.org/2024/01/31/release-1-0-0 Overview
+
+Pactus Blockchain Version 1.0.0 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+Highlights
+
+Mainnet Official Release v1.0.0 (Beijing)
+
+The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone
+for our community.
+This impressive mainnet release represents the culmination of extensive development efforts.
+Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain,
+enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software
+and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on
+this exciting journey.
+
+Onboarding validators
+
+On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in
+Testnet-0 ,
+Testnet-1 , and
+Testnet-2 .
+This marks the beginning of a new chapter in the decentralized world.
+
+Download
+
+This version has been implemented for Mainnet
+To start using Pactus Mainnet, download the latest version from the download
+page and join the Mainnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ implement get validator address for grpc (#975 )
+ add bootstrap.json and load in config on build (#964 )
+ add mainnet config and genesis files (#951 )
+ add Consensus-address to network info (#952 )
+ grpc : sign transaction using wallet client (#945 )
+ pactus gui lock support (#947 )
+ consensus : turning consensus to a zero-config module (#942 )
+
+
+Fix
+
+
+ localnet wallet issue (#970 )
+ sync : remove ReachabilityStatus from agent info (#956 )
+ daemon : keeping previous behavior for password flag, linting CLI messages (#950 )
+ consensus : detect if the system time is behind the network (#939 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Mainnet launched 🚀 2024-01-24T20:24:00+00:00 2024-01-24T20:24:00+00:00 https://pactus.org/2024/01/24/mainnet-launched Years to Launch
+
+Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time.
+Pactus Mainnet is the result of years of hard work, research, and innovation.
+It started from one idea:
+
+A low-cost, truly decentralized blockchain, built by the people for the people,
+where anyone could run and be their own validator.
+
+We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.
+
+
+
+We want to thank Pactus community for helping us on the Testnet.
+
+You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.
+
+On the Road
+
+The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!
+
+We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!
+
+We Have a Dream
+
+We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.
+
+This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.
+
+And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!
]]> Story of Testnet-2 2024-01-22T00:00:00+00:00 2024-01-22T00:00:00+00:00 https://pactus.org/2024/01/22/testnet-2-concluded What is Testnet?
+
+Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+Summary
+
+In October 2023, we launched Testnet-2 .
+The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.
+
+The committee for Testnet-2 was set to 51 validators,
+and 2084 validators joined during the Testnet period.
+More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network.
+More than 800,000 blocks were created, and about 2 million transactions were processed during this time.
+The size of the blockchain is about 450 megabytes.
+
+About 500,000 coins were staked during this period, almost 60% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+Stability of Consensus
+
+In Testnet-1, we had one consensus failure that caused us to
+conclude the Testnet-1 .
+During Testnet-2, there were no issues with the consensus mechanism, and
+we had no case of failure during the testing period,
+although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor.
+It proved that the consensus mechanism is in a stable situation.
+
+Networking issues
+
+In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem.
+In the second blockage, we had no choice but to ask active validators inside the committee to
+update their nodes to overcome the networking issue.
+The development team faced a difficult situation and had to make the proper decision to fix the networking issues.
+On one hand, the networking traffic increased significantly, and on the other hand, we had to
+make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems.
+After examining different scenarios, the networking issues were resolved, and
+no major problems were reported till the end of Testnet.
+
+Major updates
+
+During Testnet-2, we introduced several updates, including versions
+0.15.0 ,
+0.16.0 ,
+0.17.0 ,
+0.18.0 ,
+0.19.0 , and
+0.20.0 .
+The update process went smoothly, and with the stability of Version 0.20.0 confirmed,
+the development team shifted its focus to the Mainnet launch.
+
+
+
+This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+We are grateful to all those who participated in Testnets, and we encourage them to join the Mainnet.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
]]> Pactus 0.20.0 Released 2024-01-11T00:00:00+00:00 2024-01-11T00:00:00+00:00 https://pactus.org/2024/01/11/release-0-20-0 Overview
+
+Pactus Blockchain Version 0.20.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+Validator Stake Management
+
+The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.
+
+
+
+Improving Network Connectivity
+
+Some users have reported that UDP packets are being dropped by their Internet Service Providers.
+Therefore, the UDP protocol is disabled by default.
+Users can still activate the UDP protocol by configuring the settings in the file if necessary.
+
+Also, the experimental Node Gossip feature has been removed in this version.
+Node gossip could cause some validators to become isolated from the rest of the network.
+
+Relay service
+
+This version enables users to turn their node into a relay service.
+A relay service node can help users behind NAT to communicate with each other.
+It is disabled by default and can be enabled inside the config file.
+Please note that it is still in an experimental state.
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ implement relay service (#931 )
+ HTTP : Integrate AddRowDouble and update tests (#926 )
+ network : making listen address private in config (#921 )
+ http : adding AvailabilityScore to http module (#917 )
+ network : adding ‘enable_udp’ config (#918 )
+ network : removing gossip node service (#916 )
+ gRPC : adding AvailabilityScore to gRPC (#910 )
+ GUI : unbond and withdraw transaction dialogs (#908 )
+
+
+Fix
+
+
+ gRPC : adding missing get raw transaction APIs to gRPC gateway (#925 )
+ network : preventing self dial (#924 )
+ fixing time lag on starting node (#923 )
+ network : fixing network deadlock on linux arm64 (#922 )
+ GUI : updating unbond and withdraw dialogs (#911 )
+ fixing gRPC node info issue (#906 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus records its IPs in IPMINTER 2024-01-10T00:00:00+00:00 2024-01-10T00:00:00+00:00 https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminter
+
+In our continuous pursuit of innovation, the recording of our intellectual property is the
+cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a
+slow and expensive hurdle. That is… until we discovered IPMINTER!
+
+Pactus profile in IPMINTER
+
+We are ecstatic to announce that the blockchain-based platform by IPMINTER has
+revolutionized the way we secure our creations.
+
+Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our
+intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes!
+Plus, the moment we received our exquisite certificate, complete with a QR code directly linking
+to our secure blockchain entry, our confidence in this platform soared.
+
+Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission
+to protect our inventive proposals. The assurance we’ve experienced using their platform has
+been unparalleled.
+
+We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward,
+economical, and robust IP recording solution. They have our heartfelt endorsement!
+
+Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!
]]>Mainnet announcement 2024-01-08T00:00:00+00:00 2024-01-08T00:00:00+00:00 https://pactus.org/2024/01/08/mainnet-announcement The much-awaited Mainnet Launch of The Pactus Blockchain is finally here!
+On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block ,
+will be minted by four Bootstrap validators.
+After that, every 10 seconds, a new block will be added to the blockchain.
+Each block contains the committed transactions in the network.
+The block finality in the Pactus blockchain is immediate.
+It means that there is no need to wait for block confirmation to ensure a transaction is committed.
+
+Later, more than 2000 community validators will secure the blockchain and make it decentralized.
+These validators are Testnet participants who helped test Pactus during our testing period.
+The community validators will receive the initial staking coins from a Discord Bot named RoboPac.
+
+To ensure everything works smoothly on the Mainnet, three different Testnets (
+Testnet0 ,
+Testnet1 , and
+Testnet2 ) have been run.
+
+The Mainnet will never be stopped or interrupted by the core developers of Pactus,
+and validators should primarily participate in and maintain the security of the blockchain.
]]> Pactus 0.19.0 Released 2024-01-04T00:00:00+00:00 2024-01-04T00:00:00+00:00 https://pactus.org/2024/01/04/release-0-19-0 Overview
+
+Pactus Blockchain Version 0.19.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+This version has improved the overall performance of the blockchain by implementing
+PIP-15 .
+PIP-15 suggests to add caching algorithms to the database for the most frequently used items.
+
+Additionally, this version has enhanced the connectivity of the nodes in the P2P network.
+
+Availability Score
+
+This version comes with the implementation of PIP-19 .
+PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the
+committee .
+Validators with a score less than 0.8 won’t receive the block reward,
+as their proposals will be rejected by other validators.
+The main reason behind this PIP is to prevent users from downgrading
+their node specifications and running Pactus on machines with low resources.
+
+Breaking change
+
+The Docker container now contains both daemon and wallet binary files.
+Users who use Docker to run Pacts now need to add the entry point to run Pactus.
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gRPC : defining network and peers info response’s properly (#898 )
+ implementing pip-19 (#899 )
+ network : disabling GosipSub, only FloodSub (#895 )
+ www : adding change proposer round and value to consensus info votes (#892 )
+ network : adding relay service to dial relay nodes (#887 )
+ implementing pip-15 (#843 )
+ check already running by lock file (#871 )
+
+
+Fix
+
+
+ store : use cache to check if public key exists (#902 )
+ executor : not rejecting bond transaction for bootstrap validator (#901 )
+ GUI : removing unnecessary tags in transaction confirm dialog (#893 )
+ network : close relay connection for public node (#891 )
+ network : refining GossipSubParams for Gossiper node (#882 )
+ sync : adding sequence number to the bundle (#881 )
+ network : turn off mesh for gossiper node (#880 )
+ consensus : check voteset for CP strong termination (#879 )
+ adding querier to query messages (#878 )
+ execution : fixing issue #869 (#870 )
+ fixing logger issue on rotating log file (#859 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.18.0 Released 2023-12-12T00:00:00+00:00 2023-12-12T00:00:00+00:00 https://pactus.org/2023/12/12/release-0-18-0 Overview
+
+Pactus Blockchain Version 0.18.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+This version has significantly improved the syncing progress.
+The syncing process concurrently requests blocks from 8 different peers and
+actively connects to the most optimal peers for downloading the blockchain.
+
+Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.
+
+Breaking change
+
+For Unix-based systems, please note that the working directory for root users has changed from /pactus
to /root/pactus
.
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After you update the node, the configuration file will automatically get updated, keeping the old settings.
+If you want to return the configuration file to its default settings,
+just delete the current config file and restart the node.
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ implement pip-14 (#841 )
+ sort wallet addresses (#836 )
+ grpc : endpoints for creating raw transaction (#838 )
+ network reachability API (#834 )
+ implement pip-13 (#835 )
+ subscribing to libp2p eventbus (#831 )
+ implement helper methods for wallet address path (#830 )
+ logger : adding rotate log file after days, compress and maxgae for logger config (#822 )
+ enable bandwidth router metric (#819 )
+
+
+Fix
+
+
+ network : refining the connection limit (#849 )
+ corrected mistake when retrieving the reward address (#848 )
+ config : restore default config when it is deleted (#847 )
+ cmd : changing home directory for root users (#846 )
+ removing BasicCheck for hash (#845 )
+ disabling libp2p ping protocol (#844 )
+ build docker file (#839 )
+ sync : ignore publishing a block if it is received before (#829 )
+ network : subscribing to the Libp2p event bus (#828 )
+ sync : ignore block request if blocks are already inside the cache (#817 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.17.0 Released 2023-11-12T00:00:00+00:00 2023-11-12T00:00:00+00:00 https://pactus.org/2023/11/12/release-0-17-0 Overview
+
+Pactus Blockchain Version 0.17.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+The Testnet has been upgraded and all validators must update their nodes.
+
+This version will address major networking issues, reduce network usage, and improve overall performance.
+
+A new node type, “Node Gossips ”, has been introduced to help broadcast and spread messages across the network.
+Node Gossips support the network by delivering messages to non-gossiping nodes.
+This gossip option is disabled by default but can be enabled in the configuration file.
+If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node.
+Please note that this option is still experimental and subject to potential changes in future releases.
+
+
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After updating the node, the configuration file will be overwritten with a new version.
+You need to make modifications to the config file if you had customized it prior to the update.
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ network : default configs for bootstrap and relay peers (#812 )
+ introducing node gossip type (#811 )
+ sync : adding remote address to the peer info (#804 )
+ network : adding public address to factory (#795 )
+ network : filter private ips (#793 )
+
+
+Fix
+
+
+ upgrading Testnet (#814 )
+ sync : prevent opening sessions indefinitely (#813 )
+ execution : fixing mistake on calculating unbonded power (#806 )
+ network : check connection threshold on gater (#803 )
+ network : no transient connection (#799 )
+ not close connection for bootstrap nodes (#792 )
+
+
+Refactor
+
+
+ sync : refactoring sync process (#807 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.16.0 Released 2023-10-29T00:00:00+00:00 2023-10-29T00:00:00+00:00 https://pactus.org/2023/10/29/release-0-16-0 Overview
+
+Pactus Blockchain Version 0.16.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+This version allows users to create new addresses for both validators and accounts.
+The networking module has been improved, and users can now set limits on the number of connections.
+A random crash on the agreement protocol has been fixed in this version.
+
+
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gui : display network ID (#780 )
+ create new validator address (CLI and GUI) (#757 )
+ add community bootstrap nodes to testnet config (#764 )
+ network : implementing connection manager (#773 )
+ network : adding bootstrapper mode to the network config (#760 )
+
+
+Fix
+
+
+ network : redefine the network limits (#788 )
+ consensus : not increase the vote-box power on duplicated votes (#785 )
+ network : close connection when unable to get supported protocols (#781 )
+ network : enabling peer exchange for bootstrappers (#779 )
+ network : set connection limit for the resource manager (#775 )
+ sync : peer status set to known on sucessfull handshaking (#774 )
+ consensus : strong termination for the binary agreement (#765 )
+ consensus : not increase the voting power on duplicated binary votes (#762 )
+
+
+Refactor
+
+
+ network : refactoring peer manager (#787 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.15.0 released 2023-10-15T00:00:00+00:00 2023-10-15T00:00:00+00:00 https://pactus.org/2023/10/15/release-0-15-0 Overview
+
+Pactus Blockchain Version 0.15.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+Download
+
+This version is the bootstrap version for
+Testnet-2 .
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to run and configure your node:
+
+
+
+
+ If you participated in Testnet-1, ensure to delete your previous working directory and
+ create a new wallet.
+
+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows,
+ or "~/pactus" on Unix-compatible platforms.
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gui : adding the splash screen (#743 )
+ add absentees votes to the certificate (#746 )
+ logger : short stringer for loggers (#732 )
+ implementing pip-7 (#731 )
+ implementing pip-11 (#712 )
+ implementing pip-8 (#711 )
+ implementing pip-9 (#706 )
+ new API to get Public key by address (#704 )
+ Adding address field for AccountInfo (#703 )
+ CreateValidatorEvent and CreateAccountEvent for nanomsg (#702 )
+ implementing PIP-2 and PIP-3 (#699 )
+ Adding Hole Punching to network (#697 )
+ write logs into file (#673 )
+ check protocol support before sending connect/disconnect event (#683 )
+ updating genesis for pre-testnet-2 (#679 )
+ adding udp protocol for network (#672 )
+ implementing pip-4 (#671 )
+ Notifee service events (#628 )
+ adding MinimumStake parameter (#574 )
+ adding Sent and Received bytes per message metrics for peers (#618 )
+ add reason to BlockResponse messages (#607 )
+ Add CalcualteFee in GRPC (#601 )
+ add sent bytes and received bytes metrics to peerset plus update grpc (#606 )
+ added metrics of libp2p with supporting prometheus (#588 )
+ Check node address is valid (#565 )
+ add LastSent and LastReceived properties to peer (#569 )
+
+
+Fix
+
+
+ data race issue on updating certificate (#747 )
+ network : async connection (#744 )
+ adding query vote timer for CP phase (#738 )
+ trim transactions in proposed block (#737 )
+ fixing query votes and proposal issue (#736 )
+ fixing issue when a block has max transactions (#735 )
+ consensus : anti-entroy mechanism for the consensus (#734 )
+ logger : invalid level parsing error (#733 )
+ cache certificate by height (#730 )
+ fixing a crash on consensus (#729 )
+ consensus : prevent double entry in new height (#728 )
+ resolve consensus halt caused by time discrepancy in network. (#727 )
+ unsorted addresses in wallet listing (#721 )
+ send query votes message, if there is no proposal yet (#723 )
+ fixing logger level issue (#722 )
+ fixing syncing stuck issue (#720 )
+ fixing some minor issues on pre-testnet (#719 )
+ supporting go version 1.21 and higher (#692 )
+ ensure log rotation using tests (#693 )
+ restoring at the first block (#691 )
+ swagger doesn’t work with multiple proto files (#687 )
+ fixing wallet-cli issues (#686 )
+ prevent stripping public key for subsidy transactions (#678 )
+ updating the consensus protocol (#668 )
+ aggregating signature for hello message (#640 )
+ error case for logger (#634 )
+ adding committers to the certificate (#623 )
+ updating sortition executor (#608 )
+ update buf and fixing proto generation issue (#600 )
+ adding block hash to peer (#584 )
+ copy to clipboard option for address and pubkey (#583 )
+ public key aggregate (#576 )
+ remove GetValidators rpc method (#573 )
+ missing swagger ui for grpc get account by number (#564 )
+ incorrect handler for validator by number (#563 )
+
+
+Refactor
+
+
+ sync : refactoring syncing process (#676 )
+ remove payload prefix from payload transaction type (#669 )
+ change Hello message from broadcasting to direct messaging (#665 )
+ committee : using generic list for validators (#667 )
+ rename SanityCheck to BasicCheck (#643 )
+ cli : Migrating from mow.cli to cobra for wallet (#629 )
+ cli : replacing mow.cli with cobra for daemon (#621 )
+ logger : using fast JSON logger (zerolog) (#613 )
+ Using Generics for calculating Min and Max for numeric type #604 (#609 )
+ Updating LRU cache to version 2 #514 (#602 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Testnet-2 launch announcement 2023-10-15T00:00:00+00:00 2023-10-15T00:00:00+00:00 https://pactus.org/2023/10/15/testnet-2-launched Overview
+
+Exciting news for the Pactus Community: Testnet-2 is has launched!
+The journey through Testnet-1
+brought success and invaluable experiences, with over 500 validators joining the network.
+Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and
+thoroughly address these issues.
+After two months of dedicated work and testing, many problems have been resolved, and
+we feel confident launching the Testnet again.
+Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain.
+Notably, the new consensus mechanism and improved overall network performance.
+
+At this point, we want to assure the Pactus community that this version of
+the Testnet will not stop until the mainnet launches ,
+and our main focus is on improving its overall performance and launching the Mainnet.
+
+If you’re new to the concept of Testnet, check out our informative post:
+What is the Testnet?
+
+Key Focus Areas
+
+Testnet-2 has important tasks ahead.
+Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient.
+A close eye will be kept on the network’s performance, ensuring it operates as expected.
+For Testnet-2, the committee
+size has been expanded to 51 members.
+Both the committee’s performance and block production will be closely monitored.
+The goal is a blockchain that remains stable and trustworthy,
+even with thousands of validators in the network,
+ensuring it manages its regular duties seamlessly.
+
+How To Join
+
+Want to join the Testnet-2? Great! It’s super easy.
+Just download the latest Pactus software and you’re good to go.
+no fancy setups or special gear needed.
+You can run the software straight from your personal computer or laptop.
+Need some test coins? Pop over to our Discord channel and share your validator address there.
+
+Benefits for Participation
+
+By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and
+be well-prepared for the Mainnet launch.
+Testnet participants will also receive higher priority during the Mainnet launch and
+get free coins for initial staking on the Mainnet.
+
+Your Feedback Matters
+
+User feedback plays a vital role in the improvement of the Pactus blockchain.
+Share your thoughts and experiences to contribute to the enhancement of future software versions.
]]> How SSPoS (Solid State Proof of Stake) works in simple word 2023-09-28T00:00:00+00:00 2023-09-28T00:00:00+00:00 https://pactus.org/2023/09/28/how-sspos-works-in-simple-word Abstract
+
+In all Blockchain protocols, there is a concept called a consensus mechanism.
+This mechanism is used to enable nodes to reach an agreement
+on the state of the Blockchain they are
+maintaining, in order to have a synchronized and integrated Blockchain.
+
+For now, we have a lot of consensus mechanisms in the Blockchain world.
+Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.
+
+To explain how it works let’s start with explaining one of the first and simplest
+consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).
+
+
+
+PoW (Proof of Work)
+
+In the proof of work model, each node in the network should solve a complex mathematical
+problem that requires lots of computing resources to make a new block.
+
+In this way, it’s highly unlikely that anyone would be able to change
+past transactions and change Blockchain states such as balances,
+without expending equivalent computational power.
+
+By doing this we ensure the security and integrity of the Blockchain.
+
+The concept was adapted from digital tokens by Hal Finney in 2004
+through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).
+
+Bitcoin uses this consensus model.
+
+PoS (Proof of Stake)
+
+On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!
+
+Validators lock a number of their assets in the Blockchain and they can transfer or use it
+till it is locked which we call staking.
+after each Block is committed one of the validators will be chosen randomly (more amount of stake,
+more chance to be chosen) when a validator is chosen
+it proposes a block and announces it to other nodes to be validated,
+when a supermajority of validators accept the block it’s going to be committed.
+
+In this system, validators have no incentive to behave maliciously or dishonestly.
+If they do, they risk losing the stake amount.
+
+More amount of validators in a PoS Blockchain makes it more secure,
+decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.
+
+Ethereum uses this model.
+
+DPoS (Delegated Proof of Stake)
+
+DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm.
+users entrust their stakes to a small group of “delegates”.
+These delegates are responsible for validating transactions
+and creating blocks. The number of delegates is limited
+to ensure accountability and efficiency in the validation process.
+
+Some Blockchains like Cardano and Tron use DPoS.
+
+DPoS tries to solve the issue of PoS which when validators
+increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot
+of trust in the hands of a small number of delegates,
+which goes against the principle of “don’t trust, verify”.
+
+SSPoS (Solid State Proof of Stake)
+
+BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?
+
+In Pactus Blockchain, we have something called Solid State Proof of Stake
+and we try to fix the previous model’s issue, let me explain.
+
+Pactus uses a dynamic committee of validators with a fixed size of 51,
+but the members of the committee randomly change in each round,
+based on stake amount the chance of being chosen is higher. on the other hand,
+the number of validators out on the committee is unlimited, allowing anyone
+to become a validator by staking coins.
+
+At each block, validators participate in a sortition algorithm by generating a random number
+between zero and the total staked coins. If the number is less
+than the validator’s stake, they can enter the committee and replace the oldest committee member.
+
+So, in SSPoS models which are a variant of PoS, we can reach a consensus,
+without using high computation resources, having an inefficient
+validation process by increasing validator numbers,
+and also without breaking the principle of “don’t trust, verify”.
]]> Dev Report pre-testnet2 2023-09-24T00:00:00+00:00 2023-09-24T00:00:00+00:00 https://pactus.org/2023/09/24/dev-report-pre-testnet-2 Abstract
+
+there is several activities in Pactus github in September month, here is a clear report and explain of activities.
+
+
+
+Implementing PIP 2, 3 and 4
+
+After starting Pactus Labs and PIPs ,
+we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:
+
+
+
+Network
+
+There is some very good change and new features for Pactus network module,
+this list contain a list of important changes in Pactus networking:
+
+
+
+gRPC and nanomessage services
+
+We also updated, improved and enhanced gRPC and nanomessage services for better developer experience,
+for third-party and side project developers, here is some changes:
+
+
+
+Refactoring and other new feature or debugs
+
+We had some not implemented feature request, not fixed bugs and some issue with new golang version,
+list of this changes:
+
+]]> Introduction to PIPs 2023-09-04T00:00:00+00:00 2023-09-04T00:00:00+00:00 https://pactus.org/2023/09/04/introduction-to-pips Introduction to PIPs
+
+In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey:
+the Pactus Improvement Proposals, or PIPs.
+
+
+
+What are PIPs?
+
+Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform.
+Each PIP has a unique number like PIP-2 ,
+PIP-3 , and so on.
+These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.
+
+The PIP process
+
+The PIP process is open, allowing any member of the Pactus community to propose a PIP.
+The author should provide a summary, motivation, and a detailed technical explanation.
+The Pactus Laboratory team will carefully review each PIP.
+Security considerations must be addressed before finalizing a PIP.
+Once finalized, it can be added to the code.
+This process helps avoid unexpected issues during development and maintain consistency and safety.
+
+The Origins of PIPs
+
+The Pactus Improvement Proposals (PIPs) was inspired by the
+Ethereum Improvement Proposals (EIPs ) system,
+which had its roots in the Bitcoin Improvement Proposals (BIPs ) and
+Python Enhancement Proposals (PEPs ).
+
+New Feature Policy
+
+From now on, all major changes or new features in the Pactus project require a PIP.
+Any implementation must reference its specific PIP.
+Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.
+
+PIPs Repository
+
+For a complete list of Pactus Improvement Proposals, visit this link .
+The corresponding GitHub repository is accessible here .
+
+
]]> Dev report 2023-08-22T00:00:00+00:00 2023-08-22T00:00:00+00:00 https://pactus.org/2023/08/22/dev-report Abstract
+
+there is several activities in Pactus github this month, here is a clear report and explain of activities.
+
+
+
+Linters
+
+one of new changes in Pactus project is new linters we added this month.
+what is linters?
+linters are just a set of rules for the style of source codes, they force developers to write new codes
+in correct, clean and safe way.
+
+why we use them?
+the reason we are using linters in Pactus and add new ones, is to make the code more safe,
+and also make it easy to work on for new contributors because we are focus on being decentralized even in development.
+
+Linters we added till now
+
+TLA+ spec
+
+one another new change in Pactus is updating TLA+ spec, which is related to consensus,
+as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.
+
+link to changes
+
+if you wish you can learn more about Pactus consensus here.
+
+Refactoring
+
+some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries.
+also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.
+
+one of refactors
]]> Story of Testnet-1 2023-08-01T00:00:00+00:00 2023-08-01T00:00:00+00:00 https://pactus.org/2023/08/01/testnet-1-concluded What is Testnet?
+
+Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+Summary
+
+In May 2023, we launched Testnet-1 .
+The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain.
+The development team also focused on evaluating the network’s performance.
+Additionally, the overall performance of the software and the syncing process were closely examined and assessed.
+
+The committee for Testnet-1 was set to 21 validators,
+and 584 validators joined during the Testnet period.
+More than 600,000 blocks were created, and more than 1 million transactions were processed during this time.
+The size of the blockchain is about 300 megabytes.
+
+About 300,000 coins were staked during this period, it was almost 50% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+
+
+We were able to extract the confirmation time of transactions.
+More than 97% of transactions were confirmed in just one block after submission.
+This indicates that the transaction pool and broadcasting models are working fine.
+
+
+
+Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases.
+More than 97% of blocks are committed in the first rounds.
+
+
+
+Major updates
+
+During Testnet-1, we released three versions(Version
+0.11.0 ,
+0.12.0 ,
+0.13.0 ), and the upgrade process was smooth.
+Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future.
+The consensus failure was resolved by requiring some validators to re-sync their nodes.
+At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible,
+including:
+
+
+ Improving the consensus protocol
+ Reducing the blockchain size
+ Optimizing the network usage
+
+
+After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.
+
+
+
+This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+We are grateful to all those who participated in Testnet-1, and
+we encourage them to join our next Testnet to help us improve Pactus.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
]]> Dev meeting 2023-07-09T00:00:00+00:00 2023-07-09T00:00:00+00:00 https://pactus.org/2023/07/09/dev-meeting Meeting Summary
+
+The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+Overview to the Network Module
+
+The meeting began with an overview of the Network module in Pactus.
+This module uses Libp2p as its underlying network protocol.
+
+The Network module is agnostic about the content of the message and
+handles two types of messages: Gossip messages, which are broadcasted,
+and Stream messages, which are sent directly to a specific peer.
+The team discussed the relay nodes that enable communication for nodes behind NAT.
+Upon receiving a message, the module publishes an event.
+The two types of events are Gossip events and Steam events.
+
+
+
+The team discussed the issue of Relay connections resetting, and explored solutions such as
+hole punching or using UDP and IPv6.
+
+Some users in the Testnet reported high network usage.
+The team discussed implementing metrics for LibP2P to monitor network usage effectively.
+The discussion related to this issue can be found here .
+Additionally, the team discussed the customization of network resources,
+including setting limits for inbound and outbound connections.
+
+Overview to the Sync Module
+
+Moving on, the Sync module was discussed.
+Unlike the Network module, the Sync module has full knowledge about the messages and packets.
+The module handles a range of message types, which can be found
+here .
+
+It was suggested that we need to define metrics for each message type.
+There was also a discussion about the need for reducing the messages to optimize the use of network resources.
+
+The team decided to continue discussing these topics in future meetings.
+They also plan to work on improving the Network and Sync modules based on these discussions.
]]>
\ No newline at end of file
diff --git a/ar/index.html b/ar/index.html
new file mode 100644
index 000000000..fbc1b82b9
--- /dev/null
+++ b/ar/index.html
@@ -0,0 +1,601 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ الصفحة الرئيسية | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
بلوكشين بكتوس
+
Building decentralized future together!
+
+
+
+
+
+
+
+
+
+
تشغيل عقدة
+ قم بتنزيل أحدث إصدار من بلوكشين بكتوس، وقم بإنشاء محفظتك وابدأ في المزامنة مع الشبكة. تم تصميم بكتوس ليكون خفيف الوزن وسهل الاستخدام، مما يجعل التشغيل بسيطًا.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
احصل على بعض العملات
+ بمجرد تشغيل عقدتك وبدء تشغيلها، ستحتاج إلى الحصول على بعض العملات لتصبح مُصدِّق. يمكنك الانضمام إلى مجتمعنا واستلام بعض عملات الحصة مجانًا.
+
+
+
+
+
+
+
+
كن مُصدِّق
+ من خلال تعيين بعض العملات، ستتحول عقدتك إلى مصدق وبالتالي، في كل مرة تقترح فيها كتلة، ستتم مكافأتك بعملة جديدة كمكافأة للكتلة.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
جعل بكتوس أفضل
+ هناك العديد من الطرق التي يمكنك من خلالها دعم بكتوس ومساعدته في النمو. لنعمل معًا لجعل بكتوس أفضل!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/api/grpc/index.html b/ar/learn/api/grpc/index.html
new file mode 100644
index 000000000..0ea0c57f2
--- /dev/null
+++ b/ar/learn/api/grpc/index.html
@@ -0,0 +1,3656 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ gRPC API Reference | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
gRPC API Reference
+
+
Each node in the Pactus network can be configured to use the gRPC protocol for communication.
+Here you can find the list of all gRPC methods and messages.
+
+
Table of Contents
+
+
+
+ Transaction Service
+
+
+ Blockchain Service
+
+
+ Network Service
+
+
+ Wallet Service
+
+
+
+ Messages and Enums
+
+
+
+
+
+
Transaction Service transaction.proto
+
Transaction service defines various RPC methods for interacting with transactions.
+
GetTransaction rpc
+
+
+
GetTransaction retrieves transaction details based on the provided request parameters.
+
CalculateFee rpc
+
+
+
CalculateFee calculates the transaction fee based on the specified amount and payload type.
+
BroadcastTransaction rpc
+
+
+
BroadcastTransaction broadcasts a signed transaction to the network.
+
GetRawTransferTransaction rpc
+
+
+
GetRawTransferTransaction retrieves raw details of a transfer transaction.
+
GetRawBondTransaction rpc
+
+
+
GetRawBondTransaction retrieves raw details of a bond transaction.
+
GetRawUnBondTransaction rpc
+
+
+
GetRawUnBondTransaction retrieves raw details of an unbond transaction.
+
GetRawWithdrawTransaction rpc
+
+
+
GetRawWithdrawTransaction retrieves raw details of a withdraw transaction.
+
Blockchain Service blockchain.proto
+
Blockchain service defines RPC methods for interacting with the blockchain.
+
GetBlock rpc
+
+
+
GetBlock retrieves information about a block based on the provided request parameters.
+
GetBlockHash rpc
+
+
+
GetBlockHash retrieves the hash of a block at the specified height.
+
GetBlockHeight rpc
+
+
+
GetBlockHeight retrieves the height of a block with the specified hash.
+
GetBlockchainInfo rpc
+
+
+
GetBlockchainInfo retrieves general information about the blockchain.
+
GetConsensusInfo rpc
+
+
+
GetConsensusInfo retrieves information about the consensus instances.
+
GetAccount rpc
+
+
+
GetAccount retrieves information about an account based on the provided address.
+
GetValidator rpc
+
+
+
GetValidator retrieves information about a validator based on the provided address.
+
GetValidatorByNumber rpc
+
+
+
GetValidatorByNumber retrieves information about a validator based on the provided number.
+
GetValidatorAddresses rpc
+
+
+
GetValidatorAddresses retrieves a list of all validator addresses.
+
GetPublicKey rpc
+
+
+
GetPublicKey retrieves the public key of an account based on the provided address.
+
Network Service network.proto
+
Network service provides RPCs for retrieving information about the network.
+
GetNetworkInfo rpc
+
+
+
GetNetworkInfo retrieves information about the overall network.
+
GetNodeInfo rpc
+
+
+
GetNodeInfo retrieves information about a specific node in the network.
+
Wallet Service wallet.proto
+
Define the Wallet service with various RPC methods for wallet management.
+
CreateWallet rpc
+
+
+
CreateWallet creates a new wallet with the specified parameters.
+
LoadWallet rpc
+
+
+
LoadWallet loads an existing wallet with the given name.
+
UnloadWallet rpc
+
+
+
UnloadWallet unloads a currently loaded wallet with the specified name.
+
LockWallet rpc
+
+
+
LockWallet locks a currently loaded wallet with the provided password and timeout.
+
UnlockWallet rpc
+
+
+
UnlockWallet unlocks a locked wallet with the provided password and timeout.
+
SignRawTransaction rpc
+
+
+
SignRawTransaction signs a raw transaction for a specified wallet.
+
GetValidatorAddress rpc
+
+
+
GetValidatorAddress retrieves the validator address associated with a public key.
+
Messages and Enums
+
+BroadcastTransactionRequest
+msg
+
+
Request message for broadcasting a signed transaction.
+
+
+
+ Field Type Description
+
+
+
+ signed_raw_transaction
+
+ bytes
+
+ Signed raw transaction data.
+
+
+
+
+BroadcastTransactionResponse
+msg
+
+
Response message containing the ID of the broadcasted transaction.
+
+
+
+ Field Type Description
+
+
+
+ id
+
+ bytes
+
+ Transaction ID.
+
+
+
+
+CalculateFeeRequest
+msg
+
+
Request message for calculating transaction fee.
+
+
+
+ Field Type Description
+
+
+
+ amount
+
+ int64
+
+ Transaction amount.
+
+
+ payloadType
+
+ PayloadType
+
+ Type of transaction payload.
+
+
+
+
+CalculateFeeResponse
+msg
+
+
Response message containing the calculated transaction fee.
+
+
+
+ Field Type Description
+
+
+
+ fee
+
+ int64
+
+ Calculated transaction fee.
+
+
+
+
+GetRawBondTransactionRequest
+msg
+
+
Request message for retrieving raw details of a bond transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ stake
+
+ int64
+
+ Stake amount.
+
+
+ public_key
+
+ string
+
+ Public key of the validator.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetRawTransactionResponse
+msg
+
+
Response message containing raw transaction data.
+
+
+
+ Field Type Description
+
+
+
+ raw_transaction
+
+ bytes
+
+ Raw transaction data.
+
+
+
+
+GetRawTransferTransactionRequest
+msg
+
+
Request message for retrieving raw details of a transfer transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ amount
+
+ int64
+
+ Transaction amount.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetRawUnBondTransactionRequest
+msg
+
+
Request message for retrieving raw details of an unbond transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ validator_address
+
+ string
+
+ Address of the validator to unbond from.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetRawWithdrawTransactionRequest
+msg
+
+
Request message for retrieving raw details of a withdraw transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ validator_address
+
+ string
+
+ Address of the validator to withdraw from.
+
+
+ account_address
+
+ string
+
+ Address of the account to withdraw to.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ amount
+
+ int64
+
+ Withdrawal amount.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetTransactionRequest
+msg
+
+
Request message for retrieving transaction details.
+
+
+
+ Field Type Description
+
+
+
+ id
+
+ bytes
+
+ Transaction ID.
+
+
+ verbosity
+
+ TransactionVerbosity
+
+ Verbosity level for transaction details.
+
+
+
+
+GetTransactionResponse
+msg
+
+
Response message containing details of a transaction.
+
+
+
+ Field Type Description
+
+
+
+ block_height
+
+ uint32
+
+ Height of the block containing the transaction.
+
+
+ block_time
+
+ uint32
+
+ Time of the block containing the transaction.
+
+
+ transaction
+
+ TransactionInfo
+
+ Information about the transaction.
+
+
+
+
+PayloadBond
+msg
+
+
Payload for a bond transaction.
+
+
+
+ Field Type Description
+
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ stake
+
+ int64
+
+ Stake amount.
+
+
+
+
+PayloadSortition
+msg
+
+
Payload for a sortition transaction.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address associated with the sortition.
+
+
+ proof
+
+ bytes
+
+ Proof for the sortition.
+
+
+
+
+PayloadTransfer
+msg
+
+
Payload for a transfer transaction.
+
+
+
+ Field Type Description
+
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ amount
+
+ int64
+
+ Transaction amount.
+
+
+
+
+PayloadUnbond
+msg
+
+
Payload for an unbond transaction.
+
+
+
+ Field Type Description
+
+
+
+ validator
+
+ string
+
+ Address of the validator to unbond from.
+
+
+
+
+PayloadWithdraw
+msg
+
+
Payload for a withdraw transaction.
+
+
+
+ Field Type Description
+
+
+
+ from
+
+ string
+
+ Address to withdraw from.
+
+
+ to
+
+ string
+
+ Address to withdraw to.
+
+
+ amount
+
+ int64
+
+ Withdrawal amount.
+
+
+
+
+TransactionInfo
+msg
+
+
Information about a transaction.
+
+
+
+ Field Type Description
+
+
+
+ id
+
+ bytes
+
+ Transaction ID.
+
+
+ data
+
+ bytes
+
+ Transaction data.
+
+
+ version
+
+ int32
+
+ Transaction version.
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ value
+
+ int64
+
+ Transaction value.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ payloadType
+
+ PayloadType
+
+ Type of transaction payload.
+
+
+ transfer
+
+ PayloadTransfer
+
+ Transfer payload.
+
+
+ bond
+
+ PayloadBond
+
+ Bond payload.
+
+
+ sortition
+
+ PayloadSortition
+
+ Sortition payload.
+
+
+ unbond
+
+ PayloadUnbond
+
+ Unbond payload.
+
+
+ withdraw
+
+ PayloadWithdraw
+
+ Withdraw payload.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+ public_key
+
+ string
+
+ Public key associated with the transaction.
+
+
+ signature
+
+ bytes
+
+ Transaction signature.
+
+
+
+
+AccountInfo
+msg
+
+
Message containing information about an account.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the account.
+
+
+ data
+
+ bytes
+
+ Account data.
+
+
+ number
+
+ int32
+
+ Account number.
+
+
+ balance
+
+ int64
+
+ Account balance.
+
+
+ address
+
+ string
+
+ Address of the account.
+
+
+
+
+
Message containing information about the header of a block.
+
+
+
+ Field Type Description
+
+
+
+ version
+
+ int32
+
+ Block version.
+
+
+ prev_block_hash
+
+ bytes
+
+ Hash of the previous block.
+
+
+ state_root
+
+ bytes
+
+ State root of the block.
+
+
+ sortition_seed
+
+ bytes
+
+ Sortition seed of the block.
+
+
+ proposer_address
+
+ string
+
+ Address of the proposer of the block.
+
+
+
+
+CertificateInfo
+msg
+
+
Message containing information about a certificate.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the certificate.
+
+
+ round
+
+ int32
+
+ Round of the certificate.
+
+
+ committers
+ repeated
+ int32
+
+ List of committers in the certificate.
+
+
+ absentees
+ repeated
+ int32
+
+ List of absentees in the certificate.
+
+
+ signature
+
+ bytes
+
+ Certificate signature.
+
+
+
+
+ConsensusInfo
+msg
+
+
Message containing information about consensus.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address of the consensus instance.
+
+
+ Active
+
+ bool
+
+ Whether the consensus instance is active.
+
+
+ height
+
+ uint32
+
+ Height of the consensus instance.
+
+
+ round
+
+ int32
+
+ Round of the consensus instance.
+
+
+ votes
+ repeated
+ VoteInfo
+
+ List of votes in the consensus instance.
+
+
+
+
+GetAccountRequest
+msg
+
+
Message to request account information based on an address.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address of the account.
+
+
+
+
+GetAccountResponse
+msg
+
+
Message containing the response with account information.
+
+
+
+ Field Type Description
+
+
+
+ account
+
+ AccountInfo
+
+ Account information.
+
+
+
+
+GetBlockHashRequest
+msg
+
+
Message to request block hash based on height.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+
+
+GetBlockHashResponse
+msg
+
+
Message containing the response with the block hash.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the block.
+
+
+
+
+GetBlockHeightRequest
+msg
+
+
Message to request block height based on hash.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the block.
+
+
+
+
+GetBlockHeightResponse
+msg
+
+
Message containing the response with the block height.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+
+
+GetBlockRequest
+msg
+
+
Message to request block information based on height and verbosity.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+ verbosity
+
+ BlockVerbosity
+
+ Verbosity level for block information.
+
+
+
+
+GetBlockResponse
+msg
+
+
Message containing the response with block information.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+ hash
+
+ bytes
+
+ Hash of the block.
+
+
+ data
+
+ bytes
+
+ Block data.
+
+
+ block_time
+
+ uint32
+
+ Block timestamp.
+
+
+ header
+
+ BlockHeaderInfo
+
+ Block header information.
+
+
+ prev_cert
+
+ CertificateInfo
+
+ Certificate information of the previous block.
+
+
+ txs
+ repeated
+ TransactionInfo
+
+ List of transactions in the block.
+
+
+
+
+GetBlockchainInfoRequest
+msg
+
+
Message to request general information about the blockchain.
+
Message has no fields.
+
+GetBlockchainInfoResponse
+msg
+
+
Message containing the response with general blockchain information.
+
+
+
+ Field Type Description
+
+
+
+ last_block_height
+
+ uint32
+
+ Height of the last block.
+
+
+ last_block_hash
+
+ bytes
+
+ Hash of the last block.
+
+
+ total_accounts
+
+ int32
+
+ Total number of accounts.
+
+
+ total_validators
+
+ int32
+
+ Total number of validators.
+
+
+ total_power
+
+ int64
+
+ Total power in the blockchain.
+
+
+ committee_power
+
+ int64
+
+ Power of the committee.
+
+
+ committee_validators
+ repeated
+ ValidatorInfo
+
+ List of committee validators.
+
+
+
+
+GetConsensusInfoRequest
+msg
+
+
Message to request consensus information.
+
Message has no fields.
+
+GetConsensusInfoResponse
+msg
+
+
Message containing the response with consensus information.
+
+
+
+ Field Type Description
+
+
+
+ instances
+ repeated
+ ConsensusInfo
+
+ List of consensus instances.
+
+
+
+
+GetPublicKeyRequest
+msg
+
+
Message to request public key based on an address.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address for which public key is requested.
+
+
+
+
+GetPublicKeyResponse
+msg
+
+
Message containing the response with the public key.
+
+
+
+ Field Type Description
+
+
+
+ public_key
+
+ string
+
+ Public key of the account.
+
+
+
+
+GetValidatorAddressesRequest
+msg
+
+
Message to request validator addresses.
+
Message has no fields.
+
+GetValidatorAddressesResponse
+msg
+
+
Message containing the response with a list of validator addresses.
+
+
+
+ Field Type Description
+
+
+
+ addresses
+ repeated
+ string
+
+ List of validator addresses.
+
+
+
+
+GetValidatorByNumberRequest
+msg
+
+
Message to request validator information based on a validator number.
+
+
+
+ Field Type Description
+
+
+
+ number
+
+ int32
+
+ Validator number.
+
+
+
+
+GetValidatorRequest
+msg
+
+
Message to request validator information based on an address.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address of the validator.
+
+
+
+
+GetValidatorResponse
+msg
+
+
Message containing the response with validator information.
+
+
+
+ Field Type Description
+
+
+
+ validator
+
+ ValidatorInfo
+
+ Validator information.
+
+
+
+
+ValidatorInfo
+msg
+
+
Message containing information about a validator.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the validator.
+
+
+ data
+
+ bytes
+
+ Validator data.
+
+
+ public_key
+
+ string
+
+ Public key of the validator.
+
+
+ number
+
+ int32
+
+ Validator number.
+
+
+ stake
+
+ int64
+
+ Validator stake.
+
+
+ last_bonding_height
+
+ uint32
+
+ Last bonding height.
+
+
+ last_sortition_height
+
+ uint32
+
+ Last sortition height.
+
+
+ unbonding_height
+
+ uint32
+
+ Unbonding height.
+
+
+ address
+
+ string
+
+ Address of the validator.
+
+
+ availability_score
+
+ double
+
+ Availability score of the validator.
+
+
+
+
+VoteInfo
+msg
+
+
Message containing information about a vote.
+
+
+
+ Field Type Description
+
+
+
+ type
+
+ VoteType
+
+ Type of the vote.
+
+
+ voter
+
+ string
+
+ Voter's address.
+
+
+ block_hash
+
+ bytes
+
+ Hash of the block being voted on.
+
+
+ round
+
+ int32
+
+ Round of the vote.
+
+
+ cp_round
+
+ int32
+
+ Consensus round of the vote.
+
+
+ cp_value
+
+ int32
+
+ Consensus value of the vote.
+
+
+
+
+GetNetworkInfoRequest
+msg
+
+
Request message for retrieving overall network information.
+
Message has no fields.
+
+GetNetworkInfoResponse
+msg
+
+
Response message containing information about the overall network.
+
+
+
+ Field Type Description
+
+
+
+ network_name
+
+ string
+
+ Name of the network.
+
+
+ total_sent_bytes
+
+ uint32
+
+ Total bytes sent across the network.
+
+
+ total_received_bytes
+
+ uint32
+
+ Total bytes received across the network.
+
+
+ connected_peers_count
+
+ uint32
+
+ Number of connected peers.
+
+
+ connected_peers
+ repeated
+ PeerInfo
+
+ List of connected peers.
+
+
+ sent_bytes
+ repeated
+ GetNetworkInfoResponse.SentBytesEntry
+
+ Bytes sent per peer ID.
+
+
+ received_bytes
+ repeated
+ GetNetworkInfoResponse.ReceivedBytesEntry
+
+ Bytes received per peer ID.
+
+
+
+
+GetNetworkInfoResponse.ReceivedBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ uint32
+
+
+
+
+ value
+
+ uint64
+
+
+
+
+
+
+GetNetworkInfoResponse.SentBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ uint32
+
+
+
+
+ value
+
+ uint64
+
+
+
+
+
+
+GetNodeInfoRequest
+msg
+
+
Request message for retrieving information about a specific node in the network.
+
Message has no fields.
+
+GetNodeInfoResponse
+msg
+
+
Response message containing information about a specific node in the network.
+
+
+
+ Field Type Description
+
+
+
+ moniker
+
+ string
+
+ Moniker of the node.
+
+
+ agent
+
+ string
+
+ Agent information of the node.
+
+
+ peer_id
+
+ bytes
+
+ Peer ID of the node.
+
+
+ started_at
+
+ uint64
+
+ Timestamp when the node started.
+
+
+ reachability
+
+ string
+
+ Reachability status of the node.
+
+
+ services
+ repeated
+ int32
+
+ List of services provided by the node.
+
+
+ services_names
+ repeated
+ string
+
+ Names of services provided by the node.
+
+
+ addrs
+ repeated
+ string
+
+ List of addresses associated with the node.
+
+
+ protocols
+ repeated
+ string
+
+ List of protocols supported by the node.
+
+
+
+
+PeerInfo
+msg
+
+
Information about a peer in the network.
+
+
+
+ Field Type Description
+
+
+
+ status
+
+ int32
+
+ Status of the peer.
+
+
+ moniker
+
+ string
+
+ Moniker of the peer.
+
+
+ agent
+
+ string
+
+ Agent information of the peer.
+
+
+ peer_id
+
+ bytes
+
+ Peer ID of the peer.
+
+
+ consensus_keys
+ repeated
+ string
+
+ Consensus keys used by the peer.
+
+
+ consensus_address
+ repeated
+ string
+
+ Consensus address of the peer.
+
+
+ services
+
+ uint32
+
+ Services provided by the peer.
+
+
+ last_block_hash
+
+ bytes
+
+ Hash of the last block the peer knows.
+
+
+ height
+
+ uint32
+
+ Height of the peer in the blockchain.
+
+
+ received_messages
+
+ int32
+
+ Count of received messages.
+
+
+ invalid_messages
+
+ int32
+
+ Count of invalid messages received.
+
+
+ last_sent
+
+ int64
+
+ Timestamp of the last sent message.
+
+
+ last_received
+
+ int64
+
+ Timestamp of the last received message.
+
+
+ sent_bytes
+ repeated
+ PeerInfo.SentBytesEntry
+
+ Bytes sent per message type.
+
+
+ received_bytes
+ repeated
+ PeerInfo.ReceivedBytesEntry
+
+ Bytes received per message type.
+
+
+ address
+
+ string
+
+ Network address of the peer.
+
+
+ direction
+
+ string
+
+ Direction of connection with the peer.
+
+
+ protocols
+ repeated
+ string
+
+ List of protocols supported by the peer.
+
+
+ total_sessions
+
+ int32
+
+ Total sessions with the peer.
+
+
+ completed_sessions
+
+ int32
+
+ Completed sessions with the peer.
+
+
+
+
+PeerInfo.ReceivedBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ int32
+
+
+
+
+ value
+
+ int64
+
+
+
+
+
+
+PeerInfo.SentBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ int32
+
+
+
+
+ value
+
+ int64
+
+
+
+
+
+
+CreateWalletRequest
+msg
+
+
Request message for creating a new wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the new wallet.
+
+
+ mnemonic
+
+ string
+
+ Mnemonic for wallet recovery.
+
+
+ language
+
+ string
+
+ Language for the mnemonic.
+
+
+ password
+
+ string
+
+ Password for securing the wallet.
+
+
+
+
+CreateWalletResponse
+msg
+
+
Response message containing the name of the created wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the created wallet.
+
+
+
+
+GetValidatorAddressRequest
+msg
+
+
Request message for obtaining the validator address associated with a public key.
+
+
+
+ Field Type Description
+
+
+
+ public_key
+
+ string
+
+ Public key for which the validator address is requested.
+
+
+
+
+GetValidatorAddressResponse
+msg
+
+
Response message containing the validator address corresponding to a public key.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Validator address associated with the public key.
+
+
+
+
+LoadWalletRequest
+msg
+
+
Request message for loading an existing wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to load.
+
+
+
+
+LoadWalletResponse
+msg
+
+
Response message containing the name of the loaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the loaded wallet.
+
+
+
+
+LockWalletRequest
+msg
+
+
Request message for locking a currently loaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to lock.
+
+
+
+
+LockWalletResponse
+msg
+
+
Response message containing the name of the locked wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the locked wallet.
+
+
+
+
+SignRawTransactionRequest
+msg
+
+
Request message for signing a raw transaction.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet used for signing.
+
+
+ raw_transaction
+
+ bytes
+
+ Raw transaction data to be signed.
+
+
+ password
+
+ string
+
+ Password for unlocking the wallet for signing.
+
+
+
+
+SignRawTransactionResponse
+msg
+
+
Response message containing the transaction ID and signed raw transaction.
+
+
+
+ Field Type Description
+
+
+
+ transaction_id
+
+ bytes
+
+ ID of the signed transaction.
+
+
+ signed_raw_transaction
+
+ bytes
+
+ Signed raw transaction data.
+
+
+
+
+UnloadWalletRequest
+msg
+
+
Request message for unloading a currently loaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to unload.
+
+
+
+
+UnloadWalletResponse
+msg
+
+
Response message containing the name of the unloaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the unloaded wallet.
+
+
+
+
+UnlockWalletRequest
+msg
+
+
Request message for unlocking a wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to unlock.
+
+
+ password
+
+ string
+
+ Password for unlocking the wallet.
+
+
+ timeout
+
+ int32
+
+ Timeout duration for the unlocked state.
+
+
+
+
+UnlockWalletResponse
+msg
+
+
Response message containing the name of the unlocked wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the unlocked wallet.
+
+
+
+
+
+PayloadType
+enum
+
+
Enumeration for different types of transaction payloads.
+
+
+ Name Number Description
+
+
+
+
+ UNKNOWN
+ 0
+ Unknown payload type.
+
+
+
+ TRANSFER_PAYLOAD
+ 1
+ Transfer payload type.
+
+
+
+ BOND_PAYLOAD
+ 2
+ Bond payload type.
+
+
+
+ SORTITION_PAYLOAD
+ 3
+ Sortition payload type.
+
+
+
+ UNBOND_PAYLOAD
+ 4
+ Unbond payload type.
+
+
+
+ WITHDRAW_PAYLOAD
+ 5
+ Withdraw payload type.
+
+
+
+
+
+TransactionVerbosity
+enum
+
+
Enumeration for verbosity level when requesting transaction details.
+
+
+ Name Number Description
+
+
+
+
+ TRANSACTION_DATA
+ 0
+ Request only transaction data.
+
+
+
+ TRANSACTION_INFO
+ 1
+ Request detailed transaction information.
+
+
+
+
+
+BlockVerbosity
+enum
+
+
Enumeration for verbosity level when requesting block information.
+
+
+ Name Number Description
+
+
+
+
+ BLOCK_DATA
+ 0
+ Request block data only.
+
+
+
+ BLOCK_INFO
+ 1
+ Request block information only.
+
+
+
+ BLOCK_TRANSACTIONS
+ 2
+ Request block transactions only.
+
+
+
+
+
+VoteType
+enum
+
+
Enumeration for types of votes.
+
+
+ Name Number Description
+
+
+
+
+ VOTE_UNKNOWN
+ 0
+ Unknown vote type.
+
+
+
+ VOTE_PREPARE
+ 1
+ Prepare vote type.
+
+
+
+ VOTE_PRECOMMIT
+ 2
+ Precommit vote type.
+
+
+
+ VOTE_CHANGE_PROPOSER
+ 3
+ Change proposer vote type.
+
+
+
+
+
+
Scalar Value Types
+
+
+ .proto Type C++ Java Python Go C# PHP
+
+
+
+ double
+ double
+ double
+ float
+ float64
+ double
+ float
+
+
+ float
+ float
+ float
+ float
+ float32
+ float
+ float
+
+
+ int32
+ int32
+ int
+ int
+ int32
+ int
+ integer
+
+
+ int64
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+
+
+ uint32
+ uint32
+ int
+ int/long
+ uint32
+ uint
+ integer
+
+
+ uint64
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+
+
+ sint32
+ int32
+ int
+ int
+ int32
+ int
+ integer
+
+
+ sint64
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+
+
+ fixed32
+ uint32
+ int
+ int
+ uint32
+ uint
+ integer
+
+
+ fixed64
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+
+
+ sfixed32
+ int32
+ int
+ int
+ int32
+ int
+ integer
+
+
+ sfixed64
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+
+
+ bool
+ bool
+ boolean
+ boolean
+ bool
+ bool
+ boolean
+
+
+ string
+ string
+ String
+ str/unicode
+ string
+ string
+ string
+
+
+ bytes
+ string
+ ByteString
+ str
+ []byte
+ ByteString
+ string
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/blockchain/account/index.html b/ar/learn/blockchain/account/index.html
new file mode 100644
index 000000000..2bee30928
--- /dev/null
+++ b/ar/learn/blockchain/account/index.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Account | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Account
+
+
An account is an entity that is identified by a unique address ,
+which can send transactions on the blockchain.
+
+
Account Structure
+
+
The account structure is 12 bytes long and consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 4 bytes
+ Number
+
+
+ 8 bytes
+ Balance
+
+
+
+
+
+ Number is a sequential and unique number assigned to each account when it is created for the first time.
+The account number is used to calculate the state hash of the blockchain.
+ Balance holds the balance of the account, which is the amount of Pactus coins held by the account.
+
+
+
Treasury Account
+
+
The Treasury account is a special account in the Pactus blockchain that holds 21 million coins at the genesis time.
+The treasury address is defined as: 000000000000000000000000000000000000000000
.
+The address type is 0, and therefore,
+it doesn’t have any key pair associated with it.
+Every time a block is created, one coin from the Treasury account transfers to the proposer account as a block reward.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/blockchain/address/index.html b/ar/learn/blockchain/address/index.html
new file mode 100644
index 000000000..4406fb6d5
--- /dev/null
+++ b/ar/learn/blockchain/address/index.html
@@ -0,0 +1,670 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Address | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Address
+
+
An address is a unique identifier that is used to send and receive transactions on the Pactus blockchain.
+It is represented as a string of 42 alphanumeric characters and always begins with the letters “pc1”.
+Here is an example of an address on the Pactus blockchain:
+
+
pc1p4e92hx0erqyx939crndvthvpn7qcdhefc9r6s7
+
+
+
Address Structure
+
+
An address in the Pactus blockchain is made up of 21 bytes and it is derived from the public key.
+The first byte of the address specifies the address type,
+while the remaining 20 bytes represent the hash of the public key.
+The hash function used is RIPEMD-160 ,
+which is applied after Blake2b ):
+The resulting byte array is then converted into a bech32m string.
+
+
+
+
Address Type
+
+
The address type specifies the type of the address and its defined as below:
+
+
+ 0: Treasury address
+ 1: Validator address
+ 2: Account address
+
+
+
Treasury Address
+
+
The Treasury address on the Pactus blockchain is a fixed address that is defined as follows:
+
+
TreasuryAddress: 000000000000000000000000000000000000000000
+
+
+
The address type for the Treasury address is set to zero, which
+means there is no key associated with the Treasury address.
+The remaining characters of the address are all zeros.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/blockchain/block/index.html b/ar/learn/blockchain/block/index.html
new file mode 100644
index 000000000..c720ef4e3
--- /dev/null
+++ b/ar/learn/blockchain/block/index.html
@@ -0,0 +1,786 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Block | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Block
+
+
In the Pactus, a block is a set of data that contains a header, the certificate of the previous block
+and list of the transactions.
+Once a block comes with a valid certificate, it is committed and added to the blockchain, and
+the certificate will be included in the next block.
+A committed block is immutable, and any modifications to the block will invalidate the certificate.
+
+
+
+
+
+
The block header is a data structure in the Pactus blockchain that contains important information about
+the block.
+
+
The block header is 138 bytes long and consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 1 byte
+ Version
+
+
+ 4 bytes
+ Timestamp
+
+
+ 32 bytes
+ Previous Block Hash
+
+
+ 32 bytes
+ State Hash
+
+
+ 48 bytes
+ Sortition Seed
+
+
+ 21 bytes
+ Proposer Address
+
+
+
+
+
+ Version is used to track the software or protocol upgrade, and the current block version is set to 1.
+ Timestamp is the time of the block as the number of seconds since January 1, 1970 (Unix Epoch).
+ Previous Block Hash is the hash of the previous block in the blockchain.
+ State Hash is the state hash of the blockchain at this block.
+The State Hash ensures that all nodes in the network have the same state.
+ Sortition Seed is a verifiable and unpredictable seed data used by
+the sortition algorithm.
+ Proposer Address is the address of the validator who created and proposed the block.
+
+
+
Block Certificate
+
+
A block certificate is a proof of commitment for the block in the Pactus blockchain.
+It is the result of the Pactus consensus algorithm and ensures that the block has been agreed upon by committee members.
+
+
The block certificate consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 4 bytes
+ Height
+
+
+ 2 bytes
+ Round
+
+
+ Variant
+ Committers
+
+
+ Variant
+ Absentees
+
+
+ 48 bytes
+ Signature
+
+
+
+
+
+ Height is the height of the certified block.
+ Round is the consensus round in which this certificate was issued.
+If a proposer fails to propose a block in one round, another validator takes over as the proposer,
+and the round number is increased.
+ Committers is the list of validator numbers in the committee for the current certificate..
+ Absentees is the list of validator numbers that are absent in the committee.
+ Signature is the signature for the certificate that ensures the majority of the committee members have validated and
+signed the proposed block.
+
+
+
Transactions
+
+
Each block in the Pactus blockchain contains a list of transactions.
+The maximum number of transactions in a block is determined by the
+consensus parameters , and currently set to 1000.
+The first transaction in each block is the reward transaction .
+Once a block is committed and added to the blockchain, all the transactions inside the block will be executed.
+This means that the state of the blockchain will be updated based on the transactions in the committed block.
+
+
Block Hash
+
+
The block hash is a unique identifier for each block, which is computed by hashing the following data:
+
+
+ Block header data (138 bytes)
+ Previous certificate hash (32 bytes)
+ Merkle root hash of transactions (32 bytes)
+ Number of transactions (variant)
+
+
+
The previous certificate hash and the Merkle root hash of transactions are included in the block hash to
+ensure that they cannot be modified.
+The block hash is used to link the blocks together in the blockchain.
+
+
FAQ
+
+
Is there any empty block in Pactus?
+
+
There is no completely empty block in Pactus.
+Each block contains at least one transaction, which is the reward transaction.
+
+
How are certificates issued?
+
+
In the Pactus blockchain, a validator called a Proposer is responsible for collecting all transactions and
+creating a block every 10 seconds.
+The Proposer broadcasts the proposed block to other validators inside the committee.
+Other validators verify the proposed block, and if it is valid, they cast their votes in favor of the proposed block by
+signing the combination of the block hash and the consensus round.
+More details about the consensus mechanism can be found in the
+consensus protocol document.
+
+
To issue a valid certificate, signatures from validators who hold more than ⅔ of the stake in
+the committee are required.
+Once enough votes are collected, the signatures are aggregated and combined into a single signature, and
+the certificate is issued.
+
+
How are certificates verified?
+
+
To verify a certificate for a block, the block hash is computed, and
+the aggregated public key can be formed using the Committers and Absentees list.
+Then, the signature can be verified using the aggregated public key and
+the aggregated signature inside the certificate.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/blockchain/cryptography/index.html b/ar/learn/blockchain/cryptography/index.html
new file mode 100644
index 000000000..ce8834821
--- /dev/null
+++ b/ar/learn/blockchain/cryptography/index.html
@@ -0,0 +1,649 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Cryptography | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Cryptography
+
+
The Pactus blockchain employs various advanced cryptographic algorithms, including hashing and signature schemes,
+to protect user data and transactions.
+
+
Hashing Algorithm
+
+
Pactus uses a hashing algorithm called Blake2b .
+This algorithm is known for being a fast and secure way of creating unique digital fingerprints of data.
+
+
Digital Signature
+
+
To ensure secure transactions, Pactus uses a signature scheme called
+BLS (Boneh–Lynn–Shacham)
+threshold signature for cryptographic signing and verification.
+
+
Signature Aggregation
+
+
One of the advantages of BLS signatures is signature aggregation. BLS individual signatures can be
+combined into one single aggregated signature, so that the overall size does not grow beyond one
+signature.
+
+
Non-Malleability
+
+
BLS signatures have an important property called non-malleability,
+which means that it is impossible to generate two valid signatures for the same message.
+In other words, each message has a unique signature, and signatures cannot be altered without invalidating the signature.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/blockchain/genesis/index.html b/ar/learn/blockchain/genesis/index.html
new file mode 100644
index 000000000..7dd5c23b7
--- /dev/null
+++ b/ar/learn/blockchain/genesis/index.html
@@ -0,0 +1,671 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Genesis | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Genesis
+
+
The Pactus blockchain starts from scratch, with no pre-existing accounts or pre-allocated coins.
+Its starting point is known as the genesis block, which is created by the bootstrap validators.
+
+
Bootstrapping
+
+
The Pactus blockchain starts with four bootstrap validators.
+These bootstrap validators do not have any stake, however their voting power is set to one within the consensus algorithm.
+Their primary role is to initiate the blockchain during a brief period known as the bootstrapping phase.
+As the bootstrapping phase progresses, these validators are able to earn rewards,
+which they can later use to invite other validators to join the network.
+
+
Once the network reaches 51 validators, the bootstrap validators will retire, and
+the blockchain will be secured by other validators.
+
+
Genesis Block
+
+
The genesis block is the first block in the Pactus blockchain, and it is created by the bootstrap validators.
+This block marks the beginning of the blockchain and serves as the foundation for subsequent blocks.
+
+
The previous block hash in the genesis block sets to 0,
+indicating that it has no predecessor.
+Additionally, the genesis block does not have a previous certificate.
+
+
+
+
In Pactus, the Genesis Information is pre-defined and indicates the initial state of the network.
+These parameters are hardcoded into the project and include:
+
+
+ Genesis Time This is the time when the genesis block should be created.
+The bootstrap validators must be operational before this time.
+ Consensus Parameters : The initial consensus parameters
+are defined at genesis time and ensure that the entire network operates within the same configuration.
+These consensus parameters are discussed in detail in the consensus section of the documentation.
+ Treasury Account : The treasury account
+holds 21 million coins at the genesis time. Each coin is divided into 1 billion units.
+ Reserved Accounts : Reserved account are defined at the Genesis time and at total they have 21 milion coins.
+These coins are reserved and the main purpise is to support the project over time.
+ Bootstrap Validators The bootstrap validators are defined by their public keys.
+
+
+
FAQ
+
+
+
+
You can find the pre-defined Genesis Information for the Testnet of the Pactus blockchain in the genesis.json
file,
+which is located in the project repository, here .
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/blockchain/incentive/index.html b/ar/learn/blockchain/incentive/index.html
new file mode 100644
index 000000000..a58abcf2b
--- /dev/null
+++ b/ar/learn/blockchain/incentive/index.html
@@ -0,0 +1,689 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Incentive | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Incentive
+
+
+ The incentive may help encourage nodes to stay honest.
+
+ Satoshi Nakamoto
+
+
+
In Pactus, rewards are given to validators for collecting valid transactions and creating new blocks.
+These rewards serve as an incentive for validators to participate in the consensus process and
+maintain the security and integrity of the network.
+
+
Flat Reward
+
+
To better understand the incentive model in Pactus, let’s compare it with the Bitcoin reward model.
+This comparison will help to understand how the incentive model works in Pactus.
+
+
+
+
+ Pactus
+ Bitcoin
+
+
+
+
+ Consensus engine is Proof of Stake
+ Consensus engine is Proof of Work
+
+
+ Exactly every 10 seconds one block is minted
+ Around every 10 minutes one block is mined
+
+
+ Total supply is 42,000,000 coin
+ Total supply is 21,000,000 coin
+
+
+ Always one coin per block
+ Initial block reward is 50 coin
+
+
+ No halving
+ Halving happens every 4 years
+
+
+
+
+
The halving mechanism in Bitcoin rewards early contributors more significantly.
+However, in a Proof-of-Stake blockchain, this mechanism can lead to wealth centralization,
+as early validators gain too much power based on their staked coins.
+
+
To promote fairer block rewards, Pactus has introduced a simple and straightforward incentive model called the “Flat Reward.”
+In this model, the block reward remains constant at one coin per block and does not change over time.
+
+
+
+
+
+
Coin Distribution
+
+
In Pactus, the coin distribution is linear. This linear distribution is a direct result of the Flat Reward system.
+Unlike other blockchains that have a curved distribution, Pactus maintains a consistent coin distribution.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/blockchain/serialization/index.html b/ar/learn/blockchain/serialization/index.html
new file mode 100644
index 000000000..a0cc516f7
--- /dev/null
+++ b/ar/learn/blockchain/serialization/index.html
@@ -0,0 +1,774 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Data Serialization | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Data Serialization
+
+
Data serialization is the process of converting data into a format that can be easily stored or transmitted over a network.
+It typically involves encoding data into a sequence of bytes, which can later be decoded to
+reconstruct the original data structure.
+Pactus has two methods for data serialization: Deterministic serialization and CBOR serialization:
+
+
Deterministic Serialization
+
+
Pactus uses a deterministic serialization for the deterministic data like blocks and transactions.
+The serialization format for different types of data is listed in the table below:
+
+
+
+
+ Data Type
+ Size (bytes)
+ Description
+
+
+
+
+ uint8
+ 1
+ An 8 bits unsigned integer
+
+
+ int8
+ 1
+ An 8 bits signed integer
+
+
+ uint16
+ 2
+ A 16 bits unsigned integer
+
+
+ int16
+ 2
+ A 16 bits signed integer
+
+
+ uint32
+ 4
+ A 32 bits unsigned integer
+
+
+ int32
+ 4
+ A 32 bits signed signed integer
+
+
+ uint64
+ 8
+ A 64 bits unsigned integer
+
+
+ int64
+ 8
+ A 64 bits signed signed integer
+
+
+ VarInt
+ Variable
+ A compact representation of an unsigned integer.
+
+
+ VarByte
+ Variable
+ A variable length bytes
+
+
+ VarString
+ Variable
+ A variable length string
+
+
+ Address
+ 21
+ 21 bytes of address data
+
+
+ Hash32
+ 32
+ 32 bytes of hash data
+
+
+
+
+
VarInt
+
+
Variable length integer (VarInt) is encoded by 7-bit chunks. The MSB indicates whether there are
+more octets (1) or it is the last one (0). It means 0x00
to 0x7f
encoded in 1 byte, 0x80
to
+0x3fff
encoded in 2 bytes, …
+
+
Example:
+
+
0x0f -> 0f
+0x1000 -> 8020
+0xffff -> ffff03
+0xffffff -> ffffff07
+
+
+
VarByte
+
+
Variable length byte (VarByte) is encoded as a variable length integer (VarInt) containing the
+length of the array followed by the bytes themselves: VarInt(len(bytes)) || bytes
+
+
VarString
+
+
Variable length string (VarString) is encoded as a variable length integer (VarInt) containing the
+length of the string followed by the bytes that represent the string
+itself:VarInt(len(str)) || str
+
+
Byte Order
+
+
All the internal number representation are in little-endian byte order.
+
+
Example
+
+
Here is an example of a block header data that encoded using deterministic serialization:
+
+
+
+
+
CBOR Serialization
+
+
For non-deterministic data, such as networking messages, Pactus uses
+“Concise Binary Object Representation” or CBOR .
+CBOR is a binary data serialization format that is widely used in various application,
+including IoT, web services, security, and automotive, due to its compact representation and efficient parsing.
+
+
CBOR Me!
+
+
cbor.me
+is an online tool for encoding and decoding CBOR data, offering developers an easy way to test and
+validate their CBOR data without having to set up a local environment.
+
+
Example
+
+
Here is an example of a vote message that encoded using CBOR .
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/blockchain/state-hash/index.html b/ar/learn/blockchain/state-hash/index.html
new file mode 100644
index 000000000..a965c07ea
--- /dev/null
+++ b/ar/learn/blockchain/state-hash/index.html
@@ -0,0 +1,681 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ State Hash | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
State Hash
+
+
The State Hash is used to ensure the integrity of the data in the Pactus blockchain.
+It serves as a unique identifier or fingerprint of the current state of the blockchain,
+allowing all nodes to verify that their data matches that of the other nodes.
+This helps to prevent any tampering or inconsistencies in the data, ensuring the accuracy and consistency of the blockchain.
+
+
Merkle Tree
+
+
+ In cryptography and computer science, a hash tree or Merkle tree is a tree in which every leaf node
+is labelled with the cryptographic hash of a data block, and every non-leaf node is labelled with
+the cryptographic hash of the labels of its child nodes. Hash trees allow efficient and secure
+verification of the contents of large data structures.
+
+ From Wikipedia
+
+
+
A Hash tree or Merkle tree is a data structure that used by many blockchains to solve this problem:
+“How can data be securely stored and verified in a decentralized network?”
+
+
By using a Merkle tree, nodes can easily verify that they store the same data
+without having to share the entire dataset. Additionally, this helps to prevent any tampering with the data,
+as any changes made to the data would cause inconsistencies in the Merkle tree and
+can be easily detected by the network.
+
+
State Merkle Trees
+
+
In Pactus, the Merkle tree is used to verify the state of the blockchain in each block.
+The state hash in each block is calculated by taking the hash of two Merkle trees:
+the accounts Merkle tree and the validators Merkle tree.
+Each leaf in these trees contains the hash of the associated account or validator.
+By using the state hash, all nodes in the network can ensure they have the same data stored.
+
+
+
+
Scalability of Merkle Tree
+
+
Using a Merkle tree to calculate the state of the blockchain can be challenging
+because when the number of accounts is large, calculating the root hash can be difficult.
+In other words, a simple Merkle tree may not be scalable because calculating all the leaf
+and node hashes requires a significant amount of computation.
+
+
In Pactus, all accounts and validators have unique and sequential numbers.
+This means that each account and validator has a dedicated account number that helps us to
+calculate the hash of leaf nodes in the Merkle tree.
+By using these account numbers, we can ensure that the position of the leaf nodes in
+the Merkle tree is always the same.
+This approach allows us to avoid rebuilding the Merkle tree whenever an account or validator’s state changes.
+Instead, we can save the previous Merkle tree and recalculate the parent hashes by
+fetching neighbor hashes as needed.
+This helps to ensure scalability and reduces the computational resources required for recalculating the Merkle tree.
+
+
+
+
In this example, only account 6 has been updated.
+By locating the corresponding leaf node in the existing Merkle tree and
+traversing the tree towards the root node, we can calculate new root hash.
+This approach has a complexity of \(O(log n)\), making it efficient for large numbers of accounts.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/blockchain/validator/index.html b/ar/learn/blockchain/validator/index.html
new file mode 100644
index 000000000..8c7207c01
--- /dev/null
+++ b/ar/learn/blockchain/validator/index.html
@@ -0,0 +1,677 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Validator | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Validator
+
+
A Validator is an entity that participates in the consensus process by sharing its votes.
+Validators get rewarded for creating new blocks, and to become a Validator,
+they must “bond” or lock up a certain amount of coins as stake.
+The amount of stake held by validators determines their power in the consensus.
+
+
Validator Structure
+
+
The Validator structure is 120 bytes long and consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 96 bytes
+ Public Key
+
+
+ 4 bytes
+ Number
+
+
+ 8 bytes
+ Stake
+
+
+ 4 bytes
+ Last Bonding Height
+
+
+ 4 bytes
+ Unbonding Height
+
+
+ 4 bytes
+ Last Joined Height
+
+
+
+
+
+ Public Key is the Validator’s public key.
+ Number is a sequential and unique number assigned to each validator when it is created for the first time.
+The validator number is used to calculate the state hash of the blockchain.
+ Stake holds the Validator’s stake or the amount of Pactus coins locked or “staked” by the Validator.
+ Bonding Height is the last block height that the validator has bonded their stake.
+ Unbonding Height is the block height that the validator’s stake is unbonded.
+ Last Joined Height is the block height that the validator joined the committee.
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/consensus/committee/index.html b/ar/learn/consensus/committee/index.html
new file mode 100644
index 000000000..495698223
--- /dev/null
+++ b/ar/learn/consensus/committee/index.html
@@ -0,0 +1,765 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Committee | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Committee
+
+
The committee is a group of 51 validators responsible for generating new blocks.
+Validators in the committee participate in the consensus algorithm by casting votes,
+with their voting power determined by their stake.
+While in the committee, validators cannot send Bond or Unbond transactions,
+meaning their voting power remains the same.
+The members of the committee changes randomly over time through Sortition transactions.
+Each block can contain zero or more Sortition transactions.
+
+
These rules are applied when committing sortition transactions:
+
+
+ A minimum of ⅔ of the total stake must be maintained in the committee.
+ If a validator is already in the committee, they will remain in the committee.
+ If a validator is not in the committee, the oldest validator will exit the committee.
+ Each validator should stay in committee at least for 51 blocks.
+
+
+
Proposer Selection
+
+
Proposer selection within the committee operates on a deterministic, clockwise rotation system.
+If a validator is unable to propose, for any reason, it stays within the committee, but
+the proposer’s role shifts to the next validator in the committee.
+
+
+
+
Adding Validators to the Committee
+
+
When a new validator joins the committee, they take a position before the current proposer.
+After the addition of a new validator, the committee adjusts to maintain the total number of validators at 51.
+This is achieved by removing the oldest validator from the committee,
+i.e., the one that has been in the committee for the longest time.
+
+
+
+
Security of the Committee
+
+
For an adversary to take control of the committee, they would need to control more than ⅔ of the stake within the committee.
+To assess the security of the committee, let’s assume all validators in the committee have the same voting power.
+In this case, an adversary would need to control more than ⅔ of the validators in the committee.
+
+
Now, let’s imagine an adversary holds 10% of the total stake.
+As a result, one of their validators can enter the committee every 10 blocks.
+In the first 10 blocks, one of the adversary’s validators enters the committee.
+In the next 10 blocks, another validator enters the committee, giving the adversary two validators within the committee.
+In the subsequent 10 blocks, another validator enters, but at the same time, the first validator leaves the committee.
+Therefore, an adversary with 10 10% of the total stake can have, on average, two validators in a committee of 51 validators.
+
+
Using the Poisson distribution ,
+we can estimate the probability of an adversary controlling ⅔ of the committee:
+
+
+
+
+ Adversarial Stake
+ Committee size
+ ⅔+ of committee
+ Adversarial committee members
+ Probability of controlling ⅔+
+
+
+
+
+ 15%
+ 21
+ 15
+ 3
+ \(5.46 \times 10^{-07}\)
+
+
+ 15%
+ 51
+ 35
+ 7
+ \(3.34 \times 10^{-14}\)
+
+
+ 15%
+ 99
+ 67
+ 14
+ \(1.41 \times 10^{-24}\)
+
+
+ 10%
+ 21
+ 15
+ 2
+ \(3.39 \times 10^{-09}\)
+
+
+ 10%
+ 51
+ 35
+ 5
+ \(1.90 \times 10^{-18}\)
+
+
+ 10%
+ 99
+ 67
+ 9
+ \(2.91 \times 10^{-35}\)
+
+
+ 5%
+ 21
+ 15
+ 1
+ \(2.81 \times 10^{-13}\)
+
+
+ 5%
+ 51
+ 35
+ 2
+ \(4.50 \times 10^{-31}\)
+
+
+ 5%
+ 99
+ 67
+ 4
+ \(1.09 \times 10^{-56}\)
+
+
+
+
+
FAQ
+
+
How can one know when a validator has joined the committee?
+
+
The height at which the validator joined the committee is recorded as the “Last Joined Height” field in
+the validator structure.
+Once a validator enters the committee, this field is set to the current height it
+evaluated the sortition proof.
+
+
Can a validator within the committee run the sortition algorithm?
+
+
A validator within the committee can run the sortition algorithm.
+If they generate a valid sortition transaction, the height of their entry into the committee is set
+to the current block height, allowing them to stay in the committee for a longer period.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/consensus/parameters/index.html b/ar/learn/consensus/parameters/index.html
new file mode 100644
index 000000000..4ffc5d29b
--- /dev/null
+++ b/ar/learn/consensus/parameters/index.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Consensus Parameters | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Consensus Parameters
+
+
Consensus parameters are a set of configurable settings that determine how the Pactus blockchain operates.
+These parameters are agreed upon by all validators in the network,
+ensuring that validators behave in the same way and that the network operates consistently.
+
+
Here is the list of the consensus parameters:
+
+
+ Block Version: The version number of the blockchain protocol.
+This is set to 1.
+ Block Time: The time interval in seconds between the creation of two consecutive blocks.
+This is set to 10 seconds, which means that a new block is created every 10 seconds.
+ Committee Size The number of validators in the committee.
+This is set to 51 validators.
+ Block Reward The fixed reward amount given to the validator who successfully creates and proposes a new block.
+This is set to 1,000,000,000, which is equivalent to one coin.
+ Time-to-Live Interval : The number of blocks that a transaction can remain unprocessed before
+it is removed from the transaction pool.
+This is set to 8640 blocks, which is almost one day.
+ Bond Interval : The minimum number of blocks that must elapse after a validator has submitted a bond transaction
+before they can participate in the consensus process and join the validator committee.
+This is set to 360 blocks, which is almost one hour.
+ Unbond Interval : The minimum number of blocks that must elapse after a validator has submitted
+an unbond transaction before
+they can withdraw their staked coins.
+This is set to 181440 blocks, which is almost 21 days.
+ Sortition Interval : The maximum number of blocks that a sortition transaction can remain valid and be included
+in a block.
+This is set to 7 blocks.
+ Fee Fraction : The fraction of transaction value that must be paid in order for a transaction to be included in a block.
+This is set to 0.0001 PAC, meaning that 0.01% of transaction value are awarded to the block proposer.
+ Minimum Fee : The minimum transaction fee that must be paid.
+This is set to 1,000 (satoshi), which is equivalent to 0.000001 PAC coin.
+ Maximum Fee : The maximum transaction fee that must be paid.
+This is set to 1,000,000 (satoshi), which is equivalent to 0.001 PAC coin.
+ Maximum Stake : The maximum amount of coins that can be staked by a validator.
+This is set to 1,000,000,000,000 (satoshi), which is 1000 PAC coins.
+ Minimum Stake : The minimum amount of coins that can be staked by a validator.
+This is set to 1,000,000,000 (satoshi), which is 1 PAC coins.
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/consensus/proof-of-stake/index.html b/ar/learn/consensus/proof-of-stake/index.html
new file mode 100644
index 000000000..8145c7525
--- /dev/null
+++ b/ar/learn/consensus/proof-of-stake/index.html
@@ -0,0 +1,684 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Solid State Proof of Stake | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Solid State Proof of Stake
+
+
Proof of Stake is a way to secure a blockchain through requesting users to stake some amount of their coins.
+These stakeholders, called validators, are responsible to collect, validate and add transactions to the blockchain.
+The validators will be rewarded with native coins.
+
+
Unlike Proof of Work, which is based on competition, Proof of Stake is based on collaboration.
+Validators work together to manage the expansion of the blockchain.
+A Proof of Stake blockchain becomes more decentralized and secure as more validators participate in it.
+
+
An example
+
+
To understand how Proof of Stake works, imagine a community bank without any centralized authority.
+In this bank, users decide to run it together.
+Some of these users volunteer to collect, validate, and record transactions,
+ensuring that everything runs smoothly.
+
+
These volunteers, known as validators, must temporarily lock or freeze some of their money as a stake.
+This stake can’t be transferred or used.
+The more money a validator stakes, the more influence they have in the system.
+
+
From time to time, one of the validators is chosen by the others to collect all the recent transactions,
+bundle them together, and send a copy to the other validators.
+If a supermajority of the validators agree with the proposed bundle by signing it,
+the bundle will be committed to the bank’s ledger.
+
+
In this system, validators have no incentive to behave maliciously or dishonestly.
+If they do, they risk harming the bank’s reputation and the value of their own stakes as well.
+
+
Delegated Proof of Stake
+
+
In Proof of Stake, if the number of validators increases,
+the voting time will also increase, and this can lead to an inefficient consensus mechanism.
+In our community bank example, running the bank becomes more difficult as the number of validators increases.
+
+
To solve this problem, some blockchains use the concept of “delegators”.
+In Delegated Proof of Stake, users entrust their stakes to a small group of “delegates”.
+These delegates are responsible for validating transactions and creating blocks.
+The number of delegates is limited to ensure accountability and efficiency in the validation process.
+
+
+
+
The delegation model puts a lot of trust in the hands of a small number of delegates,
+which goes against the principle of “don’t trust, verify”.
+
+
Consensus without delegation or Solid State Proof of Stake (SSPoS)
+
+
Pactus introduced a mechanism that doesn’t rely on delegation, we call it Solid State Proof of Stake.
+It utilizes a dynamic committee of validators
+that are responsible for creating new blocks.
+The size of the committee is fixed, but the members of the committee are randomly changed.
+On the other hand, the number of validators outside the committee is unlimited, allowing anyone to
+become a validator by staking coins.
+
+
At each block, validators participate in a sortition algorithm
+by generating a random number between zero and the total staked coins.
+If the number is less than the validator’s stake, they can enter the committee and replaces the oldest committee member.
+
+
+
+
The chance of entering the committee depends on the validator’s stake and luck.
+But on average, one validator should enter the committee in each block.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/consensus/protocol/index.html b/ar/learn/consensus/protocol/index.html
new file mode 100644
index 000000000..f0f3ea67f
--- /dev/null
+++ b/ar/learn/consensus/protocol/index.html
@@ -0,0 +1,885 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Consensus protocol | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
+ This post is obsolete. check
here for more information.
+
+
+
Consensus Protocol
+
+
Pactus consensus algorithm is a state machine
+replication with Byzantine fault tolerance.
+The Pactus consensus algorithm starts with the block creation phase.
+In this phase one validator acts as the proposer. The proposer collects all the transactions,
+creates a block, and proposes it to other validators.
+
+
When a proposed block is seen by other validators, they validate the block and
+cast their vote for the proposed block, moving to the “prepare” state.
+
+
If more than two-thirds (⅔) of the total stakes cast their votes, the proposed block becomes prepared,
+and validators move to the “precommit” state.
+
+
If, once again, more than two-thirds (⅔) of the total stakes cast their vote for the prepared block,
+the block is committed, and the next proposer is ready to propose a new block. This cycle repeats every 10 seconds.
+
+
If a proposer fails to propose in any round, other validators start the “change proposer” phase to
+decide to change the proposer for this round.
+
+
+
+
The Algorithm
+
+
There are \(R = 3f+1\) validators. where \(f\) is the maximum
+number of validators that may be faulty or byzantine. For example, if there is one faulty validator,
+the resiliency of the algorithm is optimal if we have at least \(3\) non-faulty
+validators. So the minimum number of validators should be \(3+1=4\).
+
+
We denote a message as \(\langle m \rangle\) tuple and a signed message by node \(i\) as
+\(\langle m \rangle_{\sigma_i}\).
+
+
Pactus consensus algorithms has two phases: Block creation phase and change proposer phase.
+
+
Block Creation
+
+
The block creation phase in Pactus consensus algorithm includes these three steps :
+Propose , Prepare and Precommit .
+The protocol proceeds in rounds \(r = 0, 1, 2, \ldots\).
+
+
Propose Step
+
+
In each round \(r\), one validator is the proposer and the others act as validators.
+The proposer \(p\) collects transactions and creates a proposal block \(B\). It signs and
+broadcasts a proposal message with the proposed block piggybacked to all the validators.
+Propose message has this form:
+
+\[\langle \langle \text{PROPOSE},h,r \rangle_{\sigma_p}, B \rangle\]
+
+
where:
+
+
+ \(B\) is the proposed block
+ \(h\) indicates the block height
+ \(r\) is an assigned round number, which is zero for the first round
+
+
+
Prepare Step
+
+
If validator \(i\) accepts the proposal, it enters prepare step and signs and
+broadcasts prepare message to all other validators. Otherwise, it does nothing.
+The prepare message has this form:
+
+\[\langle \text{PREPARE},h,r,d \rangle_{\sigma_i}\]
+
+
where:
+
+
+ \(d\) is digest or hash of proposed block \(B\)
+
+
+
If validator \(i\) received \(2f+1\) prepare messages from other
+validators (including its own), it becomes prepared and enters to precommit step.
+
+
Precommit Step
+
+
In precommit step, validator \(i\) signs and broadcasts precommit message to
+the other validators.
+The precommit message has this form:
+
+\[\langle \text{PRECOMMIT},h,r,d \rangle_{\sigma_i}\]
+
+
Each validator executes and commits block \(b\) after receiving
+\(2f+1\) precommit messages (including its own) and becomes committed .
+
+
Block Announcement
+
+
Each validator that receives a valid proposal and with \(2f+1\) precommit messages from other
+validators (including its own), can create a block-announce messages and broadcasts it to the network.
+The block-announce message has this form:
+
+\[\langle \text{BLOCK-ANNOUNCE} ,h ,r ,B, C \rangle\]
+
+
where:
+
+
+ \(C\) is the quorum certificate for the precommit step.
+
+
+
Validators can move to the next height and clear the message logs after receiving valid
+block-announce message, even if their timer has expired.
+
+
The picture below shows the operation of the algorithm in the normal case. validator 1 is the
+proposer and validator 4 is faulty.
+
+
+
+
Change Proposer
+
+
The change-proposer provides liveness by allowing the system to make progress when the proposer fails.
+The change-proposer phase is triggered by timeouts that
+prevent validators from waiting indefinitely for the proposal to execute.
+
+
If the timer of a validator expires in round \(r\), the validator starts a change-proposer phase.
+The change-proposer phase is an Asynchronous Byzantine Binary Agreement (ABBA) that is biased toward zero (No).
+It means that during this phase, even if they don’t have the proposal, honest validators may decide to vote zero
+if they obtain a valid quorum Certificate for the prepare step.
+
+
If a supermajority of the validators decide to change the proposer, they move to round \(r+1\). However,
+if they decide not to change the proposer, they will return to the prepare state and,
+since a supermajority of the validators attested to a valid proposal, they can commit the proposed block.
+
+
The change proposer phase in Pactus consensus algorithm includes these three steps:
+Pre-vote , Main-vote and Decide
+The protocol proceeds in rounds \(r_{cp} = 0, 1, 2, \ldots\).
+
+
Pre-vote Step
+
+
In Pre-vote step each validator casts a pre-vote for a value \(b \in \{0, 1\}\)
+and broadcasts pre-vote message to the network.
+The pre-vote message has this form:
+
+\[\langle\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle_{\sigma_i}, justification\rangle\]
+
+
The first round is a special round and each validator starts with an initial value.
+If the validator’s timer has expired in the prepare step, its initial value is zero,
+and if the validator’s timer has expired in the precommit step, its initial value is one.
+
+\[b = \begin{cases}
+1 & \text{if timer expired in prepare step,} \\
+0 & \text{if timer expired in precommit step.}
+\end{cases}\]
+
+
In the next rounds, each validator select \(2f+1\) properly justified main-votes from round \(r − 1\) and
+
+\[b = \begin{cases}
+0 & \text{if there is a main-vote for 0,} \\
+1 & \text{if there is a main-vote for 1,} \\
+0 (biased) & \text{if all main-votes are abstain.}
+\end{cases}\]
+
+
These pre-votes must be justified with a appropriate justification.
+For the first round, if the validator’s timer has expired in the prepare step, the justification is \(nil\) ,
+and if the validator’s timer expired in the precommit step,
+the justification is the proper quorum certificate for the prepare step at round \(r\).
+
+
In the next rounds, a pre-vote for \(b\) may be justified in two ways:
+
+
+ Hard : that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp}-1,b \rangle\)
+ Soft : that is the quorum certificate for \(\langle \text{CP:MAIN-VOTE},h,r,r_{cp}-1,abstain \rangle\)
+
+
+
Main-vote Step
+
+
After collecting \(2f+1\) valid and justified pre-votes, each validator casts a main-vote \(v \in \{0, 1, abstain\}\)
+and broadcasts main-vote message to the network.
+The main-vote message has this form:
+
+\[\langle\langle \text{CP:MAIN-VOTE},h,r,r_{cp},v \rangle_{\sigma_i}, justification\rangle\]
+
+
The main-vote value \(v\) determine as below:
+
+\[v = \begin{cases}
+0 & \text{if there are 2f+1 pre-vote for 0,} \\
+1 & \text{if there are 2f+1 pre-vote for 1,} \\
+abstain & \text{if there are pre-votes for 0 and 1.}
+\end{cases}\]
+
+
These main-votes must be justified with a appropriate justification.
+A main-vote for \(v\) may be justified in two ways:
+
+
+ Non-conflicting : that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle\)
+ Conflicting : that consists of the justifications for the two conflicting pre-votes.
+
+
+
Decide Step
+
+
After collecting \(2f+1\) valid and justified main-votes, each validator examines these votes. If all
+votes are for a value \(b \in \{0, 1\}\), then the validator decides \(b\), but continues to
+participate in the protocol for one more round. Otherwise, the validator proceeds to the next round \(r_{cp}+1\).
+
+
Comparison
+
+
Pactus consensus protocl doesn’t have any lcoking mechanism or
+checkpointing and there will at most one valid proposla per round.
+This ensures that each round can begin with a new proposal.
+
+
+
+
+ Protocol
+ Normal case
+ Faulty case
+
+
+ Steps
+ Complexity
+ Locking
+ Checkpointing
+
+
+
+
+ PBFT
+ 3
+ $$O(n^2)$$
+ No
+ Yes
+
+
+ Tendermint
+ 3
+ $$O(n^2)$$
+ Yes
+ No
+
+
+ HotStuff
+ 4
+ $$O(n)$$
+ Yes
+ No
+
+
+ Pactus
+ 3
+ $$O(n^2)$$
+ No
+ No
+
+
+
+
+
+
+
References:
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/consensus/sortition/index.html b/ar/learn/consensus/sortition/index.html
new file mode 100644
index 000000000..974ffd019
--- /dev/null
+++ b/ar/learn/consensus/sortition/index.html
@@ -0,0 +1,781 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Sortition Algorithm | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Sortition Algorithm
+
+
The sortition algorithm is an important part of the Pactus blockchain, responsible for the fair, transparent
+and random selection of validators to join the committee .
+It utilizes a Verifiable Random Function, or VRF for short, to generate a verifiable random number.
+
+
The generated random number should be in the range of 0 to the total staked coins.
+If validators can prove that their generated number is less than their stake,
+they can send the sortition transaction .
+Once a sortition transaction is included in a block, the validator will join the committee,
+and the oldest validator in the committee will leave it.
+
+
Verifiable Random Function
+
+
Verifiable Random Function is a pseudo-random function that the owner of key \(s\) can evaluate \(v = f_s(x)\) and also provides
+\(proof_{x}\) efficiently proving that \(v\) is correct. We call such a mathematical
+object a verifiable pseudo-random function, VRF for brevity .
+
+
Pactus uses the BLS signature scheme as the source of VRF.
+Since BLS signatures are unique ,
+the hash of a BLS signature can be used to produce a secure and verifiable random number.
+
+
The VRF takes three parameters:
+
+
+ The secret key of the validator
+ The sortition seed
+ The total stake of the blockchain.
+
+
+
Once the VRF is executed, it produces an index with a proof.
+The index is a number between zero and the total staked coins, and the proof allows other validators to verify the correctness
+of the generated index.
+
+
The pseudocode below demonstrates the evaluation of the VRF for the sortition algorithm:
+
+\[\begin{align*}
+& \textbf{function} \ VRF(sk, seed, total\_stake) \\
+& \qquad pk \gets P_{BLS}(sk) \\
+& \qquad proof \gets S_{BLS}(sk, seed \| pk) \\
+& \qquad rnd \gets H(proof) \\
+& \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\
+& \qquad \\
+& \qquad \textbf{return} \ index, proof \\
+& \textbf{end function}
+\end{align*}\]
+
+
where:
+
+
+ \(sk\) is the secret key of the validator
+ \(seed\) is the sortition seed
+ \(total\_stake\) is the total stake of the blockchain
+ \(P_{BLS}\) is a cryptographic function that derives the public key from the secret key for the BLS signature
+ \(S_{BLS}\) is a cryptographic function that signs a message with the secret key for the BLS signature.
+ \(H\) is a cryptographic hash function that generates a number between \(0\)to \(2 ^{256}\)
+ \(\|\) denotes the concatenation of two values
+
+
+
To verify a sortition proof, both the validator’s public key and stake are required:
+
+\[\begin{align*}
+& \textbf{function} \ verifyVRF(pk, seed, proof, stake, total\_stake) \\
+& \qquad \textbf{if} \ V_{BLS}(pk, seed \| pk, proof) = True \ \textbf{then} \\
+& \qquad \qquad rnd \gets H(proof) \\
+& \qquad \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\
+& \qquad \\
+& \qquad \qquad \textbf{return} \ index \leqslant stake \\
+& \qquad \textbf{else} \\
+& \qquad \qquad \textbf{return} \ False \\
+& \qquad \textbf{end if} \\
+& \textbf{end function}
+\end{align*}\]
+
+
where:
+
+
+ \(V_{BLS}\) is a cryptographic function used to verify a signed message using the BLS signature scheme
+
+
+
There is no need to send \(index\) alongside \(proof\) because the
+result should be less than the validator’s stake, and the validator’s stake is known at each block.
+
+
Sortition Seed
+
+
The sortition algorithm relies on a random and publicly verifiable seed that cannot be manipulated by adversaries.
+Otherwise, adversaries may select a seed that favors the selection of corrupt users.
+
+
To prevent this, the BLS signature scheme is used to generate the sortition seed.
+Since BLS signatures are unique and deterministic, adversaries cannot generate more than one valid signature per block.
+In each block, the block proposer generates a new sortition seed based on the previous seed using the following function:
+
+\[\begin{align*}
+& \textbf{function} \ generateSeed(sk, prev\_seed) \\
+& \qquad \textbf{return} \ S_{BLS}(sk, H(prev\_seed)) \\
+& \textbf{end function}
+\end{align*}\]
+
+
Since the proposer’s public key is known, the seed for the next block can be easily verified.
+If the seed is invalid, the proposed block will be rejected.
+The verification function is as follows:
+
+\[\begin{align*}
+& \textbf{function} \ verifySeed(pk, prev\_seed, seed) \\
+& \qquad \textbf{return} \ V_{BLS}(pk, H(prev\_seed), seed) \\
+& \textbf{end function}
+\end{align*}\]
+
+
The sortition seed for the genesis block set to 0.
+
+
Sortition Probability
+
+
The Sortition probability refers to the expected number of validators that may join the committee in each block,
+assuming all validators are actively online and executing the sortition algorithm.
+
+
The probability of a validator \(i\) being selected depends on their stake relative to the total stake in the system:
+
+\[p_i=\frac{S_i}{S_t}\]
+
+
where:
+
+
+ \(p_i\) is the probability of validator \(i\) being selected
+ \(S_i\) is the stake of validator \(i\)
+ \(S_t\) is the total stake of all validators.
+
+
+
Therefore, the expected number of validators joining the committee at each block can be represented as:
+
+\[P=\sum_{i=1}^{n}{p_i}=\sum_{i=1}^{n}{\frac{S_i}{S_t}}=\frac{S_1+S_2+\ldots+S_n}{S_t}\]
+
+
where \(n\) is the total number of validators. We know that \(S_t={S_1+S_2+\ldots+S_n}\). Therefore we will have:
+
+\[P=\frac{S_t}{S_t}=1\]
+
+
Thus, on average, we expect one validator to join the committee at each block.
+In practice, the actual number of validators joining the committee in each block
+may differ due to the randomness in the sortition algorithm, or the possibility of some validators being offline.
+
+
FAQ
+
+
How is the total staked coin calculated?
+
+
The total staked coin in each block is calculated by summing the staked coins of all active validators.
+An active validator is a validator that has not yet unbonded .
+
+
How is the oldest validator determined?
+
+
The height at which the validator joined the committee is recorded as the “Last Joined Height” field in
+the validator structure.
+The validator with the lowest “Last Joined Height” is considered the oldest.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/consensus/specification/index.html b/ar/learn/consensus/specification/index.html
new file mode 100644
index 000000000..8e3013f27
--- /dev/null
+++ b/ar/learn/consensus/specification/index.html
@@ -0,0 +1,661 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Consensus specification | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Consensus Specification
+
+
Developing distributed and concurrent systems is a complex task that requires careful attention to the details.
+Testing such systems is challenging because it’s difficult to simulate all possible states,
+including those that can happen due to system failures, network latency, and other factors.
+This makes it hard to ensure that the system behaves correctly in all circumstances.
+
+
Therefore it’s essential to have a proactive approach that involves modeling the system’s behavior in a formal way.
+Such an approach can help identify potential issues before they occur, saving time and preventing costly flaws.
+
+
TLA+
+
+
TLA+ is a formal specification language developed by
+Leslie Lamport based on the idea of
+specifying systems using simple mathematics.
+It is used for designing, modelling, documentation, and verification of programs, especially concurrent and
+distributed systems.
+TLA+ and its tools are useful for eliminating fundamental design errors, which are hard to find and
+expensive to correct in code.
+
+
To know more about TLA+, check The TLA+ Home Page .
+
+
Pactus Consensus Spec
+
+
Pactus consensus specification
+has written in TLA+ format. It includes all invariants that can be held
+in every state of every execution that the protocol allows. The TLA+ specification is compiled into
+PDF file .
+
+
Safety Proof
+
+
By defining some invariants we can ensure the safety of the consensus
+protocol in any possible and
+distinct state, and therefore we have the informal safety proof of the Pactus consensus protocol using TLA+.
+
+
Liveness Proof
+
+
Checking the liveness is not easy, but with defining some constraints, we have the informal proof of
+liveness of Pactus consensus protocol using TLA+.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/index.html b/ar/learn/index.html
new file mode 100644
index 000000000..fb27e2fcc
--- /dev/null
+++ b/ar/learn/index.html
@@ -0,0 +1,502 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ تعلم | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
تعلم
+
+
هنا يمكنك العثور على الوثائق التقنية لمشروع بكتوس.
+
+
Table Of Content
+
+
+
+
+ Blockchain
+
+
+
+
+ Consensus
+
+
+
+
+ Transaction
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/smart-contract/storage/index.html b/ar/learn/smart-contract/storage/index.html
new file mode 100644
index 000000000..43d6b982d
--- /dev/null
+++ b/ar/learn/smart-contract/storage/index.html
@@ -0,0 +1,738 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Storage as file | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Storage as file
+
+
Motivation
+
+
Ethereum friendly blockchains keep storage in a separate key/value database per request. This has
+some drawbacks:
+
+
+ Since there is a global database that stores all storages, the storage key is a combination of
+\(Key_{contract} + Key_{item}\) that is a bit messy.
+ Storage data can’t have any meta data, because they are scattered in different places in the
+key/value database.
+ Storages per smart contract can’t be Merklized. Ethereum came with another solution to calculate
+the hash of the whole storage. They defined a hexary Patricia tree that is quite
+suboptimal .
+
+
+
Here we discuss how we can address the above issues by dedicating a separate file as Storage
+File per smart contract. In this scenario, users should purchase the storage file with required
+capacity before deploying the smart contract. Once the purchase is done, a separate empty file will
+be created and dedicated for the user. The size of the file is the same as the purchase size. For
+example users can purchase 10 MB or 120 MB of storage files depending on their need and renew them
+yearly.
+
+
Structure
+
+
Each storage file has three parts: Header, ByteCodes and contract storage.
+
+
+
+
The Header of the storage file keeps some meta data like storage file index, last payment time,
+total storage size, etc. In the ByteCodes section the byte codes of the smart contract will be saved
+and in the storage section, the actual storage of the smart contract will be stored.
+
+
Storage APIs
+
+
Smart contracts can only change data in storage sections. To achieve that the smart contract
+executer (virtual machine) should introduce these APIs:
+
+
/// This API requests the host to read the slice of `data` from the storage file
+/// at the given `offset`.
+fn read ( & self , offset : u32 , data : & mut [ u8 ]) -> Result < (), HostError > ;
+
+/// This API requests the host to write the slice of `data` into the storage file
+/// at the given `offset`
+fn write ( & self , offset : u32 , data : & [ u8 ]) -> Result < (), HostError > ;
+
+
+
+
These APIs are similar to SLoad
and SStore
opcodes in Ethereum Virtual Machine (EVM). But
+instead of key and value, they accept offset and data parameters.
+
+
Storage Allocation
+
+
In order to allocate storage space safely and efficiently user can use these predefined methods:
+
+
/// Allocates storage space with the specific `length` and returns the
+/// offset of allocated space in the storage file.
+pub fn allocate ( & self , length : u32 ) -> Result < Offset , Error > ;
+
+/// Deallocates the storage space at the specific `offset` and `length`
+pub fn deallocate ( & self , offset : Offset , length : u32 ) -> Result < (), Error > ;
+
+
+
Storage Stack
+
+
There is a fixed stack with 32 elements at the beginning of the storage . The first item in this
+stack is reserved and used for managing deallocated storage spaces. Users can use other stack items
+to keep the offset of the allocated spaces for the smart contract variables.
+
+
+
+
Data Collections
+
+
Usually in smart contracts developers are interested in data collections like Search Trees or Hash
+Tables to look up values by the associated keys. Most programming languages come up with some
+builtin collections, however we can’t use them in smart contracts because they use RAM that is
+inconsistent. However we can have storage equivalent of these data collections that instead of
+dealing with memory they are dealing with the storage file. You can naively consider storage as
+dedicated consistent memory for the smart contract.
+
+
Right now these data collection is available to use inside the smart contract: StorageVector
,
+StorageString
, StorageLinkedList
, StorageBST
and StorageHasTable
.
+
+
+
+
Merklizing Storage
+
+
To make sure all the nodes have the same state we need to calculate the hash of all storage files.
+Merkle tree can help us to easily calculate the root hash very fast. We need two Merkle trees, one
+for calculating the root hash of each storage file and the second for calculating the root hash of
+all storage files.
+
+
Single storage file Merkle tree
+
+
We can divide each file into small chunks of data and calculate the hash of each chunk once. Since
+we know exactly which chunk has changed after executing the smart, contract we can easily
+reconstruct the tree and calculate the merkle root again.
+
+
Whole storage Merkle tree
+
+
Each file has a unique index. With using that index we can make sure that the position of the leaf
+nodes in the Merkle tree is always the same. The same technique we used for calculating the
+state hash .
+
+
+
+
Example
+
+
As an example we have implemented the ERC20 smart contract based on this idea. The implementation
+can be found here
+
+
Testing
+
+
One of the consequences of Storage as File is that testing smart contracts becomes easier. What we
+need is only to mock the storage file.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/transaction/bond/index.html b/ar/learn/transaction/bond/index.html
new file mode 100644
index 000000000..e8ed32d47
--- /dev/null
+++ b/ar/learn/transaction/bond/index.html
@@ -0,0 +1,669 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Bond Transaction | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Bond Transaction
+
+
Bond transaction is used to bond stake to a validator .
+If the validator does not exist, it will be created.
+Once a bond transaction committed, the validator cannot participate in the
+sortition algorithm for 1 hour.
+This is called the “bond interval” and is defined in the
+consensus parameter .
+
+
Payload Structure
+
+
The bond transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Sender address
+
+
+ 21 bytes
+ Receiver address
+
+
+ 96 bytes (optional)
+ Public key
+
+
+ Variant
+ Amount
+
+
+
+
+
+ Sender address is the address of the sender account .
+ Receiver address is the address of the receiver validator.
+ Public key is the validator’s public key. If the validator does not exist yet,
+the public key should be set, otherwise it should left empty.
+ Amount is the amount of coins that should be staked or bonded.
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/transaction/fee/index.html b/ar/learn/transaction/fee/index.html
new file mode 100644
index 000000000..6e6a1e22e
--- /dev/null
+++ b/ar/learn/transaction/fee/index.html
@@ -0,0 +1,671 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transaction Fee | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Transaction Fee
+
+
Transaction fees in the Pactus blockchain are calculated using a percentage-based fee model.
+The fee is a percentage of the transferred amount, within a minimum and maximum range.
+The percentage, minimum fee, and maximum fee parameters are part of the blockchain
+consensus parameters .
+
+
The formula to calculate the transaction fee is as follows:
+
+
+
+\[\begin{align*}
+fee = amount \times percentage \\
+\\
+fee =
+\begin{cases}
+ & fee_{min} & \textbf{ if } \ fee < fee_{min} \\
+ & \\
+ & fee_{max} & \textbf{ if } \ fee > fee_{max} \\
+ & \\
+ & fee & \textbf{otherwise}
+ \end{cases}
+\end{align*}\]
+
+
Examples
+
+
Currently, the fee fraction or percentage is set to 0.01%, the minimum fee is set to 0.000,001 coin,
+and the maximum fee is set to 0.001 coin.
+
+
+ If Alice wants to transfer 2 coins to Bob, she needs to pay 0.000,2 coins as transaction fee.
+ If Alice wants to transfer 0.000,2 coins to Bob, she needs to pay 0.000,001 coins as transaction fee.
+ If Alice wants to transfer 20 coins to Bob, she needs to pay 0.001 coins as transaction fee.
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/transaction/format/index.html b/ar/learn/transaction/format/index.html
new file mode 100644
index 000000000..c8c52b925
--- /dev/null
+++ b/ar/learn/transaction/format/index.html
@@ -0,0 +1,708 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transaction Format | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
+
+
Transactions in Pactus consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 1 byte
+ Version
+
+
+ 4 bytes
+ Lock Time
+
+
+ Variant
+ Fee
+
+
+ Variant
+ Memo
+
+
+ 1 byte
+ Payload Type
+
+
+ Variant
+ Payload Data
+
+
+ 48 bytes
+ Signature
+
+
+ 96 bytes
+ Public Key
+
+
+
+
+
+ Version is the version of the transaction format. Different versions may have different fields or
+a different layout, and the current transaction version is set to 1.
+ Lock Time specifies the block number at which the transaction can be unlocked.
+ Fee contains the fee paid by the sender to the network for processing the transaction.
+The fee is calculated based on the percentage fee model.
+ Memo is an optional message that can be included in the transaction.
+The message can be used to provide additional information about the transaction or to communicate with the recipient.
+The maximum size of the memo is 64 characters that is defined in the
+consensus parameters
+ Payload Type specifies the type of the transaction payload.
+Depending on the payload type, the payload data field is decoded differently.
+ Payload Data contains the actual data payload of the transaction.
+The payload data varies depending on the payload type.
+ Signature contains a cryptographic signature created by the sender using their private key.
+The signature is used to ensure that the transaction has not been tampered with and that it was indeed created by the sender.
+ Public Key contains the public key of the sender.
+The public key is used to verify that the sender has the authority to create the transaction.
+The sender’s address should be derived from this public key.
+
+
+
Payload Type
+
+
The payload type field determines the format of the payload data field in the transaction.
+Different payload types have different formats for the payload data.
+The following are the supported transactions in Pactus blockchain:
+
+
+ Transfer transaction
+ Bond transaction
+ Sortition transaction
+ Unbond transaction
+ Withdraw transaction
+
+
+
Transaction ID
+
+
The Transaction ID is a unique identifier for a transaction on the blockchain.
+It is generated by taking the hash of the transaction data without including the public key and signature fields.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/transaction/sortition/index.html b/ar/learn/transaction/sortition/index.html
new file mode 100644
index 000000000..f39fc8f52
--- /dev/null
+++ b/ar/learn/transaction/sortition/index.html
@@ -0,0 +1,659 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Sortition Transaction | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Sortition Transaction
+
+
Sortition transaction is used to enter a validator
+in the committee .
+By committing a sortition transaction, the validator will enter the committee.
+Sortition transactions are valid for 7 blocks, which is defined as “sortition interval” in the
+consensus parameters .
+
+
Payload Structure
+
+
The sortition transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Address
+
+
+ 48 bytes
+ Sortition Proof
+
+
+
+
+
+ Address is the address of the validator that evaluated the sortition
+ Sortition Proof is the proof of evaluating the sortition
+
+
+
Validators do not need to pay a fee for sortition transactions, and the fee should be set to zero.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/transaction/transfer/index.html b/ar/learn/transaction/transfer/index.html
new file mode 100644
index 000000000..fc243f6ac
--- /dev/null
+++ b/ar/learn/transaction/transfer/index.html
@@ -0,0 +1,673 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transfer Transaction | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Transfer Transaction
+
+
Transfer transaction is used to transfer coins between the accounts .
+If the receiver account does not exist, it will be created.
+
+
Payload Structure
+
+
The transfer transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Sender address
+
+
+ 21 bytes
+ Receiver address
+
+
+ Variant
+ Amount
+
+
+
+
+
+ Sender address is the account address that transfers the amount
+ Receiver address is the account address that receives the amount
+ Amount is the amount of coins that should be transferred
+
+
+
Reward Transaction
+
+
The reward transaction is the first transaction in each block. There is only one reward transaction
+per block, and it has the same format as a transfer transaction, but with zero fees and no signature.
+
+
The sender address is the Treasury address ,
+and the receiver address is defined by the block proposer.
+The amount of the reward transaction should be equal to the
+block reward plus transaction fees.
+This amount will go to the proposer account as a block reward.
+Therefore, in each block, one coin from the
+Treasury account transfers to
+the proposer account as a block reward.
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/transaction/unbond/index.html b/ar/learn/transaction/unbond/index.html
new file mode 100644
index 000000000..f2ebd0237
--- /dev/null
+++ b/ar/learn/transaction/unbond/index.html
@@ -0,0 +1,650 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Unbond Transaction | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Unond Transaction
+
+
Unbond transaction is used to unbond a validator .
+An unbonded validator cannot participate in the sortition algorithm anymore, and after 21 days, the stake can be withdrawn.
+This is called the “unbond interval” and is defined in the consensus parameter .
+
+
Payload Structure
+
+
The unbond transaction has a payload consists the following field:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Validator address
+
+
+
+
+
+ Validator address is the address of validator that is unbonded.
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/learn/transaction/withdraw/index.html b/ar/learn/transaction/withdraw/index.html
new file mode 100644
index 000000000..92d53e4f7
--- /dev/null
+++ b/ar/learn/transaction/withdraw/index.html
@@ -0,0 +1,659 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Withdraw Transaction | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Withdraw Transaction
+
+
Withdraw transaction is used to withdraw the staked coins from an unbonded
+validator
+
+
Payload Structure
+
+
The withdraw transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Sender address
+
+
+ 21 bytes
+ Receiver address
+
+
+ Variant
+ Amount
+
+
+
+
+
+ Sender address is the address of the sender validator.
+ Receiver address is the address of the receiver account .
+ Amount is the amount of coins that should be withdrawn
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/mstile-150x150.png b/ar/mstile-150x150.png
new file mode 100644
index 000000000..187b08cc8
Binary files /dev/null and b/ar/mstile-150x150.png differ
diff --git a/ar/robots.txt b/ar/robots.txt
new file mode 100644
index 000000000..0097513b3
--- /dev/null
+++ b/ar/robots.txt
@@ -0,0 +1 @@
+Sitemap: https://pactus.org/sitemap.xml
diff --git a/ar/safari-pinned-tab.svg b/ar/safari-pinned-tab.svg
new file mode 100644
index 000000000..43c436d31
--- /dev/null
+++ b/ar/safari-pinned-tab.svg
@@ -0,0 +1,27 @@
+
+
+
+
+Created by potrace 1.14, written by Peter Selinger 2001-2017
+
+
+
+
+
diff --git a/ar/site.webmanifest b/ar/site.webmanifest
new file mode 100644
index 000000000..c00b17332
--- /dev/null
+++ b/ar/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-256x256.png",
+ "sizes": "256x256",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/ar/sitemap.xml b/ar/sitemap.xml
new file mode 100644
index 000000000..0c9b8774d
--- /dev/null
+++ b/ar/sitemap.xml
@@ -0,0 +1,272 @@
+
+
+
+https://pactus.org/2022/08/29/dev-meeting.html
+2022-08-29T00:00:00+00:00
+
+
+https://pactus.org/2022/09/04/dev-meeting.html
+2022-09-04T00:00:00+00:00
+
+
+https://pactus.org/2022/09/18/dev-meeting.html
+2022-09-18T00:00:00+00:00
+
+
+https://pactus.org/2022/09/20/release-0-9-0.html
+2022-09-20T00:00:00+00:00
+
+
+https://pactus.org/2022/09/24/testnet-0-launched.html
+2022-09-24T00:00:00+00:00
+
+
+https://pactus.org/2022/10/30/dev-meeting.html
+2022-10-30T00:00:00+00:00
+
+
+https://pactus.org/2022/11/24/release-0-9-1.html
+2022-11-24T00:00:00+00:00
+
+
+https://pactus.org/2023/03/01/what-is-testnet.html
+2023-03-01T00:00:00+00:00
+
+
+https://pactus.org/2023/04/21/testnet-0-concluded.html
+2023-04-21T00:00:00+00:00
+
+
+https://pactus.org/2023/05/08/release-0-10-0.html
+2023-05-08T00:00:00+00:00
+
+
+https://pactus.org/2023/05/09/testnet-1-launched.html
+2023-05-09T00:00:00+00:00
+
+
+https://pactus.org/2023/05/29/release-0-11-0.html
+2023-05-29T00:00:00+00:00
+
+
+https://pactus.org/2023/06/19/release-0-12-0.html
+2023-06-19T00:00:00+00:00
+
+
+https://pactus.org/2023/07/01/release-0-13-0.html
+2023-07-01T00:00:00+00:00
+
+
+https://pactus.org/2023/07/05/testnet-500-validators.html
+2023-07-05T00:00:00+00:00
+
+
+https://pactus.org/2023/07/09/dev-meeting.html
+2023-07-09T00:00:00+00:00
+
+
+https://pactus.org/2023/08/01/testnet-1-concluded.html
+2023-08-01T00:00:00+00:00
+
+
+https://pactus.org/2023/08/22/dev-report.html
+2023-08-22T00:00:00+00:00
+
+
+https://pactus.org/2023/09/04/introduction-to-pips.html
+2023-09-04T00:00:00+00:00
+
+
+https://pactus.org/2023/09/24/dev-report-pre-testnet-2.html
+2023-09-24T00:00:00+00:00
+
+
+https://pactus.org/2023/09/28/how-sspos-works-in-simple-word.html
+2023-09-28T00:00:00+00:00
+
+
+https://pactus.org/2023/10/15/release-0-15-0.html
+2023-10-15T00:00:00+00:00
+
+
+https://pactus.org/2023/10/15/testnet-2-launched.html
+2023-10-15T00:00:00+00:00
+
+
+https://pactus.org/2023/10/29/release-0-16-0.html
+2023-10-29T00:00:00+00:00
+
+
+https://pactus.org/2023/11/12/release-0-17-0.html
+2023-11-12T00:00:00+00:00
+
+
+https://pactus.org/2023/12/12/release-0-18-0.html
+2023-12-12T00:00:00+00:00
+
+
+https://pactus.org/2024/01/04/release-0-19-0.html
+2024-01-04T00:00:00+00:00
+
+
+https://pactus.org/2024/01/08/mainnet-announcement.html
+2024-01-08T00:00:00+00:00
+
+
+https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminter.html
+2024-01-10T00:00:00+00:00
+
+
+https://pactus.org/2024/01/11/release-0-20-0.html
+2024-01-11T00:00:00+00:00
+
+
+https://pactus.org/2024/01/22/testnet-2-concluded.html
+2024-01-22T00:00:00+00:00
+
+
+https://pactus.org/2024/01/24/mainnet-launched.html
+2024-01-24T20:24:00+00:00
+
+
+https://pactus.org/2024/01/31/release-1-0-0.html
+2024-01-31T00:00:00+00:00
+
+
+https://pactus.org/2024/02/10/release-1-0-1.html
+2024-02-10T00:00:00+00:00
+
+
+https://pactus.org/2024/02/18/release-1-0-2.html
+2024-02-18T00:00:00+00:00
+
+
+https://pactus.org/blog/
+
+
+https://pactus.org/
+
+
+https://pactus.org/community/
+
+
+https://pactus.org/contributing/
+
+
+https://pactus.org/user-guides/run-pactus-docker/
+
+
+https://pactus.org/user-guides/send-transactions-gui/
+
+
+https://pactus.org/user-guides/grpc-sign-transactions/
+
+
+https://pactus.org/user-guides/reduce-network/
+
+
+https://pactus.org/user-guides/run-pactus-cli/
+
+
+https://pactus.org/user-guides/run-pactus-metrics/
+
+
+https://pactus.org/user-guides/run-pactus-gui/
+
+
+https://pactus.org/user-guides/use-wallet-cli/
+
+
+https://pactus.org/user-guides/
+
+
+https://pactus.org/download/
+
+
+https://pactus.org/term-of-use/
+
+
+https://pactus.org/about/what-is-pactus/
+
+
+https://pactus.org/about/roadmap/
+
+
+https://pactus.org/about/faq/
+
+
+https://pactus.org/learn/blockchain/block/
+
+
+https://pactus.org/learn/blockchain/state-hash/
+
+
+https://pactus.org/learn/blockchain/account/
+
+
+https://pactus.org/learn/blockchain/genesis/
+
+
+https://pactus.org/learn/blockchain/validator/
+
+
+https://pactus.org/learn/blockchain/cryptography/
+
+
+https://pactus.org/learn/blockchain/address/
+
+
+https://pactus.org/learn/blockchain/incentive/
+
+
+https://pactus.org/learn/blockchain/serialization/
+
+
+https://pactus.org/learn/consensus/specification/
+
+
+https://pactus.org/learn/consensus/proof-of-stake/
+
+
+https://pactus.org/learn/consensus/protocol/
+
+
+https://pactus.org/learn/consensus/parameters/
+
+
+https://pactus.org/learn/consensus/committee/
+
+
+https://pactus.org/learn/consensus/sortition/
+
+
+https://pactus.org/learn/smart-contract/storage/
+
+
+https://pactus.org/learn/transaction/transfer/
+
+
+https://pactus.org/learn/transaction/fee/
+
+
+https://pactus.org/learn/transaction/withdraw/
+
+
+https://pactus.org/learn/transaction/unbond/
+
+
+https://pactus.org/learn/transaction/bond/
+
+
+https://pactus.org/learn/transaction/format/
+
+
+https://pactus.org/learn/transaction/sortition/
+
+
+https://pactus.org/learn/api/grpc/
+
+
+https://pactus.org/learn/
+
+
diff --git a/ar/term-of-use/index.html b/ar/term-of-use/index.html
new file mode 100644
index 000000000..d7a0bdc22
--- /dev/null
+++ b/ar/term-of-use/index.html
@@ -0,0 +1,560 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Term of Use | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Terms of Use
+
+
Welcome to Pactus.
+
+
By using our website or services, you agree to these Terms of Use (“Terms”).
+Please review them carefully.
+If you do not accept the Terms, please do not use our website or services.
+
+
We may update the Terms occasionally.
+Your continued use of our website or services after any changes means you accept the updates.
+If you do not agree to the updates, please stop using our website and services.
+
+
“We,” “us,” “our,” and “Pactus” refer to the Pactus Blockchain Project. “You” refers to each user of our
+website or services.
+
+
Website Access and Modifications
+
+
We strive to provide continuous website access but cannot guarantee uninterrupted or error-free service.
+Pactus is not liable for any inaccessible features or website unavailability.
+
+
We may modify, expand, limit, or discontinue any part of the website or
+services at any time to accommodate users or for other reasons, without notice.
+We reserve the right to suspend website access temporarily or permanently, at our discretion, without notice.
+
+
Users may need to update their computer hardware or software to access some website content or features.
+Pactus is not responsible for any inability to access the website or services due to user systems,
+internet networks, or other causes.
+
+
Age Limit
+
+
Our website and services are not intended for those under 18.
+If you are under 18, you may only use this website with the supervision of a parent, guardian, or other responsible adult.
+
+
No Personalized Advice
+
+
This website does not provide individualized legal, tax, financial, or investment advice.
+Since everyone’s situation is different, we recommend consulting a qualified professional for financial decisions.
+
+
PAC coin is meant to be used as a medium of exchange.
+Nothing on this website should be considered investment advice or a solicitation to
+buy, hold, invest in, own, or use PAC coin.
+
+
No Content Guarantees
+
+
We cannot guarantee the accuracy, completeness, or quality of the information on this website.
+All content is provided on an “as is” and “as available” basis, and use is at your own risk.
+
+
The content may be sourced from third parties.
+Pactus is not responsible for any errors, omissions, or inaccuracies.
+The information may not suit everyone and may only apply to certain regions.
+
+
It is your responsibility to evaluate if the information and services are technically and legally suitable for
+your intended use and comply with applicable laws.
+Always verify any information before using it for personal, financial, or business purposes.
+
+
We may modify website content and services at any time without notice.
+We are not obligated to inform you of any changes or corrections.
+
+
External Content
+
+
Any testimonials, opinions, advice, offers, or other third party content on this website reflect the views
+and intentions of those parties/people only.
+They do not represent the views of Pactus.
+
+
We do not guarantee the accuracy, completeness, reliability, or usefulness of external content.
+Users are responsible for assessing external content.
+Pactus is not liable for any damage or loss from relying on or using third party content.
+
+
User Generated Content
+
+
By posting or submitting any material to this website, including the forum, you grant Pactus a
+worldwide, fully paid-up, non-exclusive license to edit and display your materials on our website and
+social media platforms as we deem appropriate.
+
+
You agree to indemnify and hold harmless Pactus and its Users from any third-party claims arising from
+your materials.
+You also represent that you own or have the right to post the materials, that they are
+accurate, their use on the Pactus website complies with laws, and they will not cause harm to any
+person.
+
+
Pactus has the right to remove any materials we deem objectionable, offensive, illegal, harmful, or in
+violation of these Terms.
+We may disclose user information if legally required.
+
+
Please contact info@pactus.org to request the removal of your posted content for reasons such as
+privacy concerns, copyright issues, or no longer wanting your content to appear publicly.
+We will review removal requests on a case-by-case basis.
+
+
File Safety and Security
+
+
Pactus implements measures to protect downloadable files on our website but cannot guarantee they
+are free of infections, viruses, or harmful code.
+
+
We are also not responsible if users’ devices are infected by visiting our website or downloading files in
+the event of a security breach.
+
+
If uncertain, users should consider compiling Pactus from the provided source code.
+Users are responsible for meeting their own security requirements.
+
+
+
+
Pactus works with reputable partners, but does not endorse or take responsibility for sponsored content claims.
+We do not review, recommend, or endorse any products or services promoted on our site.
+
+
Pactus is not liable for damages from misuse of personal information given to sponsors.
+We are also not responsible for losses from using sponsor links or services on our site.
+
+
External Links
+
+
For user convenience, our website may contain links to external sites and resources.
+However, we do not control these external sites and are not responsible for
+their content, products, services, or information.
+
+
Link inclusion does not imply Pactus endorsement or affiliation.
+Users should be aware they may leave our website by clicking links.
+External site terms of use may differ from ours.Pactus is not responsible for
+losses from users following links to external sites.
+We encourage caution and reviewing external sites’ terms and policies before transacting or engaging.
+
+
Electronic Communications
+
+
Our website responses and email communications will be delivered electronically.
+Pactus reserves the right to disclose any user emails or objectionable material
+to comply with legal processes or protect the
+rights and property of Pactus, its customers, suppliers, and users.
+
+
No Financial Services
+
+
This website does not engage in storing, selling, buying, sending, or receiving Pactus coins.
+All activities related to owning and transferring Pactus coins occur on the DEX/CEX/decentralized Pactus network.
+This website does not actively participate in that network.
+
+
No Liability
+
+
Pactus assumes no liability for any damages, claims, or losses related to using Pactus.
+This includes third party actions or inactions and events.
+
+
It includes but is not limited to: security issues when using Pactus software/services, technical problems
+when using Pactus software/services, software or data corruption when using Pactus software/services,
+or user errors when using Pactus software/services.
+
+
Disclaimer of Warranties
+
+
Pactus expressly disclaims all warranties, representations, and conditions, whether express or implied,
+including but not limited to the implied warranties and conditions of merchantability, fitness for a
+particular purpose, and non-infringement.
+
+
This disclaimer extends to the use of this website and its services, as well as the accuracy, completeness,
+timeliness, or currentness of its content, in any manner and for any purpose.
+
+
No Consequential Damages
+
+
Under no circumstances will Pactus be liable for any incidental, special, consequential, exemplary,
+indirect, or other damages arising from use of this website, its services, or content.
+This includes but is not limited to data loss, even if advised of such damage possibilities.
+
+
This disclaimer applies whether based on contract, tort, negligence, product liability, strict liability, or otherwise.
+It extends to all potential scenarios and circumstances.
+
+
General
+
+
These Terms of Use (TOU) and any applicable Terms of Service are the full agreement for website use by
+users and Pactus. They replace previous agreements.
+
+
If Pactus or a user does not exercise a TOU right, this does not waive the right. If a TOU provision is
+invalid, the rest remain valid.
+
+
The TOU and Terms of Service are intentionally in English, the governing language for Pactus and users.
+
+
Copyright
+
+
Attributed Content
+
+
Logos for operating systems, platforms, and sponsors we support are copyrighted by their respective owners.
+Pactus does not own these copyrights but uses the logos with permission or in a clear, non- harmful way.
+
+
Privacy Policy
+
+
Data Collection and Use
+
+
We collect standard server logs from our website.
+This data helps provide site statistics, improve content and information flow, analyze errors, and diagnose dead links.
+A segment of server logs gathers download statistics to better understand user needs.
+
+
+ Last update: 25 January 2024
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/user-guides/grpc-sign-transactions/index.html b/ar/user-guides/grpc-sign-transactions/index.html
new file mode 100644
index 000000000..c7031655f
--- /dev/null
+++ b/ar/user-guides/grpc-sign-transactions/index.html
@@ -0,0 +1,523 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to sign transaction using gRPC? | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to sign transaction using gRPC?
+
+
Preface
+
+
The Pactus Blockchain provides a gRPC interface that allows users to interact with the blockchain and native wallet.
+This is ideal for merchants and users who want to create, sign, and broadcast transactions using their local node.
+This tutorial will guide you step-by-step on how to use gRPC to sign transactions.
+
+
Setup node
+
+
Initialize the node
+
+
To follow along with this tutorial, you’ll first need to set up and run a localnet blockchain, which is suitable for testing:
+
+
./build/pactus-daemon init \
+ --localnet \
+ --working-dir ./pactus-localnet \
+ --password "super-secret-password" \
+ --val-num 7 \
+ --restore "fish cool avoid history kitten quick olive purchase blossom grocery cool treat"
+
+
+
This command initializes a Pactus blockchain as a localnet.
+The purpose of this network is for testing.
+The above command actually restores a node from the given mnemonic.
+This helps you to create the same wallet with this tutorial. The first two addresses in this wallet are:
+
+
tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6
+tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7
+
+
+
We are going to transfer 1 PAC from the first account to the second one.
+
+
Run the node
+
+
Now you can run the node simply with this command:
+
+
./build/pactus-daemon start \
+ --working-dir ./pactus-localnet \
+ --password "super-secret-password"
+
+
+
By running the node, you will see that it starts creating blocks, and
+therefore the reward account address will be rewarded locally.
+We can use this balance for testing purposes.
+
+
Interact with the node
+
+
Open another terminal and run the following command:
+
+
./pactus-ctl --server-addr localhost:50052 \
+ blockchain get-blockchain-info
+
+
+
It should print information about the localnet blockchain.
+The pactus-ctl
application uses gRPC to interact with the blockchain.
+In this tutorial, we use pactus-ctl
to interact with the blockchain.
+You can either use gRPC-gateway REST APIs or make direct gRPC calls to interact with the node.
+They are more or less similar and all interact with the node using gRPC endpoints.
+
+
Signing Transitions
+
+
Create raw transaction
+
+
To sign a transaction, we first need to create a raw transaction and then sign it.
+We can use the get_raw_transfer_transaction
method to create a raw transfer transaction.
+Similar methods can be used to create raw bond, unbond, and withdraw transactions.
+
+
./pactus-ctl --server-addr localhost:50052 \
+ transaction get-raw-transfer-transaction \
+ --sender tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6 \
+ --receiver tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7 \
+ --amount 1
+{
+ "rawTransaction" : "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+}
+
+
+
The sender account is the first reward address in the wallet, therefore it should have some coins in its account.
+
+
Please note that the amount here is in atomic units.
+There is a Working-In-Progress PR to accept and return all amounts in PAC units (10^9).
+
+
Sign transaction
+
+
Now you can sign this raw transaction. To sign a transaction, first, we need to load a wallet.
+At the time of writing this document, Pactus only supports the “default_wallet”.
+Soon, creating wallets through gRPC and loading them will be supported.
+
+
./pactus-ctl --server-addr localhost:50052 \
+ wallet load-wallet --wallet-name "default_wallet"
+{
+ "walletName" : "default_wallet"
+}
+
+
+
Now that the “default_wallet” is loaded, we can proceed to sign the raw transaction:
+
+
./pactus-ctl --server-addr localhost:50052 \
+ wallet sign-raw-transaction \
+ --wallet-name "default_wallet" \
+ --password "super-secret-password" \
+ --raw-transaction "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+{
+ "transactionId" : "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA=" ,
+ "signedRawTransaction" : "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+}
+
+
+
Transaction successfully signed.
+
+
Broadcast signed transaction
+
+
Now you can broadcast the signed transaction:
+
+
./pactus-ctl --server-addr localhost:50052 \
+ transaction broadcast-transaction \
+ --signed-raw-transaction "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+{
+ "id" : "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA="
+}
+
+
+
Transaction successfully broadcasted.
+
+
Production Security Considerations
+
+
In this tutorial, we utilized a localnet version of Pactus.
+For production purposes, you’ll need to set up the node for the Mainnet and synchronize it with the network.
+Additionally, in production, the wallet service is disabled by default.
+You can enable the wallet service in the configuration file.
+
+
When signing transactions in production, you need to prioritize the security of the wallet.
+Make sure you have set a strong password for the native wallet.
+Ensure that it is called on localhost for safety.
+If you intend to call it on a remote server, there are several security measures to consider:
+
+
+ Ensure SSL is installed using Nginx to secure the connections.
+ Secure the API using a password (currently under development; see here: PIP-20 ).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/user-guides/index.html b/ar/user-guides/index.html
new file mode 100644
index 000000000..c4c04cd63
--- /dev/null
+++ b/ar/user-guides/index.html
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ دلائل المستخدم | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
دلائل المستخدم
+
+
هنا، يمكنك العثور على بعض التوجيهات لمساعدتك على استخدام والتفاعل مع بلوكشين بكتوس.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/user-guides/reduce-network/index.html b/ar/user-guides/reduce-network/index.html
new file mode 100644
index 000000000..0aa7d82f9
--- /dev/null
+++ b/ar/user-guides/reduce-network/index.html
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to reduce the network usage? | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to reduce the network usage?
+
+
Preface
+
+
Pactus is designed for low traffic usage.
+However, some users still face bandwidth limitations imposed by their Internet Service Providers (ISPs).
+This guide will explore effective ways to reduce networking usage for a Pactus node.
+
+
Reducing the number of connection
+
+
By default, Pactus attempts to maintain 64 open connections with other nodes,
+split into 32 inbound and 32 outbound connections.
+To reduce networking usage, you can decrease this maximum number of connections.
+However, it’s important to remember that more connections with
+peers usually enable the node to function more effectively and securely.
+The max_connections
setting in the config file can be adjusted to manage the maximum number of connections.
+
+
Disabling Relay
+
+
A relay connection is a type of connection that can be established between two peers,
+usually behind a NAT, by a third-party peer known as a relay.
+This is especially helpful when users run Pactus on a private network like home internet.
+However, the relay connection is not as stable as a direct connection.
+Disabling the relay connection may reduce network usage.
+If you have a reliable and public IP address, you can disable the relay connection.
+The relay connection is enabled by default. To disable the relay connection,
+set enable_relay
to false
inside the config file.
+
+
Disabling Node-Network service
+
+
A node-network is a type of node that provides historical data, such as blocks,
+to other nodes so they can sync with the network.
+By default, this service is enabled.
+Disabling this service helps reduce traffic usage.
+Keep in mind that new nodes rely on other nodes to be able to sync.
+To disable the node-network service, set node_network
to false
.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/user-guides/run-pactus-cli/index.html b/ar/user-guides/run-pactus-cli/index.html
new file mode 100644
index 000000000..e7efd71dd
--- /dev/null
+++ b/ar/user-guides/run-pactus-cli/index.html
@@ -0,0 +1,545 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ كيفية تشغيل بكتوس في وضع سطر الأوامر؟ | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
كيفية تشغيل بكتوس في وضع سطر الأوامر؟
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
Preface
+
+
Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI).
+This tutorial will guide you through the steps to run Pactus in CLI mode, suitable for advanced users.
+
+
Prerequisites
+
+
Before proceeding with the steps below, ensure that you have the following:
+
+
+ A computer running Windows, macOS, or Linux
+ Suitable internet connection
+
+
+
Download
+
+
To get started, download and extract the Pactus CLI file from
+here .
+
+
Initializing the node
+
+
Now you need to create a wallet and setup a working directory for your node.
+A working directory is a place where you save blockchain data and wallets.
+Open the Terminal and run the following command:
+
+
+
+
+
+
+
./pactus-daemon init -w ~/pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus
.
+
+
+
+
+
+
+
./pactus-daemon init -w ~/pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus
.
+
+
+
+
+
+
+
pactus-daemon.exe init -w c:\pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at c:\pactus
.
+
+
+
+
+
+
+
Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future
+in case your computer is lost, damaged, or stolen.
+
+
The working directory contains:
+
+
+ Default wallet
+ Genesis file
+ Config file
+
+
+
Feel free to take a look at these files.
+
+
Running the node
+
+
Now you can start the node and sync with the network. Run the following command in the Terminal:
+
+
+
+
+
+
+
./pactus-daemon start -w ~/pactus
+
+
+
+
+
+
+
+
./pactus-daemon start -w ~/pactus
+
+
+
+
+
+
+
+
pactus-daemon.exe start -w c:\pactus
+
+
+
+
+
+
+
+
When the Pactus node starts running, it begins syncing with the network.
+This process may take some time, as your node needs to download and verify the entire blockchain history.
+Please be patient while your node syncs.
+
+
To become a validator and participate in the
+consensus algorithm to earn rewards, you first need to
+stake some coins. In the next
+tutorial ,
+we will explain how to send a Bond transaction to become a validator.
+
+
+
+
By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. Thank you for your participation!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/user-guides/run-pactus-docker/index.html b/ar/user-guides/run-pactus-docker/index.html
new file mode 100644
index 000000000..a421a5e87
--- /dev/null
+++ b/ar/user-guides/run-pactus-docker/index.html
@@ -0,0 +1,559 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ كيفية تشغيل بكتوس باستخدام دوكر؟ | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
كيفية تشغيل بكتوس باستخدام دوكر؟
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
Preface
+
+
Docker is a tool that simplifies the process of creating, deploying, and running applications using containers.
+With containers, developers can bundle all the necessary parts of an application, including libraries and dependencies,
+and deploy them as a single package.
+
+
In this document, we will guide you on how to run Pactus using Docker, step by step.
+
+
Prerequisites
+
+
The only thing you need is installing docker in your machine.
+If you are using Windows please make sure you have installed WSL.
+
+
Docker Images
+
+
The Pactus docker images are available at Docker Hub .
+You can pull the latest image with this command:
+
+
docker pull pactus/pactus
+
+
+
Initializing the node
+
+
Now you need to create a wallet and setup a working directory for your node.
+A working directory is a place where you save blockchain data and wallets.
+Open the Terminal and run the following command:
+
+
+
+
+
+
+
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus/testnet
.
+
+
+
+
+
+
+
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus/testnet
.
+
+
+
+
+
+
+
docker run -it --rm -v c:\pactus\testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at c:\pactus\testnet
.
+
+
+
+
+
+
+
Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future
+in case your computer is lost, damaged, or stolen.
+
+
The working directory contains:
+
+
+ Default wallet
+ Genesis file
+ Config file
+
+
+
Feel free to take a look at these files.
+
+
Running the node
+
+
Now you can start the node and sync with the network. Run the following command in the Terminal:
+
+
+
+
+
+
+
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+
+
+
+
+
+
+
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+
+
+
+
+
+
+
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+
+
+
+
+
+
+
To run pactus-testnet in background just add a -d flag in the command.
+
+
Hint: Remember to pass in your wallet passphrase as well with -p flag after /pactus.
+
+
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p { YOUR_PASSPHRASE}
+
+
+
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p { YOUR_PASSPHRASE }
+
+
+
You can stop/start docker:
+
+
docker stop pactus-testnet
+docker start pactus-testnet
+
+
+
Or check the logs:
+
+
docker logs pactus-testnet --tail 1000 -f
+
+
+
+
+
By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network.
+Thank you for your participation!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/user-guides/run-pactus-gui/code-certificate-warning.png b/ar/user-guides/run-pactus-gui/code-certificate-warning.png
new file mode 100644
index 000000000..029a877ff
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/code-certificate-warning.png differ
diff --git a/ar/user-guides/run-pactus-gui/default-wallet.png b/ar/user-guides/run-pactus-gui/default-wallet.png
new file mode 100644
index 000000000..dee6ba6eb
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/default-wallet.png differ
diff --git a/ar/user-guides/run-pactus-gui/index.html b/ar/user-guides/run-pactus-gui/index.html
new file mode 100644
index 000000000..3a50c2f34
--- /dev/null
+++ b/ar/user-guides/run-pactus-gui/index.html
@@ -0,0 +1,526 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ كيفية تشغيل بكتوس في الوضع الرسومي؟ | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
كيفية تشغيل بكتوس في الوضع الرسومي؟
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
Preface
+
+
Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI).
+This tutorial will guide you through the steps to run Pactus in GUI mode, suitable for beginner to advanced users.
+
+
Prerequisites
+
+
Before proceeding with the steps below, ensure that you have the following:
+
+
+ A computer running Windows, macOS, or Linux
+ Suitable internet connection
+
+
+
Download
+
+
Download the Pactus GUI installer or archived file from
+here .
+
+
Code certificate issue
+
+
Windows and macOS users may encounter a warning message stating that Pactus is an untrusted application.
+This is because Pactus does not have a
+code signing certificate .
+
+
+
+
A code certificate is a digital signature that verifies the identity and authenticity of the software publisher.
+However, obtaining a code certificate is complex and expensive process, and requires registering a company and
+passing Know Your Customer (KYC) checks.
+
+
As Pactus is an open-source and community-based application, we don’t have a code certificate yet.
+Therefore, you can safely ignore the warning message and proceed with installing Pactus.
+
+
Installing
+
+
To install Pactus GUI, simply follow the on-screen instructions provided by the installer.
+The process is straightforward and similar to installing any other application on your computer.
+
+
+
+
Initializing
+
+
When you run Pactus for the first time, a wizard dialog will appear to guide you through the wallet creation and
+initialization process. This process consists of several steps:
+
+
Initialize mode
+
+
On the first page, you will ask you how you want to create your wallet.
+Select the option to “Create a new wallet from scratch” and proceed to the next page.
+
+
+
+
Wallet seed
+
+
The next page will display your wallet seed phrase, which consists of 12 words.
+It is essential to securely back up this seed phrase, as it is required for wallet recovery
+in case your computer is lost, damaged, or stolen.
+
+
+
+
Warning: Keep your wallet seed phrase private and secure.
+If someone else gains access to your seed phrase, they can control your wallet and funds.
+
+
Seed confirmation
+
+
In this step, you will be asked to confirm your seed phrase.
+Input the 12 words you received in the previous step into the dialog.
+If the seed phrase is entered correctly, you will be able to proceed to the next page.
+
+
+
+
Wallet password
+
+
On this page, you will be asked to set a password for your wallet.
+Enter a strong password in the first dialog box and confirm it in the second one.
+This password will be used to encrypt your wallet and protect it from unauthorized access.
+
+
+
+
Note: Choose a strong password and keep it safe.
+If you forget or lose your password, you will need your seed phrase to regain access to your wallet.
+
+
Number of validators
+
+
Each node in the Pactus blockchain can run up to 32 validators, and each validator can stake up to
+1000 coins. Here, you can define how many validators you want to create for your node.
+Select the number of validators based on the amount of coins you want to stake.
+
+
+
+
If you want to stake more than 32,000 coins, you need to set up a new node.
+
+
+
+
The last page of the initialization process shows the node information, such as the working directory, validator address,
+and reward address. Review this information and click “Close” to complete the initialization process.
+
+
+
+
Upon closing the wizard dialog, your Pactus node will start running. You are now ready to use Pactus in GUI mode.
+
+
Running the Pactus Node
+
+
After completing the initialization process, you are ready to run the Pactus node.
+Running a Pactus node allows you to synchronize with the network, enabling you to view and manage your wallet and
+sending transactions.
+
+
Syncing with the Network
+
+
When the Pactus node starts running, it begins syncing with the network. This process may take some time,
+as your node needs to download and verify the entire blockchain history.
+Please be patient while your node syncs.
+
+
+
+
Default Wallet
+
+
You can check the “Default Wallet” tab to access your wallet information. Please note that the displayed
+information may not be accurate until the syncing process is complete.
+
+
+
+
In the “Default Wallet” tab, you can view your account details, including your balance and
+address information such as the validator and reward addresses .
+Your computer acts as a node and is recognized by the validator address in the Pactus network.
+The reward address is the account address where you collect the
+rewards earned by participating in
+the consensus algorithm and proposing new blocks.
+
+
To become a validator and participate in the
+consensus algorithm to earn rewards, you first need to
+stake some coins. In the next
+tutorial ,
+we will explain how to send a Bond transaction to become a validator.
+
+
+
+
By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network.
+Thank you for your participation!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/user-guides/run-pactus-gui/initialize-mode.png b/ar/user-guides/run-pactus-gui/initialize-mode.png
new file mode 100644
index 000000000..757a9518c
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/initialize-mode.png differ
diff --git a/ar/user-guides/run-pactus-gui/installing.png b/ar/user-guides/run-pactus-gui/installing.png
new file mode 100644
index 000000000..9025ff728
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/installing.png differ
diff --git a/ar/user-guides/run-pactus-gui/node-information.png b/ar/user-guides/run-pactus-gui/node-information.png
new file mode 100644
index 000000000..0f9f69d90
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/node-information.png differ
diff --git a/ar/user-guides/run-pactus-gui/number-of-validators.png b/ar/user-guides/run-pactus-gui/number-of-validators.png
new file mode 100644
index 000000000..4b97ca1b4
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/number-of-validators.png differ
diff --git a/ar/user-guides/run-pactus-gui/seed-confirmation.png b/ar/user-guides/run-pactus-gui/seed-confirmation.png
new file mode 100644
index 000000000..f6a644547
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/seed-confirmation.png differ
diff --git a/ar/user-guides/run-pactus-gui/syncing-progress.png b/ar/user-guides/run-pactus-gui/syncing-progress.png
new file mode 100644
index 000000000..d11797b50
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/syncing-progress.png differ
diff --git a/ar/user-guides/run-pactus-gui/wallet-password.png b/ar/user-guides/run-pactus-gui/wallet-password.png
new file mode 100644
index 000000000..c17c3b30c
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/wallet-password.png differ
diff --git a/ar/user-guides/run-pactus-gui/wallet-seed.png b/ar/user-guides/run-pactus-gui/wallet-seed.png
new file mode 100644
index 000000000..9f000acd8
Binary files /dev/null and b/ar/user-guides/run-pactus-gui/wallet-seed.png differ
diff --git a/ar/user-guides/run-pactus-metrics/index.html b/ar/user-guides/run-pactus-metrics/index.html
new file mode 100644
index 000000000..894a13b4d
--- /dev/null
+++ b/ar/user-guides/run-pactus-metrics/index.html
@@ -0,0 +1,520 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to run Pactus Metrics? | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to run Pactus Metrics?
+
+
Preface
+
+
Pactus can be run with metrics, providing you with the ability to monitor your node.
+This tutorial will guide you through the steps to run Pactus with metrics, suitable for advanced users.
+
+
Prerequisites
+
+
Before proceeding with the steps below, ensure that you have the following:
+
+
+
+
+
+
To Configure the Pactus Node for Metrics, navigate to the Pactus directory; by default, it’s located at the following path.
+
+
/home/YourUsername/pactus
+
+
+
There’s a file named config.toml
that contains all the configurations for your node.
+There are two parameters that you should enable for metrics: the first is enable_metrics
,
+and the second is enable http
. After editing the config.toml
you should restart your node.
+The metrics now can be accessed at http://localhost:80/metrics/prometheus
(this url going to be use by prometheus).
+
+
+
+if you are running Pactus with docker image, make sure to expose :80 port.
+
+
+
+
+
+
+
+
You should run Grafana and Prometheus for gathering metrics and displaying them in charts.
+First, create a directory named prometheus-grafana
. Inside the directory,
+create a docker-compose.yml
file and paste the code below.
+
+
services :
+ prometheus :
+ image : prom/prometheus
+ container_name : prometheus
+ command :
+ - " --config.file=/etc/prometheus/prometheus.yml"
+ ports :
+ - 9090:9090
+ restart : unless-stopped
+ volumes :
+ - ./prometheus:/etc/prometheus
+ - prom_data:/prometheus
+ grafana :
+ image : grafana/grafana
+ container_name : grafana
+ ports :
+ - 3000:3000
+ restart : unless-stopped
+ environment :
+ - GF_SECURITY_ADMIN_USER=admin
+ - GF_SECURITY_ADMIN_PASSWORD=admin
+ volumes :
+ - ./grafana:/etc/grafana/provisioning/datasources
+volumes : prom_data
+
+
+
You can change the default username and password of Grafana by modifying the values of GF_SECURITY_ADMIN_USER
and GF_SECURITY_ADMIN_PASSWORD
.
+Now, save the file. Then, in the current directory (meaning you are inside the prometheus-grafana
directory),
+create another directory named grafana
. Then, go to the directory. So now you’re in the path /prometheus-grafana/grafana/
.
+In the current directory, create a file named datasource.yml
and paste the code below there.
+
+
apiVersion : 1
+
+datasources :
+ - name : Prometheus
+ type : prometheus
+ url : http://prometheus:9090
+ isDefault : true
+ access : proxy
+ editable : true
+
+
+
Then save the file and exit.
+Now, we should go up one directory level from the current directory and navigate to the /prometheus-grafana
directory.
+In the current directory, which is /prometheus-grafana
, create another directory named prometheus
,
+then go into the directory.In the prometheus directory create a file named prometheus.yml
and paste below code there.
+
+
global :
+ scrape_interval : 15s
+ scrape_timeout : 10s
+ evaluation_interval : 15s
+alerting :
+ alertmanagers :
+ - static_configs :
+ - targets : []
+ scheme : http
+ timeout : 10s
+ api_version : v1
+scrape_configs :
+ - job_name : prometheus
+ honor_timestamps : true
+ scrape_interval : 15s
+ scrape_timeout : 10s
+ metrics_path : /metrics/prometheus
+ scheme : http
+ static_configs :
+ - targets :
+ - 127.0.0.1
+
+
+
Then save the file and exit.
+
+
+
+Tip: In the last section of the code, you will see the targets section where I’ve written 127.0.0.1.
+You can change it based on your localhost IP or your website domain.
+Please be aware that your target should match with your node http port.
+The default http port of pactus node is 80.
+
+
+
+
Run Grafana and Prometheus
+
+
Go to the /prometheus-grafana
directory where the docker-compose.yml
is located and run the command below.
+
+
+
+
Congratulations! Grafana and Prometheus are now up and accessible at ports 3000
and 9090
respectively.
+
+
Import Pactus Metrics to Grafana Dashboard
+
+
As Pactus uses libp2p
for its peer-to-peer network, we should import libp2p
metrics that you can find here .
+Download one of the metrics config and then Import it into Grafana Dashboard
.
+
+
Congratulations! You did it. Now, you can perform the same operations for other configurations.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/user-guides/send-transactions-gui/bond-transaction-dialog.png b/ar/user-guides/send-transactions-gui/bond-transaction-dialog.png
new file mode 100644
index 000000000..4c06bcea4
Binary files /dev/null and b/ar/user-guides/send-transactions-gui/bond-transaction-dialog.png differ
diff --git a/ar/user-guides/send-transactions-gui/index.html b/ar/user-guides/send-transactions-gui/index.html
new file mode 100644
index 000000000..cd7f8d11a
--- /dev/null
+++ b/ar/user-guides/send-transactions-gui/index.html
@@ -0,0 +1,431 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ كيفية إرسال المعاملات في الوضع الرسومي؟ | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
كيفية إرسال المعاملات في الوضع الرسومي؟
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
Preface
+
+
The Pactus Blockchain offers a Graphical User Interface (GUI) that comes with a built-in wallet to create,
+sign and broadcast transactions.
+This tutorial aims to guide you step-by-step on how to use the GUI application to send transactions to the Pactus blockchain.
+Whether you are a beginner or an advanced user, this tutorial is suitable for you.
+
+
Prerequisites
+
+
Before we begin, you’ll need to run the Pactus GUI application and ensure that it is synced with the network.
+You can find detailed instructions on how to do this in the following tutorial .
+
+
Sending a Transfer Transaction
+
+
To send a transfer transaction , click on the “Transaction” menu and
+select “Transfer.”
+This will bring up a new window where you can select the
+account address from which you wish to send the transfer,
+as well as the recipient’s account address and the amount you wish to send.
+
+
After reviewing the transaction details and ensuring that they are correct,
+click on the “Send” button to sign and broadcast the transaction to the Pactus blockchain.
+
+
+
+
It’s important to note that the transaction fee
+will be calculated based on the amount you’re sending.
+
+
Sending a Bond Transaction
+
+
To send a bond transaction , navigate to the “Transaction” menu
+and select “Bond.”
+A new window will appear where you can select the account address from which you wish to send the bond transaction,
+as well as the validator address of the recipient and
+the amount you wish to stake.
+
+
If the validator address is not already registered on the Pactus blockchain, you will need to provide the
+validator’s public key as the first staking transaction will create the validator on the Pactus blockchain.
+To obtain the public key, you can right-click on the validator’s address in your wallet
+and select “Details.”
+
+
+
+
It’s important to note that the transaction fee
+will be calculated based on the amount you’re sending.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ar/user-guides/send-transactions-gui/transfer-transaction-dialog.png b/ar/user-guides/send-transactions-gui/transfer-transaction-dialog.png
new file mode 100644
index 000000000..3dddf68a3
Binary files /dev/null and b/ar/user-guides/send-transactions-gui/transfer-transaction-dialog.png differ
diff --git a/ar/user-guides/use-wallet-cli/index.html b/ar/user-guides/use-wallet-cli/index.html
new file mode 100644
index 000000000..be59b06a2
--- /dev/null
+++ b/ar/user-guides/use-wallet-cli/index.html
@@ -0,0 +1,1146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ كيفية استخدام المحفظة في وضع سطر الأوامر؟ | بلوكشين بكتوس
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
كيفية استخدام المحفظة في وضع سطر الأوامر؟
+
+
+ الترجمة قديمة. يمكنك قراءتها، لكن قد لا تكون دقيقة.
+
Preface
+
+
The Pactus Blockchain provides a wallet application that allows users to interact with the Pactus blockchain
+without the need to run a node.
+This is ideal for users who do not wish to operate a node but still want to create a personal wallet to manage their funds.
+This tutorial will guide you step-by-step on how to use the wallet application.
+
+
Download
+
+
To get started, download and extract the Pactus CLI file from
+here .
+
+
+
+
Wallet commands
+
+
In this section, we will explore various wallet commands that help you create, manage,
+and recover your Pactus wallet.
+
+
Create a wallet
+
+
First, you need to create a wallet. To create a new wallet, run the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 create
+
+
+
This command creates a new wallet and store it in the ~/pactus/wallets/wallet_1
.
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 create
+
+
+
This command creates a new wallet and store it in the ~/pactus/wallets/wallet_1
.
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 create --testnet
+
+
+
This command creates a new wallet and save it in the c:\pactus\wallets\wallet_1 directory.
+This command creates a new wallet and store it in the c:\pactus\wallets\wallet_1
.
+
+
+
+
+
+
+
Don’t forget to back up your wallet seed, as it allows you to recover your wallet if you lose it.
+
+
Wallet password
+
+
You can change the wallet password by tunning this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 password
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 password
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 password
+
+
+
+
+
+
+
+
If you forget your password, you can still recover your wallet using the wallet seed.
+
+
Wallet seed
+
+
You can obtain the wallet seed by running this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 seed
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 seed
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 seed
+
+
+
+
+
+
+
+
The wallet seed is encrypted within your wallet, and
+you’ll need to enter the wallet password to access it.
+
+
Recovering Wallet
+
+
If you lose your wallet, you can recover it by running this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/recovered_wallet recover
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/recovered_wallet recover
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\recovered_wallet recover
+
+
+
+
+
+
+
+
Please note that if you lose your seed, there is no way to recover your wallet.
+
+
+
+
Address commands
+
+
In this section, we’ll cover address commands that help you manage your wallet addresses.
+
+
Creating new address
+
+
You can create a new address by running this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address new
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address new
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 address new
+
+
+
+
+
+
+
+
You can also assign a label to your address to better organize your address book.
+
+
List of addresses
+
+
To view the list of wallet addresses, use this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address all
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address all
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 address all
+
+
+
+
+
+
+
+
Get Public key
+
+
To obtain the public key for a specific address, run this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
Replace <ADDRESS>
with the address for which you want to retrieve its public key.
+
+
Get Private key
+
+
You can get the public key of your address by this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
Replace <ADDRESS>
with the address for which you want to retrieve its private key.
+Keep your private key secure. If someone gains access to your private key,
+they will have full control over that address.
+
+
+
+
Transaction commands
+
+
In this section, we’ll cover transaction commands that help you create, sign, and
+broadcast transactions on the Pactus Blockchain.
+You’ll need to provide the password to sign the transaction.
+Please note that once a transaction is broadcasted, it cannot be reversed.
+
+
Sending Transfer transaction
+
+
To create, sign, and broadcast a
+Transfer transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
In this command, <FROM>
should be one of the addresses in your wallet as the sender address,
+and <TO>
is the receiver address.
+
+
Sending Bond transaction
+
+
To create, sign, and broadcast a
+Bond transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
In this command, <FROM>
should be one of the addresses in your wallet as the sender address,
+and <TO>
is the receiver validator address.
+
+
If the validator associated with this address does not exist yet,
+you need to provide the public key to create it:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
Replace <PUBLIC_KEY>
with the validator’s public key,
+which is the public key of the <TO>
address.
+
+
Sending Unbond transaction
+
+
To create, sign, and broadcast a
+Unbond transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <ADDRESS>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx unbond <ADDRESS>
+
+
+
+
+
+
+
+
In this command, <ADDRESS>
is the address of the validator that you want to unbond.
+
+
Sending Withdraw transaction
+
+
To create, sign, and broadcast a
+Withdraw transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx withdraw <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/css/custom.css b/assets/css/custom.css
new file mode 100644
index 000000000..309f55ddc
--- /dev/null
+++ b/assets/css/custom.css
@@ -0,0 +1 @@
+:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}:root,[data-bs-theme=light]{--pa-blue: #0d6efd;--pa-indigo: #6610f2;--pa-purple: #6f42c1;--pa-pink: #d63384;--pa-red: #dc3545;--pa-orange: #fd7e14;--pa-yellow: #ffc107;--pa-green: #198754;--pa-teal: #20c997;--pa-cyan: #0dcaf0;--pa-black: #000;--pa-white: #fff;--pa-gray: #6c757d;--pa-gray-dark: #343a40;--pa-gray-100: #f8f9fa;--pa-gray-200: #e9ecef;--pa-gray-300: #dee2e6;--pa-gray-400: #ced4da;--pa-gray-500: #adb5bd;--pa-gray-600: #6c757d;--pa-gray-700: #495057;--pa-gray-800: #343a40;--pa-gray-900: #212529;--pa-primary: #021a34;--pa-secondary: #075f94;--pa-success: #198754;--pa-info: #0dcaf0;--pa-warning: #ffc107;--pa-danger: #dc3545;--pa-light: #f8f9fa;--pa-dark: #212529;--pa-primary-rgb: 2, 26, 52;--pa-secondary-rgb: 7, 95, 148;--pa-success-rgb: 25, 135, 84;--pa-info-rgb: 13, 202, 240;--pa-warning-rgb: 255, 193, 7;--pa-danger-rgb: 220, 53, 69;--pa-light-rgb: 248, 249, 250;--pa-dark-rgb: 33, 37, 41;--pa-primary-text-emphasis: #010a15;--pa-secondary-text-emphasis: #03263b;--pa-success-text-emphasis: #0a3622;--pa-info-text-emphasis: #055160;--pa-warning-text-emphasis: #664d03;--pa-danger-text-emphasis: #58151c;--pa-light-text-emphasis: #495057;--pa-dark-text-emphasis: #495057;--pa-primary-bg-subtle: #ccd1d6;--pa-secondary-bg-subtle: #cddfea;--pa-success-bg-subtle: #d1e7dd;--pa-info-bg-subtle: #cff4fc;--pa-warning-bg-subtle: #fff3cd;--pa-danger-bg-subtle: #f8d7da;--pa-light-bg-subtle: #fcfcfd;--pa-dark-bg-subtle: #ced4da;--pa-primary-border-subtle: #9aa3ae;--pa-secondary-border-subtle: #9cbfd4;--pa-success-border-subtle: #a3cfbb;--pa-info-border-subtle: #9eeaf9;--pa-warning-border-subtle: #ffe69c;--pa-danger-border-subtle: #f1aeb5;--pa-light-border-subtle: #e9ecef;--pa-dark-border-subtle: #adb5bd;--pa-white-rgb: 255, 255, 255;--pa-black-rgb: 0, 0, 0;--pa-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--pa-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--pa-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--pa-body-font-family: var(--pa-font-sans-serif);--pa-body-font-size:1rem;--pa-body-font-weight: 400;--pa-body-line-height: 1.5;--pa-body-color: #212529;--pa-body-color-rgb: 33, 37, 41;--pa-body-bg: #fff;--pa-body-bg-rgb: 255, 255, 255;--pa-emphasis-color: #000;--pa-emphasis-color-rgb: 0, 0, 0;--pa-secondary-color: rgba(33, 37, 41, 0.75);--pa-secondary-color-rgb: 33, 37, 41;--pa-secondary-bg: #e9ecef;--pa-secondary-bg-rgb: 233, 236, 239;--pa-tertiary-color: rgba(33, 37, 41, 0.5);--pa-tertiary-color-rgb: 33, 37, 41;--pa-tertiary-bg: #f8f9fa;--pa-tertiary-bg-rgb: 248, 249, 250;--pa-heading-color: inherit;--pa-link-color: #021a34;--pa-link-color-rgb: 2, 26, 52;--pa-link-decoration: underline;--pa-link-hover-color: #02152a;--pa-link-hover-color-rgb: 2, 21, 42;--pa-code-color: #d63384;--pa-highlight-color: #212529;--pa-highlight-bg: #fff3cd;--pa-border-width: 1px;--pa-border-style: solid;--pa-border-color: #dee2e6;--pa-border-color-translucent: rgba(0, 0, 0, 0.175);--pa-border-radius: 0.375rem;--pa-border-radius-sm: 0.25rem;--pa-border-radius-lg: 0.5rem;--pa-border-radius-xl: 1rem;--pa-border-radius-xxl: 2rem;--pa-border-radius-2xl: var(--pa-border-radius-xxl);--pa-border-radius-pill: 50rem;--pa-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--pa-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--pa-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--pa-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--pa-focus-ring-width: 0.25rem;--pa-focus-ring-opacity: 0.25;--pa-focus-ring-color: rgba(2, 26, 52, 0.25);--pa-form-valid-color: #198754;--pa-form-valid-border-color: #198754;--pa-form-invalid-color: #dc3545;--pa-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--pa-body-color: #dee2e6;--pa-body-color-rgb: 222, 226, 230;--pa-body-bg: #212529;--pa-body-bg-rgb: 33, 37, 41;--pa-emphasis-color: #fff;--pa-emphasis-color-rgb: 255, 255, 255;--pa-secondary-color: rgba(222, 226, 230, 0.75);--pa-secondary-color-rgb: 222, 226, 230;--pa-secondary-bg: #343a40;--pa-secondary-bg-rgb: 52, 58, 64;--pa-tertiary-color: rgba(222, 226, 230, 0.5);--pa-tertiary-color-rgb: 222, 226, 230;--pa-tertiary-bg: #2b3035;--pa-tertiary-bg-rgb: 43, 48, 53;--pa-primary-text-emphasis: #677685;--pa-secondary-text-emphasis: #6a9fbf;--pa-success-text-emphasis: #75b798;--pa-info-text-emphasis: #6edff6;--pa-warning-text-emphasis: #ffda6a;--pa-danger-text-emphasis: #ea868f;--pa-light-text-emphasis: #f8f9fa;--pa-dark-text-emphasis: #dee2e6;--pa-primary-bg-subtle: #00050a;--pa-secondary-bg-subtle: #01131e;--pa-success-bg-subtle: #051b11;--pa-info-bg-subtle: #032830;--pa-warning-bg-subtle: #332701;--pa-danger-bg-subtle: #2c0b0e;--pa-light-bg-subtle: #343a40;--pa-dark-bg-subtle: #1a1d20;--pa-primary-border-subtle: #01101f;--pa-secondary-border-subtle: #043959;--pa-success-border-subtle: #0f5132;--pa-info-border-subtle: #087990;--pa-warning-border-subtle: #997404;--pa-danger-border-subtle: #842029;--pa-light-border-subtle: #495057;--pa-dark-border-subtle: #343a40;--pa-heading-color: inherit;--pa-link-color: #677685;--pa-link-hover-color: #85919d;--pa-link-color-rgb: 103, 118, 133;--pa-link-hover-color-rgb: 133, 145, 157;--pa-code-color: #e685b5;--pa-highlight-color: #dee2e6;--pa-highlight-bg: #664d03;--pa-border-color: #495057;--pa-border-color-translucent: rgba(255, 255, 255, 0.15);--pa-form-valid-color: #75b798;--pa-form-valid-border-color: #75b798;--pa-form-invalid-color: #ea868f;--pa-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--pa-body-font-family);font-size:var(--pa-body-font-size);font-weight:var(--pa-body-font-weight);line-height:var(--pa-body-line-height);color:var(--pa-body-color);text-align:var(--pa-body-text-align);background-color:var(--pa-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--pa-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--pa-heading-color)}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + 0.6vw)}@media(min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + 0.3vw)}@media(min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;color:var(--pa-highlight-color);background-color:var(--pa-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 1));text-decoration:underline}a:hover{--pa-link-color-rgb: var(--pa-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--pa-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--pa-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:0.875em;color:var(--pa-body-bg);background-color:var(--pa-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--pa-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--pa-body-bg);border:var(--pa-border-width) solid var(--pa-border-color);border-radius:var(--pa-border-radius);box-shadow:var(--pa-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:var(--pa-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--pa-breakpoint-xs: 0;--pa-breakpoint-sm: 576px;--pa-breakpoint-md: 768px;--pa-breakpoint-lg: 992px;--pa-breakpoint-xl: 1200px;--pa-breakpoint-xxl: 1400px}.row{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--pa-gutter-y));margin-right:calc(-0.5*var(--pa-gutter-x));margin-left:calc(-0.5*var(--pa-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-top:var(--pa-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--pa-gutter-x: 0}.g-0,.gy-0{--pa-gutter-y: 0}.g-1,.gx-1{--pa-gutter-x: 0.25rem}.g-1,.gy-1{--pa-gutter-y: 0.25rem}.g-2,.gx-2{--pa-gutter-x: 0.5rem}.g-2,.gy-2{--pa-gutter-y: 0.5rem}.g-3,.gx-3{--pa-gutter-x: 1rem}.g-3,.gy-3{--pa-gutter-y: 1rem}.g-4,.gx-4{--pa-gutter-x: 1.5rem}.g-4,.gy-4{--pa-gutter-y: 1.5rem}.g-5,.gx-5{--pa-gutter-x: 3rem}.g-5,.gy-5{--pa-gutter-y: 3rem}@media(min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--pa-gutter-x: 0}.g-sm-0,.gy-sm-0{--pa-gutter-y: 0}.g-sm-1,.gx-sm-1{--pa-gutter-x: 0.25rem}.g-sm-1,.gy-sm-1{--pa-gutter-y: 0.25rem}.g-sm-2,.gx-sm-2{--pa-gutter-x: 0.5rem}.g-sm-2,.gy-sm-2{--pa-gutter-y: 0.5rem}.g-sm-3,.gx-sm-3{--pa-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--pa-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--pa-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--pa-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--pa-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--pa-gutter-y: 3rem}}@media(min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--pa-gutter-x: 0}.g-md-0,.gy-md-0{--pa-gutter-y: 0}.g-md-1,.gx-md-1{--pa-gutter-x: 0.25rem}.g-md-1,.gy-md-1{--pa-gutter-y: 0.25rem}.g-md-2,.gx-md-2{--pa-gutter-x: 0.5rem}.g-md-2,.gy-md-2{--pa-gutter-y: 0.5rem}.g-md-3,.gx-md-3{--pa-gutter-x: 1rem}.g-md-3,.gy-md-3{--pa-gutter-y: 1rem}.g-md-4,.gx-md-4{--pa-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--pa-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--pa-gutter-x: 3rem}.g-md-5,.gy-md-5{--pa-gutter-y: 3rem}}@media(min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--pa-gutter-x: 0}.g-lg-0,.gy-lg-0{--pa-gutter-y: 0}.g-lg-1,.gx-lg-1{--pa-gutter-x: 0.25rem}.g-lg-1,.gy-lg-1{--pa-gutter-y: 0.25rem}.g-lg-2,.gx-lg-2{--pa-gutter-x: 0.5rem}.g-lg-2,.gy-lg-2{--pa-gutter-y: 0.5rem}.g-lg-3,.gx-lg-3{--pa-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--pa-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--pa-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--pa-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--pa-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--pa-gutter-y: 3rem}}@media(min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--pa-gutter-x: 0}.g-xl-0,.gy-xl-0{--pa-gutter-y: 0}.g-xl-1,.gx-xl-1{--pa-gutter-x: 0.25rem}.g-xl-1,.gy-xl-1{--pa-gutter-y: 0.25rem}.g-xl-2,.gx-xl-2{--pa-gutter-x: 0.5rem}.g-xl-2,.gy-xl-2{--pa-gutter-y: 0.5rem}.g-xl-3,.gx-xl-3{--pa-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--pa-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--pa-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--pa-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--pa-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--pa-gutter-y: 3rem}}@media(min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--pa-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--pa-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--pa-gutter-x: 0.25rem}.g-xxl-1,.gy-xxl-1{--pa-gutter-y: 0.25rem}.g-xxl-2,.gx-xxl-2{--pa-gutter-x: 0.5rem}.g-xxl-2,.gy-xxl-2{--pa-gutter-y: 0.5rem}.g-xxl-3,.gx-xxl-3{--pa-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--pa-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--pa-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--pa-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--pa-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--pa-gutter-y: 3rem}}.table{--pa-table-color-type: initial;--pa-table-bg-type: initial;--pa-table-color-state: initial;--pa-table-bg-state: initial;--pa-table-color: var(--pa-emphasis-color);--pa-table-bg: var(--pa-body-bg);--pa-table-border-color: var(--pa-border-color);--pa-table-accent-bg: transparent;--pa-table-striped-color: var(--pa-emphasis-color);--pa-table-striped-bg: rgba(var(--pa-emphasis-color-rgb), 0.05);--pa-table-active-color: var(--pa-emphasis-color);--pa-table-active-bg: rgba(var(--pa-emphasis-color-rgb), 0.1);--pa-table-hover-color: var(--pa-emphasis-color);--pa-table-hover-bg: rgba(var(--pa-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--pa-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--pa-table-color-state, var(--pa-table-color-type, var(--pa-table-color)));background-color:var(--pa-table-bg);border-bottom-width:var(--pa-border-width);box-shadow:inset 0 0 0 9999px var(--pa-table-bg-state, var(--pa-table-bg-type, var(--pa-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--pa-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--pa-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--pa-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-active{--pa-table-color-state: var(--pa-table-active-color);--pa-table-bg-state: var(--pa-table-active-bg)}.table-hover>tbody>tr:hover>*{--pa-table-color-state: var(--pa-table-hover-color);--pa-table-bg-state: var(--pa-table-hover-bg)}.table-primary{--pa-table-color: #000;--pa-table-bg: #ccd1d6;--pa-table-border-color: #a3a7ab;--pa-table-striped-bg: #c2c7cb;--pa-table-striped-color: #000;--pa-table-active-bg: #b8bcc1;--pa-table-active-color: #000;--pa-table-hover-bg: #bdc1c6;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-secondary{--pa-table-color: #000;--pa-table-bg: #cddfea;--pa-table-border-color: #a4b2bb;--pa-table-striped-bg: #c3d4de;--pa-table-striped-color: #000;--pa-table-active-bg: #b9c9d3;--pa-table-active-color: #000;--pa-table-hover-bg: #beced8;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-success{--pa-table-color: #000;--pa-table-bg: #d1e7dd;--pa-table-border-color: #a7b9b1;--pa-table-striped-bg: #c7dbd2;--pa-table-striped-color: #000;--pa-table-active-bg: #bcd0c7;--pa-table-active-color: #000;--pa-table-hover-bg: #c1d6cc;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-info{--pa-table-color: #000;--pa-table-bg: #cff4fc;--pa-table-border-color: #a6c3ca;--pa-table-striped-bg: #c5e8ef;--pa-table-striped-color: #000;--pa-table-active-bg: #badce3;--pa-table-active-color: #000;--pa-table-hover-bg: #bfe2e9;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-warning{--pa-table-color: #000;--pa-table-bg: #fff3cd;--pa-table-border-color: #ccc2a4;--pa-table-striped-bg: #f2e7c3;--pa-table-striped-color: #000;--pa-table-active-bg: #e6dbb9;--pa-table-active-color: #000;--pa-table-hover-bg: #ece1be;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-danger{--pa-table-color: #000;--pa-table-bg: #f8d7da;--pa-table-border-color: #c6acae;--pa-table-striped-bg: #eccccf;--pa-table-striped-color: #000;--pa-table-active-bg: #dfc2c4;--pa-table-active-color: #000;--pa-table-hover-bg: #e5c7ca;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-light{--pa-table-color: #000;--pa-table-bg: #f8f9fa;--pa-table-border-color: #c6c7c8;--pa-table-striped-bg: #ecedee;--pa-table-striped-color: #000;--pa-table-active-bg: #dfe0e1;--pa-table-active-color: #000;--pa-table-hover-bg: #e5e6e7;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-dark{--pa-table-color: #fff;--pa-table-bg: #212529;--pa-table-border-color: #4d5154;--pa-table-striped-bg: #2c3034;--pa-table-striped-color: #fff;--pa-table-active-bg: #373b3e;--pa-table-active-color: #fff;--pa-table-hover-bg: #323539;--pa-table-hover-color: #fff;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.btn{--pa-btn-padding-x: 0.75rem;--pa-btn-padding-y: 0.375rem;--pa-btn-font-family: ;--pa-btn-font-size:1rem;--pa-btn-font-weight: 400;--pa-btn-line-height: 1.5;--pa-btn-color: var(--pa-body-color);--pa-btn-bg: transparent;--pa-btn-border-width: var(--pa-border-width);--pa-btn-border-color: transparent;--pa-btn-border-radius: var(--pa-border-radius);--pa-btn-hover-border-color: transparent;--pa-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--pa-btn-disabled-opacity: 0.65;--pa-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--pa-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--pa-btn-padding-y) var(--pa-btn-padding-x);font-family:var(--pa-btn-font-family);font-size:var(--pa-btn-font-size);font-weight:var(--pa-btn-font-weight);line-height:var(--pa-btn-line-height);color:var(--pa-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;border:var(--pa-btn-border-width) solid var(--pa-btn-border-color);border-radius:var(--pa-btn-border-radius);background-color:var(--pa-btn-bg);box-shadow:var(--pa-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--pa-btn-color);background-color:var(--pa-btn-bg);border-color:var(--pa-btn-border-color)}.btn:focus-visible{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--pa-btn-active-color);background-color:var(--pa-btn-active-bg);border-color:var(--pa-btn-active-border-color);box-shadow:var(--pa-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--pa-btn-active-shadow),var(--pa-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--pa-btn-disabled-color);pointer-events:none;background-color:var(--pa-btn-disabled-bg);border-color:var(--pa-btn-disabled-border-color);opacity:var(--pa-btn-disabled-opacity);box-shadow:none}.btn-primary{--pa-btn-color: #fff;--pa-btn-bg: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #02162c;--pa-btn-hover-border-color: #02152a;--pa-btn-focus-shadow-rgb: 40, 60, 82;--pa-btn-active-color: #fff;--pa-btn-active-bg: #02152a;--pa-btn-active-border-color: #021427;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #021a34;--pa-btn-disabled-border-color: #021a34}.btn-secondary{--pa-btn-color: #fff;--pa-btn-bg: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #06517e;--pa-btn-hover-border-color: #064c76;--pa-btn-focus-shadow-rgb: 44, 119, 164;--pa-btn-active-color: #fff;--pa-btn-active-bg: #064c76;--pa-btn-active-border-color: #05476f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #075f94;--pa-btn-disabled-border-color: #075f94}.btn-success{--pa-btn-color: #fff;--pa-btn-bg: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #157347;--pa-btn-hover-border-color: #146c43;--pa-btn-focus-shadow-rgb: 60, 153, 110;--pa-btn-active-color: #fff;--pa-btn-active-bg: #146c43;--pa-btn-active-border-color: #13653f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #198754;--pa-btn-disabled-border-color: #198754}.btn-info{--pa-btn-color: #000;--pa-btn-bg: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #31d2f2;--pa-btn-hover-border-color: #25cff2;--pa-btn-focus-shadow-rgb: 11, 172, 204;--pa-btn-active-color: #000;--pa-btn-active-bg: #3dd5f3;--pa-btn-active-border-color: #25cff2;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #0dcaf0;--pa-btn-disabled-border-color: #0dcaf0}.btn-warning{--pa-btn-color: #000;--pa-btn-bg: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffca2c;--pa-btn-hover-border-color: #ffc720;--pa-btn-focus-shadow-rgb: 217, 164, 6;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffcd39;--pa-btn-active-border-color: #ffc720;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #ffc107;--pa-btn-disabled-border-color: #ffc107}.btn-danger{--pa-btn-color: #fff;--pa-btn-bg: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #bb2d3b;--pa-btn-hover-border-color: #b02a37;--pa-btn-focus-shadow-rgb: 225, 83, 97;--pa-btn-active-color: #fff;--pa-btn-active-bg: #b02a37;--pa-btn-active-border-color: #a52834;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #dc3545;--pa-btn-disabled-border-color: #dc3545}.btn-light{--pa-btn-color: #000;--pa-btn-bg: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #d3d4d5;--pa-btn-hover-border-color: #c6c7c8;--pa-btn-focus-shadow-rgb: 211, 212, 213;--pa-btn-active-color: #000;--pa-btn-active-bg: #c6c7c8;--pa-btn-active-border-color: #babbbc;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #f8f9fa;--pa-btn-disabled-border-color: #f8f9fa}.btn-dark{--pa-btn-color: #fff;--pa-btn-bg: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #424649;--pa-btn-hover-border-color: #373b3e;--pa-btn-focus-shadow-rgb: 66, 70, 73;--pa-btn-active-color: #fff;--pa-btn-active-bg: #4d5154;--pa-btn-active-border-color: #373b3e;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #212529;--pa-btn-disabled-border-color: #212529}.btn-outline-primary{--pa-btn-color: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #021a34;--pa-btn-hover-border-color: #021a34;--pa-btn-focus-shadow-rgb: 2, 26, 52;--pa-btn-active-color: #fff;--pa-btn-active-bg: #021a34;--pa-btn-active-border-color: #021a34;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #021a34;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #021a34;--pa-gradient: none}.btn-outline-secondary{--pa-btn-color: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #075f94;--pa-btn-hover-border-color: #075f94;--pa-btn-focus-shadow-rgb: 7, 95, 148;--pa-btn-active-color: #fff;--pa-btn-active-bg: #075f94;--pa-btn-active-border-color: #075f94;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #075f94;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #075f94;--pa-gradient: none}.btn-outline-success{--pa-btn-color: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #198754;--pa-btn-hover-border-color: #198754;--pa-btn-focus-shadow-rgb: 25, 135, 84;--pa-btn-active-color: #fff;--pa-btn-active-bg: #198754;--pa-btn-active-border-color: #198754;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #198754;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #198754;--pa-gradient: none}.btn-outline-info{--pa-btn-color: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #0dcaf0;--pa-btn-hover-border-color: #0dcaf0;--pa-btn-focus-shadow-rgb: 13, 202, 240;--pa-btn-active-color: #000;--pa-btn-active-bg: #0dcaf0;--pa-btn-active-border-color: #0dcaf0;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #0dcaf0;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #0dcaf0;--pa-gradient: none}.btn-outline-warning{--pa-btn-color: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffc107;--pa-btn-hover-border-color: #ffc107;--pa-btn-focus-shadow-rgb: 255, 193, 7;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffc107;--pa-btn-active-border-color: #ffc107;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #ffc107;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #ffc107;--pa-gradient: none}.btn-outline-danger{--pa-btn-color: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #dc3545;--pa-btn-hover-border-color: #dc3545;--pa-btn-focus-shadow-rgb: 220, 53, 69;--pa-btn-active-color: #fff;--pa-btn-active-bg: #dc3545;--pa-btn-active-border-color: #dc3545;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #dc3545;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #dc3545;--pa-gradient: none}.btn-outline-light{--pa-btn-color: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #f8f9fa;--pa-btn-hover-border-color: #f8f9fa;--pa-btn-focus-shadow-rgb: 248, 249, 250;--pa-btn-active-color: #000;--pa-btn-active-bg: #f8f9fa;--pa-btn-active-border-color: #f8f9fa;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #f8f9fa;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #f8f9fa;--pa-gradient: none}.btn-outline-dark{--pa-btn-color: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #212529;--pa-btn-hover-border-color: #212529;--pa-btn-focus-shadow-rgb: 33, 37, 41;--pa-btn-active-color: #fff;--pa-btn-active-bg: #212529;--pa-btn-active-border-color: #212529;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #212529;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #212529;--pa-gradient: none}.btn-link{--pa-btn-font-weight: 400;--pa-btn-color: var(--pa-link-color);--pa-btn-bg: transparent;--pa-btn-border-color: transparent;--pa-btn-hover-color: var(--pa-link-hover-color);--pa-btn-hover-border-color: transparent;--pa-btn-active-color: var(--pa-link-hover-color);--pa-btn-active-border-color: transparent;--pa-btn-disabled-color: #6c757d;--pa-btn-disabled-border-color: transparent;--pa-btn-box-shadow: 0 0 0 #000;--pa-btn-focus-shadow-rgb: 40, 60, 82;text-decoration:underline}.btn-link:focus-visible{color:var(--pa-btn-color)}.btn-link:hover{color:var(--pa-btn-hover-color)}.btn-lg{--pa-btn-padding-y: 0.5rem;--pa-btn-padding-x: 1rem;--pa-btn-font-size:1.25rem;--pa-btn-border-radius: var(--pa-border-radius-lg)}.btn-sm{--pa-btn-padding-y: 0.25rem;--pa-btn-padding-x: 0.5rem;--pa-btn-font-size:0.875rem;--pa-btn-border-radius: var(--pa-border-radius-sm)}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--pa-dropdown-zindex: 1000;--pa-dropdown-min-width: 10rem;--pa-dropdown-padding-x: 0;--pa-dropdown-padding-y: 0.5rem;--pa-dropdown-spacer: 0.125rem;--pa-dropdown-font-size:1rem;--pa-dropdown-color: var(--pa-body-color);--pa-dropdown-bg: var(--pa-body-bg);--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-border-radius: var(--pa-border-radius);--pa-dropdown-border-width: var(--pa-border-width);--pa-dropdown-inner-border-radius: calc(var(--pa-border-radius) - var(--pa-border-width));--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-divider-margin-y: 0.5rem;--pa-dropdown-box-shadow: var(--pa-box-shadow);--pa-dropdown-link-color: var(--pa-body-color);--pa-dropdown-link-hover-color: var(--pa-body-color);--pa-dropdown-link-hover-bg: var(--pa-tertiary-bg);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: var(--pa-tertiary-color);--pa-dropdown-item-padding-x: 1rem;--pa-dropdown-item-padding-y: 0.25rem;--pa-dropdown-header-color: #6c757d;--pa-dropdown-header-padding-x: 1rem;--pa-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--pa-dropdown-zindex);display:none;min-width:var(--pa-dropdown-min-width);padding:var(--pa-dropdown-padding-y) var(--pa-dropdown-padding-x);margin:0;font-size:var(--pa-dropdown-font-size);color:var(--pa-dropdown-color);text-align:left;list-style:none;background-color:var(--pa-dropdown-bg);background-clip:padding-box;border:var(--pa-dropdown-border-width) solid var(--pa-dropdown-border-color);border-radius:var(--pa-dropdown-border-radius);box-shadow:var(--pa-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--pa-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--pa-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--pa-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--pa-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--pa-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--pa-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--pa-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--pa-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--pa-dropdown-link-hover-color);background-color:var(--pa-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--pa-dropdown-link-active-color);text-decoration:none;background-color:var(--pa-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--pa-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--pa-dropdown-header-padding-y) var(--pa-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--pa-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);color:var(--pa-dropdown-link-color)}.dropdown-menu-dark{--pa-dropdown-color: #dee2e6;--pa-dropdown-bg: #343a40;--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-box-shadow: ;--pa-dropdown-link-color: #dee2e6;--pa-dropdown-link-hover-color: #fff;--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: #adb5bd;--pa-dropdown-header-color: #adb5bd}.nav{--pa-nav-link-padding-x: 1rem;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-link-color);--pa-nav-link-hover-color: var(--pa-link-hover-color);--pa-nav-link-disabled-color: var(--pa-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--pa-nav-link-padding-y) var(--pa-nav-link-padding-x);font-size:var(--pa-nav-link-font-size);font-weight:var(--pa-nav-link-font-weight);color:var(--pa-nav-link-color);text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--pa-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(2,26,52,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--pa-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--pa-nav-tabs-border-width: var(--pa-border-width);--pa-nav-tabs-border-color: var(--pa-border-color);--pa-nav-tabs-border-radius: var(--pa-border-radius);--pa-nav-tabs-link-hover-border-color: var(--pa-secondary-bg) var(--pa-secondary-bg) var(--pa-border-color);--pa-nav-tabs-link-active-color: var(--pa-emphasis-color);--pa-nav-tabs-link-active-bg: var(--pa-body-bg);--pa-nav-tabs-link-active-border-color: var(--pa-border-color) var(--pa-border-color) var(--pa-body-bg);border-bottom:var(--pa-nav-tabs-border-width) solid var(--pa-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--pa-nav-tabs-border-width));border:var(--pa-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--pa-nav-tabs-border-radius);border-top-right-radius:var(--pa-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--pa-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--pa-nav-tabs-link-active-color);background-color:var(--pa-nav-tabs-link-active-bg);border-color:var(--pa-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--pa-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--pa-nav-pills-border-radius: var(--pa-border-radius);--pa-nav-pills-link-active-color: #fff;--pa-nav-pills-link-active-bg: #021a34}.nav-pills .nav-link{border-radius:var(--pa-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--pa-nav-pills-link-active-color);background-color:var(--pa-nav-pills-link-active-bg)}.nav-underline{--pa-nav-underline-gap: 1rem;--pa-nav-underline-border-width: 0.125rem;--pa-nav-underline-link-active-color: var(--pa-emphasis-color);gap:var(--pa-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--pa-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--pa-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--pa-navbar-padding-x: 0;--pa-navbar-padding-y: 0.5rem;--pa-navbar-color: rgba(var(--pa-emphasis-color-rgb), 0.65);--pa-navbar-hover-color: rgba(var(--pa-emphasis-color-rgb), 0.8);--pa-navbar-disabled-color: rgba(var(--pa-emphasis-color-rgb), 0.3);--pa-navbar-active-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-padding-y: 0.3125rem;--pa-navbar-brand-margin-end: 1rem;--pa-navbar-brand-font-size: 1.25rem;--pa-navbar-brand-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-hover-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-nav-link-padding-x: 0.5rem;--pa-navbar-toggler-padding-y: 0.25rem;--pa-navbar-toggler-padding-x: 0.75rem;--pa-navbar-toggler-font-size: 1.25rem;--pa-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--pa-navbar-toggler-border-color: rgba(var(--pa-emphasis-color-rgb), 0.15);--pa-navbar-toggler-border-radius: var(--pa-border-radius);--pa-navbar-toggler-focus-width: 0.25rem;--pa-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--pa-navbar-padding-y) var(--pa-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--pa-navbar-brand-padding-y);padding-bottom:var(--pa-navbar-brand-padding-y);margin-right:var(--pa-navbar-brand-margin-end);font-size:var(--pa-navbar-brand-font-size);color:var(--pa-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--pa-navbar-brand-hover-color)}.navbar-nav{--pa-nav-link-padding-x: 0;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-navbar-color);--pa-nav-link-hover-color: var(--pa-navbar-hover-color);--pa-nav-link-disabled-color: var(--pa-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--pa-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--pa-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--pa-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--pa-navbar-toggler-padding-y) var(--pa-navbar-toggler-padding-x);font-size:var(--pa-navbar-toggler-font-size);line-height:1;color:var(--pa-navbar-color);background-color:rgba(0,0,0,0);border:var(--pa-border-width) solid var(--pa-navbar-toggler-border-color);border-radius:var(--pa-navbar-toggler-border-radius);transition:var(--pa-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--pa-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--pa-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--pa-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--pa-navbar-color: rgba(255, 255, 255, 0.55);--pa-navbar-hover-color: rgba(255, 255, 255, 0.75);--pa-navbar-disabled-color: rgba(255, 255, 255, 0.25);--pa-navbar-active-color: #fff;--pa-navbar-brand-color: #fff;--pa-navbar-brand-hover-color: #fff;--pa-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);--pa-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--pa-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.badge{--pa-badge-padding-x: 0.65em;--pa-badge-padding-y: 0.35em;--pa-badge-font-size:0.75em;--pa-badge-font-weight: 700;--pa-badge-color: #fff;--pa-badge-border-radius: var(--pa-border-radius);display:inline-block;padding:var(--pa-badge-padding-y) var(--pa-badge-padding-x);font-size:var(--pa-badge-font-size);font-weight:var(--pa-badge-font-weight);line-height:1;color:var(--pa-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--pa-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--pa-alert-bg: transparent;--pa-alert-padding-x: 1rem;--pa-alert-padding-y: 1rem;--pa-alert-margin-bottom: 1rem;--pa-alert-color: inherit;--pa-alert-border-color: transparent;--pa-alert-border: var(--pa-border-width) solid var(--pa-alert-border-color);--pa-alert-border-radius: var(--pa-border-radius);--pa-alert-link-color: inherit;position:relative;padding:var(--pa-alert-padding-y) var(--pa-alert-padding-x);margin-bottom:var(--pa-alert-margin-bottom);color:var(--pa-alert-color);background-color:var(--pa-alert-bg);border:var(--pa-alert-border);border-radius:var(--pa-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--pa-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--pa-alert-color: var(--pa-primary-text-emphasis);--pa-alert-bg: var(--pa-primary-bg-subtle);--pa-alert-border-color: var(--pa-primary-border-subtle);--pa-alert-link-color: var(--pa-primary-text-emphasis)}.alert-secondary{--pa-alert-color: var(--pa-secondary-text-emphasis);--pa-alert-bg: var(--pa-secondary-bg-subtle);--pa-alert-border-color: var(--pa-secondary-border-subtle);--pa-alert-link-color: var(--pa-secondary-text-emphasis)}.alert-success{--pa-alert-color: var(--pa-success-text-emphasis);--pa-alert-bg: var(--pa-success-bg-subtle);--pa-alert-border-color: var(--pa-success-border-subtle);--pa-alert-link-color: var(--pa-success-text-emphasis)}.alert-info{--pa-alert-color: var(--pa-info-text-emphasis);--pa-alert-bg: var(--pa-info-bg-subtle);--pa-alert-border-color: var(--pa-info-border-subtle);--pa-alert-link-color: var(--pa-info-text-emphasis)}.alert-warning{--pa-alert-color: var(--pa-warning-text-emphasis);--pa-alert-bg: var(--pa-warning-bg-subtle);--pa-alert-border-color: var(--pa-warning-border-subtle);--pa-alert-link-color: var(--pa-warning-text-emphasis)}.alert-danger{--pa-alert-color: var(--pa-danger-text-emphasis);--pa-alert-bg: var(--pa-danger-bg-subtle);--pa-alert-border-color: var(--pa-danger-border-subtle);--pa-alert-link-color: var(--pa-danger-text-emphasis)}.alert-light{--pa-alert-color: var(--pa-light-text-emphasis);--pa-alert-bg: var(--pa-light-bg-subtle);--pa-alert-border-color: var(--pa-light-border-subtle);--pa-alert-link-color: var(--pa-light-text-emphasis)}.alert-dark{--pa-alert-color: var(--pa-dark-text-emphasis);--pa-alert-bg: var(--pa-dark-bg-subtle);--pa-alert-border-color: var(--pa-dark-border-subtle);--pa-alert-link-color: var(--pa-dark-text-emphasis)}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--pa-primary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--pa-secondary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--pa-success-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--pa-info-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--pa-warning-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--pa-danger-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--pa-light-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--pa-dark-rgb), var(--pa-bg-opacity, 1)) !important}.link-primary{color:RGBA(var(--pa-primary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-primary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(2, 21, 42, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(2, 21, 42, var(--pa-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--pa-secondary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-secondary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(6, 76, 118, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(6, 76, 118, var(--pa-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--pa-success-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-success-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--pa-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--pa-info-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-info-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--pa-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--pa-warning-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-warning-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--pa-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--pa-danger-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-danger-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--pa-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--pa-light-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-light-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--pa-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--pa-dark-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-dark-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--pa-focus-ring-x, 0) var(--pa-focus-ring-y, 0) var(--pa-focus-ring-blur, 0) var(--pa-focus-ring-width) var(--pa-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--pa-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--pa-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--pa-aspect-ratio: 100%}.ratio-4x3{--pa-aspect-ratio: 75%}.ratio-16x9{--pa-aspect-ratio: 56.25%}.ratio-21x9{--pa-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--pa-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:var(--pa-box-shadow) !important}.shadow-sm{box-shadow:var(--pa-box-shadow-sm) !important}.shadow-lg{box-shadow:var(--pa-box-shadow-lg) !important}.shadow-none{box-shadow:none !important}.focus-ring-primary{--pa-focus-ring-color: rgba(var(--pa-primary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-secondary{--pa-focus-ring-color: rgba(var(--pa-secondary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-success{--pa-focus-ring-color: rgba(var(--pa-success-rgb), var(--pa-focus-ring-opacity))}.focus-ring-info{--pa-focus-ring-color: rgba(var(--pa-info-rgb), var(--pa-focus-ring-opacity))}.focus-ring-warning{--pa-focus-ring-color: rgba(var(--pa-warning-rgb), var(--pa-focus-ring-opacity))}.focus-ring-danger{--pa-focus-ring-color: rgba(var(--pa-danger-rgb), var(--pa-focus-ring-opacity))}.focus-ring-light{--pa-focus-ring-color: rgba(var(--pa-light-rgb), var(--pa-focus-ring-opacity))}.focus-ring-dark{--pa-focus-ring-color: rgba(var(--pa-dark-rgb), var(--pa-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-start-0{border-left:0 !important}.border-primary{--pa-border-opacity: 1;border-color:rgba(var(--pa-primary-rgb), var(--pa-border-opacity)) !important}.border-secondary{--pa-border-opacity: 1;border-color:rgba(var(--pa-secondary-rgb), var(--pa-border-opacity)) !important}.border-success{--pa-border-opacity: 1;border-color:rgba(var(--pa-success-rgb), var(--pa-border-opacity)) !important}.border-info{--pa-border-opacity: 1;border-color:rgba(var(--pa-info-rgb), var(--pa-border-opacity)) !important}.border-warning{--pa-border-opacity: 1;border-color:rgba(var(--pa-warning-rgb), var(--pa-border-opacity)) !important}.border-danger{--pa-border-opacity: 1;border-color:rgba(var(--pa-danger-rgb), var(--pa-border-opacity)) !important}.border-light{--pa-border-opacity: 1;border-color:rgba(var(--pa-light-rgb), var(--pa-border-opacity)) !important}.border-dark{--pa-border-opacity: 1;border-color:rgba(var(--pa-dark-rgb), var(--pa-border-opacity)) !important}.border-black{--pa-border-opacity: 1;border-color:rgba(var(--pa-black-rgb), var(--pa-border-opacity)) !important}.border-white{--pa-border-opacity: 1;border-color:rgba(var(--pa-white-rgb), var(--pa-border-opacity)) !important}.border-primary-subtle{border-color:var(--pa-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--pa-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--pa-success-border-subtle) !important}.border-info-subtle{border-color:var(--pa-info-border-subtle) !important}.border-warning-subtle{border-color:var(--pa-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--pa-danger-border-subtle) !important}.border-light-subtle{border-color:var(--pa-light-border-subtle) !important}.border-dark-subtle{border-color:var(--pa-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--pa-border-opacity: 0.1}.border-opacity-25{--pa-border-opacity: 0.25}.border-opacity-50{--pa-border-opacity: 0.5}.border-opacity-75{--pa-border-opacity: 0.75}.border-opacity-100{--pa-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--pa-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + 0.9vw) !important}.fs-3{font-size:calc(1.3rem + 0.6vw) !important}.fs-4{font-size:calc(1.275rem + 0.3vw) !important}.fs-5{font-size:1.25rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{--pa-text-opacity: 1;color:rgba(var(--pa-primary-rgb), var(--pa-text-opacity)) !important}.text-secondary{--pa-text-opacity: 1;color:rgba(var(--pa-secondary-rgb), var(--pa-text-opacity)) !important}.text-success{--pa-text-opacity: 1;color:rgba(var(--pa-success-rgb), var(--pa-text-opacity)) !important}.text-info{--pa-text-opacity: 1;color:rgba(var(--pa-info-rgb), var(--pa-text-opacity)) !important}.text-warning{--pa-text-opacity: 1;color:rgba(var(--pa-warning-rgb), var(--pa-text-opacity)) !important}.text-danger{--pa-text-opacity: 1;color:rgba(var(--pa-danger-rgb), var(--pa-text-opacity)) !important}.text-light{--pa-text-opacity: 1;color:rgba(var(--pa-light-rgb), var(--pa-text-opacity)) !important}.text-dark{--pa-text-opacity: 1;color:rgba(var(--pa-dark-rgb), var(--pa-text-opacity)) !important}.text-black{--pa-text-opacity: 1;color:rgba(var(--pa-black-rgb), var(--pa-text-opacity)) !important}.text-white{--pa-text-opacity: 1;color:rgba(var(--pa-white-rgb), var(--pa-text-opacity)) !important}.text-body{--pa-text-opacity: 1;color:rgba(var(--pa-body-color-rgb), var(--pa-text-opacity)) !important}.text-muted{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-black-50{--pa-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--pa-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-body-tertiary{--pa-text-opacity: 1;color:var(--pa-tertiary-color) !important}.text-body-emphasis{--pa-text-opacity: 1;color:var(--pa-emphasis-color) !important}.text-reset{--pa-text-opacity: 1;color:inherit !important}.text-opacity-25{--pa-text-opacity: 0.25}.text-opacity-50{--pa-text-opacity: 0.5}.text-opacity-75{--pa-text-opacity: 0.75}.text-opacity-100{--pa-text-opacity: 1}.text-primary-emphasis{color:var(--pa-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--pa-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--pa-success-text-emphasis) !important}.text-info-emphasis{color:var(--pa-info-text-emphasis) !important}.text-warning-emphasis{color:var(--pa-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--pa-danger-text-emphasis) !important}.text-light-emphasis{color:var(--pa-light-text-emphasis) !important}.text-dark-emphasis{color:var(--pa-dark-text-emphasis) !important}.link-opacity-10{--pa-link-opacity: 0.1}.link-opacity-10-hover:hover{--pa-link-opacity: 0.1}.link-opacity-25{--pa-link-opacity: 0.25}.link-opacity-25-hover:hover{--pa-link-opacity: 0.25}.link-opacity-50{--pa-link-opacity: 0.5}.link-opacity-50-hover:hover{--pa-link-opacity: 0.5}.link-opacity-75{--pa-link-opacity: 0.75}.link-opacity-75-hover:hover{--pa-link-opacity: 0.75}.link-opacity-100{--pa-link-opacity: 1}.link-opacity-100-hover:hover{--pa-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-primary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-primary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-secondary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-secondary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-success{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-success-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-info{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-info-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-warning{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-warning-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-danger{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-danger-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-light{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-light-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-dark{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-dark-rgb), var(--pa-link-underline-opacity)) !important}.link-underline{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--pa-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--pa-link-underline-opacity: 0}.link-underline-opacity-10{--pa-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--pa-link-underline-opacity: 0.1}.link-underline-opacity-25{--pa-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--pa-link-underline-opacity: 0.25}.link-underline-opacity-50{--pa-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--pa-link-underline-opacity: 0.5}.link-underline-opacity-75{--pa-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--pa-link-underline-opacity: 0.75}.link-underline-opacity-100{--pa-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--pa-link-underline-opacity: 1}.bg-primary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-primary-rgb), var(--pa-bg-opacity)) !important}.bg-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-rgb), var(--pa-bg-opacity)) !important}.bg-success{--pa-bg-opacity: 1;background-color:rgba(var(--pa-success-rgb), var(--pa-bg-opacity)) !important}.bg-info{--pa-bg-opacity: 1;background-color:rgba(var(--pa-info-rgb), var(--pa-bg-opacity)) !important}.bg-warning{--pa-bg-opacity: 1;background-color:rgba(var(--pa-warning-rgb), var(--pa-bg-opacity)) !important}.bg-danger{--pa-bg-opacity: 1;background-color:rgba(var(--pa-danger-rgb), var(--pa-bg-opacity)) !important}.bg-light{--pa-bg-opacity: 1;background-color:rgba(var(--pa-light-rgb), var(--pa-bg-opacity)) !important}.bg-dark{--pa-bg-opacity: 1;background-color:rgba(var(--pa-dark-rgb), var(--pa-bg-opacity)) !important}.bg-black{--pa-bg-opacity: 1;background-color:rgba(var(--pa-black-rgb), var(--pa-bg-opacity)) !important}.bg-white{--pa-bg-opacity: 1;background-color:rgba(var(--pa-white-rgb), var(--pa-bg-opacity)) !important}.bg-body{--pa-bg-opacity: 1;background-color:rgba(var(--pa-body-bg-rgb), var(--pa-bg-opacity)) !important}.bg-transparent{--pa-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-body-tertiary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-tertiary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-opacity-10{--pa-bg-opacity: 0.1}.bg-opacity-25{--pa-bg-opacity: 0.25}.bg-opacity-50{--pa-bg-opacity: 0.5}.bg-opacity-75{--pa-bg-opacity: 0.75}.bg-opacity-100{--pa-bg-opacity: 1}.bg-primary-subtle{background-color:var(--pa-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--pa-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--pa-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--pa-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--pa-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--pa-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--pa-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--pa-dark-bg-subtle) !important}.bg-gradient{background-image:var(--pa-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--pa-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--pa-border-radius-sm) !important}.rounded-2{border-radius:var(--pa-border-radius) !important}.rounded-3{border-radius:var(--pa-border-radius-lg) !important}.rounded-4{border-radius:var(--pa-border-radius-xl) !important}.rounded-5{border-radius:var(--pa-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--pa-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--pa-border-radius-sm) !important;border-top-right-radius:var(--pa-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--pa-border-radius-lg) !important;border-top-right-radius:var(--pa-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--pa-border-radius-xl) !important;border-top-right-radius:var(--pa-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--pa-border-radius-xxl) !important;border-top-right-radius:var(--pa-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--pa-border-radius-pill) !important;border-top-right-radius:var(--pa-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--pa-border-radius-sm) !important;border-bottom-right-radius:var(--pa-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--pa-border-radius-lg) !important;border-bottom-right-radius:var(--pa-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--pa-border-radius-xl) !important;border-bottom-right-radius:var(--pa-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-right-radius:var(--pa-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--pa-border-radius-pill) !important;border-bottom-right-radius:var(--pa-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--pa-border-radius-sm) !important;border-bottom-left-radius:var(--pa-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--pa-border-radius-lg) !important;border-bottom-left-radius:var(--pa-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--pa-border-radius-xl) !important;border-bottom-left-radius:var(--pa-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-left-radius:var(--pa-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--pa-border-radius-pill) !important;border-bottom-left-radius:var(--pa-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--pa-border-radius-sm) !important;border-top-left-radius:var(--pa-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--pa-border-radius-lg) !important;border-top-left-radius:var(--pa-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--pa-border-radius-xl) !important;border-top-left-radius:var(--pa-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--pa-border-radius-xxl) !important;border-top-left-radius:var(--pa-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--pa-border-radius-pill) !important;border-top-left-radius:var(--pa-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media(min-width: 1200px){.fs-1{font-size:2.5rem !important}.fs-2{font-size:2rem !important}.fs-3{font-size:1.75rem !important}.fs-4{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}body{font-family:"Open Sans",sans-serif;font-weight:400;color:var(--text-color);background-color:var(--bg-color);max-width:1200px;margin:0 auto}.btn-primary{color:var(--text-color-reverse);background-color:var(--primary-color);border-color:var(--primary-color)}.btn-outline-primary{color:var(--primary-color);background:none;border-color:var(--primary-color)}.btn-outline-primary:hover{background-color:var(--primary-color);color:var(--text-color-reverse)}.btn-secondary{color:#fff;background-color:var(--secondary-color);border-color:var(--secondary-color)}.navbar .nav-top{height:86px}.navbar .fixed-menu{width:220px}.navbar .logo img{width:200px}a{text-decoration:underline;color:var(--link-color)}a:hover{color:var(--link-hover-color)}a:active{color:var(--link-color)}h1,.h1,h2,.h2{font-weight:500;line-height:1.25;padding-bottom:12px;padding-top:14px}h1,.h1{font-weight:600}h3,.h3{padding-top:16px}.motto .title{font-weight:600;font-size:32px;padding-top:36px}.motto .motto{font-weight:500;font-size:20px}.btn-fixed{border-width:2px;border-style:solid;width:220px;height:46px;text-transform:uppercase;font-weight:700;border-radius:5px 5px 5px 5px;vertical-align:middle;line-height:42px;padding:0;margin:16px;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)}.pactus-video video{max-width:100%;width:100%;margin-left:auto;margin-right:auto;display:block}.highlighter-rouge .highlight pre{background-color:#0d1117;padding:32px 12px 12px 12px;color:#ccc;position:relative;overflow:auto;direction:ltr}.highlighter-rouge .highlight pre button{position:absolute;top:6px;right:8px;padding:2px;background-color:gray;color:#404040;border-radius:5px;border:ridge 1px gray}.highlighter-rouge .highlight pre button:hover{cursor:pointer;background-color:#bcbabb}.nav-tabs{border-color:#0d1117 !important}.nav-tabs .nav-link{border-width:0 !important}.nav-tabs .nav-link:not(.active):hover{color:#fff !important;background-color:gray !important}.nav-tabs .active{color:#fff !important;background-color:#0d1117 !important}table thead tr th{font-weight:700;background-color:var(--bg-color) !important}blockquote{background:#eee;border-left:10px solid #ccc;padding:16px;quotes:"“" "”" "‘" "’"}blockquote:before{color:#ccc;content:open-quote;font-size:64px;line-height:.1em;vertical-align:-0.4em}blockquote p{margin-top:16px}blockquote p:first-child{display:inline;padding-bottom:160px;margin-bottom:160px}.footer{background-color:var(--primary-color);color:var(--text-color-reverse)}.footer .section{font-size:1.75rem;font-weight:500;line-height:1.25;padding-bottom:20px}.footer li{padding-bottom:8px}.footer.anchor a{color:var(--text-color-reverse)}.footer.anchor a:link{color:var(--text-color-reverse);background-color:rgba(0,0,0,0);text-decoration:none}.footer.anchor a:hover{color:var(--text-color-reverse)}.footer .legal{color:var(--text-color-reverse);font-size:12px}.community img{margin:4px}.community_ran img{margin:4px}#btn-back-to-top{background-color:var(--primary-color);color:var(--bg-color);position:fixed;bottom:20px;right:20px;display:none}.edit-bar{padding-top:30px}.edit-bar .edit-btn,.edit-bar .edit-btn>a:hover{color:var(--text-color);text-decoration:none}.all-posts .post-link{padding-bottom:8px}.blog-post .post-date{padding-bottom:10px;color:gray}.blog-post .content{padding-top:22px;min-height:600px}.partners img{padding-top:24px}.hexdump{font-family:monospace;font-size:12px;padding-bottom:1rem}.hexdump .offset{border-right:2px solid #708090;color:#789}.hexdump .ascii{color:dimgray}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.faq h3,.faq .h3{margin-top:20px;padding-top:16px;border-top:1px solid var(--primary-color)}.faq a{text-decoration:none}.faq .group{padding-top:16px}.faq .group .col{font-weight:600;padding-bottom:10px}.faq .separator{padding-top:12px;padding-bottom:12px}.faq .read_more{padding-top:12px}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.toc .btn,.toc a{color:var(--text-color)}.toc .btn-section{padding:.25rem .5rem;font-weight:600;background-color:rgba(0,0,0,0)}.toc .btn-section:hover,.toc .btn-section:focus{background-color:var(--bg-color)}.toc .btn-page a{padding:.1875rem .5rem;margin-top:.125rem;margin-left:1.25rem}.toc .btn-page a:hover,.toc .btn-page a:focus,.toc .btn-page .selected{background-color:var(--bg-color)}.timeline{position:relative}.timeline::after{content:"";position:absolute;width:6px;background-color:#939597;top:0;bottom:0;left:50%;margin-left:-3px}.timeline-card{position:relative;width:50%}.timeline-card .card{border:1px solid rgba(0,0,0,.175);border-radius:5px;background-color:#eee;color:#4c4c4c}.timeline-card .card a{color:#4c4c4c}.timeline-card .card .text-muted{color:#898b8d !important}.timeline-card .card-title{padding-bottom:12px;font-size:1.1rem;font-weight:500}.timeline-card::after{line-height:38px;font-size:24px;position:absolute;text-align:center;width:48px;height:48px;right:-24px;top:15px;border-radius:50%;z-index:1}.timeline-card.completed::after{content:"✅";background-color:#eee;border:5px solid #77b255}.timeline-card.ongoing::after{content:"🚧";background-color:#eee;border:5px solid #ffcb4b}.timeline-card.upcoming::after{content:"⏳";background-color:#eee;border:5px solid #478ec2}.timeline-card.left{padding:0px 50px 20px 0px;left:0}.timeline-card.right{padding:0px 0px 20px 50px;left:50%}.timeline-card.left::before{content:"";position:absolute;height:20px;width:20px;background-color:#eee;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;right:33px;border-right:1px solid rgba(0,0,0,.175);border-top:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{content:"";position:absolute;height:20px;width:20px;background-color:#eee !important;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:33px;z-index:0;left:48px;border-left:1px solid rgba(0,0,0,.175);border-bottom:1px solid rgba(0,0,0,.175)}.timeline-card.right::after{left:-24px}@media screen and (max-width: 600px){.timeline::after{left:31px}.timeline-card{width:100%;padding-left:80px !important;padding-right:25px !important}.timeline-card::before{left:77px !important}.timeline-card.left::after,.timeline-card.right::after{left:8px !important}.timeline-card.left::before{border-right:none;border-top:none;border-left:1px solid rgba(0,0,0,.175);border-bottom:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{right:auto}.timeline-card.right{left:0%}}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.learn h2,.learn .h2{border-top:1px solid var(--primary-color)}[data-bs-theme=dark] blockquote{background:#14171c}[data-bs-theme=dark] .toc .btn-section::before{--svg-color: var(--text)}[data-bs-theme=dark] .fa-linux{color:#fff}/*# sourceMappingURL=custom.css.map */
\ No newline at end of file
diff --git a/assets/css/custom.css.map b/assets/css/custom.css.map
new file mode 100644
index 000000000..a7da8066e
--- /dev/null
+++ b/assets/css/custom.css.map
@@ -0,0 +1 @@
+{"version":3,"sourceRoot":"","sources":["../../_sass/_vars.scss","../../../node_modules/bootstrap/scss/_root.scss","../../../node_modules/bootstrap/scss/vendor/_rfs.scss","../../../node_modules/bootstrap/scss/mixins/_color-mode.scss","../../../node_modules/bootstrap/scss/_reboot.scss","../../../node_modules/bootstrap/scss/_variables.scss","../../../node_modules/bootstrap/scss/mixins/_border-radius.scss","../../../node_modules/bootstrap/scss/_type.scss","../../../node_modules/bootstrap/scss/mixins/_lists.scss","../../../node_modules/bootstrap/scss/_images.scss","../../../node_modules/bootstrap/scss/mixins/_image.scss","../../../node_modules/bootstrap/scss/mixins/_box-shadow.scss","../../../node_modules/bootstrap/scss/_containers.scss","../../../node_modules/bootstrap/scss/mixins/_container.scss","../../../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../../../node_modules/bootstrap/scss/_grid.scss","../../../node_modules/bootstrap/scss/mixins/_grid.scss","../../../node_modules/bootstrap/scss/_tables.scss","../../../node_modules/bootstrap/scss/mixins/_table-variants.scss","../../../node_modules/bootstrap/scss/_buttons.scss","../../../node_modules/bootstrap/scss/mixins/_gradients.scss","../../../node_modules/bootstrap/scss/mixins/_transition.scss","../../../node_modules/bootstrap/scss/mixins/_buttons.scss","../../../node_modules/bootstrap/scss/_transitions.scss","../../../node_modules/bootstrap/scss/_dropdown.scss","../../../node_modules/bootstrap/scss/mixins/_caret.scss","../../../node_modules/bootstrap/scss/_nav.scss","../../../node_modules/bootstrap/scss/_navbar.scss","../../../node_modules/bootstrap/scss/_badge.scss","../../../node_modules/bootstrap/scss/_alert.scss","../../../node_modules/bootstrap/scss/mixins/_clearfix.scss","../../../node_modules/bootstrap/scss/helpers/_color-bg.scss","../../../node_modules/bootstrap/scss/helpers/_colored-links.scss","../../../node_modules/bootstrap/scss/helpers/_focus-ring.scss","../../../node_modules/bootstrap/scss/helpers/_icon-link.scss","../../../node_modules/bootstrap/scss/helpers/_ratio.scss","../../../node_modules/bootstrap/scss/helpers/_position.scss","../../../node_modules/bootstrap/scss/helpers/_stacks.scss","../../../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../../../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../../../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../../../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../../../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../../../node_modules/bootstrap/scss/helpers/_vr.scss","../../../node_modules/bootstrap/scss/mixins/_utilities.scss","../../../node_modules/bootstrap/scss/utilities/_api.scss","../../_sass/_styles.scss","../../_sass/_hexdump.scss","../../_sass/_faq.scss","../../_sass/_toc.scss","../../_sass/_roadmap.scss","../../_sass/_learn.scss","../../_sass/dark_mode.scss"],"names":[],"mappings":"CAGA,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDChEF,4BASI,mRAIA,+MAIA,yKAIA,wOAIA,yRAIA,yPAIA,yRAGF,8BACA,wBAMA,sNACA,0GACA,0FAOA,iDC2OI,oBALI,KDpOR,2BACA,2BAKA,yBACA,gCACA,mBACA,gCAEA,0BACA,iCAEA,6CACA,qCACA,2BACA,qCAEA,2CACA,oCACA,0BACA,oCAGA,4BAEA,yBACA,+BACA,gCAEA,+BACA,qCAMA,yBACA,8BACA,2BAGA,uBACA,yBACA,2BACA,oDAEA,6BACA,+BACA,8BACA,4BACA,6BACA,oDACA,+BAGA,mDACA,4DACA,qDACA,4DAIA,+BACA,8BACA,6CAIA,+BACA,sCACA,iCACA,wCEhHE,qBFsHA,kBAGA,yBACA,mCACA,sBACA,6BAEA,0BACA,uCAEA,gDACA,wCACA,2BACA,kCAEA,8CACA,uCACA,0BACA,iCAGE,yRAIA,yPAIA,yRAGF,4BAEA,yBACA,+BACA,mCACA,yCAEA,yBACA,8BACA,2BAEA,2BACA,yDAEA,+BACA,sCACA,iCACA,wCGxKJ,qBAGE,sBAeE,8CANJ,MAOM,wBAcN,KACE,SACA,uCF6OI,UALI,yBEtOR,uCACA,uCACA,2BACA,qCACA,mCACA,8BACA,0CASF,GACE,cACA,MCmnB4B,QDlnB5B,SACA,wCACA,QCynB4B,ID/mB9B,0CACE,aACA,cCwjB4B,MDrjB5B,YCwjB4B,IDvjB5B,YCwjB4B,IDvjB5B,8BAGF,OFuMQ,iCA5JJ,0BE3CJ,OF8MQ,kBEzMR,OFkMQ,iCA5JJ,0BEtCJ,OFyMQ,gBEpMR,OF6LQ,+BA5JJ,0BEjCJ,OFoMQ,mBE/LR,OFwLQ,iCA5JJ,0BE5BJ,OF+LQ,kBE1LR,OF+KM,UALI,QErKV,OF0KM,UALI,KE1JV,EACE,aACA,cCwV0B,KD9U5B,YACE,iCACA,YACA,8BAMF,QACE,mBACA,kBACA,oBAMF,MAEE,kBAGF,SAGE,aACA,mBAGF,wBAIE,gBAGF,GACE,YC6b4B,IDxb9B,GACE,oBACA,cAMF,WACE,gBAQF,SAEE,YCsa4B,OD9Z9B,aF6EM,UALI,QEjEV,WACE,QCqf4B,QDpf5B,gCACA,wCASF,QAEE,kBFwDI,UALI,OEjDR,cACA,wBAGF,mBACA,eAKA,EACE,gEACA,gBCgNwC,UD9MxC,QACE,oDAWF,4DAEE,cACA,qBAOJ,kBAIE,YCgV4B,yBHlUxB,UALI,IEDV,IACE,cACA,aACA,mBACA,cFEI,UALI,QEQR,SFHI,UALI,QEUN,cACA,kBAIJ,KFVM,UALI,QEiBR,2BACA,qBAGA,OACE,cAIJ,IACE,yBFtBI,UALI,QE6BR,MCu5CkC,kBDt5ClC,iBCu5CkC,qBC5rDhC,qBFwSF,QACE,UF7BE,UALI,IE6CV,OACE,gBAMF,QAEE,sBAQF,MACE,oBACA,yBAGF,QACE,YC4X4B,MD3X5B,eC2X4B,MD1X5B,MC4Z4B,0BD3Z5B,gBAOF,GAEE,mBACA,gCAGF,2BAME,qBACA,mBACA,eAQF,MACE,qBAMF,OAEE,gBAQF,iCACE,UAKF,sCAKE,SACA,oBF5HI,UALI,QEmIR,oBAIF,cAEE,oBAKF,cACE,eAGF,OAGE,iBAGA,gBACE,UAOJ,0IACE,wBAQF,gDAIE,0BAGE,4GACE,eAON,mBACE,UACA,kBAKF,SACE,gBAUF,SACE,YACA,UACA,SACA,SAQF,OACE,WACA,WACA,UACA,cCmN4B,MHpatB,iCEoNN,oBFhXE,0BEyWJ,OFtMQ,kBE+MN,SACE,WAOJ,+OAOE,UAGF,4BACE,YASF,cACE,6BACA,oBAmBF,4BACE,wBAKF,+BACE,UAOF,uBACE,aACA,0BAKF,OACE,qBAKF,OACE,SAOF,QACE,kBACA,eAQF,SACE,wBAQF,SACE,wBGrkBF,MLmQM,UALI,QK5PR,YFwoB4B,IEnoB5B,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBK/OR,eCvDE,eACA,gBD2DF,aC5DE,eACA,gBD8DF,kBACE,qBAEA,mCACE,aFsoB0B,ME5nB9B,YL8MM,UALI,QKvMR,yBAIF,YACE,cFiUO,KH1HH,UALI,QK/LR,wBACE,gBAIJ,mBACE,iBACA,cFuTO,KH1HH,UALI,QKtLR,MFtFS,QEwFT,2BACE,aEhGJ,WCIE,eAGA,YDDF,eACE,QJ6jDkC,OI5jDlC,iBJ6jDkC,kBI5jDlC,2DHGE,sCKLE,WARW,wBDKf,eAGA,YDcF,QAEE,qBAGF,YACE,oBACA,cAGF,gBPyPM,UALI,QOlPR,MJgjDkC,0BOllDlC,mGCHA,sBACA,iBACA,WACA,0CACA,yCACA,kBACA,iBCsDE,yBF5CE,yBACE,UPkee,OSvbnB,yBF5CE,uCACE,UPkee,OSvbnB,yBF5CE,qDACE,UPkee,OSvbnB,0BF5CE,mEACE,UPkee,QSvbnB,0BF5CE,kFACE,UPkee,QUlfvB,MAEI,2JAKF,KCNA,sBACA,iBACA,aACA,eAEA,uCACA,2CACA,0CDEE,OCOF,cACA,WACA,eACA,0CACA,yCACA,8BA+CI,KACE,YAGF,iBApCJ,cACA,WAcA,cACE,cACA,WAFF,cACE,cACA,UAFF,cACE,cACA,mBAFF,cACE,cACA,UAFF,cACE,cACA,UAFF,cACE,cACA,mBA+BE,UAhDJ,cACA,WAqDQ,OAhEN,cACA,kBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,WAuEQ,UAxDV,wBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,WAxDV,yBAwDU,WAxDV,yBAmEM,WAEE,iBAGF,WAEE,iBAPF,WAEE,uBAGF,WAEE,uBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,0BEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,0BEUE,SACE,YAGF,qBApCJ,cACA,WAcA,kBACE,cACA,WAFF,kBACE,cACA,UAFF,kBACE,cACA,mBAFF,kBACE,cACA,UAFF,kBACE,cACA,UAFF,kBACE,cACA,mBA+BE,cAhDJ,cACA,WAqDQ,WAhEN,cACA,kBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,WAuEQ,cAxDV,cAwDU,cAxDV,wBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,eAxDV,yBAwDU,eAxDV,yBAmEM,mBAEE,iBAGF,mBAEE,iBAPF,mBAEE,uBAGF,mBAEE,uBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,oBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,qBCrHV,OAEE,+BACA,4BACA,gCACA,6BAEA,2CACA,iCACA,gDACA,kCACA,mDACA,gEACA,kDACA,8DACA,iDACA,+DAEA,WACA,cZkYO,KYjYP,eZusB4B,IYtsB5B,0CAOA,yBACE,oBAEA,qFACA,oCACA,oBZ+sB0B,uBY9sB1B,2GAGF,aACE,uBAGF,aACE,sBAIJ,qBACE,+DAOF,aACE,iBAUA,4BACE,sBAeF,gCACE,sCAGA,kCACE,sCAOJ,oCACE,sBAGF,qCACE,mBAUF,2CACE,qDACA,+CAMF,yDACE,qDACA,+CAQJ,cACE,qDACA,+CAQA,8BACE,oDACA,8CC5IF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,iBAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,cAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,aAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CDiJA,kBACE,gBACA,iCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,sBACE,gBACA,kCEnKN,KAEE,4BACA,6BACA,uBjBuRI,mBALI,KiBhRR,0BACA,0BACA,qCACA,yBACA,8CACA,mCACA,gDACA,yCACA,6FACA,gCACA,kFAGA,qBACA,wDACA,sCjBsQI,UALI,wBiB/PR,sCACA,sCACA,0BACA,kBACA,qBAEA,sBACA,eACA,iBACA,mEbjBE,0CcfF,iBDkCqB,iBRxBjB,WARW,yBUUX,WFwBJ,mHEpBI,uCFhBN,KEiBQ,iBFqBN,WACE,gCAEA,wCACA,8CAGF,sBAEE,0BACA,kCACA,wCAGF,mBACE,gCCrDF,iBDsDuB,uBACrB,8CACA,UAGE,mEAMJ,8BACE,8CACA,UAGE,mEAMJ,mGAKE,iCACA,yCAGA,+CR3EE,WARW,4BQsFb,yKAGI,sEAON,mDAGE,mCACA,oBACA,2CAEA,iDACA,uCRhGE,WARW,KQoHf,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,eGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,YGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,WGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHmHA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,qCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,uBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,oBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,mBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBHsGF,UACE,0BACA,qCACA,yBACA,mCACA,iDACA,yCACA,kDACA,0CACA,iCACA,4CACA,gCACA,sCAEA,gBduRwC,Uc7QxC,wBACE,0BAGF,gBACE,gCAWJ,QGxIE,2BACA,yBpB8NI,mBALI,QoBvNR,mDHyIF,QG5IE,4BACA,2BpB8NI,mBALI,SoBvNR,mDCnEF,MFgBM,WEfJ,oBFmBI,uCEpBN,MFqBQ,iBElBN,iBACE,UAMF,qBACE,aAIJ,YACE,SACA,gBFDI,WEEJ,iBFEI,uCELN,YFMQ,iBEDN,gCACE,QACA,YFNE,WEOF,gBFHE,uEACE,iBGpBR,sEAME,kBAGF,iBACE,mBCwBE,wBACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WArCJ,sBACA,sCACA,gBACA,qCA0DE,8BACE,cD9CN,eAEE,2BACA,+BACA,2BACA,gCACA,+BtBuQI,wBALI,KsBhQR,0CACA,oCACA,+DACA,qDACA,mDACA,0FACA,6DACA,uCACA,+CACA,+CACA,qDACA,mDACA,sCACA,sCACA,4DACA,mCACA,sCACA,oCACA,qCACA,uCAGA,kBACA,kCACA,aACA,uCACA,kEACA,StB0OI,UALI,6BsBnOR,+BACA,gBACA,gBACA,uCACA,4BACA,6ElBzCE,+CKLE,WARW,8Ba0Df,+BACE,SACA,OACA,qCAwBA,qBACE,qBAEA,qCACE,WACA,OAIJ,mBACE,mBAEA,mCACE,QACA,UV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,yBACE,qBAEA,yCACE,WACA,OAIJ,uBACE,mBAEA,uCACE,QACA,WAUN,uCACE,SACA,YACA,aACA,wCCpFA,gCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WA9BJ,aACA,sCACA,yBACA,qCAmDE,sCACE,cDgEJ,wCACE,MACA,WACA,UACA,aACA,sCClGA,iCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAvBJ,oCACA,eACA,uCACA,uBA4CE,uCACE,cD0EF,iCACE,iBAMJ,0CACE,MACA,WACA,UACA,aACA,uCCnHA,mCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAWA,mCACE,aAGF,oCACE,qBACA,apB0gBsB,OoBzgBtB,epBwgBsB,OoBvgBtB,WAnCN,oCACA,wBACA,uCAsCE,yCACE,cD2FF,oCACE,iBAON,kBACE,SACA,6CACA,gBACA,mDACA,UAMF,eACE,cACA,WACA,4EACA,WACA,YnByb4B,ImBxb5B,oCACA,mBACA,qBACA,mBACA,+BACA,SlBtKE,uDkByKF,0CAEE,0CJ1LF,iBI4LuB,iCAGvB,4CAEE,2CACA,qBJlMF,iBImMuB,kCAGvB,gDAEE,6CACA,oBACA,+BAMJ,oBACE,cAIF,iBACE,cACA,gFACA,gBtBmEI,UALI,SsB5DR,sCACA,mBAIF,oBACE,cACA,4EACA,oCAIF,oBAEE,6BACA,0BACA,+DACA,2BACA,kCACA,qCACA,6DACA,uDACA,sCACA,sCACA,2CACA,oCElPF,KAEE,8BACA,gCAEA,4BACA,0CACA,sDACA,wDAGA,aACA,eACA,eACA,gBACA,gBAGF,UACE,cACA,kExBsQI,UALI,6BwB/PR,2CACA,+BACA,qBACA,gBACA,SLfI,WKgBJ,uFLZI,uCKGN,ULFQ,iBKaN,gCAEE,qCAIF,wBACE,UACA,WrBkhBoB,+BqB9gBtB,sCAEE,wCACA,oBACA,eAQJ,UAEE,mDACA,mDACA,qDACA,4GACA,0DACA,gDACA,wGAGA,oFAEA,oBACE,uDACA,2DpB7CA,wDACA,yDoB+CA,oDAGE,kBACA,wDAIJ,8DAEE,2CACA,mDACA,yDAGF,yBAEE,oDpBjEA,yBACA,0BoB2EJ,WAEE,sDACA,uCACA,uCAGA,qBpB5FE,gDoBgGF,uDAEE,4CNjHF,iBMkHuB,mCASzB,eAEE,6BACA,0CACA,+DAGA,gCAEA,yBACE,gBACA,eACA,uEAEA,8DAEE,iCAIJ,+DAEE,YrB0d0B,IqBzd1B,gDACA,iCAUF,wCAEE,cACA,kBAKF,kDAEE,aACA,YACA,kBAMF,iEACE,WAUF,uBACE,aAEF,qBACE,cC7LJ,QAEE,yBACA,8BACA,4DACA,iEACA,oEACA,gEACA,uCACA,mCACA,qCACA,+DACA,qEACA,uCACA,uCACA,uCACA,uCACA,4QACA,2EACA,2DACA,yCACA,6DAGA,kBACA,aACA,eACA,mBACA,8BACA,8DAMA,2JACE,aACA,kBACA,mBACA,8BAoBJ,cACE,6CACA,gDACA,+CzB4NI,UALI,iCyBrNR,mCACA,qBACA,mBAEA,wCAEE,yCAUJ,YAEE,2BACA,gCAEA,4BACA,4CACA,wDACA,8DAGA,aACA,sBACA,eACA,gBACA,gBAGE,wDAEE,oCAIJ,2BACE,gBASJ,aACE,YtB8gCkC,MsB7gClC,etB6gCkC,MsB5gClC,6BAEA,yDAGE,oCAaJ,iBACE,gBACA,YAGA,mBAIF,gBACE,8EzByII,UALI,mCyBlIR,cACA,6BACA,+BACA,0ErBxIE,qDeHE,WM6IJ,oCNzII,uCMiIN,gBNhIQ,iBM0IN,sBACE,qBAGF,sBACE,qBACA,UACA,sDAMJ,qBACE,qBACA,YACA,aACA,sBACA,kDACA,4BACA,2BACA,qBAGF,mBACE,yCACA,gBb1HE,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,mBAEI,iBACA,2BAEA,+BACE,mBAEA,8CACE,kBAGF,yCACE,kDACA,iDAIJ,sCACE,iBAGF,oCACE,wBACA,gBAGF,mCACE,aAGF,8BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,gDACE,aAGF,8CACE,aACA,YACA,UACA,oBAtDR,eAEI,iBACA,2BAEA,2BACE,mBAEA,0CACE,kBAGF,qCACE,kDACA,iDAIJ,kCACE,iBAGF,gCACE,wBACA,gBAGF,+BACE,aAGF,0BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,4CACE,aAGF,0CACE,aACA,YACA,UACA,mBAiBZ,yCAGE,6CACA,mDACA,sDACA,+BACA,8BACA,oCACA,2DACA,+QAME,0CACE,+QCxRN,OAEE,6BACA,6B1BuRI,qBALI,O0BhRR,4BACA,uBACA,kDAGA,qBACA,4D1B+QI,UALI,0B0BxQR,wCACA,cACA,4BACA,kBACA,mBACA,wBtBJE,4CsBSF,aACE,aAKJ,YACE,kBACA,SChCF,OAEE,2BACA,2BACA,2BACA,+BACA,0BACA,qCACA,6EACA,kDACA,+BAGA,kBACA,4DACA,4CACA,4BACA,oCACA,8BvBHE,4CuBQJ,eAEE,cAIF,YACE,YxB6kB4B,IwB5kB5B,iCAQF,mBACE,cxBo+C8B,KwBj+C9B,8BACE,kBACA,MACA,QACA,UACA,qBAQF,eACE,kDACA,2CACA,yDACA,uDAJF,iBACE,oDACA,6CACA,2DACA,yDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,YACE,+CACA,wCACA,sDACA,oDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,cACE,iDACA,0CACA,wDACA,sDAJF,aACE,gDACA,yCACA,uDACA,qDAJF,YACE,+CACA,wCACA,sDACA,oDC9DF,iBACE,cACA,WACA,WCHF,iBACE,sBACA,iFAFF,mBACE,sBACA,mFAFF,iBACE,sBACA,iFAFF,cACE,sBACA,8EAFF,iBACE,sBACA,iFAFF,gBACE,sBACA,gFAFF,eACE,sBACA,+EAFF,cACE,sBACA,8ECFF,cACE,wEACA,kGAGE,wCAGE,4DACA,sFATN,gBACE,0EACA,oGAGE,4CAGE,6DACA,uFATN,cACE,wEACA,kGAGE,wCAGE,8DACA,wFATN,WACE,qEACA,+FAGE,kCAGE,+DACA,yFATN,cACE,wEACA,kGAGE,wCAGE,+DACA,yFATN,aACE,uEACA,iGAGE,sCAGE,8DACA,wFATN,YACE,sEACA,gGAGE,oCAGE,gEACA,0FATN,WACE,qEACA,+FAGE,kCAGE,6DACA,uFAOR,oBACE,+EACA,yGAGE,oDAEE,kFACA,4GC1BN,kBACE,UAEA,kJCHF,WACE,oBACA,I7B6c4B,Q6B5c5B,mBACA,kFACA,sB7B2c4B,M6B1c5B,2BAEA,eACE,cACA,M7Buc0B,I6Btc1B,O7Bsc0B,I6Brc1B,kBbIE,WaHF,0BbOE,uCaZJ,ebaM,iBaDJ,8DACE,mECnBN,OACE,kBACA,WAEA,eACE,cACA,mCACA,WAGF,SACE,kBACA,MACA,OACA,WACA,YAKF,WACE,wBADF,WACE,uBADF,YACE,0BADF,YACE,kCCrBJ,WACE,eACA,MACA,QACA,OACA,Q/BumCkC,K+BpmCpC,cACE,eACA,QACA,SACA,OACA,Q/B+lCkC,K+BvlChC,YACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,eACE,gBACA,SACA,Q/B6kC8B,KS9iChC,yBsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,yBsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,yBsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,0BsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,0BsBxCA,gBACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,mBACE,gBACA,SACA,Q/B6kC8B,MgC5mCpC,QACE,aACA,mBACA,mBACA,mBAGF,QACE,aACA,cACA,sBACA,mBCRF,2ECIE,qBACA,sBACA,qBACA,uBACA,2BACA,iCACA,8BACA,oBAGA,qGACE,6BCdF,uBACE,kBACA,MACA,QACA,SACA,OACA,QnCgcsC,EmC/btC,WCRJ,+BCCE,uBACA,mBCNF,IACE,qBACA,mBACA,MtCisB4B,uBsChsB5B,eACA,8BACA,QtC2rB4B,IuC/nBtB,gBAOI,mCAPJ,WAOI,8BAPJ,cAOI,iCAPJ,cAOI,iCAPJ,mBAOI,sCAPJ,gBAOI,mCAPJ,aAOI,sBAPJ,WAOI,uBAPJ,YAOI,sBAPJ,oBAOI,8BAPJ,kBAOI,4BAPJ,iBAOI,2BAPJ,kBAOI,iCAPJ,iBAOI,2BAPJ,WAOI,qBAPJ,YAOI,uBAPJ,YAOI,sBAPJ,YAOI,uBAPJ,aAOI,qBAPJ,eAOI,yBAPJ,iBAOI,2BAPJ,kBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,2BAPJ,mBAOI,6BAPJ,oBAOI,8BAPJ,mBAOI,6BAPJ,iBAOI,2BAPJ,mBAOI,6BAPJ,oBAOI,8BAPJ,mBAOI,6BAPJ,UAOI,0BAPJ,gBAOI,gCAPJ,SAOI,yBAPJ,QAOI,wBAPJ,eAOI,+BAPJ,SAOI,yBAPJ,aAOI,6BAPJ,cAOI,8BAPJ,QAOI,wBAPJ,eAOI,+BAPJ,QAOI,wBAPJ,QAOI,2CAPJ,WAOI,8CAPJ,WAOI,8CAPJ,aAOI,2BAjBJ,oBACE,iFADF,sBACE,mFADF,oBACE,iFADF,iBACE,8EADF,oBACE,iFADF,mBACE,gFADF,kBACE,+EADF,iBACE,8EASF,iBAOI,2BAPJ,mBAOI,6BAPJ,mBAOI,6BAPJ,gBAOI,0BAPJ,iBAOI,2BAPJ,OAOI,iBAPJ,QAOI,mBAPJ,SAOI,oBAPJ,UAOI,oBAPJ,WAOI,sBAPJ,YAOI,uBAPJ,SAOI,kBAPJ,UAOI,oBAPJ,WAOI,qBAPJ,OAOI,mBAPJ,QAOI,qBAPJ,SAOI,sBAPJ,kBAOI,2CAPJ,oBAOI,sCAPJ,oBAOI,sCAPJ,QAOI,uFAPJ,UAOI,oBAPJ,YAOI,2FAPJ,cAOI,wBAPJ,YAOI,6FAPJ,cAOI,0BAPJ,eAOI,8FAPJ,iBAOI,2BAPJ,cAOI,4FAPJ,gBAOI,yBAPJ,gBAIQ,uBAGJ,8EAPJ,kBAIQ,uBAGJ,gFAPJ,gBAIQ,uBAGJ,8EAPJ,aAIQ,uBAGJ,2EAPJ,gBAIQ,uBAGJ,8EAPJ,eAIQ,uBAGJ,6EAPJ,cAIQ,uBAGJ,4EAPJ,aAIQ,uBAGJ,2EAPJ,cAIQ,uBAGJ,4EAPJ,cAIQ,uBAGJ,4EAPJ,uBAOI,wDAPJ,yBAOI,0DAPJ,uBAOI,wDAPJ,oBAOI,qDAPJ,uBAOI,wDAPJ,sBAOI,uDAPJ,qBAOI,sDAPJ,oBAOI,qDAPJ,UAOI,4BAPJ,UAOI,4BAPJ,UAOI,4BAPJ,UAOI,4BAPJ,UAOI,4BAjBJ,mBACE,yBADF,mBACE,0BADF,mBACE,yBADF,mBACE,0BADF,oBACE,uBASF,MAOI,qBAPJ,MAOI,qBAPJ,MAOI,qBAPJ,OAOI,sBAPJ,QAOI,sBAPJ,QAOI,0BAPJ,QAOI,uBAPJ,YAOI,2BAPJ,MAOI,sBAPJ,MAOI,sBAPJ,MAOI,sBAPJ,OAOI,uBAPJ,QAOI,uBAPJ,QAOI,2BAPJ,QAOI,wBAPJ,YAOI,4BAPJ,WAOI,yBAPJ,UAOI,8BAPJ,aAOI,iCAPJ,kBAOI,sCAPJ,qBAOI,yCAPJ,aAOI,uBAPJ,aAOI,uBAPJ,eAOI,yBAPJ,eAOI,yBAPJ,WAOI,0BAPJ,aAOI,4BAPJ,mBAOI,kCAPJ,uBAOI,sCAPJ,qBAOI,oCAPJ,wBAOI,kCAPJ,yBAOI,yCAPJ,wBAOI,wCAPJ,wBAOI,wCAPJ,mBAOI,kCAPJ,iBAOI,gCAPJ,oBAOI,8BAPJ,sBAOI,gCAPJ,qBAOI,+BAPJ,qBAOI,oCAPJ,mBAOI,kCAPJ,sBAOI,gCAPJ,uBAOI,uCAPJ,sBAOI,sCAPJ,uBAOI,iCAPJ,iBAOI,2BAPJ,kBAOI,iCAPJ,gBAOI,+BAPJ,mBAOI,6BAPJ,qBAOI,+BAPJ,oBAOI,8BAPJ,aAOI,oBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,YAOI,mBAPJ,KAOI,oBAPJ,KAOI,yBAPJ,KAOI,wBAPJ,KAOI,uBAPJ,KAOI,yBAPJ,KAOI,uBAPJ,QAOI,uBAPJ,MAOI,mDAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,yDAPJ,MAOI,6DAPJ,MAOI,yDAPJ,SAOI,yDAPJ,MAOI,mDAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,yDAPJ,MAOI,6DAPJ,MAOI,yDAPJ,SAOI,yDAPJ,MAOI,wBAPJ,MAOI,6BAPJ,MAOI,4BAPJ,MAOI,2BAPJ,MAOI,6BAPJ,MAOI,2BAPJ,SAOI,2BAPJ,MAOI,0BAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,+BAPJ,MAOI,6BAPJ,SAOI,6BAPJ,MAOI,2BAPJ,MAOI,gCAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,gCAPJ,MAOI,8BAPJ,SAOI,8BAPJ,MAOI,yBAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,4BAPJ,MAOI,8BAPJ,MAOI,4BAPJ,SAOI,4BAPJ,KAOI,qBAPJ,KAOI,0BAPJ,KAOI,yBAPJ,KAOI,wBAPJ,KAOI,0BAPJ,KAOI,wBAPJ,MAOI,qDAPJ,MAOI,+DAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,+DAPJ,MAOI,2DAPJ,MAOI,qDAPJ,MAOI,+DAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,+DAPJ,MAOI,2DAPJ,MAOI,yBAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,4BAPJ,MAOI,8BAPJ,MAOI,4BAPJ,MAOI,2BAPJ,MAOI,gCAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,gCAPJ,MAOI,8BAPJ,MAOI,4BAPJ,MAOI,iCAPJ,MAOI,gCAPJ,MAOI,+BAPJ,MAOI,iCAPJ,MAOI,+BAPJ,MAOI,0BAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,+BAPJ,MAOI,6BAPJ,OAOI,iBAPJ,OAOI,sBAPJ,OAOI,qBAPJ,OAOI,oBAPJ,OAOI,sBAPJ,OAOI,oBAPJ,WAOI,qBAPJ,WAOI,0BAPJ,WAOI,yBAPJ,WAOI,wBAPJ,WAOI,0BAPJ,WAOI,wBAPJ,cAOI,wBAPJ,cAOI,6BAPJ,cAOI,4BAPJ,cAOI,2BAPJ,cAOI,6BAPJ,cAOI,2BAPJ,gBAOI,gDAPJ,MAOI,4CAPJ,MAOI,4CAPJ,MAOI,0CAPJ,MAOI,4CAPJ,MAOI,6BAPJ,MAOI,0BAPJ,YAOI,6BAPJ,YAOI,6BAPJ,YAOI,+BAPJ,UAOI,2BAPJ,WAOI,2BAPJ,WAOI,2BAPJ,aAOI,2BAPJ,SAOI,2BAPJ,WAOI,8BAPJ,MAOI,yBAPJ,OAOI,4BAPJ,SAOI,2BAPJ,OAOI,yBAPJ,YAOI,2BAPJ,UAOI,4BAPJ,aAOI,6BAPJ,sBAOI,gCAPJ,2BAOI,qCAPJ,8BAOI,wCAPJ,gBAOI,oCAPJ,gBAOI,oCAPJ,iBAOI,qCAPJ,WAOI,8BAPJ,aAOI,8BAPJ,YAOI,iEAPJ,cAIQ,qBAGJ,qEAPJ,gBAIQ,qBAGJ,uEAPJ,cAIQ,qBAGJ,qEAPJ,WAIQ,qBAGJ,kEAPJ,cAIQ,qBAGJ,qEAPJ,aAIQ,qBAGJ,oEAPJ,YAIQ,qBAGJ,mEAPJ,WAIQ,qBAGJ,kEAPJ,YAIQ,qBAGJ,mEAPJ,YAIQ,qBAGJ,mEAPJ,WAIQ,qBAGJ,wEAPJ,YAIQ,qBAGJ,2CAPJ,eAIQ,qBAGJ,gCAPJ,eAIQ,qBAGJ,sCAPJ,qBAIQ,qBAGJ,2CAPJ,oBAIQ,qBAGJ,0CAPJ,oBAIQ,qBAGJ,0CAPJ,YAIQ,qBAGJ,yBAjBJ,iBACE,wBADF,iBACE,uBADF,iBACE,wBADF,kBACE,qBASF,uBAOI,iDAPJ,yBAOI,mDAPJ,uBAOI,iDAPJ,oBAOI,8CAPJ,uBAOI,iDAPJ,sBAOI,gDAPJ,qBAOI,+CAPJ,oBAOI,8CAjBJ,iBACE,uBAIA,6BACE,uBANJ,iBACE,wBAIA,6BACE,wBANJ,iBACE,uBAIA,6BACE,uBANJ,iBACE,wBAIA,6BACE,wBANJ,kBACE,qBAIA,8BACE,qBAIJ,eAOI,wCAKF,2BAOI,wCAnBN,eAOI,uCAKF,2BAOI,uCAnBN,eAOI,wCAKF,2BAOI,wCAnBN,wBAIQ,+BAGJ,+FAPJ,0BAIQ,+BAGJ,iGAPJ,wBAIQ,+BAGJ,+FAPJ,qBAIQ,+BAGJ,4FAPJ,wBAIQ,+BAGJ,+FAPJ,uBAIQ,+BAGJ,8FAPJ,sBAIQ,+BAGJ,6FAPJ,qBAIQ,+BAGJ,4FAPJ,gBAIQ,+BAGJ,qGAjBJ,0BACE,+BAIA,sCACE,+BANJ,2BACE,iCAIA,uCACE,iCANJ,2BACE,kCAIA,uCACE,kCANJ,2BACE,iCAIA,uCACE,iCANJ,2BACE,kCAIA,uCACE,kCANJ,4BACE,+BAIA,wCACE,+BAIJ,YAIQ,mBAGJ,8EAPJ,cAIQ,mBAGJ,gFAPJ,YAIQ,mBAGJ,8EAPJ,SAIQ,mBAGJ,2EAPJ,YAIQ,mBAGJ,8EAPJ,WAIQ,mBAGJ,6EAPJ,UAIQ,mBAGJ,4EAPJ,SAIQ,mBAGJ,2EAPJ,UAIQ,mBAGJ,4EAPJ,UAIQ,mBAGJ,4EAPJ,SAIQ,mBAGJ,8EAPJ,gBAIQ,mBAGJ,0CAPJ,mBAIQ,mBAGJ,mFAPJ,kBAIQ,mBAGJ,kFAjBJ,eACE,qBADF,eACE,sBADF,eACE,qBADF,eACE,sBADF,gBACE,mBASF,mBAOI,wDAPJ,qBAOI,0DAPJ,mBAOI,wDAPJ,gBAOI,qDAPJ,mBAOI,wDAPJ,kBAOI,uDAPJ,iBAOI,sDAPJ,gBAOI,qDAPJ,aAOI,+CAPJ,iBAOI,2BAPJ,kBAOI,4BAPJ,kBAOI,4BAPJ,SAOI,+BAPJ,SAOI,+BAPJ,SAOI,iDAPJ,WAOI,2BAPJ,WAOI,oDAPJ,WAOI,iDAPJ,WAOI,oDAPJ,WAOI,oDAPJ,WAOI,qDAPJ,gBAOI,6BAPJ,cAOI,sDAPJ,aAOI,qHAPJ,eAOI,yEAPJ,eAOI,2HAPJ,eAOI,qHAPJ,eAOI,2HAPJ,eAOI,2HAPJ,eAOI,6HAPJ,oBAOI,6EAPJ,kBAOI,+HAPJ,aAOI,yHAPJ,eAOI,6EAPJ,eAOI,+HAPJ,eAOI,yHAPJ,eAOI,+HAPJ,eAOI,+HAPJ,eAOI,iIAPJ,oBAOI,iFAPJ,kBAOI,mIAPJ,gBAOI,2HAPJ,kBAOI,+EAPJ,kBAOI,iIAPJ,kBAOI,2HAPJ,kBAOI,iIAPJ,kBAOI,iIAPJ,kBAOI,mIAPJ,uBAOI,mFAPJ,qBAOI,qIAPJ,eAOI,uHAPJ,iBAOI,2EAPJ,iBAOI,6HAPJ,iBAOI,uHAPJ,iBAOI,6HAPJ,iBAOI,6HAPJ,iBAOI,+HAPJ,sBAOI,+EAPJ,oBAOI,iIAPJ,SAOI,8BAPJ,WAOI,6BAPJ,MAOI,sBAPJ,KAOI,qBAPJ,KAOI,qBAPJ,KAOI,qBAPJ,KAOI,qB9BVR,yB8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,yB8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,yB8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,0B8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,0B8BGI,iBAOI,sBAPJ,eAOI,uBAPJ,gBAOI,sBAPJ,wBAOI,8BAPJ,sBAOI,4BAPJ,qBAOI,2BAPJ,sBAOI,iCAPJ,qBAOI,2BAPJ,cAOI,0BAPJ,oBAOI,gCAPJ,aAOI,yBAPJ,YAOI,wBAPJ,mBAOI,+BAPJ,aAOI,yBAPJ,iBAOI,6BAPJ,kBAOI,8BAPJ,YAOI,wBAPJ,mBAOI,+BAPJ,YAOI,wBAPJ,eAOI,yBAPJ,cAOI,8BAPJ,iBAOI,iCAPJ,sBAOI,sCAPJ,yBAOI,yCAPJ,iBAOI,uBAPJ,iBAOI,uBAPJ,mBAOI,yBAPJ,mBAOI,yBAPJ,eAOI,0BAPJ,iBAOI,4BAPJ,uBAOI,kCAPJ,2BAOI,sCAPJ,yBAOI,oCAPJ,4BAOI,kCAPJ,6BAOI,yCAPJ,4BAOI,wCAPJ,4BAOI,wCAPJ,uBAOI,kCAPJ,qBAOI,gCAPJ,wBAOI,8BAPJ,0BAOI,gCAPJ,yBAOI,+BAPJ,yBAOI,oCAPJ,uBAOI,kCAPJ,0BAOI,gCAPJ,2BAOI,uCAPJ,0BAOI,sCAPJ,2BAOI,iCAPJ,qBAOI,2BAPJ,sBAOI,iCAPJ,oBAOI,+BAPJ,uBAOI,6BAPJ,yBAOI,+BAPJ,wBAOI,8BAPJ,iBAOI,oBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,gBAOI,mBAPJ,SAOI,oBAPJ,SAOI,yBAPJ,SAOI,wBAPJ,SAOI,uBAPJ,SAOI,yBAPJ,SAOI,uBAPJ,YAOI,uBAPJ,UAOI,mDAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,yDAPJ,UAOI,6DAPJ,UAOI,yDAPJ,aAOI,yDAPJ,UAOI,mDAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,yDAPJ,UAOI,6DAPJ,UAOI,yDAPJ,aAOI,yDAPJ,UAOI,wBAPJ,UAOI,6BAPJ,UAOI,4BAPJ,UAOI,2BAPJ,UAOI,6BAPJ,UAOI,2BAPJ,aAOI,2BAPJ,UAOI,0BAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,+BAPJ,UAOI,6BAPJ,aAOI,6BAPJ,UAOI,2BAPJ,UAOI,gCAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,gCAPJ,UAOI,8BAPJ,aAOI,8BAPJ,UAOI,yBAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,4BAPJ,UAOI,8BAPJ,UAOI,4BAPJ,aAOI,4BAPJ,SAOI,qBAPJ,SAOI,0BAPJ,SAOI,yBAPJ,SAOI,wBAPJ,SAOI,0BAPJ,SAOI,wBAPJ,UAOI,qDAPJ,UAOI,+DAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,+DAPJ,UAOI,2DAPJ,UAOI,qDAPJ,UAOI,+DAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,+DAPJ,UAOI,2DAPJ,UAOI,yBAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,4BAPJ,UAOI,8BAPJ,UAOI,4BAPJ,UAOI,2BAPJ,UAOI,gCAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,gCAPJ,UAOI,8BAPJ,UAOI,4BAPJ,UAOI,iCAPJ,UAOI,gCAPJ,UAOI,+BAPJ,UAOI,iCAPJ,UAOI,+BAPJ,UAOI,0BAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,+BAPJ,UAOI,6BAPJ,WAOI,iBAPJ,WAOI,sBAPJ,WAOI,qBAPJ,WAOI,oBAPJ,WAOI,sBAPJ,WAOI,oBAPJ,eAOI,qBAPJ,eAOI,0BAPJ,eAOI,yBAPJ,eAOI,wBAPJ,eAOI,0BAPJ,eAOI,wBAPJ,kBAOI,wBAPJ,kBAOI,6BAPJ,kBAOI,4BAPJ,kBAOI,2BAPJ,kBAOI,6BAPJ,kBAOI,2BAPJ,gBAOI,2BAPJ,cAOI,4BAPJ,iBAOI,8BCtDZ,0BD+CQ,MAOI,4BAPJ,MAOI,0BAPJ,MAOI,6BAPJ,MAOI,6BCnCZ,aD4BQ,gBAOI,0BAPJ,sBAOI,gCAPJ,eAOI,yBAPJ,cAOI,wBAPJ,qBAOI,+BAPJ,eAOI,yBAPJ,mBAOI,6BAPJ,oBAOI,8BAPJ,cAOI,wBAPJ,qBAOI,+BAPJ,cAOI,yBEnBZ,KACE,mCACA,gBACA,wBACA,iCACA,iBACA,cAGF,aACE,gCACA,sCACA,kCAGF,qBACE,2BACA,gBACA,kCAEA,2BACE,sCACA,gCAIJ,eACE,WACA,wCACA,oCAIA,iBACE,YAGF,oBACE,YAGF,kBACE,YAIJ,EACE,0BACA,wBAEA,QACE,8BAGF,SACE,wBAIJ,cAEE,gBACA,iBACA,oBACA,iBAGF,OACE,gBAGF,OACE,iBAIA,cACE,gBACA,eACA,iBAGF,cACE,gBACA,eAKJ,WACE,iBACA,mBACA,YACA,YACA,yBACA,gBACA,8BACA,sBACA,iBACA,UACA,YACA,6CAKA,oBACE,eACA,WACA,iBACA,kBACA,cAIJ,kCACE,yBACA,4BACA,WACA,kBACA,cACA,cAEA,yCACE,kBACA,QACA,UAEA,YACA,sBACA,cACA,kBACA,sBAEA,+CACE,eACA,yBAKN,UACE,gCAEA,oBACE,0BAEA,uCACE,sBACA,iCAIJ,kBACE,sBACA,oCAKF,kBACE,gBACA,4CAQJ,WACE,gBACA,4BACA,aACA,uBAEA,kBACE,WACA,mBACA,eACA,iBACA,sBAGF,aACE,gBAGF,yBACE,eACA,qBACA,oBAIJ,QACE,sCACA,gCAEA,iBACE,kBACA,gBACA,iBACA,oBAGF,WACE,mBAIA,iBACE,gCAGF,sBACE,gCACA,+BACA,qBAGF,uBACE,gCAIJ,eACE,gCACA,eAKF,eACE,WAKF,mBACE,WAIJ,iBACE,sCACA,sBACA,eACA,YACA,WACA,aAGF,UACE,iBAEA,gDAEE,wBACA,qBAKF,sBACE,mBAKF,sBACE,oBACA,WAGF,oBACE,iBACA,iBAKF,cACE,iBCjVJ,SACE,sBACA,eACA,oBAGF,iBACE,+BACA,WAEF,gBACE,c/CRF,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDgD7DA,iBACE,gBACA,iBACA,0CAGF,OACE,qBAGF,YACE,iBAEA,iBACE,gBACA,oBAIJ,gBACE,iBACA,oBAGF,gBACE,iBhDzBJ,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDiD5DA,iBAEE,wBAGF,kBACE,qBACA,gBACA,+BAGF,gDAEE,iCAGF,iBACE,uBACA,mBACA,oBAGF,uEAGE,iCC1BJ,UACE,kBAGA,iBACE,WACA,kBACA,UACA,iBAXS,QAYT,MACA,SACA,SACA,iBAKJ,eACE,kBACA,UAEA,qBACE,kCACA,kBACA,sBACA,cAEA,uBACE,cAGF,iCACE,yBAIJ,2BACE,oBACA,iBACA,gBAIF,sBACE,iBACA,eACA,kBACA,kBACA,WACA,YACA,YACA,SACA,kBACA,UAGF,gCACE,YACA,sBACA,yBAGF,8BACE,aACA,sBACA,yBAGF,+BACE,YACA,sBACA,yBAIF,oBACE,0BACA,OAIF,qBACE,0BACA,SAIF,4BACE,WACA,kBACA,YACA,WACA,sBACA,sBACA,wCACA,SACA,UACA,WACA,wCACA,sCAIF,6BACE,WACA,kBACA,YACA,WACA,iCACA,sBACA,wCACA,SACA,UACA,UACA,uCACA,yCAIF,4BACE,WAKJ,qCAGE,iBACE,UAIF,eACE,WACA,6BACA,8BAGA,uBACE,qBAIF,uDAEE,oBAGF,4BACE,kBACA,gBACA,uCACA,yCAGF,6BACE,WAIF,qBACE,SlDlKN,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDmD7DA,qBACE,0CCHF,gCACE,mBAKA,+CACE,yBAIJ,+BACE","sourcesContent":["$primary-color: #021a34;\n$secondary-color: #075f94;\n\n:root {\n // -- Light\n --primary-color-light: #021a34;\n --secondary-color-light: #075f94;\n\n --bg-color-light: #edeef0;\n --bg-color-reverse-light: #021a34;\n --bg-color-tinted-light: #b0b2b4;\n\n --text-color-light: #4c4c4c;\n --text-color-reverse-light: #edeef0;\n --text-muted-color-light: #4c4c4c;\n\n --link-color-light: #4c4c4c;\n --link-hover-color-light: #6c6c6c;\n\n // -- Dark\n --primary-color-dark: #edeef0;\n --secondary-color-dark: #075f94;\n\n --bg-color-dark: #14171c;\n --bg-color-reverse-dark: #edeef0;\n --bg-color-tinted-dark: #627191;\n\n --text-color-dark: #edeef0;\n --text-color-reverse-dark: #14171c;\n --text-muted-color-dark: #edeef0;\n\n --link-color-dark: #edeef0;\n --link-hover-color-dark: #ffffff;\n}\n\n[data-bs-theme=\"light\"] {\n --primary-color: var(--primary-color-light);\n --secondary-color: var(--secondary-color-light);\n --bg-color-tinted: var(--bg-color-tinted-light);\n\n --bg-color: var(--bg-color-light);\n --bg-color-reverse: var(--bg-color-reverse-light);\n --text-color: var(--text-color-light);\n\n --text-color-reverse: var(--text-color-reverse-light);\n --text-muted-color: var(--text-muted-color-light);\n\n --link-color: var(--link-color-light);\n --link-hover-color: var(--link-hover-color-light);\n}\n\n[data-bs-theme=\"dark\"] {\n --primary-color: var(--primary-color-dark);\n --secondary-color: var(--secondary-color-dark);\n\n --bg-color: var(--bg-color-dark);\n --bg-color-reverse: var(--bg-color-reverse-dark);\n --bg-color-tinted: var(--bg-color-tinted-dark);\n\n --text-color: var(--text-color-dark);\n --text-color-reverse: var(--text-color-reverse-dark);\n --text-muted-color: var(--text-muted-color-dark);\n\n --link-color: var(--link-color-dark);\n --link-hover-color: var(--link-hover-color-dark);\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, ``-`` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on ` `s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `
` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.\n// See https://stackoverflow.com/a/54997118\n\n[list]:not([type=\"date\"]):not([type=\"datetime-local\"]):not([type=\"month\"]):not([type=\"week\"]):not([type=\"time\"])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. ``s, which have `min-width: 0;` by default.\n// So we reset that to ensure fieldsets behave more like a standard block element.\n// See https://github.com/twbs/bootstrap/issues/12359\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n min-width: 0; // 1\n padding: 0; // 2\n margin: 0; // 2\n border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n// This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n// See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n float: left; // 1\n width: 100%;\n padding: 0;\n margin-bottom: $legend-margin-bottom;\n @include font-size($legend-font-size);\n font-weight: $legend-font-weight;\n line-height: inherit;\n\n + * {\n clear: left; // 2\n }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n// 1. This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n// 2. Correct the outline style in Safari.\n\n[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n outline-offset: -2px; // 2\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n\n// 1. Inherit font family and line height for file input buttons\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::file-selector-button {\n font: inherit; // 1\n -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n display: list-item; // 1\n cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,
\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,
\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,
\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,
\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,
\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,
\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,
\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,
\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,
\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,
\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,
\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,
\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,
\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,
\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,
\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,
\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n","//\n// Headings\n//\n.h1 {\n @extend h1;\n}\n\n.h2 {\n @extend h2;\n}\n\n.h3 {\n @extend h3;\n}\n\n.h4 {\n @extend h4;\n}\n\n.h5 {\n @extend h5;\n}\n\n.h6 {\n @extend h6;\n}\n\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n@each $display, $font-size in $display-font-sizes {\n .display-#{$display} {\n @include font-size($font-size);\n font-family: $display-font-family;\n font-style: $display-font-style;\n font-weight: $display-font-weight;\n line-height: $display-line-height;\n }\n}\n\n//\n// Emphasis\n//\n.small {\n @extend small;\n}\n\n.mark {\n @extend mark;\n}\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled();\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled();\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size($initialism-font-size);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-font-size);\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n.blockquote-footer {\n margin-top: -$blockquote-margin-y;\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-footer-font-size);\n color: $blockquote-footer-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `
`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid();\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid();\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer * .5;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n","@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @each $value in $shadow {\n @if $value != null {\n $result: append($result, $value, \"comma\");\n }\n @if $value == none and length($shadow) > 1 {\n @warn \"The keyword 'none' must be used as a single argument.\";\n }\n }\n\n @if (length($result) > 0) {\n box-shadow: $result;\n }\n }\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n // Reset needed for nesting tables\n --#{$prefix}table-color-type: initial;\n --#{$prefix}table-bg-type: initial;\n --#{$prefix}table-color-state: initial;\n --#{$prefix}table-bg-state: initial;\n // End of reset\n --#{$prefix}table-color: #{$table-color};\n --#{$prefix}table-bg: #{$table-bg};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-accent-bg: #{$table-accent-bg};\n --#{$prefix}table-striped-color: #{$table-striped-color};\n --#{$prefix}table-striped-bg: #{$table-striped-bg};\n --#{$prefix}table-active-color: #{$table-active-color};\n --#{$prefix}table-active-bg: #{$table-active-bg};\n --#{$prefix}table-hover-color: #{$table-hover-color};\n --#{$prefix}table-hover-bg: #{$table-hover-bg};\n\n width: 100%;\n margin-bottom: $spacer;\n vertical-align: $table-cell-vertical-align;\n border-color: var(--#{$prefix}table-border-color);\n\n // Target th & td\n // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.\n // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).\n // Another advantage is that this generates less code and makes the selector less specific making it easier to override.\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y $table-cell-padding-x;\n // Following the precept of cascades: https://codepen.io/miriamsuzanne/full/vYNgodb\n color: var(--#{$prefix}table-color-state, var(--#{$prefix}table-color-type, var(--#{$prefix}table-color)));\n background-color: var(--#{$prefix}table-bg);\n border-bottom-width: $table-border-width;\n box-shadow: inset 0 0 0 9999px var(--#{$prefix}table-bg-state, var(--#{$prefix}table-bg-type, var(--#{$prefix}table-accent-bg)));\n }\n\n > tbody {\n vertical-align: inherit;\n }\n\n > thead {\n vertical-align: bottom;\n }\n}\n\n.table-group-divider {\n border-top: calc(#{$table-border-width} * 2) solid $table-group-separator-color; // stylelint-disable-line function-disallowed-list\n}\n\n//\n// Change placement of captions with a class\n//\n\n.caption-top {\n caption-side: top;\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n//\n// When borders are added on all sides of the cells, the corners can render odd when\n// these borders do not have the same color or if they are semi-transparent.\n// Therefor we add top and border bottoms to the `tr`s and left and right borders\n// to the `td`s or `th`s\n\n.table-bordered {\n > :not(caption) > * {\n border-width: $table-border-width 0;\n\n // stylelint-disable-next-line selector-max-universal\n > * {\n border-width: 0 $table-border-width;\n }\n }\n}\n\n.table-borderless {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n border-bottom-width: 0;\n }\n\n > :not(:first-child) {\n border-top-width: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n// For rows\n.table-striped {\n > tbody > tr:nth-of-type(#{$table-striped-order}) > * {\n --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\n --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\n }\n}\n\n// For columns\n.table-striped-columns {\n > :not(caption) > tr > :nth-child(#{$table-striped-columns-order}) {\n --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\n --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\n }\n}\n\n// Active table\n//\n// The `.table-active` class can be added to highlight rows or cells\n\n.table-active {\n --#{$prefix}table-color-state: var(--#{$prefix}table-active-color);\n --#{$prefix}table-bg-state: var(--#{$prefix}table-active-bg);\n}\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover > * {\n --#{$prefix}table-color-state: var(--#{$prefix}table-hover-color);\n --#{$prefix}table-bg-state: var(--#{$prefix}table-hover-bg);\n }\n}\n\n\n// Table variants\n//\n// Table variants set the table cell backgrounds, border colors\n// and the colors of the striped, hovered & active tables\n\n@each $color, $value in $table-variants {\n @include table-variant($color, $value);\n}\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @include media-breakpoint-down($breakpoint) {\n .table-responsive#{$infix} {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n }\n}\n","// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n $table-border-color: mix($color, $background, percentage($table-border-factor));\n\n --#{$prefix}table-color: #{$color};\n --#{$prefix}table-bg: #{$background};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-striped-bg: #{$striped-bg};\n --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$prefix}table-active-bg: #{$active-bg};\n --#{$prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$prefix}table-hover-bg: #{$hover-bg};\n --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: var(--#{$prefix}table-color);\n border-color: var(--#{$prefix}table-border-color);\n }\n}\n// scss-docs-end table-variant\n","//\n// Base styles\n//\n\n.btn {\n // scss-docs-start btn-css-vars\n --#{$prefix}btn-padding-x: #{$btn-padding-x};\n --#{$prefix}btn-padding-y: #{$btn-padding-y};\n --#{$prefix}btn-font-family: #{$btn-font-family};\n @include rfs($btn-font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-font-weight: #{$btn-font-weight};\n --#{$prefix}btn-line-height: #{$btn-line-height};\n --#{$prefix}btn-color: #{$btn-color};\n --#{$prefix}btn-bg: transparent;\n --#{$prefix}btn-border-width: #{$btn-border-width};\n --#{$prefix}btn-border-color: transparent;\n --#{$prefix}btn-border-radius: #{$btn-border-radius};\n --#{$prefix}btn-hover-border-color: transparent;\n --#{$prefix}btn-box-shadow: #{$btn-box-shadow};\n --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity};\n --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5);\n // scss-docs-end btn-css-vars\n\n display: inline-block;\n padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x);\n font-family: var(--#{$prefix}btn-font-family);\n @include font-size(var(--#{$prefix}btn-font-size));\n font-weight: var(--#{$prefix}btn-font-weight);\n line-height: var(--#{$prefix}btn-line-height);\n color: var(--#{$prefix}btn-color);\n text-align: center;\n text-decoration: if($link-decoration == none, null, none);\n white-space: $btn-white-space;\n vertical-align: middle;\n cursor: if($enable-button-pointers, pointer, null);\n user-select: none;\n border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color);\n @include border-radius(var(--#{$prefix}btn-border-radius));\n @include gradient-bg(var(--#{$prefix}btn-bg));\n @include box-shadow(var(--#{$prefix}btn-box-shadow));\n @include transition($btn-transition);\n\n &:hover {\n color: var(--#{$prefix}btn-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n background-color: var(--#{$prefix}btn-hover-bg);\n border-color: var(--#{$prefix}btn-hover-border-color);\n }\n\n .btn-check + &:hover {\n // override for the checkbox/radio buttons\n color: var(--#{$prefix}btn-color);\n background-color: var(--#{$prefix}btn-bg);\n border-color: var(--#{$prefix}btn-border-color);\n }\n\n &:focus-visible {\n color: var(--#{$prefix}btn-hover-color);\n @include gradient-bg(var(--#{$prefix}btn-hover-bg));\n border-color: var(--#{$prefix}btn-hover-border-color);\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\n } @else {\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n }\n }\n\n .btn-check:focus-visible + & {\n border-color: var(--#{$prefix}btn-hover-border-color);\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\n } @else {\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n }\n }\n\n .btn-check:checked + &,\n :not(.btn-check) + &:active,\n &:first-child:active,\n &.active,\n &.show {\n color: var(--#{$prefix}btn-active-color);\n background-color: var(--#{$prefix}btn-active-bg);\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: var(--#{$prefix}btn-active-border-color);\n @include box-shadow(var(--#{$prefix}btn-active-shadow));\n\n &:focus-visible {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow);\n } @else {\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n }\n }\n }\n\n &:disabled,\n &.disabled,\n fieldset:disabled & {\n color: var(--#{$prefix}btn-disabled-color);\n pointer-events: none;\n background-color: var(--#{$prefix}btn-disabled-bg);\n background-image: if($enable-gradients, none, null);\n border-color: var(--#{$prefix}btn-disabled-border-color);\n opacity: var(--#{$prefix}btn-disabled-opacity);\n @include box-shadow(none);\n }\n}\n\n\n//\n// Alternate buttons\n//\n\n// scss-docs-start btn-variant-loops\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @if $color == \"light\" {\n @include button-variant(\n $value,\n $value,\n $hover-background: shade-color($value, $btn-hover-bg-shade-amount),\n $hover-border: shade-color($value, $btn-hover-border-shade-amount),\n $active-background: shade-color($value, $btn-active-bg-shade-amount),\n $active-border: shade-color($value, $btn-active-border-shade-amount)\n );\n } @else if $color == \"dark\" {\n @include button-variant(\n $value,\n $value,\n $hover-background: tint-color($value, $btn-hover-bg-tint-amount),\n $hover-border: tint-color($value, $btn-hover-border-tint-amount),\n $active-background: tint-color($value, $btn-active-bg-tint-amount),\n $active-border: tint-color($value, $btn-active-border-tint-amount)\n );\n } @else {\n @include button-variant($value, $value);\n }\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n// scss-docs-end btn-variant-loops\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n --#{$prefix}btn-font-weight: #{$font-weight-normal};\n --#{$prefix}btn-color: #{$btn-link-color};\n --#{$prefix}btn-bg: transparent;\n --#{$prefix}btn-border-color: transparent;\n --#{$prefix}btn-hover-color: #{$btn-link-hover-color};\n --#{$prefix}btn-hover-border-color: transparent;\n --#{$prefix}btn-active-color: #{$btn-link-hover-color};\n --#{$prefix}btn-active-border-color: transparent;\n --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color};\n --#{$prefix}btn-disabled-border-color: transparent;\n --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows\n --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb};\n\n text-decoration: $link-decoration;\n @if $enable-gradients {\n background-image: none;\n }\n\n &:hover,\n &:focus-visible {\n text-decoration: $link-hover-decoration;\n }\n\n &:focus-visible {\n color: var(--#{$prefix}btn-color);\n }\n\n &:hover {\n color: var(--#{$prefix}btn-hover-color);\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);\n}\n","// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n","// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-bg: #{$background};\n --#{$prefix}btn-border-color: #{$border};\n --#{$prefix}btn-hover-color: #{$hover-color};\n --#{$prefix}btn-hover-bg: #{$hover-background};\n --#{$prefix}btn-hover-border-color: #{$hover-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$disabled-color};\n --#{$prefix}btn-disabled-bg: #{$disabled-background};\n --#{$prefix}btn-disabled-border-color: #{$disabled-border};\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-border-color: #{$color};\n --#{$prefix}btn-hover-color: #{$color-hover};\n --#{$prefix}btn-hover-bg: #{$active-background};\n --#{$prefix}btn-hover-border-color: #{$active-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$color};\n --#{$prefix}btn-disabled-bg: transparent;\n --#{$prefix}btn-disabled-border-color: #{$color};\n --#{$prefix}gradient: none;\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}btn-padding-y: #{$padding-y};\n --#{$prefix}btn-padding-x: #{$padding-x};\n @include rfs($font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-border-radius: #{$border-radius};\n}\n// scss-docs-end btn-size-mixin\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n// scss-docs-start collapse-classes\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n\n &.collapse-horizontal {\n width: 0;\n height: auto;\n @include transition($transition-collapse-width);\n }\n}\n// scss-docs-end collapse-classes\n","// The dropdown wrapper (`
`)\n.dropup,\n.dropend,\n.dropdown,\n.dropstart,\n.dropup-center,\n.dropdown-center {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret();\n}\n\n// The dropdown menu\n.dropdown-menu {\n // scss-docs-start dropdown-css-vars\n --#{$prefix}dropdown-zindex: #{$zindex-dropdown};\n --#{$prefix}dropdown-min-width: #{$dropdown-min-width};\n --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x};\n --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y};\n --#{$prefix}dropdown-spacer: #{$dropdown-spacer};\n @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size);\n --#{$prefix}dropdown-color: #{$dropdown-color};\n --#{$prefix}dropdown-bg: #{$dropdown-bg};\n --#{$prefix}dropdown-border-color: #{$dropdown-border-color};\n --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius};\n --#{$prefix}dropdown-border-width: #{$dropdown-border-width};\n --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius};\n --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg};\n --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y};\n --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow};\n --#{$prefix}dropdown-link-color: #{$dropdown-link-color};\n --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color};\n --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg};\n --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color};\n --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg};\n --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color};\n --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x};\n --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y};\n --#{$prefix}dropdown-header-color: #{$dropdown-header-color};\n --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x};\n --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y};\n // scss-docs-end dropdown-css-vars\n\n position: absolute;\n z-index: var(--#{$prefix}dropdown-zindex);\n display: none; // none by default, but block on \"open\" of the menu\n min-width: var(--#{$prefix}dropdown-min-width);\n padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x);\n margin: 0; // Override default margin of ul\n @include font-size(var(--#{$prefix}dropdown-font-size));\n color: var(--#{$prefix}dropdown-color);\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: var(--#{$prefix}dropdown-bg);\n background-clip: padding-box;\n border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color);\n @include border-radius(var(--#{$prefix}dropdown-border-radius));\n @include box-shadow(var(--#{$prefix}dropdown-box-shadow));\n\n &[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: var(--#{$prefix}dropdown-spacer);\n }\n\n @if $dropdown-padding-y == 0 {\n > .dropdown-item:first-child,\n > li:first-child .dropdown-item {\n @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius));\n }\n > .dropdown-item:last-child,\n > li:last-child .dropdown-item {\n @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius));\n }\n\n }\n}\n\n// scss-docs-start responsive-breakpoints\n// We deliberately hardcode the `bs-` prefix because we check\n// this custom property in JS to determine Popper's positioning\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-start {\n --bs-position: start;\n\n &[data-bs-popper] {\n right: auto;\n left: 0;\n }\n }\n\n .dropdown-menu#{$infix}-end {\n --bs-position: end;\n\n &[data-bs-popper] {\n right: 0;\n left: auto;\n }\n }\n }\n}\n// scss-docs-end responsive-breakpoints\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: var(--#{$prefix}dropdown-spacer);\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropend {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: var(--#{$prefix}dropdown-spacer);\n }\n\n .dropdown-toggle {\n @include caret(end);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropstart {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: var(--#{$prefix}dropdown-spacer);\n }\n\n .dropdown-toggle {\n @include caret(start);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n\n// Dividers (basically an `
`) within the dropdown\n.dropdown-divider {\n height: 0;\n margin: var(--#{$prefix}dropdown-divider-margin-y) 0;\n overflow: hidden;\n border-top: 1px solid var(--#{$prefix}dropdown-divider-bg);\n opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
element\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `
`-specific styles are denoted with `// For s`\n.dropdown-item {\n display: block;\n width: 100%; // For ``s\n padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\n clear: both;\n font-weight: $font-weight-normal;\n color: var(--#{$prefix}dropdown-link-color);\n text-align: inherit; // For ``s\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For ``s\n border: 0; // For ``s\n @include border-radius(var(--#{$prefix}dropdown-item-border-radius, 0));\n\n &:hover,\n &:focus {\n color: var(--#{$prefix}dropdown-link-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n @include gradient-bg(var(--#{$prefix}dropdown-link-hover-bg));\n }\n\n &.active,\n &:active {\n color: var(--#{$prefix}dropdown-link-active-color);\n text-decoration: none;\n @include gradient-bg(var(--#{$prefix}dropdown-link-active-bg));\n }\n\n &.disabled,\n &:disabled {\n color: var(--#{$prefix}dropdown-link-disabled-color);\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: var(--#{$prefix}dropdown-header-padding-y) var(--#{$prefix}dropdown-header-padding-x);\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: var(--#{$prefix}dropdown-header-color);\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\n color: var(--#{$prefix}dropdown-link-color);\n}\n\n// Dark dropdowns\n.dropdown-menu-dark {\n // scss-docs-start dropdown-dark-css-vars\n --#{$prefix}dropdown-color: #{$dropdown-dark-color};\n --#{$prefix}dropdown-bg: #{$dropdown-dark-bg};\n --#{$prefix}dropdown-border-color: #{$dropdown-dark-border-color};\n --#{$prefix}dropdown-box-shadow: #{$dropdown-dark-box-shadow};\n --#{$prefix}dropdown-link-color: #{$dropdown-dark-link-color};\n --#{$prefix}dropdown-link-hover-color: #{$dropdown-dark-link-hover-color};\n --#{$prefix}dropdown-divider-bg: #{$dropdown-dark-divider-bg};\n --#{$prefix}dropdown-link-hover-bg: #{$dropdown-dark-link-hover-bg};\n --#{$prefix}dropdown-link-active-color: #{$dropdown-dark-link-active-color};\n --#{$prefix}dropdown-link-active-bg: #{$dropdown-dark-link-active-bg};\n --#{$prefix}dropdown-link-disabled-color: #{$dropdown-dark-link-disabled-color};\n --#{$prefix}dropdown-header-color: #{$dropdown-dark-header-color};\n // scss-docs-end dropdown-dark-css-vars\n}\n","// scss-docs-start caret-mixins\n@mixin caret-down($width: $caret-width) {\n border-top: $width solid;\n border-right: $width solid transparent;\n border-bottom: 0;\n border-left: $width solid transparent;\n}\n\n@mixin caret-up($width: $caret-width) {\n border-top: 0;\n border-right: $width solid transparent;\n border-bottom: $width solid;\n border-left: $width solid transparent;\n}\n\n@mixin caret-end($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: 0;\n border-bottom: $width solid transparent;\n border-left: $width solid;\n}\n\n@mixin caret-start($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: $width solid;\n border-bottom: $width solid transparent;\n}\n\n@mixin caret(\n $direction: down,\n $width: $caret-width,\n $spacing: $caret-spacing,\n $vertical-align: $caret-vertical-align\n) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down($width);\n } @else if $direction == up {\n @include caret-up($width);\n } @else if $direction == end {\n @include caret-end($width);\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @include caret-start($width);\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// ``s, ``s or ``s.\n\n.nav {\n // scss-docs-start nav-css-vars\n --#{$prefix}nav-link-padding-x: #{$nav-link-padding-x};\n --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\n @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\n --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\n --#{$prefix}nav-link-color: #{$nav-link-color};\n --#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};\n --#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};\n // scss-docs-end nav-css-vars\n\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: var(--#{$prefix}nav-link-padding-y) var(--#{$prefix}nav-link-padding-x);\n @include font-size(var(--#{$prefix}nav-link-font-size));\n font-weight: var(--#{$prefix}nav-link-font-weight);\n color: var(--#{$prefix}nav-link-color);\n text-decoration: if($link-decoration == none, null, none);\n background: none;\n border: 0;\n @include transition($nav-link-transition);\n\n &:hover,\n &:focus {\n color: var(--#{$prefix}nav-link-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n &:focus-visible {\n outline: 0;\n box-shadow: $nav-link-focus-box-shadow;\n }\n\n // Disabled state lightens text\n &.disabled,\n &:disabled {\n color: var(--#{$prefix}nav-link-disabled-color);\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n // scss-docs-start nav-tabs-css-vars\n --#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};\n --#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};\n --#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};\n --#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};\n --#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};\n --#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};\n --#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};\n // scss-docs-end nav-tabs-css-vars\n\n border-bottom: var(--#{$prefix}nav-tabs-border-width) solid var(--#{$prefix}nav-tabs-border-color);\n\n .nav-link {\n margin-bottom: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\n border: var(--#{$prefix}nav-tabs-border-width) solid transparent;\n @include border-top-radius(var(--#{$prefix}nav-tabs-border-radius));\n\n &:hover,\n &:focus {\n // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link\n isolation: isolate;\n border-color: var(--#{$prefix}nav-tabs-link-hover-border-color);\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: var(--#{$prefix}nav-tabs-link-active-color);\n background-color: var(--#{$prefix}nav-tabs-link-active-bg);\n border-color: var(--#{$prefix}nav-tabs-link-active-border-color);\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n // scss-docs-start nav-pills-css-vars\n --#{$prefix}nav-pills-border-radius: #{$nav-pills-border-radius};\n --#{$prefix}nav-pills-link-active-color: #{$nav-pills-link-active-color};\n --#{$prefix}nav-pills-link-active-bg: #{$nav-pills-link-active-bg};\n // scss-docs-end nav-pills-css-vars\n\n .nav-link {\n @include border-radius(var(--#{$prefix}nav-pills-border-radius));\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: var(--#{$prefix}nav-pills-link-active-color);\n @include gradient-bg(var(--#{$prefix}nav-pills-link-active-bg));\n }\n}\n\n\n//\n// Underline\n//\n\n.nav-underline {\n // scss-docs-start nav-underline-css-vars\n --#{$prefix}nav-underline-gap: #{$nav-underline-gap};\n --#{$prefix}nav-underline-border-width: #{$nav-underline-border-width};\n --#{$prefix}nav-underline-link-active-color: #{$nav-underline-link-active-color};\n // scss-docs-end nav-underline-css-vars\n\n gap: var(--#{$prefix}nav-underline-gap);\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n border-bottom: var(--#{$prefix}nav-underline-border-width) solid transparent;\n\n &:hover,\n &:focus {\n border-bottom-color: currentcolor;\n }\n }\n\n .nav-link.active,\n .show > .nav-link {\n font-weight: $font-weight-bold;\n color: var(--#{$prefix}nav-underline-link-active-color);\n border-bottom-color: currentcolor;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n > .nav-link,\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n > .nav-link,\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n.nav-fill,\n.nav-justified {\n .nav-item .nav-link {\n width: 100%; // Make sure button will grow\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n // scss-docs-start navbar-css-vars\n --#{$prefix}navbar-padding-x: #{if($navbar-padding-x == null, 0, $navbar-padding-x)};\n --#{$prefix}navbar-padding-y: #{$navbar-padding-y};\n --#{$prefix}navbar-color: #{$navbar-light-color};\n --#{$prefix}navbar-hover-color: #{$navbar-light-hover-color};\n --#{$prefix}navbar-disabled-color: #{$navbar-light-disabled-color};\n --#{$prefix}navbar-active-color: #{$navbar-light-active-color};\n --#{$prefix}navbar-brand-padding-y: #{$navbar-brand-padding-y};\n --#{$prefix}navbar-brand-margin-end: #{$navbar-brand-margin-end};\n --#{$prefix}navbar-brand-font-size: #{$navbar-brand-font-size};\n --#{$prefix}navbar-brand-color: #{$navbar-light-brand-color};\n --#{$prefix}navbar-brand-hover-color: #{$navbar-light-brand-hover-color};\n --#{$prefix}navbar-nav-link-padding-x: #{$navbar-nav-link-padding-x};\n --#{$prefix}navbar-toggler-padding-y: #{$navbar-toggler-padding-y};\n --#{$prefix}navbar-toggler-padding-x: #{$navbar-toggler-padding-x};\n --#{$prefix}navbar-toggler-font-size: #{$navbar-toggler-font-size};\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-light-toggler-icon-bg)};\n --#{$prefix}navbar-toggler-border-color: #{$navbar-light-toggler-border-color};\n --#{$prefix}navbar-toggler-border-radius: #{$navbar-toggler-border-radius};\n --#{$prefix}navbar-toggler-focus-width: #{$navbar-toggler-focus-width};\n --#{$prefix}navbar-toggler-transition: #{$navbar-toggler-transition};\n // scss-docs-end navbar-css-vars\n\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: var(--#{$prefix}navbar-padding-y) var(--#{$prefix}navbar-padding-x);\n @include gradient-bg();\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n // The `flex-wrap` property is inherited to simplify the expanded navbars\n %container-flex-properties {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n }\n\n > .container,\n > .container-fluid {\n @extend %container-flex-properties;\n }\n\n @each $breakpoint, $container-max-width in $container-max-widths {\n > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {\n @extend %container-flex-properties;\n }\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n padding-top: var(--#{$prefix}navbar-brand-padding-y);\n padding-bottom: var(--#{$prefix}navbar-brand-padding-y);\n margin-right: var(--#{$prefix}navbar-brand-margin-end);\n @include font-size(var(--#{$prefix}navbar-brand-font-size));\n color: var(--#{$prefix}navbar-brand-color);\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap;\n\n &:hover,\n &:focus {\n color: var(--#{$prefix}navbar-brand-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n // scss-docs-start navbar-nav-css-vars\n --#{$prefix}nav-link-padding-x: 0;\n --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\n @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\n --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\n --#{$prefix}nav-link-color: var(--#{$prefix}navbar-color);\n --#{$prefix}nav-link-hover-color: var(--#{$prefix}navbar-hover-color);\n --#{$prefix}nav-link-disabled-color: var(--#{$prefix}navbar-disabled-color);\n // scss-docs-end navbar-nav-css-vars\n\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n &.active,\n &.show {\n color: var(--#{$prefix}navbar-active-color);\n }\n }\n\n .dropdown-menu {\n position: static;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n color: var(--#{$prefix}navbar-color);\n\n a,\n a:hover,\n a:focus {\n color: var(--#{$prefix}navbar-active-color);\n }\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: var(--#{$prefix}navbar-toggler-padding-y) var(--#{$prefix}navbar-toggler-padding-x);\n @include font-size(var(--#{$prefix}navbar-toggler-font-size));\n line-height: 1;\n color: var(--#{$prefix}navbar-color);\n background-color: transparent; // remove default button style\n border: var(--#{$prefix}border-width) solid var(--#{$prefix}navbar-toggler-border-color); // remove default button style\n @include border-radius(var(--#{$prefix}navbar-toggler-border-radius));\n @include transition(var(--#{$prefix}navbar-toggler-transition));\n\n &:hover {\n text-decoration: none;\n }\n\n &:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 var(--#{$prefix}navbar-toggler-focus-width);\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-image: var(--#{$prefix}navbar-toggler-icon-bg);\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--#{$prefix}scroll-height, 75vh);\n overflow-y: auto;\n}\n\n// scss-docs-start navbar-expand-loop\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n // stylelint-disable-next-line scss/selector-no-union-class-name\n {$infix} {\n @include media-breakpoint-up($next) {\n flex-wrap: nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .nav-link {\n padding-right: var(--#{$prefix}navbar-nav-link-padding-x);\n padding-left: var(--#{$prefix}navbar-nav-link-padding-x);\n }\n }\n\n .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n\n .offcanvas {\n // stylelint-disable declaration-no-important\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n @include box-shadow(none);\n @include transition(none);\n // stylelint-enable declaration-no-important\n\n .offcanvas-header {\n display: none;\n }\n\n .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n }\n }\n }\n }\n}\n// scss-docs-end navbar-expand-loop\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n.navbar-light {\n @include deprecate(\"`.navbar-light`\", \"v5.2.0\", \"v6.0.0\", true);\n}\n\n.navbar-dark,\n.navbar[data-bs-theme=\"dark\"] {\n // scss-docs-start navbar-dark-css-vars\n --#{$prefix}navbar-color: #{$navbar-dark-color};\n --#{$prefix}navbar-hover-color: #{$navbar-dark-hover-color};\n --#{$prefix}navbar-disabled-color: #{$navbar-dark-disabled-color};\n --#{$prefix}navbar-active-color: #{$navbar-dark-active-color};\n --#{$prefix}navbar-brand-color: #{$navbar-dark-brand-color};\n --#{$prefix}navbar-brand-hover-color: #{$navbar-dark-brand-hover-color};\n --#{$prefix}navbar-toggler-border-color: #{$navbar-dark-toggler-border-color};\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\n // scss-docs-end navbar-dark-css-vars\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark) {\n .navbar-toggler-icon {\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n // scss-docs-start badge-css-vars\n --#{$prefix}badge-padding-x: #{$badge-padding-x};\n --#{$prefix}badge-padding-y: #{$badge-padding-y};\n @include rfs($badge-font-size, --#{$prefix}badge-font-size);\n --#{$prefix}badge-font-weight: #{$badge-font-weight};\n --#{$prefix}badge-color: #{$badge-color};\n --#{$prefix}badge-border-radius: #{$badge-border-radius};\n // scss-docs-end badge-css-vars\n\n display: inline-block;\n padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x);\n @include font-size(var(--#{$prefix}badge-font-size));\n font-weight: var(--#{$prefix}badge-font-weight);\n line-height: 1;\n color: var(--#{$prefix}badge-color);\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius(var(--#{$prefix}badge-border-radius));\n @include gradient-bg();\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n","//\n// Base styles\n//\n\n.alert {\n // scss-docs-start alert-css-vars\n --#{$prefix}alert-bg: transparent;\n --#{$prefix}alert-padding-x: #{$alert-padding-x};\n --#{$prefix}alert-padding-y: #{$alert-padding-y};\n --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom};\n --#{$prefix}alert-color: inherit;\n --#{$prefix}alert-border-color: transparent;\n --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color);\n --#{$prefix}alert-border-radius: #{$alert-border-radius};\n --#{$prefix}alert-link-color: inherit;\n // scss-docs-end alert-css-vars\n\n position: relative;\n padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x);\n margin-bottom: var(--#{$prefix}alert-margin-bottom);\n color: var(--#{$prefix}alert-color);\n background-color: var(--#{$prefix}alert-bg);\n border: var(--#{$prefix}alert-border);\n @include border-radius(var(--#{$prefix}alert-border-radius));\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n color: var(--#{$prefix}alert-link-color);\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $alert-dismissible-padding-r;\n\n // Adjust close link position\n .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: $stretched-link-z-index + 1;\n padding: $alert-padding-y * 1.25 $alert-padding-x;\n }\n}\n\n\n// scss-docs-start alert-modifiers\n// Generate contextual modifier classes for colorizing the alert\n@each $state in map-keys($theme-colors) {\n .alert-#{$state} {\n --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis);\n --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle);\n --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle);\n --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis);\n }\n}\n// scss-docs-end alert-modifiers\n","// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n","// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\n@each $color, $value in $theme-colors {\n .text-bg-#{$color} {\n color: color-contrast($value) if($enable-important-utilities, !important, null);\n background-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}bg-opacity, 1)) if($enable-important-utilities, !important, null);\n }\n}\n","// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\n@each $color, $value in $theme-colors {\n .link-#{$color} {\n color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n\n @if $link-shade-percentage != 0 {\n &:hover,\n &:focus {\n $hover-color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));\n color: RGBA(#{to-rgb($hover-color)}, var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(to-rgb($hover-color), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n }\n }\n }\n}\n\n// One-off special link helper as a bridge until v6\n.link-body-emphasis {\n color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n\n @if $link-shade-percentage != 0 {\n &:hover,\n &:focus {\n color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, .75)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, .75)) if($enable-important-utilities, !important, null);\n }\n }\n}\n",".focus-ring:focus {\n outline: 0;\n // By default, there is no `--bs-focus-ring-x`, `--bs-focus-ring-y`, or `--bs-focus-ring-blur`, but we provide CSS variables with fallbacks to initial `0` values\n box-shadow: var(--#{$prefix}focus-ring-x, 0) var(--#{$prefix}focus-ring-y, 0) var(--#{$prefix}focus-ring-blur, 0) var(--#{$prefix}focus-ring-width) var(--#{$prefix}focus-ring-color);\n}\n",".icon-link {\n display: inline-flex;\n gap: $icon-link-gap;\n align-items: center;\n text-decoration-color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, .5));\n text-underline-offset: $icon-link-underline-offset;\n backface-visibility: hidden;\n\n > .bi {\n flex-shrink: 0;\n width: $icon-link-icon-size;\n height: $icon-link-icon-size;\n fill: currentcolor;\n @include transition($icon-link-icon-transition);\n }\n}\n\n.icon-link-hover {\n &:hover,\n &:focus-visible {\n > .bi {\n transform: var(--#{$prefix}icon-link-transform, $icon-link-icon-transform);\n }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.ratio {\n position: relative;\n width: 100%;\n\n &::before {\n display: block;\n padding-top: var(--#{$prefix}aspect-ratio);\n content: \"\";\n }\n\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n\n@each $key, $ratio in $aspect-ratios {\n .ratio-#{$key} {\n --#{$prefix}aspect-ratio: #{$ratio};\n }\n}\n","// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n// Responsive sticky top and bottom\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .sticky#{$infix}-top {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n\n .sticky#{$infix}-bottom {\n position: sticky;\n bottom: 0;\n z-index: $zindex-sticky;\n }\n }\n}\n","// scss-docs-start stacks\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n// scss-docs-end stacks\n","//\n// Visually hidden\n//\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n @include visually-hidden();\n}\n","// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n\n // Fix for positioned table caption that could become anonymous cells\n &:not(caption) {\n position: absolute !important;\n }\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::#{$stretched-link-pseudo-element} {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $stretched-link-z-index;\n content: \"\";\n }\n}\n","//\n// Text truncation\n//\n\n.text-truncate {\n @include text-truncate();\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n",".vr {\n display: inline-block;\n align-self: stretch;\n width: $vr-border-width;\n min-height: 1em;\n background-color: currentcolor;\n opacity: $hr-opacity;\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n","@import \"vars\";\n\n// Variable overrides first\n$primary: $primary-color;\n$secondary: $secondary-color;\n$enable-shadows: true;\n$prefix: \"pa-\";\n\n// Required\n@import \"../../node_modules/bootstrap/scss/functions\";\n@import \"../../node_modules/bootstrap/scss/variables\";\n@import \"../../node_modules/bootstrap/scss/variables-dark\";\n@import \"../../node_modules/bootstrap/scss/maps\";\n@import \"../../node_modules/bootstrap/scss/mixins\";\n@import \"../../node_modules/bootstrap/scss/utilities\";\n@import \"../../node_modules/bootstrap/scss/root\";\n@import \"../../node_modules/bootstrap/scss/reboot\";\n\n@import \"../../node_modules/bootstrap/scss/type\";\n@import \"../../node_modules/bootstrap/scss/images\";\n@import \"../../node_modules/bootstrap/scss/containers\";\n@import \"../../node_modules/bootstrap/scss/grid\";\n@import \"../../node_modules/bootstrap/scss/tables\";\n// @import \"../../node_modules/bootstrap/scss/forms\";\n@import \"../../node_modules/bootstrap/scss/buttons\";\n@import \"../../node_modules/bootstrap/scss/transitions\";\n@import \"../../node_modules/bootstrap/scss/dropdown\";\n// @import \"../../node_modules/bootstrap/scss/button-group\";\n@import \"../../node_modules/bootstrap/scss/nav\";\n@import \"../../node_modules/bootstrap/scss/navbar\"; // Requires nav\n// @import \"../../node_modules/bootstrap/scss/card\";\n// @import \"../../node_modules/bootstrap/scss/breadcrumb\";\n// @import \"../../node_modules/bootstrap/scss/accordion\";\n// @import \"../../node_modules/bootstrap/scss/pagination\";\n@import \"../../node_modules/bootstrap/scss/badge\";\n@import \"../../node_modules/bootstrap/scss/alert\";\n// @import \"../../node_modules/bootstrap/scss/progress\";\n// @import \"../../node_modules/bootstrap/scss/list-group\";\n// @import \"../../node_modules/bootstrap/scss/close\";\n// @import \"../../node_modules/bootstrap/scss/toasts\";\n// @import \"../../node_modules/bootstrap/scss/modal\"; // Requires transitions\n// @import \"../../node_modules/bootstrap/scss/tooltip\";\n// @import \"../../node_modules/bootstrap/scss/popover\";\n// @import \"../../node_modules/bootstrap/scss/carousel\";\n// @import \"../../node_modules/bootstrap/scss/spinners\";\n// @import \"../../node_modules/bootstrap/scss/offcanvas\"; // Requires transitions\n// @import \"../../node_modules/bootstrap/scss/placeholders\";\n\n// Helpers\n@import \"../../node_modules/bootstrap/scss/helpers\";\n\n// Utilities\n@import \"../../node_modules/bootstrap/scss/utilities/api\";\n\nbody {\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: var(--text-color);\n background-color: var(--bg-color);\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.btn-primary {\n color: var(--text-color-reverse);\n background-color: var(--primary-color);\n border-color: var(--primary-color);\n}\n\n.btn-outline-primary {\n color: var(--primary-color);\n background: none;\n border-color: var(--primary-color);\n\n &:hover {\n background-color: var(--primary-color);\n color: var(--text-color-reverse);\n }\n}\n\n.btn-secondary {\n color: #ffffff;\n background-color: var(--secondary-color);\n border-color: var(--secondary-color);\n}\n\n.navbar {\n .nav-top {\n height: 86px;\n }\n\n .fixed-menu {\n width: 220px;\n }\n\n .logo img {\n width: 200px;\n }\n}\n\na {\n text-decoration: underline;\n color: var(--link-color);\n\n &:hover {\n color: var(--link-hover-color);\n }\n\n &:active {\n color: var(--link-color);\n }\n}\n\nh1,\nh2 {\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 12px;\n padding-top: 14px;\n}\n\nh1 {\n font-weight: 600;\n}\n\nh3 {\n padding-top: 16px;\n}\n\n.motto {\n .title {\n font-weight: 600;\n font-size: 32px;\n padding-top: 36px;\n }\n\n .motto {\n font-weight: 500;\n font-size: 20px;\n }\n\n}\n\n.btn-fixed {\n border-width: 2px;\n border-style: solid;\n width: 220px;\n height: 46px;\n text-transform: uppercase;\n font-weight: 700;\n border-radius: 5px 5px 5px 5px;\n vertical-align: middle;\n line-height: 42px;\n padding: 0;\n margin: 16px;\n box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075);\n}\n\n\n.pactus-video {\n video {\n max-width: 100%;\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n display: block;\n }\n}\n\n.highlighter-rouge .highlight pre {\n background-color: #0d1117;\n padding: 32px 12px 12px 12px;\n color: #cccccc;\n position: relative;\n overflow: auto;\n direction: ltr;\n\n button {\n position: absolute;\n top: 6px;\n right: 8px;\n\n padding: 2px;\n background-color: #808080;\n color: #404040;\n border-radius: 5px;\n border: ridge 1px #808080;\n\n &:hover {\n cursor: pointer;\n background-color: #bcbabb;\n }\n }\n}\n\n.nav-tabs {\n border-color: #0d1117 !important;\n\n .nav-link {\n border-width: 0 !important;\n\n &:not(.active):hover {\n color: #ffffff !important;\n background-color: #808080 !important;\n }\n }\n\n .active {\n color: #ffffff !important;\n background-color: #0d1117 !important;\n }\n}\n\ntable {\n thead tr th {\n font-weight: 700;\n background-color: var(--bg-color) !important;\n }\n\n // tbody tr:nth-child(2n + 1) td {\n // background-color: #eee;\n // }\n}\n\nblockquote {\n background: #eee;\n border-left: 10px solid #ccc;\n padding: 16px;\n quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n\n &:before {\n color: #ccc;\n content: open-quote;\n font-size: 64px;\n line-height: 0.1em;\n vertical-align: -0.4em;\n }\n\n p {\n margin-top: 16px;\n }\n\n & p:first-child {\n display: inline;\n padding-bottom: 160px;\n margin-bottom: 160px;\n }\n}\n\n.footer {\n background-color: var(--primary-color);\n color: var(--text-color-reverse);\n\n .section {\n font-size: 1.75rem;\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 20px;\n }\n\n li {\n padding-bottom: 8px;\n }\n\n &.anchor {\n a {\n color: var(--text-color-reverse);\n }\n\n a:link {\n color: var(--text-color-reverse);\n background-color: transparent;\n text-decoration: none;\n }\n\n a:hover {\n color: var(--text-color-reverse);\n }\n }\n\n .legal {\n color: var(--text-color-reverse);\n font-size: 12px;\n }\n}\n\n.community {\n img {\n margin: 4px;\n }\n}\n\n.community_ran {\n img {\n margin: 4px;\n }\n}\n\n#btn-back-to-top {\n background-color: var(--primary-color);\n color: var(--bg-color);\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: none;\n}\n\n.edit-bar {\n padding-top: 30px;\n\n .edit-btn,\n .edit-btn>a:hover {\n color: var(--text-color);\n text-decoration: none;\n }\n}\n\n.all-posts {\n .post-link {\n padding-bottom: 8px;\n }\n}\n\n.blog-post {\n .post-date {\n padding-bottom: 10px;\n color: #808080;\n }\n\n .content {\n padding-top: 22px;\n min-height: 600px;\n }\n}\n\n.partners {\n img {\n padding-top: 24px;\n }\n}\n",".hexdump {\n font-family: monospace;\n font-size: 12px;\n padding-bottom: 1rem;\n}\n\n.hexdump .offset {\n border-right: 2px solid #708090;\n color: #778899;\n}\n.hexdump .ascii {\n color: #696969;\n}\n","@import \"vars\";\n\n.faq {\n h3 {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid var(--primary-color);\n }\n\n a {\n text-decoration: none;\n }\n\n .group {\n padding-top: 16px;\n\n .col {\n font-weight: 600;\n padding-bottom: 10px;\n }\n }\n\n .separator {\n padding-top: 12px;\n padding-bottom: 12px;\n }\n\n .read_more {\n padding-top: 12px;\n }\n}\n","@import \"vars\";\n\n.toc {\n\n .btn,\n a {\n color: var(--text-color);\n }\n\n .btn-section {\n padding: 0.25rem 0.5rem;\n font-weight: 600;\n background-color: transparent;\n }\n\n .btn-section:hover,\n .btn-section:focus {\n background-color: var(--bg-color);\n }\n\n .btn-page a {\n padding: 0.1875rem 0.5rem;\n margin-top: 0.125rem;\n margin-left: 1.25rem;\n }\n\n .btn-page a:hover,\n .btn-page a:focus,\n .btn-page .selected {\n background-color: var(--bg-color);\n }\n}\n","$line-color: #939597;\n\n/* The actual timeline (the vertical ruler) */\n.timeline {\n position: relative;\n\n /* The actual timeline (the vertical ruler) */\n &::after {\n content: \"\";\n position: absolute;\n width: 6px;\n background-color: $line-color;\n top: 0;\n bottom: 0;\n left: 50%;\n margin-left: -3px;\n }\n}\n\n/* Container around content */\n.timeline-card {\n position: relative;\n width: 50%;\n\n .card {\n border: 1px solid rgba(0, 0, 0, 0.175);\n border-radius: 5px;\n background-color: #eeeeee;\n color: #4c4c4c;\n\n a {\n color: #4c4c4c;\n }\n\n .text-muted {\n color: #898b8d !important;\n }\n }\n\n .card-title {\n padding-bottom: 12px;\n font-size: 1.1rem;\n font-weight: 500;\n }\n\n /* The circles on the timeline */\n &::after {\n line-height: 38px;\n font-size: 24px;\n position: absolute;\n text-align: center;\n width: 48px;\n height: 48px;\n right: -24px;\n top: 15px;\n border-radius: 50%;\n z-index: 1;\n }\n\n &.completed::after {\n content: \"✅\";\n background-color: #eeeeee;\n border: 5px solid #77b255;\n }\n\n &.ongoing::after {\n content: \"🚧\";\n background-color: #eeeeee;\n border: 5px solid #ffcb4b;\n }\n\n &.upcoming::after {\n content: \"⏳\";\n background-color: #eeeeee;\n border: 5px solid #478ec2;\n }\n\n /* Place the container to the left */\n &.left {\n padding: 0px 50px 20px 0px;\n left: 0;\n }\n\n /* Place the container to the right */\n &.right {\n padding: 0px 0px 20px 50px;\n left: 50%;\n }\n\n /* Add arrows to the left container (pointing right) */\n &.left::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background-color: #eeeeee;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 34px;\n z-index: 0;\n right: 33px;\n border-right: 1px solid rgba(0, 0, 0, 0.175);\n border-top: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Add arrows to the right container (pointing left) */\n &.right::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background-color: #eeeeee !important;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 33px;\n z-index: 0;\n left: 48px;\n border-left: 1px solid rgba(0, 0, 0, 0.175);\n border-bottom: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Fix the circle for containers on the right side */\n &.right::after {\n left: -24px;\n }\n}\n\n/* Media queries - Responsive timeline on screens less than 600px wide */\n@media screen and (max-width: 600px) {\n\n /* Place the timeline to the left */\n .timeline::after {\n left: 31px;\n }\n\n /* Full-width containers */\n .timeline-card {\n width: 100%;\n padding-left: 80px !important;\n padding-right: 25px !important;\n\n /* Make sure that all arrows are pointing leftwards */\n &::before {\n left: 77px !important;\n }\n\n /* Make sure all circles are at the same spot */\n &.left::after,\n &.right::after {\n left: 8px !important;\n }\n\n &.left::before {\n border-right: none;\n border-top: none;\n border-left: 1px solid rgba(0, 0, 0, 0.175);\n border-bottom: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n &.right::before {\n right: auto;\n }\n\n /* Make all right containers behave like the left ones */\n &.right {\n left: 0%;\n }\n }\n}\n","@import \"vars\";\n\n.learn {\n h2 {\n border-top: 1px solid var(--primary-color);\n }\n}\n","@include color-mode(dark) {\n blockquote {\n background: #14171c;\n }\n\n\n .toc {\n .btn-section::before {\n --svg-color: var(--text);\n }\n }\n\n .fa-linux {\n color: #ffffff;\n }\n}\n"],"file":"custom.css"}
\ No newline at end of file
diff --git a/assets/css/fontawesome.colorful.brands.css b/assets/css/fontawesome.colorful.brands.css
new file mode 100644
index 000000000..faa3408f3
--- /dev/null
+++ b/assets/css/fontawesome.colorful.brands.css
@@ -0,0 +1,144 @@
+.fa-adn { color: #4A484C; }
+.fa-amazon { color: #ff9900; }
+.fa-android { color: #a4c639; }
+.fa-angellist { color: #000; }
+.fa-apple { color: #979797; }
+.fa-behance { color: #1769ff; }
+.fa-behance-square { color: #1769ff; }
+.fa-bitbucket { color: #205081; }
+.fa-bitbucket-square { color: #205081; }
+.fa-bitcoin { color: #ee9209; }
+.fa-black-tie { color: #222; }
+.fa-btc { color: #ee9209; }
+.fa-buysellads { color: #c90100; }
+.fa-cc-amex { color: #007bc1; }
+.fa-cc-diners-club { color: #004A97; }
+.fa-cc-discover { color: #f68121; }
+.fa-cc-jcb { color: #003A8F; }
+.fa-cc-mastercard { color: #0a3a82; }
+.fa-cc-paypal { color: #253b80; }
+.fa-cc-stripe { color: #00afe1; }
+.fa-cc-visa { color: #0157a2; }
+.fa-chrome { color: #4587F3; }
+.fa-codepen { color: #000; }
+.fa-connectdevelop { color: #391448; }
+.fa-contao { color: #eb8623; }
+.fa-creative-commons { color: #231f20; }
+.fa-css3 { color: #1680C0; }
+.fa-dashcube { color: #7f7f7f; }
+.fa-delicious { color: #3399ff; }
+.fa-deviantart { color: #4e6252; }
+.fa-digg { color: #000; }
+.fa-dribbble { color: #444444; }
+.fa-dropbox { color: #007ee5; }
+.fa-drupal { color: #0077c0; }
+.fa-empire { color: #000; }
+.fa-expeditedssl { color: #343433; }
+.fa-facebook { color: #3b5998; }
+.fa-facebook-official { color: #3b5998; }
+.fa-facebook-square { color: #3b5998; }
+.fa-firefox { color: #e66000; }
+.fa-flickr { color: #ff0084; }
+.fa-fonticons { color: #1C1E29; }
+.fa-forumbee { color: #83ad13; }
+.fa-foursquare { color: #0072b1; }
+.fa-ge { color: #000; }
+.fa-get-pocket { color: #d3505a; }
+.fa-gg { color: #000; }
+.fa-gg-circle { color: #000; }
+.fa-git { color: #333; }
+.fa-git-square { color: #333; }
+.fa-github { color: #333; }
+.fa-github-alt { color: #333; }
+.fa-github-square { color: #333; }
+.fa-gittip { color: #663300; }
+.fa-google { color: #4285f4; }
+.fa-google-plus { color: #dd4b39; }
+.fa-google-plus-square { color: #dd4b39; }
+.fa-google-wallet { color: #4285f4; }
+.fa-hacker-news { color: #ff6600; }
+.fa-houzz { color: #7ac142; }
+.fa-html5 { color: #e34f26; }
+.fa-instagram { color: #3f729b; }
+.fa-internet-explorer { color: #1EBBEE; }
+.fa-ioxhost { color: #faa729; }
+.fa-joomla { color: #142849; }
+.fa-jsfiddle { color: #4679BD; }
+.fa-lastfm { color: #c3000d; }
+.fa-lastfm-square { color: #c3000d; }
+.fa-leanpub { color: #0c0c0c; }
+.fa-linkedin { color: #0976b4; }
+.fa-linkedin-square { color: #0976b4; }
+.fa-linux { color: #333333; }
+.fa-maxcdn { color: #FF6600; }
+.fa-meanpath { color: #538ed7; }
+.fa-medium { color: #000; }
+.fa-odnoklassniki { color: #ed812b; }
+.fa-odnoklassniki-square { color: #ed812b; }
+.fa-opencart { color: #2AC2EF; }
+.fa-openid { color: #F78C40; }
+.fa-opera { color: #cc0f16; }
+.fa-optin-monster { color: #83c11f; }
+.fa-pagelines { color: #000; }
+.fa-paypal { color: #253b80; }
+.fa-pied-piper { color: #2f9f46; }
+.fa-pied-piper-alt { color: #2f9f46; }
+.fa-pied-piper-square { color: #2f9f46; }
+.fa-pinterest { color: #cc2127; }
+.fa-pinterest-p { color: #cc2127; }
+.fa-pinterest-square { color: #cc2127; }
+.fa-qq { color: #000; }
+.fa-ra { color: #000; }
+.fa-rebel { color: #000; }
+.fa-reddit { color: #ff4500; }
+.fa-reddit-square { color: #ff4500; }
+.fa-renren { color: #005EAC; }
+.fa-safari { color: #1B88CA; }
+.fa-sellsy { color: #1f78b9; }
+.fa-share-alt { color: #01bf01; }
+.fa-share-alt-square { color: #01bf01; }
+.fa-shirtsinbulk { color: #dd3a26; }
+.fa-simplybuilt { color: #000; }
+.fa-skyatlas { color: #00adbb; }
+.fa-skype { color: #00aff0; }
+.fa-slack { color: #0f7965; }
+.fa-slideshare { color: #e98325; }
+.fa-soundcloud { color: #f80; }
+.fa-spotify { color: #7ab800; }
+.fa-stack-exchange { color: #000; }
+.fa-stack-overflow { color: #fe7a15; }
+.fa-steam { color: #0B0B0B; }
+.fa-steam-square { color: #0B0B0B; }
+.fa-stumbleupon { color: #eb4924; }
+.fa-stumbleupon-circle { color: #eb4924; }
+.fa-tencent-weibo { color: #74AF2C; }
+.fa-trello { color: #256a92; }
+.fa-tripadvisor { color: #589442; }
+.fa-tumblr { color: #35465c; }
+.fa-tumblr-square { color: #35465c; }
+.fa-twitch { color: #6441a5; }
+.fa-twitter { color: #55acee; }
+.fa-twitter-square { color: #55acee; }
+.fa-viacoin { color: #333; }
+.fa-vimeo { color: #1ab7ea; }
+.fa-vimeo-square { color: #1ab7ea; }
+.fa-vine { color: #00b488; }
+.fa-vk { color: #45668e; }
+.fa-wechat { color: #93d034; }
+.fa-weibo { color: #E71D34; }
+.fa-weixin { color: #93d034; }
+.fa-wikipedia-w { color: #000; }
+.fa-windows { color: #00bcf2; }
+.fa-wordpress { color: #21759b; }
+.fa-xing { color: #026466; }
+.fa-xing-square { color: #026466; }
+.fa-y-combinator { color: #F0652F; }
+.fa-yc { color: #F0652F; }
+.fa-yahoo { color: #400191; }
+.fa-yelp { color: #af0606; }
+.fa-youtube { color: #e52d27; }
+.fa-youtube-play { color: #e52d27; }
+.fa-youtube-square { color: #e52d27; }
+.fa-freebsd { color: #b5000f; }
+.fa-discord { color: #5865f2; }
+.fa-telegram { color: #4b9fd8; }
diff --git a/assets/css/fontawesome.min.css b/assets/css/fontawesome.min.css
new file mode 100644
index 000000000..5dddbd50c
--- /dev/null
+++ b/assets/css/fontawesome.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2022 Fonticons, Inc.
+ */
+.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-child-rifle:before{content:"\e4e0"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
\ No newline at end of file
diff --git a/assets/css/rouge.theme.native.css b/assets/css/rouge.theme.native.css
new file mode 100644
index 000000000..33edaec07
--- /dev/null
+++ b/assets/css/rouge.theme.native.css
@@ -0,0 +1,69 @@
+.highlight .hll { background-color: #404040 }
+.highlight .c { color: #999999; font-style: italic } /* Comment */
+.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
+.highlight .g { color: #d0d0d0 } /* Generic */
+.highlight .k { color: #6ab825; font-weight: bold } /* Keyword */
+.highlight .l { color: #d0d0d0 } /* Literal */
+.highlight .n { color: #d0d0d0 } /* Name */
+.highlight .o { color: #d0d0d0 } /* Operator */
+.highlight .x { color: #d0d0d0 } /* Other */
+.highlight .p { color: #d0d0d0 } /* Punctuation */
+.highlight .cm { color: #999999; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
+.highlight .c1 { color: #999999; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+.highlight .gd { color: #d22323 } /* Generic.Deleted */
+.highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #d22323 } /* Generic.Error */
+.highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #589819 } /* Generic.Inserted */
+.highlight .go { color: #cccccc } /* Generic.Output */
+.highlight .gp { color: #aaaaaa } /* Generic.Prompt */
+.highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
+.highlight .gt { color: #d22323 } /* Generic.Traceback */
+.highlight .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #6ab825 } /* Keyword.Pseudo */
+.highlight .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */
+.highlight .ld { color: #d0d0d0 } /* Literal.Date */
+.highlight .m { color: #3677a9 } /* Literal.Number */
+.highlight .s { color: #ed9d13 } /* Literal.String */
+.highlight .na { color: #bbbbbb } /* Name.Attribute */
+.highlight .nb { color: #24909d } /* Name.Builtin */
+.highlight .nc { color: #447fcf; text-decoration: underline } /* Name.Class */
+.highlight .no { color: #40ffff } /* Name.Constant */
+.highlight .nd { color: #ffa500 } /* Name.Decorator */
+.highlight .ni { color: #d0d0d0 } /* Name.Entity */
+.highlight .ne { color: #bbbbbb } /* Name.Exception */
+.highlight .nf { color: #447fcf } /* Name.Function */
+.highlight .nl { color: #d0d0d0 } /* Name.Label */
+.highlight .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */
+.highlight .nx { color: #d0d0d0 } /* Name.Other */
+.highlight .py { color: #d0d0d0 } /* Name.Property */
+.highlight .nt { color: #6ab825; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #40ffff } /* Name.Variable */
+.highlight .ow { color: #6ab825; font-weight: bold } /* Operator.Word */
+.highlight .w { color: #666666 } /* Text.Whitespace */
+.highlight .mf { color: #3677a9 } /* Literal.Number.Float */
+.highlight .mh { color: #3677a9 } /* Literal.Number.Hex */
+.highlight .mi { color: #3677a9 } /* Literal.Number.Integer */
+.highlight .mo { color: #3677a9 } /* Literal.Number.Oct */
+.highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
+.highlight .sc { color: #ed9d13 } /* Literal.String.Char */
+.highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
+.highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
+.highlight .se { color: #ed9d13 } /* Literal.String.Escape */
+.highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
+.highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
+.highlight .sx { color: #ffa500 } /* Literal.String.Other */
+.highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
+.highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
+.highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
+.highlight .bp { color: #24909d } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #40ffff } /* Name.Variable.Class */
+.highlight .vg { color: #40ffff } /* Name.Variable.Global */
+.highlight .vi { color: #40ffff } /* Name.Variable.Instance */
+.highlight .il { color: #3677a9 } /* Literal.Number.Integer.Long */
diff --git a/assets/css/rouge.theme.vim.css b/assets/css/rouge.theme.vim.css
new file mode 100644
index 000000000..a7328e2f0
--- /dev/null
+++ b/assets/css/rouge.theme.vim.css
@@ -0,0 +1,97 @@
+/* Solarized Dark
+
+For use with Jekyll and Pygments
+
+http://ethanschoonover.com/solarized
+
+SOLARIZED HEX ROLE
+--------- -------- ------------------------------------------
+base03 #002b36 background
+base01 #586e75 comments / secondary content
+base1 #93a1a1 body text / default code / primary content
+orange #cb4b16 constants
+red #dc322f regex, special keywords
+blue #268bd2 reserved keywords
+cyan #2aa198 strings, numbers
+green #859900 operators, other keywords
+*/
+
+.highlight .hll { background-color: #002b36 }
+.highlight { background-color: #002b36; color: #93a1a1;}
+.highlight .lineno { color: #586e75 } /* Line Numbers */
+.highlight .c { color: #586e75 } /* Comment */
+.highlight .err { color: #93a1a1 } /* Error */
+.highlight .esc { color: #93a1a1 } /* Escape */
+.highlight .g { color: #93a1a1 } /* Generic */
+.highlight .k { color: #859900 } /* Keyword */
+.highlight .l { color: #93a1a1 } /* Literal */
+.highlight .n { color: #93a1a1 } /* Name */
+.highlight .o { color: #859900 } /* Operator */
+.highlight .x { color: #cb4b16 } /* Other */
+.highlight .p { color: #93a1a1 } /* Punctuation */
+.highlight .ch { color: #586e75 } /* Comment.Hashbang */
+.highlight .cm { color: #586e75 } /* Comment.Multiline */
+.highlight .cp { color: #859900 } /* Comment.Preproc */
+.highlight .cpf { color: #859900 } /* Comment.PreprocFile */
+.highlight .c1 { color: #586e75 } /* Comment.Single */
+.highlight .cs { color: #859900 } /* Comment.Special */
+.highlight .gd { color: #2aa198 } /* Generic.Deleted */
+.highlight .ge { color: #93a1a1; font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #dc322f } /* Generic.Error */
+.highlight .gh { color: #cb4b16 } /* Generic.Heading */
+.highlight .gi { color: #859900 } /* Generic.Inserted */
+.highlight .go { color: #93a1a1 } /* Generic.Output */
+.highlight .gp { color: #93a1a1 } /* Generic.Prompt */
+.highlight .gs { color: #93a1a1; font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #cb4b16 } /* Generic.Subheading */
+.highlight .gt { color: #93a1a1 } /* Generic.Traceback */
+.highlight .kc { color: #cb4b16 } /* Keyword.Constant */
+.highlight .kd { color: #268bd2 } /* Keyword.Declaration */
+.highlight .kn { color: #859900 } /* Keyword.Namespace */
+.highlight .kp { color: #859900 } /* Keyword.Pseudo */
+.highlight .kr { color: #268bd2 } /* Keyword.Reserved */
+.highlight .kt { color: #dc322f } /* Keyword.Type */
+.highlight .ld { color: #93a1a1 } /* Literal.Date */
+.highlight .m { color: #2aa198 } /* Literal.Number */
+.highlight .s { color: #2aa198 } /* Literal.String */
+.highlight .na { color: #93a1a1 } /* Name.Attribute */
+.highlight .nb { color: #B58900 } /* Name.Builtin */
+.highlight .nc { color: #268bd2 } /* Name.Class */
+.highlight .no { color: #cb4b16 } /* Name.Constant */
+.highlight .nd { color: #268bd2 } /* Name.Decorator */
+.highlight .ni { color: #cb4b16 } /* Name.Entity */
+.highlight .ne { color: #cb4b16 } /* Name.Exception */
+.highlight .nf { color: #268bd2 } /* Name.Function */
+.highlight .nl { color: #93a1a1 } /* Name.Label */
+.highlight .nn { color: #93a1a1 } /* Name.Namespace */
+.highlight .nx { color: #93a1a1 } /* Name.Other */
+.highlight .py { color: #93a1a1 } /* Name.Property */
+.highlight .nt { color: #268bd2 } /* Name.Tag */
+.highlight .nv { color: #268bd2 } /* Name.Variable */
+.highlight .ow { color: #859900 } /* Operator.Word */
+.highlight .w { color: #93a1a1 } /* Text.Whitespace */
+.highlight .mb { color: #2aa198 } /* Literal.Number.Bin */
+.highlight .mf { color: #2aa198 } /* Literal.Number.Float */
+.highlight .mh { color: #2aa198 } /* Literal.Number.Hex */
+.highlight .mi { color: #2aa198 } /* Literal.Number.Integer */
+.highlight .mo { color: #2aa198 } /* Literal.Number.Oct */
+.highlight .sa { color: #586e75 } /* Literal.String.Affix */
+.highlight .sb { color: #586e75 } /* Literal.String.Backtick */
+.highlight .sc { color: #2aa198 } /* Literal.String.Char */
+.highlight .dl { color: #2aa198 } /* Literal.String.Delimiter */
+.highlight .sd { color: #93a1a1 } /* Literal.String.Doc */
+.highlight .s2 { color: #2aa198 } /* Literal.String.Double */
+.highlight .se { color: #cb4b16 } /* Literal.String.Escape */
+.highlight .sh { color: #93a1a1 } /* Literal.String.Heredoc */
+.highlight .si { color: #2aa198 } /* Literal.String.Interpol */
+.highlight .sx { color: #2aa198 } /* Literal.String.Other */
+.highlight .sr { color: #dc322f } /* Literal.String.Regex */
+.highlight .s1 { color: #2aa198 } /* Literal.String.Single */
+.highlight .ss { color: #2aa198 } /* Literal.String.Symbol */
+.highlight .bp { color: #268bd2 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #268bd2 } /* Name.Function.Magic */
+.highlight .vc { color: #268bd2 } /* Name.Variable.Class */
+.highlight .vg { color: #268bd2 } /* Name.Variable.Global */
+.highlight .vi { color: #268bd2 } /* Name.Variable.Instance */
+.highlight .vm { color: #268bd2 } /* Name.Variable.Magic */
+.highlight .il { color: #2aa198 } /* Literal.Number.Integer.Long */
diff --git a/assets/images/become-validator-1.png b/assets/images/become-validator-1.png
new file mode 100644
index 000000000..994f60537
Binary files /dev/null and b/assets/images/become-validator-1.png differ
diff --git a/assets/images/become-validator.png b/assets/images/become-validator.png
new file mode 100644
index 000000000..4b68659dd
Binary files /dev/null and b/assets/images/become-validator.png differ
diff --git a/assets/images/bitcoin-coin-distribution.png b/assets/images/bitcoin-coin-distribution.png
new file mode 100644
index 000000000..e6514563b
Binary files /dev/null and b/assets/images/bitcoin-coin-distribution.png differ
diff --git a/assets/images/bitcoin-reward.png b/assets/images/bitcoin-reward.png
new file mode 100644
index 000000000..05783bebc
Binary files /dev/null and b/assets/images/bitcoin-reward.png differ
diff --git a/assets/images/delegated-proof-of-stake.png b/assets/images/delegated-proof-of-stake.png
new file mode 100644
index 000000000..5db9800cd
Binary files /dev/null and b/assets/images/delegated-proof-of-stake.png differ
diff --git a/assets/images/feed.svg b/assets/images/feed.svg
new file mode 100644
index 000000000..dfae7ebfd
--- /dev/null
+++ b/assets/images/feed.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/images/get-coins-1.png b/assets/images/get-coins-1.png
new file mode 100644
index 000000000..9ac528961
Binary files /dev/null and b/assets/images/get-coins-1.png differ
diff --git a/assets/images/get-coins.png b/assets/images/get-coins.png
new file mode 100644
index 000000000..2ed319c15
Binary files /dev/null and b/assets/images/get-coins.png differ
diff --git a/assets/images/increase-stake-1.png b/assets/images/increase-stake-1.png
new file mode 100644
index 000000000..589477577
Binary files /dev/null and b/assets/images/increase-stake-1.png differ
diff --git a/assets/images/increase-stake.png b/assets/images/increase-stake.png
new file mode 100644
index 000000000..acc810428
Binary files /dev/null and b/assets/images/increase-stake.png differ
diff --git a/assets/images/logos/circle-128.png b/assets/images/logos/circle-128.png
new file mode 100644
index 000000000..f12927c2a
Binary files /dev/null and b/assets/images/logos/circle-128.png differ
diff --git a/assets/images/logos/circle-260.png b/assets/images/logos/circle-260.png
new file mode 100644
index 000000000..0c63ad9c5
Binary files /dev/null and b/assets/images/logos/circle-260.png differ
diff --git a/assets/images/logos/circle-32.png b/assets/images/logos/circle-32.png
new file mode 100644
index 000000000..47c44c390
Binary files /dev/null and b/assets/images/logos/circle-32.png differ
diff --git a/assets/images/logos/circle-64.png b/assets/images/logos/circle-64.png
new file mode 100644
index 000000000..70545a0a3
Binary files /dev/null and b/assets/images/logos/circle-64.png differ
diff --git a/assets/images/logos/pactus-logo-dark.png b/assets/images/logos/pactus-logo-dark.png
new file mode 100644
index 000000000..f5d4e1456
Binary files /dev/null and b/assets/images/logos/pactus-logo-dark.png differ
diff --git a/assets/images/logos/pactus-logo-light.png b/assets/images/logos/pactus-logo-light.png
new file mode 100644
index 000000000..916fba308
Binary files /dev/null and b/assets/images/logos/pactus-logo-light.png differ
diff --git a/assets/images/logos/square-32.png b/assets/images/logos/square-32.png
new file mode 100644
index 000000000..37a948be0
Binary files /dev/null and b/assets/images/logos/square-32.png differ
diff --git a/assets/images/logos/square-64.png b/assets/images/logos/square-64.png
new file mode 100644
index 000000000..4d4abda96
Binary files /dev/null and b/assets/images/logos/square-64.png differ
diff --git a/assets/images/logos/text-logo-big.png b/assets/images/logos/text-logo-big.png
new file mode 100644
index 000000000..f227ded09
Binary files /dev/null and b/assets/images/logos/text-logo-big.png differ
diff --git a/assets/images/logos/text-logo.png b/assets/images/logos/text-logo.png
new file mode 100644
index 000000000..6b300f4f8
Binary files /dev/null and b/assets/images/logos/text-logo.png differ
diff --git a/assets/images/long-range-attack.png b/assets/images/long-range-attack.png
new file mode 100644
index 000000000..862e778ad
Binary files /dev/null and b/assets/images/long-range-attack.png differ
diff --git a/assets/images/pactus-address.png b/assets/images/pactus-address.png
new file mode 100644
index 000000000..58fbd3a80
Binary files /dev/null and b/assets/images/pactus-address.png differ
diff --git a/assets/images/pactus-blockchain.png b/assets/images/pactus-blockchain.png
new file mode 100644
index 000000000..820b9f7e6
Binary files /dev/null and b/assets/images/pactus-blockchain.png differ
diff --git a/assets/images/pactus-cli.png b/assets/images/pactus-cli.png
new file mode 100644
index 000000000..e4373fdba
Binary files /dev/null and b/assets/images/pactus-cli.png differ
diff --git a/assets/images/pactus-coin-allocation.png b/assets/images/pactus-coin-allocation.png
new file mode 100644
index 000000000..92190eaf8
Binary files /dev/null and b/assets/images/pactus-coin-allocation.png differ
diff --git a/assets/images/pactus-coin-distribution.png b/assets/images/pactus-coin-distribution.png
new file mode 100644
index 000000000..6da71eb77
Binary files /dev/null and b/assets/images/pactus-coin-distribution.png differ
diff --git a/assets/images/pactus-committee-adding-validators.png b/assets/images/pactus-committee-adding-validators.png
new file mode 100644
index 000000000..affad855c
Binary files /dev/null and b/assets/images/pactus-committee-adding-validators.png differ
diff --git a/assets/images/pactus-committee-proposer-selection.png b/assets/images/pactus-committee-proposer-selection.png
new file mode 100644
index 000000000..0140a15c8
Binary files /dev/null and b/assets/images/pactus-committee-proposer-selection.png differ
diff --git a/assets/images/pactus-consensus-normal-execution.png b/assets/images/pactus-consensus-normal-execution.png
new file mode 100644
index 000000000..5c1a62608
Binary files /dev/null and b/assets/images/pactus-consensus-normal-execution.png differ
diff --git a/assets/images/pactus-consensus-states.png b/assets/images/pactus-consensus-states.png
new file mode 100644
index 000000000..02600f378
Binary files /dev/null and b/assets/images/pactus-consensus-states.png differ
diff --git a/assets/images/pactus-gui-main-window.png b/assets/images/pactus-gui-main-window.png
new file mode 100644
index 000000000..1fe39875a
Binary files /dev/null and b/assets/images/pactus-gui-main-window.png differ
diff --git a/assets/images/pactus-real-pos.png b/assets/images/pactus-real-pos.png
new file mode 100644
index 000000000..66a537772
Binary files /dev/null and b/assets/images/pactus-real-pos.png differ
diff --git a/assets/images/pactus-reward.png b/assets/images/pactus-reward.png
new file mode 100644
index 000000000..74e8026c1
Binary files /dev/null and b/assets/images/pactus-reward.png differ
diff --git a/assets/images/pactus-stamped-transaction.png b/assets/images/pactus-stamped-transaction.png
new file mode 100644
index 000000000..6cfae2a57
Binary files /dev/null and b/assets/images/pactus-stamped-transaction.png differ
diff --git a/assets/images/pactus-state-hash.png b/assets/images/pactus-state-hash.png
new file mode 100644
index 000000000..bf0391321
Binary files /dev/null and b/assets/images/pactus-state-hash.png differ
diff --git a/assets/images/pactus-state-root-account-tree.png b/assets/images/pactus-state-root-account-tree.png
new file mode 100644
index 000000000..b592102aa
Binary files /dev/null and b/assets/images/pactus-state-root-account-tree.png differ
diff --git a/assets/images/pactus-storage-file-structure.png b/assets/images/pactus-storage-file-structure.png
new file mode 100644
index 000000000..f07300118
Binary files /dev/null and b/assets/images/pactus-storage-file-structure.png differ
diff --git a/assets/images/pactus-storage-merkle-tree.png b/assets/images/pactus-storage-merkle-tree.png
new file mode 100644
index 000000000..d8b11ea91
Binary files /dev/null and b/assets/images/pactus-storage-merkle-tree.png differ
diff --git a/assets/images/pactus-storage-stack.png b/assets/images/pactus-storage-stack.png
new file mode 100644
index 000000000..869e9d4aa
Binary files /dev/null and b/assets/images/pactus-storage-stack.png differ
diff --git a/assets/images/pactus-validator-pool.png b/assets/images/pactus-validator-pool.png
new file mode 100644
index 000000000..6714ab935
Binary files /dev/null and b/assets/images/pactus-validator-pool.png differ
diff --git a/assets/images/partners/ipminter.png b/assets/images/partners/ipminter.png
new file mode 100644
index 000000000..314ffe892
Binary files /dev/null and b/assets/images/partners/ipminter.png differ
diff --git a/assets/images/partners/partners_logo_template.psd b/assets/images/partners/partners_logo_template.psd
new file mode 100644
index 000000000..798d349ca
Binary files /dev/null and b/assets/images/partners/partners_logo_template.psd differ
diff --git a/assets/images/partners/sensifia.png b/assets/images/partners/sensifia.png
new file mode 100644
index 000000000..836042046
Binary files /dev/null and b/assets/images/partners/sensifia.png differ
diff --git a/assets/images/preventing-long-range-attack.png b/assets/images/preventing-long-range-attack.png
new file mode 100644
index 000000000..4d081e26c
Binary files /dev/null and b/assets/images/preventing-long-range-attack.png differ
diff --git a/assets/images/run-node-1.png b/assets/images/run-node-1.png
new file mode 100644
index 000000000..6c50e3cbc
Binary files /dev/null and b/assets/images/run-node-1.png differ
diff --git a/assets/images/run-node.png b/assets/images/run-node.png
new file mode 100644
index 000000000..9427f642a
Binary files /dev/null and b/assets/images/run-node.png differ
diff --git a/assets/images/social-bitcoin-talk.svg b/assets/images/social-bitcoin-talk.svg
new file mode 100644
index 000000000..fb6600d15
--- /dev/null
+++ b/assets/images/social-bitcoin-talk.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/assets/images/social-discord.svg b/assets/images/social-discord.svg
new file mode 100644
index 000000000..3efe1ec11
--- /dev/null
+++ b/assets/images/social-discord.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/social-facebook.svg b/assets/images/social-facebook.svg
new file mode 100644
index 000000000..e2e1def51
--- /dev/null
+++ b/assets/images/social-facebook.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/social-github.svg b/assets/images/social-github.svg
new file mode 100644
index 000000000..538ec5bf2
--- /dev/null
+++ b/assets/images/social-github.svg
@@ -0,0 +1 @@
+GitHub
\ No newline at end of file
diff --git a/assets/images/social-instagram.svg b/assets/images/social-instagram.svg
new file mode 100644
index 000000000..7261b7dac
--- /dev/null
+++ b/assets/images/social-instagram.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/social-linkedin.svg b/assets/images/social-linkedin.svg
new file mode 100644
index 000000000..14c80da10
--- /dev/null
+++ b/assets/images/social-linkedin.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/assets/images/social-reddit.svg b/assets/images/social-reddit.svg
new file mode 100644
index 000000000..7054f96b3
--- /dev/null
+++ b/assets/images/social-reddit.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/assets/images/social-telegram.svg b/assets/images/social-telegram.svg
new file mode 100644
index 000000000..080818fa9
--- /dev/null
+++ b/assets/images/social-telegram.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/social-twitter.svg b/assets/images/social-twitter.svg
new file mode 100644
index 000000000..ddd89cee0
--- /dev/null
+++ b/assets/images/social-twitter.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/social-wechat.svg b/assets/images/social-wechat.svg
new file mode 100644
index 000000000..199d129f0
--- /dev/null
+++ b/assets/images/social-wechat.svg
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Untitled-2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Untitled-2
+
+
+
+
diff --git a/assets/images/validators/adora.png b/assets/images/validators/adora.png
new file mode 100644
index 000000000..8e9c95bb2
Binary files /dev/null and b/assets/images/validators/adora.png differ
diff --git a/assets/images/validators/blocksync.png b/assets/images/validators/blocksync.png
new file mode 100644
index 000000000..9e72e726c
Binary files /dev/null and b/assets/images/validators/blocksync.png differ
diff --git a/assets/images/validators/catsmile.png b/assets/images/validators/catsmile.png
new file mode 100644
index 000000000..e66e150c8
Binary files /dev/null and b/assets/images/validators/catsmile.png differ
diff --git a/assets/images/validators/codeblocklabs.png b/assets/images/validators/codeblocklabs.png
new file mode 100644
index 000000000..1b4ba71c5
Binary files /dev/null and b/assets/images/validators/codeblocklabs.png differ
diff --git a/assets/images/validators/corenode.png b/assets/images/validators/corenode.png
new file mode 100644
index 000000000..70d4d7cc4
Binary files /dev/null and b/assets/images/validators/corenode.png differ
diff --git a/assets/images/validators/dnsarz.png b/assets/images/validators/dnsarz.png
new file mode 100644
index 000000000..cee47f27e
Binary files /dev/null and b/assets/images/validators/dnsarz.png differ
diff --git a/assets/images/validators/genznodes.png b/assets/images/validators/genznodes.png
new file mode 100644
index 000000000..d36cbea60
Binary files /dev/null and b/assets/images/validators/genznodes.png differ
diff --git a/assets/images/validators/ionode.png b/assets/images/validators/ionode.png
new file mode 100644
index 000000000..c7bc42249
Binary files /dev/null and b/assets/images/validators/ionode.png differ
diff --git a/assets/images/validators/kenz.png b/assets/images/validators/kenz.png
new file mode 100644
index 000000000..1ebc316c3
Binary files /dev/null and b/assets/images/validators/kenz.png differ
diff --git a/assets/images/validators/node39.png b/assets/images/validators/node39.png
new file mode 100644
index 000000000..a3d817f52
Binary files /dev/null and b/assets/images/validators/node39.png differ
diff --git a/assets/images/validators/nodeops.png b/assets/images/validators/nodeops.png
new file mode 100644
index 000000000..ff42efedb
Binary files /dev/null and b/assets/images/validators/nodeops.png differ
diff --git a/assets/images/validators/nodesync.png b/assets/images/validators/nodesync.png
new file mode 100644
index 000000000..6a220fe11
Binary files /dev/null and b/assets/images/validators/nodesync.png differ
diff --git a/assets/images/validators/oshvank.png b/assets/images/validators/oshvank.png
new file mode 100644
index 000000000..a5905c6af
Binary files /dev/null and b/assets/images/validators/oshvank.png differ
diff --git a/assets/images/validators/p10node.png b/assets/images/validators/p10node.png
new file mode 100644
index 000000000..1300f31b7
Binary files /dev/null and b/assets/images/validators/p10node.png differ
diff --git a/assets/images/validators/sgtstake.png b/assets/images/validators/sgtstake.png
new file mode 100644
index 000000000..9ddf2f8d1
Binary files /dev/null and b/assets/images/validators/sgtstake.png differ
diff --git a/assets/images/validators/str.png b/assets/images/validators/str.png
new file mode 100644
index 000000000..36978c47a
Binary files /dev/null and b/assets/images/validators/str.png differ
diff --git a/assets/images/validators/testnetnodes.png b/assets/images/validators/testnetnodes.png
new file mode 100644
index 000000000..912b12154
Binary files /dev/null and b/assets/images/validators/testnetnodes.png differ
diff --git a/assets/images/validators/tpes.png b/assets/images/validators/tpes.png
new file mode 100644
index 000000000..a84ace100
Binary files /dev/null and b/assets/images/validators/tpes.png differ
diff --git a/assets/images/validators/validator-wiki.png b/assets/images/validators/validator-wiki.png
new file mode 100644
index 000000000..acb804f05
Binary files /dev/null and b/assets/images/validators/validator-wiki.png differ
diff --git a/assets/images/validators/validator247.png b/assets/images/validators/validator247.png
new file mode 100644
index 000000000..7228261e2
Binary files /dev/null and b/assets/images/validators/validator247.png differ
diff --git a/assets/images/validators/validators_logo_template.psd b/assets/images/validators/validators_logo_template.psd
new file mode 100644
index 000000000..2c0c49306
Binary files /dev/null and b/assets/images/validators/validators_logo_template.psd differ
diff --git a/assets/images/validators/validatorvn.png b/assets/images/validators/validatorvn.png
new file mode 100644
index 000000000..2e7087410
Binary files /dev/null and b/assets/images/validators/validatorvn.png differ
diff --git a/assets/images/validators/vnbnode.png b/assets/images/validators/vnbnode.png
new file mode 100644
index 000000000..f48020eff
Binary files /dev/null and b/assets/images/validators/vnbnode.png differ
diff --git a/assets/images/validators/ykpbb.png b/assets/images/validators/ykpbb.png
new file mode 100644
index 000000000..9019e8f40
Binary files /dev/null and b/assets/images/validators/ykpbb.png differ
diff --git a/assets/images/validators/you-logo-here.png b/assets/images/validators/you-logo-here.png
new file mode 100644
index 000000000..5193c02ba
Binary files /dev/null and b/assets/images/validators/you-logo-here.png differ
diff --git a/assets/images/welcome-video-placeholder.png b/assets/images/welcome-video-placeholder.png
new file mode 100644
index 000000000..31bfe49fc
Binary files /dev/null and b/assets/images/welcome-video-placeholder.png differ
diff --git a/assets/images/what-is-pactus.png b/assets/images/what-is-pactus.png
new file mode 100644
index 000000000..af9b12d72
Binary files /dev/null and b/assets/images/what-is-pactus.png differ
diff --git a/assets/js/anchor.min.js b/assets/js/anchor.min.js
new file mode 100644
index 000000000..00f80c058
--- /dev/null
+++ b/assets/js/anchor.min.js
@@ -0,0 +1,9 @@
+// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat
+//
+// AnchorJS - v5.0.0 - 2023-01-18
+// https://www.bryanbraun.com/anchorjs/
+// Copyright (c) 2023 Bryan Braun; Licensed MIT
+//
+// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat
+!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(globalThis,function(){"use strict";return function(A){function u(A){A.icon=Object.prototype.hasOwnProperty.call(A,"icon")?A.icon:"",A.visible=Object.prototype.hasOwnProperty.call(A,"visible")?A.visible:"hover",A.placement=Object.prototype.hasOwnProperty.call(A,"placement")?A.placement:"right",A.ariaLabel=Object.prototype.hasOwnProperty.call(A,"ariaLabel")?A.ariaLabel:"Anchor",A.class=Object.prototype.hasOwnProperty.call(A,"class")?A.class:"",A.base=Object.prototype.hasOwnProperty.call(A,"base")?A.base:"",A.truncate=Object.prototype.hasOwnProperty.call(A,"truncate")?Math.floor(A.truncate):64,A.titleText=Object.prototype.hasOwnProperty.call(A,"titleText")?A.titleText:""}function d(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new TypeError("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}this.options=A||{},this.elements=[],u(this.options),this.add=function(A){var e,t,o,i,n,s,a,r,l,c,h,p=[];if(u(this.options),0!==(e=d(A=A||"h2, h3, h4, h5, h6")).length){for(null===document.head.querySelector("style.anchorjs")&&((A=document.createElement("style")).className="anchorjs",A.appendChild(document.createTextNode("")),void 0===(h=document.head.querySelector('[rel="stylesheet"],style'))?document.head.appendChild(A):document.head.insertBefore(A,h),A.sheet.insertRule(".anchorjs-link{opacity:0;text-decoration:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}",A.sheet.cssRules.length),A.sheet.insertRule(":hover>.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}});
+// @license-end
diff --git a/assets/js/bootstrap.bundle.min.js b/assets/js/bootstrap.bundle.min.js
new file mode 100644
index 000000000..b1999d9a9
--- /dev/null
+++ b/assets/js/bootstrap.bundle.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v5.3.2 (https://getbootstrap.com/)
+ * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?n(i.trim()):null}return e},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=".dropdown-toggle",zs=`:not(${Bs})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ks extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return z.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(Bs,Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:z.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Ks.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(Vs))Ks.getOrCreateInstance(t)})),m(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Ys=`mouseout${Qs}`,Us=`focusin${Qs}`,Gs=`focusout${Qs}`,Js=`hide${Qs}`,Zs=`hidden${Qs}`,to=`show${Qs}`,eo=`shown${Qs}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){N.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),d(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),N.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),N.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Xs,(t=>this._onInteraction(t,!0))),N.on(this._element,Ys,(t=>this._onInteraction(t,!1))),N.on(this._element,Us,(t=>this._onInteraction(t,!0))),N.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ao),m(ao),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Ks,Toast:ao,Tooltip:cs}}));
+//# sourceMappingURL=bootstrap.bundle.min.js.map
\ No newline at end of file
diff --git a/assets/js/color-modes.js b/assets/js/color-modes.js
new file mode 100644
index 000000000..1752cd869
--- /dev/null
+++ b/assets/js/color-modes.js
@@ -0,0 +1,85 @@
+/*!
+ * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
+ * Copyright 2011-2023 The Bootstrap Authors
+ * Licensed under the Creative Commons Attribution 3.0 Unported License.
+ */
+
+(() => {
+ 'use strict'
+
+ const getStoredTheme = () => localStorage.getItem('theme')
+ const setStoredTheme = theme => localStorage.setItem('theme', theme)
+
+ const getPreferredTheme = () => {
+ const storedTheme = getStoredTheme()
+ if (storedTheme) {
+ return storedTheme
+ }
+
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
+ }
+
+ const setTheme = theme => {
+ if (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ document.documentElement.setAttribute('data-bs-theme', 'dark')
+ } else {
+ document.documentElement.setAttribute('data-bs-theme', theme)
+ }
+ }
+
+ const updateLogo = theme => {
+ const logoImage = document.getElementById("logo_image")
+ if (theme === 'dark') {
+ logoImage.src = '/assets/images/logos/pactus-logo-dark.png'
+ } else {
+ logoImage.src = '/assets/images/logos/pactus-logo-light.png'
+ }
+ }
+
+ setTheme(getPreferredTheme())
+
+ const showActiveTheme = (theme, focus = false) => {
+ const themeSwitcher = document.querySelector('#bd-theme')
+
+ if (!themeSwitcher) {
+ return
+ }
+
+ const themeSwitcherText = document.querySelector('#bd-theme-icon')
+ const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`)
+ const activeFAClasses = btnToActive.querySelector('i').classList.value
+
+ document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
+ element.setAttribute('aria-pressed', 'false')
+ })
+
+ btnToActive.setAttribute('aria-pressed', 'true')
+ themeSwitcherText.classList.value = activeFAClasses
+
+ if (focus) {
+ themeSwitcher.focus()
+ }
+ }
+
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
+ const storedTheme = getStoredTheme()
+ if (storedTheme !== 'light' && storedTheme !== 'dark') {
+ setTheme(getPreferredTheme())
+ }
+ })
+
+ window.addEventListener('DOMContentLoaded', () => {
+ showActiveTheme(getPreferredTheme())
+
+ document.querySelectorAll('[data-bs-theme-value]')
+ .forEach(toggle => {
+ toggle.addEventListener('click', () => {
+ const theme = toggle.getAttribute('data-bs-theme-value')
+ setStoredTheme(theme)
+ setTheme(theme)
+ updateLogo(theme)
+ showActiveTheme(theme, true)
+ })
+ })
+ })
+})()
diff --git a/assets/js/custom.js b/assets/js/custom.js
new file mode 100644
index 000000000..5982ceab2
--- /dev/null
+++ b/assets/js/custom.js
@@ -0,0 +1,108 @@
+function hexdump(hex, where) {
+ var buffer = hexToBytes(hex)
+ var rows = Math.ceil(buffer.length / 16);
+ var last = buffer.length % 16 || 16;
+ var offsetLength = buffer.length.toString(16).length;
+ if (offsetLength < 6) offsetLength = 6;
+
+ var span = '';
+ var i = 0;
+ var b = 0;
+ var lastBytes;
+ var lastSpaces;
+ var v;
+
+ for (i = 0; i < rows; i++) {
+ span += '' + zero(b, offsetLength) + ' ';
+ lastBytes = i === rows - 1 ? last : 16;
+ lastSpaces = 16 - lastBytes;
+
+ var j;
+ for (j = 0; j < lastBytes; j++) {
+ if (b % 8 == 0) {
+ span += ' ';
+ }
+ span += ' ' + zero(buffer[b], 2);
+ b++;
+ }
+
+ for (j = 0; j < lastSpaces; j++) {
+ span += ' ';
+ }
+ if (lastBytes <= 8) {
+ span += ' ';
+ }
+
+ b -= lastBytes;
+ span += ' ';
+ span += '';
+
+ for (j = 0; j < lastBytes; j++) {
+ v = buffer[b];
+ if (v == 60) {
+ span += '<';
+ } else {
+ span += ((v > 31 && v < 127) || v > 159) ? String.fromCharCode(v) : '.';
+ }
+ b++;
+ }
+
+ span += ' ';
+ }
+
+ document.getElementById(where).innerHTML = span;
+}
+
+function zero(n, max) {
+ n = n.toString(16).toUpperCase();
+ while (n.length < max) {
+ n = '0' + n;
+ }
+ return n;
+}
+
+function hexToBytes(hex) {
+ for (var bytes = [], c = 0; c < hex.length; c += 2)
+ bytes.push(parseInt(hex.substr(c, 2), 16));
+ return bytes;
+}
+
+$( document ).ready(function() {
+ const copyButtonLabel = " Copy";
+
+ // you can use a class selector instead if you, or the syntax highlighting library adds one to the 'pre'.
+ let blocks = document.querySelectorAll("pre");
+
+ blocks.forEach((block) => {
+ // only add button if browser supports Clipboard API
+ if (navigator.clipboard) {
+ let button = document.createElement("button");
+ button.innerHTML = copyButtonLabel;
+ button.addEventListener("click", copyCode);
+ block.appendChild(button);
+ }
+ });
+
+ async function copyCode(event) {
+ const button = event.srcElement;
+ const pre = button.parentElement;
+ let code = pre.querySelector("code");
+ let text = code.innerText;
+ await navigator.clipboard.writeText(text);
+
+ button.innerHTML = "Copied!";
+
+ setTimeout(() => {
+ button.innerHTML = copyButtonLabel;
+ }, 1000)
+ }
+})
+
+// Jekyll kramdown HACK:
+//
+// Adding table class to all tables
+// making images responsive
+$( document ).ready(function() {
+ $('table').addClass('table');
+ $('img').addClass('img-fluid');
+})
diff --git a/assets/js/jquery-3.6.1.min.js b/assets/js/jquery-3.6.1.min.js
new file mode 100644
index 000000000..2c69bc908
--- /dev/null
+++ b/assets/js/jquery-3.6.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.6.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML=" ";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=" ",v.option=!!ce.lastChild;var ge={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 00:00:02.262
+What is Pactus Blockchain?
+
+2
+00:00:02.347 --> 00:00:07.415
+Pactus is powered by a real Proof of stake consensus mechanism.
+
+3
+00:00:07.955 --> 00:00:11.444
+Pactus has an unlimited pool of validators that
+
+4
+00:00:11.444 --> 00:00:16.417
+anyone can become a validator by staking some coins.
+
+5
+00:00:16.417 --> 00:00:21.875
+On the other hand, there is a committee of validators that generates new blocks.
+
+6
+00:00:22.071 --> 00:00:25.784
+The size of the committee is fixed to 21 validators.
+
+7
+00:00:25.860 --> 00:00:31.632
+However the committee members are not fixed and they can change randomly.
+
+8
+00:00:31.710 --> 00:00:34.591
+But how does this change happen?
+
+9
+00:00:34.814 --> 00:00:38.269
+Pactus has a cryptographic sortition algorithm that
+
+10
+00:00:38.269 --> 00:00:41.502
+changes the committee members.
+
+11
+00:00:41.502 --> 00:00:42.715
+In each block,
+
+12
+00:00:42.715 --> 00:00:47.143
+each validator generates one and only one random number
+
+13
+00:00:47.143 --> 00:00:51.190
+between zero and the total stake.
+
+14
+00:00:52.144 --> 00:00:56.742
+If the generated number is less than the validators' stake,
+
+15
+00:00:56.742 --> 00:01:01.820
+the validator will be nominated to be inside the committee for the next block
+
+16
+00:01:01.821 --> 00:01:04.962
+and the last validator in the committee will leave the committee.
+
+17
+00:01:04.962 --> 00:01:06.057
+For example,
+
+18
+00:01:06.057 --> 00:01:08.003
+consider the situation that
+
+19
+00:01:08.003 --> 00:01:10.599
+100 coins have been staked so far,
+
+20
+00:01:10.599 --> 00:01:18.915
+Alice has staked 30 coins, Bob 20 coins, Carol 25 coins and so on and so on.
+
+21
+00:01:18.915 --> 00:01:23.434
+Validators start generating random numbers between zero and 100.
+
+22
+00:01:23.434 --> 00:01:27.692
+Remember that the total stake is 100.
+
+23
+00:01:27.773 --> 00:01:34.551
+Carol can generate a random number less than her stake which is 15.
+
+24
+00:01:34.731 --> 00:01:40.404
+Therefore she can enter the committee on the next block.
+
+25
+00:01:40.466 --> 00:01:45.866
+As you can see the chance of entering the committee depends on the amount of stake.
+
+26
+00:01:45.866 --> 00:01:50.807
+If you have more stakes, therefore you have more chances to enter the committee.
+
+27
+00:01:50.808 --> 00:01:54.000
+This sortition algorithm repeats per block.
+
+28
+00:01:54.001 --> 00:01:58.694
+When a validator joins the committee, it has a chance to propose a block
+
+29
+00:01:58.694 --> 00:02:02.481
+and if the block is accepted by other committee members,
+
+30
+00:02:02.482 --> 00:02:06.865
+the proposer will receive one coin as block reward.
+
+31
+00:02:06.865 --> 00:02:10.639
+Transactions in Pactus Blockchain are stamped.
+
+32
+00:02:10.639 --> 00:02:15.443
+Stamping transaction simply means putting something from the previous block
+
+33
+00:02:15.443 --> 00:02:16.550
+(like block ID)
+
+34
+00:02:16.550 --> 00:02:18.949
+into the header of the transaction.
+
+35
+00:02:18.949 --> 00:02:22.165
+Stamping the transactions has some benefits, like:
+
+36
+00:02:22.165 --> 00:02:25.742
+the stamped transactions are loyal to the main chain
+
+37
+00:02:25.742 --> 00:02:29.168
+and therefore the blockchain becomes immune against attacks
+
+38
+00:02:29.168 --> 00:02:33.984
+like Long-Range attack which is very deadly for Proof of Stake blockchains.
+
+39
+00:02:33.984 --> 00:02:37.770
+Also stamped transactions have a lifetime
+
+40
+00:02:37.770 --> 00:02:41.260
+and they are valid only for one day.
+
+41
+00:02:42.588 --> 00:02:46.840
+The economic model in Pactus is almost similar to Bitcoin.
+
+42
+00:02:46.840 --> 00:02:51.297
+The total supply in the Pactus Blockchain is 21 million coins
+
+43
+00:02:51.297 --> 00:02:56.294
+and therefore Pactus is a deflationary cryptocurrency (like Bitcoin).
+
+44
+00:02:56.294 --> 00:03:00.000
+So the value of the coins should increase by time,
+
+45
+00:03:00.000 --> 00:03:02.166
+since the number of coins is limited.
+
+46
+00:03:02.166 --> 00:03:03.559
+In order to achieve that,
+
+47
+00:03:03.559 --> 00:03:09.134
+there is a special account in the genesis block which is called “Treasury account”.
+
+48
+00:03:09.134 --> 00:03:13.538
+The Treasury account has 21 million coins at the genesis time,
+
+49
+00:03:13.538 --> 00:03:16.605
+and no one has access to the treasury account.
+
+50
+00:03:16.605 --> 00:03:17.802
+In each block,
+
+51
+00:03:17.802 --> 00:03:24.256
+one coin from the treasury account will move to the block proposer as block reward.
+
+52
+00:03:24.818 --> 00:03:29.388
+Unlike bitcoin which has a halving mechanism for block reward,
+
+53
+00:03:29.388 --> 00:03:34.490
+block reward in Pactus is fixed and it is always one coin per block.
+
+54
+00:03:34.490 --> 00:03:41.802
+After 21 million blocks or almost 6 and half years the rewards will be finished.
+
+55
+00:03:41.802 --> 00:03:48.475
+However the validators can be incentivized by the transaction fees at that time.
+
+56
+00:03:49.381 --> 00:03:52.226
+Since the block reward is fixed,
+
+57
+00:03:52.226 --> 00:03:56.518
+the token distribution in Pactus is linear compared to Bitcoin.
+
+58
+00:03:56.518 --> 00:03:59.207
+This is a fair and good mechanism for token distribution
+
+59
+00:03:59.207 --> 00:04:01.924
+in a Proof of Stake blockchain.
+
+60
+00:04:01.924 --> 00:04:05.935
+Since the validators are powered by stakes (or coins)
+
+61
+00:04:05.935 --> 00:04:11.186
+there is a good motivation for validators to join the network earlier.
+
+62
+00:04:11.186 --> 00:04:14.490
+Transaction fees in Pactus are fixed and
+
+63
+00:04:14.490 --> 00:04:19.369
+calculated based on the transferred values (not transferred bits).
+
+64
+00:04:19.369 --> 00:04:22.091
+There is a consensus between validators to
+
+65
+00:04:22.091 --> 00:04:25.244
+define the percentage and minimum fee amount.
+
+66
+00:04:25.244 --> 00:04:30.161
+The minimum fee amount secures the network against spam transactions.
+
+67
+00:04:30.161 --> 00:04:33.836
+Pactus starts with only 4 bootstrap validators.
+
+68
+00:04:33.836 --> 00:04:36.952
+These bootstrap validators have no stake.
+
+69
+00:04:36.952 --> 00:04:39.947
+Whenever the 21st validator joins the network,
+
+70
+00:04:39.947 --> 00:04:42.418
+these bootstrap validators will be retired and
+
+71
+00:04:42.418 --> 00:04:45.671
+the network will be secured by other validators.
+
+72
+00:04:45.671 --> 00:04:52.275
+In this time the new validators can join the committee by running the sortition algorithm.
+
+73
+00:04:54.223 --> 00:04:59.897
+Running a validator in Pactus is easy, see you there.
diff --git a/assets/media/what_is_pactus.mp4 b/assets/media/what_is_pactus.mp4
new file mode 100644
index 000000000..90e712f70
Binary files /dev/null and b/assets/media/what_is_pactus.mp4 differ
diff --git a/assets/webfonts/fa-brands-400.ttf b/assets/webfonts/fa-brands-400.ttf
new file mode 100644
index 000000000..502f3621e
Binary files /dev/null and b/assets/webfonts/fa-brands-400.ttf differ
diff --git a/assets/webfonts/fa-brands-400.woff2 b/assets/webfonts/fa-brands-400.woff2
new file mode 100644
index 000000000..d801b51f6
Binary files /dev/null and b/assets/webfonts/fa-brands-400.woff2 differ
diff --git a/assets/webfonts/fa-regular-400.ttf b/assets/webfonts/fa-regular-400.ttf
new file mode 100644
index 000000000..e0abe2710
Binary files /dev/null and b/assets/webfonts/fa-regular-400.ttf differ
diff --git a/assets/webfonts/fa-regular-400.woff2 b/assets/webfonts/fa-regular-400.woff2
new file mode 100644
index 000000000..d736e4b24
Binary files /dev/null and b/assets/webfonts/fa-regular-400.woff2 differ
diff --git a/assets/webfonts/fa-solid-900.ttf b/assets/webfonts/fa-solid-900.ttf
new file mode 100644
index 000000000..13c948977
Binary files /dev/null and b/assets/webfonts/fa-solid-900.ttf differ
diff --git a/assets/webfonts/fa-solid-900.woff2 b/assets/webfonts/fa-solid-900.woff2
new file mode 100644
index 000000000..3516fdbe3
Binary files /dev/null and b/assets/webfonts/fa-solid-900.woff2 differ
diff --git a/assets/webfonts/fa-v4compatibility.ttf b/assets/webfonts/fa-v4compatibility.ttf
new file mode 100644
index 000000000..dc2981941
Binary files /dev/null and b/assets/webfonts/fa-v4compatibility.ttf differ
diff --git a/assets/webfonts/fa-v4compatibility.woff2 b/assets/webfonts/fa-v4compatibility.woff2
new file mode 100644
index 000000000..28d46b15a
Binary files /dev/null and b/assets/webfonts/fa-v4compatibility.woff2 differ
diff --git a/blog/images/2022-09-24-testnet-0-launched/testnet.gif b/blog/images/2022-09-24-testnet-0-launched/testnet.gif
new file mode 100644
index 000000000..9997df534
Binary files /dev/null and b/blog/images/2022-09-24-testnet-0-launched/testnet.gif differ
diff --git a/blog/images/2022-10-30-dev-meeting/women-life-freedom.png b/blog/images/2022-10-30-dev-meeting/women-life-freedom.png
new file mode 100644
index 000000000..17b13a097
Binary files /dev/null and b/blog/images/2022-10-30-dev-meeting/women-life-freedom.png differ
diff --git a/blog/images/2023-05-08-release-0-10-0/multi-validators.png b/blog/images/2023-05-08-release-0-10-0/multi-validators.png
new file mode 100644
index 000000000..6e7ee80fa
Binary files /dev/null and b/blog/images/2023-05-08-release-0-10-0/multi-validators.png differ
diff --git a/blog/images/2023-05-29-release-0-11-0/bond-transaction-dialog.png b/blog/images/2023-05-29-release-0-11-0/bond-transaction-dialog.png
new file mode 100644
index 000000000..4678a11a3
Binary files /dev/null and b/blog/images/2023-05-29-release-0-11-0/bond-transaction-dialog.png differ
diff --git a/blog/images/2023-06-19-release-0-12-0/syncing-progress.png b/blog/images/2023-06-19-release-0-12-0/syncing-progress.png
new file mode 100644
index 000000000..f35596901
Binary files /dev/null and b/blog/images/2023-06-19-release-0-12-0/syncing-progress.png differ
diff --git a/blog/images/2023-07-01-release-0-13-0/restore-mode.png b/blog/images/2023-07-01-release-0-13-0/restore-mode.png
new file mode 100644
index 000000000..38fbd999f
Binary files /dev/null and b/blog/images/2023-07-01-release-0-13-0/restore-mode.png differ
diff --git a/blog/images/2023-07-05-testnet-500-validators/500-validators.png b/blog/images/2023-07-05-testnet-500-validators/500-validators.png
new file mode 100644
index 000000000..989eb0c6b
Binary files /dev/null and b/blog/images/2023-07-05-testnet-500-validators/500-validators.png differ
diff --git a/blog/images/2023-07-09-dev-meeting/network-messages.png b/blog/images/2023-07-09-dev-meeting/network-messages.png
new file mode 100644
index 000000000..0d809041d
Binary files /dev/null and b/blog/images/2023-07-09-dev-meeting/network-messages.png differ
diff --git a/blog/images/2023-08-01-testnet-1-concluded/consensus-round.png b/blog/images/2023-08-01-testnet-1-concluded/consensus-round.png
new file mode 100644
index 000000000..8e54e6f9c
Binary files /dev/null and b/blog/images/2023-08-01-testnet-1-concluded/consensus-round.png differ
diff --git a/blog/images/2023-08-01-testnet-1-concluded/staked-coins.png b/blog/images/2023-08-01-testnet-1-concluded/staked-coins.png
new file mode 100644
index 000000000..8a0dbf82d
Binary files /dev/null and b/blog/images/2023-08-01-testnet-1-concluded/staked-coins.png differ
diff --git a/blog/images/2023-08-01-testnet-1-concluded/transaction-confirmation.png b/blog/images/2023-08-01-testnet-1-concluded/transaction-confirmation.png
new file mode 100644
index 000000000..74a6bf99d
Binary files /dev/null and b/blog/images/2023-08-01-testnet-1-concluded/transaction-confirmation.png differ
diff --git a/blog/images/2023-08-22-dev-report/github-pactus.png b/blog/images/2023-08-22-dev-report/github-pactus.png
new file mode 100644
index 000000000..adca894da
Binary files /dev/null and b/blog/images/2023-08-22-dev-report/github-pactus.png differ
diff --git a/blog/images/2023-09-04-introduction-to-pips/PIP.png b/blog/images/2023-09-04-introduction-to-pips/PIP.png
new file mode 100644
index 000000000..cb9df60be
Binary files /dev/null and b/blog/images/2023-09-04-introduction-to-pips/PIP.png differ
diff --git a/blog/images/2023-09-04-introduction-to-pips/repository.png b/blog/images/2023-09-04-introduction-to-pips/repository.png
new file mode 100644
index 000000000..65abac284
Binary files /dev/null and b/blog/images/2023-09-04-introduction-to-pips/repository.png differ
diff --git a/blog/images/2023-09-24-dev-report-pre-testnet-2/github-pactus.png b/blog/images/2023-09-24-dev-report-pre-testnet-2/github-pactus.png
new file mode 100644
index 000000000..d63c23110
Binary files /dev/null and b/blog/images/2023-09-24-dev-report-pre-testnet-2/github-pactus.png differ
diff --git a/blog/images/2023-09-28-how-sspos-works-in-simple-word/SSPoS.png b/blog/images/2023-09-28-how-sspos-works-in-simple-word/SSPoS.png
new file mode 100644
index 000000000..412208802
Binary files /dev/null and b/blog/images/2023-09-28-how-sspos-works-in-simple-word/SSPoS.png differ
diff --git a/blog/images/2023-10-15-release-0-15-0/splash-screen.png b/blog/images/2023-10-15-release-0-15-0/splash-screen.png
new file mode 100644
index 000000000..a5c8f139a
Binary files /dev/null and b/blog/images/2023-10-15-release-0-15-0/splash-screen.png differ
diff --git a/blog/images/2023-10-29-release-0-16-0/new-address-dialog.png b/blog/images/2023-10-29-release-0-16-0/new-address-dialog.png
new file mode 100644
index 000000000..9b8259ad9
Binary files /dev/null and b/blog/images/2023-10-29-release-0-16-0/new-address-dialog.png differ
diff --git a/blog/images/2023-11-12-release-0-17-0/node-gossip-config.png b/blog/images/2023-11-12-release-0-17-0/node-gossip-config.png
new file mode 100644
index 000000000..9d06a753f
Binary files /dev/null and b/blog/images/2023-11-12-release-0-17-0/node-gossip-config.png differ
diff --git a/blog/images/2024-01-10-pactus-records-its-ips-in-ipminter/pactus-records-proposal-ipminter.png b/blog/images/2024-01-10-pactus-records-its-ips-in-ipminter/pactus-records-proposal-ipminter.png
new file mode 100644
index 000000000..5ac3b20f9
Binary files /dev/null and b/blog/images/2024-01-10-pactus-records-its-ips-in-ipminter/pactus-records-proposal-ipminter.png differ
diff --git a/blog/images/2024-01-11-release-0-20-0/withdraw-dialog.png b/blog/images/2024-01-11-release-0-20-0/withdraw-dialog.png
new file mode 100644
index 000000000..3d9fbb2ec
Binary files /dev/null and b/blog/images/2024-01-11-release-0-20-0/withdraw-dialog.png differ
diff --git a/blog/images/2024-01-31-release-1-0-0/pactus-1-0-0-beijing.png b/blog/images/2024-01-31-release-1-0-0/pactus-1-0-0-beijing.png
new file mode 100644
index 000000000..73abb443d
Binary files /dev/null and b/blog/images/2024-01-31-release-1-0-0/pactus-1-0-0-beijing.png differ
diff --git a/blog/images/2024-02-10-release-1-0-1/pactus-1-0-1-beijing.png b/blog/images/2024-02-10-release-1-0-1/pactus-1-0-1-beijing.png
new file mode 100644
index 000000000..28e614444
Binary files /dev/null and b/blog/images/2024-02-10-release-1-0-1/pactus-1-0-1-beijing.png differ
diff --git a/blog/images/2024-02-18-release-1-0-2/pactus-1-0-2-istanbul.png b/blog/images/2024-02-18-release-1-0-2/pactus-1-0-2-istanbul.png
new file mode 100644
index 000000000..ad81fa344
Binary files /dev/null and b/blog/images/2024-02-18-release-1-0-2/pactus-1-0-2-istanbul.png differ
diff --git a/blog/index.html b/blog/index.html
new file mode 100644
index 000000000..519d307d6
--- /dev/null
+++ b/blog/index.html
@@ -0,0 +1,573 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
All posts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- 28 September 2023
+
+
+
+
+
- 24 September 2023
+
+
+
+
+
- 04 September 2023
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- 24 September 2022
+
+
+
+
+
- 20 September 2022
+
+
+
+
+
- 18 September 2022
+
+
+
+
+
- 04 September 2022
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/browserconfig.xml b/browserconfig.xml
new file mode 100644
index 000000000..b3930d0f0
--- /dev/null
+++ b/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #da532c
+
+
+
diff --git a/community/index.html b/community/index.html
new file mode 100644
index 000000000..00b1604bb
--- /dev/null
+++ b/community/index.html
@@ -0,0 +1,446 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Community | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
By joining the Pactus community, you become a part of a global network of innovators, thinkers, and doers who are all united by a shared vision of building a better future with blockchain technology. Whether you’re a developer, entrepreneur, investor, or simply a blockchain enthusiast, there’s a place for you here at Pactus. So, let’s come together and make a difference!
+
+
+
+
To explore the communities managed by members of the community, you can follow the links below.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/contributing/index.html b/contributing/index.html
new file mode 100644
index 000000000..bd7bcbd8c
--- /dev/null
+++ b/contributing/index.html
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Contributing | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing
+
+
As an open-source platform, Pactus blockchain empowers from its community.
+Whether you’re a developer, designer, or enthusiast, your contributions can make a meaningful impact.
+
+
There are several ways to support the Pactus project:
+
+
Run a Node
+
+
One of the most effective ways to contribute to the Pactus network is by running a node.
+A “node” is a software program that downloads a copy of the Pactus blockchain and
+ensure the network keeps running safe and decentralized.
+
+
These guides can help you to run and configure your node:
+
+
+
+
Become a Validator
+
+
Validators play an important role in the Pactus blockchain by verifying transactions and
+adding them to the blockchain.
+By becoming a validator, you can earn rewards
+for contributing to the network’s security and decentralization.
+
+
To become a validator, you will need to stake a certain amount of Pactus coins.
+These guides can help you to send a Bond transaction and stake some coins:
+
+
+
+
Develop
+
+
Pactus is an open-source project that welcomes and encourages contributions from developers.
+By contributing to the project, you can help improve the Pactus platform and create new features that
+benefit the entire community.
+
+
You can check our Contributing page
+for more information on how to get involved and contribute to the project.
+
+
Translation
+
+
Another way to contribute to the Pactus project is by translating this website into other languages and
+improving its content.
+
+
Spread the Word
+
+
The more people who know about Pactus, the more opportunities there are for collaboration and growth.
+Share our project on social media, attend Pactus events, or simply tell your friends and colleagues about us.
+
+
+
+
Together, Let’s build a better future for blockchain technology.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/download/index.html b/download/index.html
new file mode 100644
index 000000000..976670f98
--- /dev/null
+++ b/download/index.html
@@ -0,0 +1,545 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Download | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download Pactus
+
+
On this page you can find how to download and get the latest version of the Pactus software.
+
+
+
+
🏗️ Compile from Source Code
+
+
Project Pactus is distributed as open source software, so the preferred way for installing it is to clone the source code from the GitHub repository and compile the source code.
+
+
Instructions for compiling Pactus is provided on the install page.
+
+
+
+
⬇️ Download Stable Releases
+
+
You can also download the latest stable releases of Pactus. These releases are updated automatically when a new version is released in GitHub repository .
+
+
Pactus Graphical User Interface (GUI)
+
+
You can run Pactus in a graphical user interface (GUI) mode and it is suitable for both beginners and advanced users.
+
+
+
+
+
+
+
Untrusted application Be aware that the precompiled binaries are not shipped with any
code signing certificate . Most probability in Windows and macOS the downloaded binaries are detected as untrusted application.
+
+
+
+
Once you have downloaded the Pactus GUI, you may follow this tutorial to set up and run your node:
+ How to run Pactus in Graphic Mode?
+
+
+
+
Pactus Command Line Interface (CLI)
+
+
Advanced users can run Pactus in command line interface (CLI) mode.
+
+
+
+
+
+
Once you have downloaded the Pactus CLI, you may follow this tutorial to set up and run your node:
+ How to run Pactus in Command Line Mode?
+
+
Downloader script
+
+
For Unix-like systems (e.g., Linux, macOS, or MSYS2 on Windows), there is a downloader script available. This script can download the archived file, verify it, and extract it for you. To use it, simply run the following command in your terminal:
+
+
curl --proto '=https' --tlsv1 .2 -sSL https://github.com/pactus-project/pactus/releases/download/v1.0.2/pactus_downloader.sh | sh
+
+
+
+
+
🐳 Docker Container
+
+
Advanced users can get the Pactus docker image from Docker Hub .
+
+
You may follow this tutorial to set up and run your node using Docker:
+ How to run Pactus using Docker?
+
+
+
+
+
+
+
+
+
+
diff --git a/favicon-128x128.png b/favicon-128x128.png
new file mode 100644
index 000000000..f12927c2a
Binary files /dev/null and b/favicon-128x128.png differ
diff --git a/favicon-16x16.png b/favicon-16x16.png
new file mode 100644
index 000000000..c6d902e56
Binary files /dev/null and b/favicon-16x16.png differ
diff --git a/favicon-32x32.png b/favicon-32x32.png
new file mode 100644
index 000000000..55447f432
Binary files /dev/null and b/favicon-32x32.png differ
diff --git a/favicon-64x64.png b/favicon-64x64.png
new file mode 100644
index 000000000..70545a0a3
Binary files /dev/null and b/favicon-64x64.png differ
diff --git a/favicon.ico b/favicon.ico
new file mode 100644
index 000000000..64080c0ee
Binary files /dev/null and b/favicon.ico differ
diff --git a/feed.xml b/feed.xml
new file mode 100644
index 000000000..91d3235f6
--- /dev/null
+++ b/feed.xml
@@ -0,0 +1,1223 @@
+Jekyll 2024-03-10T09:34:30+00:00 https://pactus.org/feed.xml Pactus blockchain Pactus 1.0.2 (Istanbul) Released 2024-02-18T00:00:00+00:00 2024-02-18T00:00:00+00:00 https://pactus.org/2024/02/18/release-1-0-2 Overview
+
+Pactus Blockchain Version 1.0.2 (Istanbul)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+This release is named after the city of Istanbul and it
+was unanimously selected by Pactus community.
+
+
+
+Highlights
+
+This update fixes a major issue that decreases the number of inbound connections of the nodes over time.
+We highly recommend all users to upgrade to the new version for better connectivity.
+
+Download
+
+To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+How to Upgrade
+
+If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Fix
+
+
+ sync : fix concurrent map read-write crash (#1112 )
+ network : remove disconnected peers from peerMgr (#1110 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 1.0.1 (Beijing) Released 2024-02-10T00:00:00+00:00 2024-02-10T00:00:00+00:00 https://pactus.org/2024/02/10/release-1-0-1 Overview
+
+Pactus Blockchain Version 1.0.1 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+This release is named after the city of Beijing and it
+was unanimously selected by Pactus community.
+
+
+
+Highlights
+
+This update fixes several issues identified after the release of
+1.0.0 (Beijing) .
+Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.
+
+Download
+
+To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+How to Upgrade
+
+If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gui : add connections and moniker fields to main windows (#1090 )
+
+
+Fix
+
+
+ network : set dial and accept limit in connection gater (#1089 )
+ gui stderr logger in windows os (#1081 )
+ sync : improve syncing process (#1087 )
+ network : redefine resource limits (#1086 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 1.0.0 (Beijing) Released 2024-01-31T00:00:00+00:00 2024-01-31T00:00:00+00:00 https://pactus.org/2024/01/31/release-1-0-0 Overview
+
+Pactus Blockchain Version 1.0.0 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+Highlights
+
+Mainnet Official Release v1.0.0 (Beijing)
+
+The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone
+for our community.
+This impressive mainnet release represents the culmination of extensive development efforts.
+Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain,
+enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software
+and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on
+this exciting journey.
+
+Onboarding validators
+
+On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in
+Testnet-0 ,
+Testnet-1 , and
+Testnet-2 .
+This marks the beginning of a new chapter in the decentralized world.
+
+Download
+
+This version has been implemented for Mainnet
+To start using Pactus Mainnet, download the latest version from the download
+page and join the Mainnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ implement get validator address for grpc (#975 )
+ add bootstrap.json and load in config on build (#964 )
+ add mainnet config and genesis files (#951 )
+ add Consensus-address to network info (#952 )
+ grpc : sign transaction using wallet client (#945 )
+ pactus gui lock support (#947 )
+ consensus : turning consensus to a zero-config module (#942 )
+
+
+Fix
+
+
+ localnet wallet issue (#970 )
+ sync : remove ReachabilityStatus from agent info (#956 )
+ daemon : keeping previous behavior for password flag, linting CLI messages (#950 )
+ consensus : detect if the system time is behind the network (#939 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Mainnet launched 🚀 2024-01-24T20:24:00+00:00 2024-01-24T20:24:00+00:00 https://pactus.org/2024/01/24/mainnet-launched Years to Launch
+
+Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time.
+Pactus Mainnet is the result of years of hard work, research, and innovation.
+It started from one idea:
+
+A low-cost, truly decentralized blockchain, built by the people for the people,
+where anyone could run and be their own validator.
+
+We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.
+
+
+
+We want to thank Pactus community for helping us on the Testnet.
+
+You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.
+
+On the Road
+
+The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!
+
+We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!
+
+We Have a Dream
+
+We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.
+
+This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.
+
+And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!
]]> Story of Testnet-2 2024-01-22T00:00:00+00:00 2024-01-22T00:00:00+00:00 https://pactus.org/2024/01/22/testnet-2-concluded What is Testnet?
+
+Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+Summary
+
+In October 2023, we launched Testnet-2 .
+The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.
+
+The committee for Testnet-2 was set to 51 validators,
+and 2084 validators joined during the Testnet period.
+More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network.
+More than 800,000 blocks were created, and about 2 million transactions were processed during this time.
+The size of the blockchain is about 450 megabytes.
+
+About 500,000 coins were staked during this period, almost 60% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+Stability of Consensus
+
+In Testnet-1, we had one consensus failure that caused us to
+conclude the Testnet-1 .
+During Testnet-2, there were no issues with the consensus mechanism, and
+we had no case of failure during the testing period,
+although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor.
+It proved that the consensus mechanism is in a stable situation.
+
+Networking issues
+
+In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem.
+In the second blockage, we had no choice but to ask active validators inside the committee to
+update their nodes to overcome the networking issue.
+The development team faced a difficult situation and had to make the proper decision to fix the networking issues.
+On one hand, the networking traffic increased significantly, and on the other hand, we had to
+make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems.
+After examining different scenarios, the networking issues were resolved, and
+no major problems were reported till the end of Testnet.
+
+Major updates
+
+During Testnet-2, we introduced several updates, including versions
+0.15.0 ,
+0.16.0 ,
+0.17.0 ,
+0.18.0 ,
+0.19.0 , and
+0.20.0 .
+The update process went smoothly, and with the stability of Version 0.20.0 confirmed,
+the development team shifted its focus to the Mainnet launch.
+
+
+
+This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+We are grateful to all those who participated in Testnets, and we encourage them to join the Mainnet.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
]]> Pactus 0.20.0 Released 2024-01-11T00:00:00+00:00 2024-01-11T00:00:00+00:00 https://pactus.org/2024/01/11/release-0-20-0 Overview
+
+Pactus Blockchain Version 0.20.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+Validator Stake Management
+
+The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.
+
+
+
+Improving Network Connectivity
+
+Some users have reported that UDP packets are being dropped by their Internet Service Providers.
+Therefore, the UDP protocol is disabled by default.
+Users can still activate the UDP protocol by configuring the settings in the file if necessary.
+
+Also, the experimental Node Gossip feature has been removed in this version.
+Node gossip could cause some validators to become isolated from the rest of the network.
+
+Relay service
+
+This version enables users to turn their node into a relay service.
+A relay service node can help users behind NAT to communicate with each other.
+It is disabled by default and can be enabled inside the config file.
+Please note that it is still in an experimental state.
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ implement relay service (#931 )
+ HTTP : Integrate AddRowDouble and update tests (#926 )
+ network : making listen address private in config (#921 )
+ http : adding AvailabilityScore to http module (#917 )
+ network : adding ‘enable_udp’ config (#918 )
+ network : removing gossip node service (#916 )
+ gRPC : adding AvailabilityScore to gRPC (#910 )
+ GUI : unbond and withdraw transaction dialogs (#908 )
+
+
+Fix
+
+
+ gRPC : adding missing get raw transaction APIs to gRPC gateway (#925 )
+ network : preventing self dial (#924 )
+ fixing time lag on starting node (#923 )
+ network : fixing network deadlock on linux arm64 (#922 )
+ GUI : updating unbond and withdraw dialogs (#911 )
+ fixing gRPC node info issue (#906 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus records its IPs in IPMINTER 2024-01-10T00:00:00+00:00 2024-01-10T00:00:00+00:00 https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminter
+
+In our continuous pursuit of innovation, the recording of our intellectual property is the
+cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a
+slow and expensive hurdle. That is… until we discovered IPMINTER!
+
+Pactus profile in IPMINTER
+
+We are ecstatic to announce that the blockchain-based platform by IPMINTER has
+revolutionized the way we secure our creations.
+
+Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our
+intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes!
+Plus, the moment we received our exquisite certificate, complete with a QR code directly linking
+to our secure blockchain entry, our confidence in this platform soared.
+
+Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission
+to protect our inventive proposals. The assurance we’ve experienced using their platform has
+been unparalleled.
+
+We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward,
+economical, and robust IP recording solution. They have our heartfelt endorsement!
+
+Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!
]]>Mainnet announcement 2024-01-08T00:00:00+00:00 2024-01-08T00:00:00+00:00 https://pactus.org/2024/01/08/mainnet-announcement The much-awaited Mainnet Launch of The Pactus Blockchain is finally here!
+On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block ,
+will be minted by four Bootstrap validators.
+After that, every 10 seconds, a new block will be added to the blockchain.
+Each block contains the committed transactions in the network.
+The block finality in the Pactus blockchain is immediate.
+It means that there is no need to wait for block confirmation to ensure a transaction is committed.
+
+Later, more than 2000 community validators will secure the blockchain and make it decentralized.
+These validators are Testnet participants who helped test Pactus during our testing period.
+The community validators will receive the initial staking coins from a Discord Bot named RoboPac.
+
+To ensure everything works smoothly on the Mainnet, three different Testnets (
+Testnet0 ,
+Testnet1 , and
+Testnet2 ) have been run.
+
+The Mainnet will never be stopped or interrupted by the core developers of Pactus,
+and validators should primarily participate in and maintain the security of the blockchain.
]]> Pactus 0.19.0 Released 2024-01-04T00:00:00+00:00 2024-01-04T00:00:00+00:00 https://pactus.org/2024/01/04/release-0-19-0 Overview
+
+Pactus Blockchain Version 0.19.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+This version has improved the overall performance of the blockchain by implementing
+PIP-15 .
+PIP-15 suggests to add caching algorithms to the database for the most frequently used items.
+
+Additionally, this version has enhanced the connectivity of the nodes in the P2P network.
+
+Availability Score
+
+This version comes with the implementation of PIP-19 .
+PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the
+committee .
+Validators with a score less than 0.8 won’t receive the block reward,
+as their proposals will be rejected by other validators.
+The main reason behind this PIP is to prevent users from downgrading
+their node specifications and running Pactus on machines with low resources.
+
+Breaking change
+
+The Docker container now contains both daemon and wallet binary files.
+Users who use Docker to run Pacts now need to add the entry point to run Pactus.
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gRPC : defining network and peers info response’s properly (#898 )
+ implementing pip-19 (#899 )
+ network : disabling GosipSub, only FloodSub (#895 )
+ www : adding change proposer round and value to consensus info votes (#892 )
+ network : adding relay service to dial relay nodes (#887 )
+ implementing pip-15 (#843 )
+ check already running by lock file (#871 )
+
+
+Fix
+
+
+ store : use cache to check if public key exists (#902 )
+ executor : not rejecting bond transaction for bootstrap validator (#901 )
+ GUI : removing unnecessary tags in transaction confirm dialog (#893 )
+ network : close relay connection for public node (#891 )
+ network : refining GossipSubParams for Gossiper node (#882 )
+ sync : adding sequence number to the bundle (#881 )
+ network : turn off mesh for gossiper node (#880 )
+ consensus : check voteset for CP strong termination (#879 )
+ adding querier to query messages (#878 )
+ execution : fixing issue #869 (#870 )
+ fixing logger issue on rotating log file (#859 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.18.0 Released 2023-12-12T00:00:00+00:00 2023-12-12T00:00:00+00:00 https://pactus.org/2023/12/12/release-0-18-0 Overview
+
+Pactus Blockchain Version 0.18.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+This version has significantly improved the syncing progress.
+The syncing process concurrently requests blocks from 8 different peers and
+actively connects to the most optimal peers for downloading the blockchain.
+
+Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.
+
+Breaking change
+
+For Unix-based systems, please note that the working directory for root users has changed from /pactus
to /root/pactus
.
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After you update the node, the configuration file will automatically get updated, keeping the old settings.
+If you want to return the configuration file to its default settings,
+just delete the current config file and restart the node.
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ implement pip-14 (#841 )
+ sort wallet addresses (#836 )
+ grpc : endpoints for creating raw transaction (#838 )
+ network reachability API (#834 )
+ implement pip-13 (#835 )
+ subscribing to libp2p eventbus (#831 )
+ implement helper methods for wallet address path (#830 )
+ logger : adding rotate log file after days, compress and maxgae for logger config (#822 )
+ enable bandwidth router metric (#819 )
+
+
+Fix
+
+
+ network : refining the connection limit (#849 )
+ corrected mistake when retrieving the reward address (#848 )
+ config : restore default config when it is deleted (#847 )
+ cmd : changing home directory for root users (#846 )
+ removing BasicCheck for hash (#845 )
+ disabling libp2p ping protocol (#844 )
+ build docker file (#839 )
+ sync : ignore publishing a block if it is received before (#829 )
+ network : subscribing to the Libp2p event bus (#828 )
+ sync : ignore block request if blocks are already inside the cache (#817 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.17.0 Released 2023-11-12T00:00:00+00:00 2023-11-12T00:00:00+00:00 https://pactus.org/2023/11/12/release-0-17-0 Overview
+
+Pactus Blockchain Version 0.17.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+The Testnet has been upgraded and all validators must update their nodes.
+
+This version will address major networking issues, reduce network usage, and improve overall performance.
+
+A new node type, “Node Gossips ”, has been introduced to help broadcast and spread messages across the network.
+Node Gossips support the network by delivering messages to non-gossiping nodes.
+This gossip option is disabled by default but can be enabled in the configuration file.
+If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node.
+Please note that this option is still experimental and subject to potential changes in future releases.
+
+
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After updating the node, the configuration file will be overwritten with a new version.
+You need to make modifications to the config file if you had customized it prior to the update.
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ network : default configs for bootstrap and relay peers (#812 )
+ introducing node gossip type (#811 )
+ sync : adding remote address to the peer info (#804 )
+ network : adding public address to factory (#795 )
+ network : filter private ips (#793 )
+
+
+Fix
+
+
+ upgrading Testnet (#814 )
+ sync : prevent opening sessions indefinitely (#813 )
+ execution : fixing mistake on calculating unbonded power (#806 )
+ network : check connection threshold on gater (#803 )
+ network : no transient connection (#799 )
+ not close connection for bootstrap nodes (#792 )
+
+
+Refactor
+
+
+ sync : refactoring sync process (#807 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.16.0 Released 2023-10-29T00:00:00+00:00 2023-10-29T00:00:00+00:00 https://pactus.org/2023/10/29/release-0-16-0 Overview
+
+Pactus Blockchain Version 0.16.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+This version allows users to create new addresses for both validators and accounts.
+The networking module has been improved, and users can now set limits on the number of connections.
+A random crash on the agreement protocol has been fixed in this version.
+
+
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gui : display network ID (#780 )
+ create new validator address (CLI and GUI) (#757 )
+ add community bootstrap nodes to testnet config (#764 )
+ network : implementing connection manager (#773 )
+ network : adding bootstrapper mode to the network config (#760 )
+
+
+Fix
+
+
+ network : redefine the network limits (#788 )
+ consensus : not increase the vote-box power on duplicated votes (#785 )
+ network : close connection when unable to get supported protocols (#781 )
+ network : enabling peer exchange for bootstrappers (#779 )
+ network : set connection limit for the resource manager (#775 )
+ sync : peer status set to known on sucessfull handshaking (#774 )
+ consensus : strong termination for the binary agreement (#765 )
+ consensus : not increase the voting power on duplicated binary votes (#762 )
+
+
+Refactor
+
+
+ network : refactoring peer manager (#787 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.15.0 released 2023-10-15T00:00:00+00:00 2023-10-15T00:00:00+00:00 https://pactus.org/2023/10/15/release-0-15-0 Overview
+
+Pactus Blockchain Version 0.15.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+Download
+
+This version is the bootstrap version for
+Testnet-2 .
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to run and configure your node:
+
+
+
+
+ If you participated in Testnet-1, ensure to delete your previous working directory and
+ create a new wallet.
+
+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows,
+ or "~/pactus" on Unix-compatible platforms.
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gui : adding the splash screen (#743 )
+ add absentees votes to the certificate (#746 )
+ logger : short stringer for loggers (#732 )
+ implementing pip-7 (#731 )
+ implementing pip-11 (#712 )
+ implementing pip-8 (#711 )
+ implementing pip-9 (#706 )
+ new API to get Public key by address (#704 )
+ Adding address field for AccountInfo (#703 )
+ CreateValidatorEvent and CreateAccountEvent for nanomsg (#702 )
+ implementing PIP-2 and PIP-3 (#699 )
+ Adding Hole Punching to network (#697 )
+ write logs into file (#673 )
+ check protocol support before sending connect/disconnect event (#683 )
+ updating genesis for pre-testnet-2 (#679 )
+ adding udp protocol for network (#672 )
+ implementing pip-4 (#671 )
+ Notifee service events (#628 )
+ adding MinimumStake parameter (#574 )
+ adding Sent and Received bytes per message metrics for peers (#618 )
+ add reason to BlockResponse messages (#607 )
+ Add CalcualteFee in GRPC (#601 )
+ add sent bytes and received bytes metrics to peerset plus update grpc (#606 )
+ added metrics of libp2p with supporting prometheus (#588 )
+ Check node address is valid (#565 )
+ add LastSent and LastReceived properties to peer (#569 )
+
+
+Fix
+
+
+ data race issue on updating certificate (#747 )
+ network : async connection (#744 )
+ adding query vote timer for CP phase (#738 )
+ trim transactions in proposed block (#737 )
+ fixing query votes and proposal issue (#736 )
+ fixing issue when a block has max transactions (#735 )
+ consensus : anti-entroy mechanism for the consensus (#734 )
+ logger : invalid level parsing error (#733 )
+ cache certificate by height (#730 )
+ fixing a crash on consensus (#729 )
+ consensus : prevent double entry in new height (#728 )
+ resolve consensus halt caused by time discrepancy in network. (#727 )
+ unsorted addresses in wallet listing (#721 )
+ send query votes message, if there is no proposal yet (#723 )
+ fixing logger level issue (#722 )
+ fixing syncing stuck issue (#720 )
+ fixing some minor issues on pre-testnet (#719 )
+ supporting go version 1.21 and higher (#692 )
+ ensure log rotation using tests (#693 )
+ restoring at the first block (#691 )
+ swagger doesn’t work with multiple proto files (#687 )
+ fixing wallet-cli issues (#686 )
+ prevent stripping public key for subsidy transactions (#678 )
+ updating the consensus protocol (#668 )
+ aggregating signature for hello message (#640 )
+ error case for logger (#634 )
+ adding committers to the certificate (#623 )
+ updating sortition executor (#608 )
+ update buf and fixing proto generation issue (#600 )
+ adding block hash to peer (#584 )
+ copy to clipboard option for address and pubkey (#583 )
+ public key aggregate (#576 )
+ remove GetValidators rpc method (#573 )
+ missing swagger ui for grpc get account by number (#564 )
+ incorrect handler for validator by number (#563 )
+
+
+Refactor
+
+
+ sync : refactoring syncing process (#676 )
+ remove payload prefix from payload transaction type (#669 )
+ change Hello message from broadcasting to direct messaging (#665 )
+ committee : using generic list for validators (#667 )
+ rename SanityCheck to BasicCheck (#643 )
+ cli : Migrating from mow.cli to cobra for wallet (#629 )
+ cli : replacing mow.cli with cobra for daemon (#621 )
+ logger : using fast JSON logger (zerolog) (#613 )
+ Using Generics for calculating Min and Max for numeric type #604 (#609 )
+ Updating LRU cache to version 2 #514 (#602 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Testnet-2 launch announcement 2023-10-15T00:00:00+00:00 2023-10-15T00:00:00+00:00 https://pactus.org/2023/10/15/testnet-2-launched Overview
+
+Exciting news for the Pactus Community: Testnet-2 is has launched!
+The journey through Testnet-1
+brought success and invaluable experiences, with over 500 validators joining the network.
+Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and
+thoroughly address these issues.
+After two months of dedicated work and testing, many problems have been resolved, and
+we feel confident launching the Testnet again.
+Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain.
+Notably, the new consensus mechanism and improved overall network performance.
+
+At this point, we want to assure the Pactus community that this version of
+the Testnet will not stop until the mainnet launches ,
+and our main focus is on improving its overall performance and launching the Mainnet.
+
+If you’re new to the concept of Testnet, check out our informative post:
+What is the Testnet?
+
+Key Focus Areas
+
+Testnet-2 has important tasks ahead.
+Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient.
+A close eye will be kept on the network’s performance, ensuring it operates as expected.
+For Testnet-2, the committee
+size has been expanded to 51 members.
+Both the committee’s performance and block production will be closely monitored.
+The goal is a blockchain that remains stable and trustworthy,
+even with thousands of validators in the network,
+ensuring it manages its regular duties seamlessly.
+
+How To Join
+
+Want to join the Testnet-2? Great! It’s super easy.
+Just download the latest Pactus software and you’re good to go.
+no fancy setups or special gear needed.
+You can run the software straight from your personal computer or laptop.
+Need some test coins? Pop over to our Discord channel and share your validator address there.
+
+Benefits for Participation
+
+By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and
+be well-prepared for the Mainnet launch.
+Testnet participants will also receive higher priority during the Mainnet launch and
+get free coins for initial staking on the Mainnet.
+
+Your Feedback Matters
+
+User feedback plays a vital role in the improvement of the Pactus blockchain.
+Share your thoughts and experiences to contribute to the enhancement of future software versions.
]]> How SSPoS (Solid State Proof of Stake) works in simple word 2023-09-28T00:00:00+00:00 2023-09-28T00:00:00+00:00 https://pactus.org/2023/09/28/how-sspos-works-in-simple-word Abstract
+
+In all Blockchain protocols, there is a concept called a consensus mechanism.
+This mechanism is used to enable nodes to reach an agreement
+on the state of the Blockchain they are
+maintaining, in order to have a synchronized and integrated Blockchain.
+
+For now, we have a lot of consensus mechanisms in the Blockchain world.
+Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.
+
+To explain how it works let’s start with explaining one of the first and simplest
+consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).
+
+
+
+PoW (Proof of Work)
+
+In the proof of work model, each node in the network should solve a complex mathematical
+problem that requires lots of computing resources to make a new block.
+
+In this way, it’s highly unlikely that anyone would be able to change
+past transactions and change Blockchain states such as balances,
+without expending equivalent computational power.
+
+By doing this we ensure the security and integrity of the Blockchain.
+
+The concept was adapted from digital tokens by Hal Finney in 2004
+through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).
+
+Bitcoin uses this consensus model.
+
+PoS (Proof of Stake)
+
+On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!
+
+Validators lock a number of their assets in the Blockchain and they can transfer or use it
+till it is locked which we call staking.
+after each Block is committed one of the validators will be chosen randomly (more amount of stake,
+more chance to be chosen) when a validator is chosen
+it proposes a block and announces it to other nodes to be validated,
+when a supermajority of validators accept the block it’s going to be committed.
+
+In this system, validators have no incentive to behave maliciously or dishonestly.
+If they do, they risk losing the stake amount.
+
+More amount of validators in a PoS Blockchain makes it more secure,
+decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.
+
+Ethereum uses this model.
+
+DPoS (Delegated Proof of Stake)
+
+DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm.
+users entrust their stakes to a small group of “delegates”.
+These delegates are responsible for validating transactions
+and creating blocks. The number of delegates is limited
+to ensure accountability and efficiency in the validation process.
+
+Some Blockchains like Cardano and Tron use DPoS.
+
+DPoS tries to solve the issue of PoS which when validators
+increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot
+of trust in the hands of a small number of delegates,
+which goes against the principle of “don’t trust, verify”.
+
+SSPoS (Solid State Proof of Stake)
+
+BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?
+
+In Pactus Blockchain, we have something called Solid State Proof of Stake
+and we try to fix the previous model’s issue, let me explain.
+
+Pactus uses a dynamic committee of validators with a fixed size of 51,
+but the members of the committee randomly change in each round,
+based on stake amount the chance of being chosen is higher. on the other hand,
+the number of validators out on the committee is unlimited, allowing anyone
+to become a validator by staking coins.
+
+At each block, validators participate in a sortition algorithm by generating a random number
+between zero and the total staked coins. If the number is less
+than the validator’s stake, they can enter the committee and replace the oldest committee member.
+
+So, in SSPoS models which are a variant of PoS, we can reach a consensus,
+without using high computation resources, having an inefficient
+validation process by increasing validator numbers,
+and also without breaking the principle of “don’t trust, verify”.
]]> Dev Report pre-testnet2 2023-09-24T00:00:00+00:00 2023-09-24T00:00:00+00:00 https://pactus.org/2023/09/24/dev-report-pre-testnet-2 Abstract
+
+there is several activities in Pactus github in September month, here is a clear report and explain of activities.
+
+
+
+Implementing PIP 2, 3 and 4
+
+After starting Pactus Labs and PIPs ,
+we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:
+
+
+
+Network
+
+There is some very good change and new features for Pactus network module,
+this list contain a list of important changes in Pactus networking:
+
+
+
+gRPC and nanomessage services
+
+We also updated, improved and enhanced gRPC and nanomessage services for better developer experience,
+for third-party and side project developers, here is some changes:
+
+
+
+Refactoring and other new feature or debugs
+
+We had some not implemented feature request, not fixed bugs and some issue with new golang version,
+list of this changes:
+
+]]> Introduction to PIPs 2023-09-04T00:00:00+00:00 2023-09-04T00:00:00+00:00 https://pactus.org/2023/09/04/introduction-to-pips Introduction to PIPs
+
+In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey:
+the Pactus Improvement Proposals, or PIPs.
+
+
+
+What are PIPs?
+
+Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform.
+Each PIP has a unique number like PIP-2 ,
+PIP-3 , and so on.
+These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.
+
+The PIP process
+
+The PIP process is open, allowing any member of the Pactus community to propose a PIP.
+The author should provide a summary, motivation, and a detailed technical explanation.
+The Pactus Laboratory team will carefully review each PIP.
+Security considerations must be addressed before finalizing a PIP.
+Once finalized, it can be added to the code.
+This process helps avoid unexpected issues during development and maintain consistency and safety.
+
+The Origins of PIPs
+
+The Pactus Improvement Proposals (PIPs) was inspired by the
+Ethereum Improvement Proposals (EIPs ) system,
+which had its roots in the Bitcoin Improvement Proposals (BIPs ) and
+Python Enhancement Proposals (PEPs ).
+
+New Feature Policy
+
+From now on, all major changes or new features in the Pactus project require a PIP.
+Any implementation must reference its specific PIP.
+Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.
+
+PIPs Repository
+
+For a complete list of Pactus Improvement Proposals, visit this link .
+The corresponding GitHub repository is accessible here .
+
+
]]> Dev report 2023-08-22T00:00:00+00:00 2023-08-22T00:00:00+00:00 https://pactus.org/2023/08/22/dev-report Abstract
+
+there is several activities in Pactus github this month, here is a clear report and explain of activities.
+
+
+
+Linters
+
+one of new changes in Pactus project is new linters we added this month.
+what is linters?
+linters are just a set of rules for the style of source codes, they force developers to write new codes
+in correct, clean and safe way.
+
+why we use them?
+the reason we are using linters in Pactus and add new ones, is to make the code more safe,
+and also make it easy to work on for new contributors because we are focus on being decentralized even in development.
+
+Linters we added till now
+
+TLA+ spec
+
+one another new change in Pactus is updating TLA+ spec, which is related to consensus,
+as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.
+
+link to changes
+
+if you wish you can learn more about Pactus consensus here.
+
+Refactoring
+
+some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries.
+also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.
+
+one of refactors
]]> Story of Testnet-1 2023-08-01T00:00:00+00:00 2023-08-01T00:00:00+00:00 https://pactus.org/2023/08/01/testnet-1-concluded What is Testnet?
+
+Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+Summary
+
+In May 2023, we launched Testnet-1 .
+The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain.
+The development team also focused on evaluating the network’s performance.
+Additionally, the overall performance of the software and the syncing process were closely examined and assessed.
+
+The committee for Testnet-1 was set to 21 validators,
+and 584 validators joined during the Testnet period.
+More than 600,000 blocks were created, and more than 1 million transactions were processed during this time.
+The size of the blockchain is about 300 megabytes.
+
+About 300,000 coins were staked during this period, it was almost 50% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+
+
+We were able to extract the confirmation time of transactions.
+More than 97% of transactions were confirmed in just one block after submission.
+This indicates that the transaction pool and broadcasting models are working fine.
+
+
+
+Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases.
+More than 97% of blocks are committed in the first rounds.
+
+
+
+Major updates
+
+During Testnet-1, we released three versions(Version
+0.11.0 ,
+0.12.0 ,
+0.13.0 ), and the upgrade process was smooth.
+Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future.
+The consensus failure was resolved by requiring some validators to re-sync their nodes.
+At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible,
+including:
+
+
+ Improving the consensus protocol
+ Reducing the blockchain size
+ Optimizing the network usage
+
+
+After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.
+
+
+
+This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+We are grateful to all those who participated in Testnet-1, and
+we encourage them to join our next Testnet to help us improve Pactus.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
]]> Dev meeting 2023-07-09T00:00:00+00:00 2023-07-09T00:00:00+00:00 https://pactus.org/2023/07/09/dev-meeting Meeting Summary
+
+The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+Overview to the Network Module
+
+The meeting began with an overview of the Network module in Pactus.
+This module uses Libp2p as its underlying network protocol.
+
+The Network module is agnostic about the content of the message and
+handles two types of messages: Gossip messages, which are broadcasted,
+and Stream messages, which are sent directly to a specific peer.
+The team discussed the relay nodes that enable communication for nodes behind NAT.
+Upon receiving a message, the module publishes an event.
+The two types of events are Gossip events and Steam events.
+
+
+
+The team discussed the issue of Relay connections resetting, and explored solutions such as
+hole punching or using UDP and IPv6.
+
+Some users in the Testnet reported high network usage.
+The team discussed implementing metrics for LibP2P to monitor network usage effectively.
+The discussion related to this issue can be found here .
+Additionally, the team discussed the customization of network resources,
+including setting limits for inbound and outbound connections.
+
+Overview to the Sync Module
+
+Moving on, the Sync module was discussed.
+Unlike the Network module, the Sync module has full knowledge about the messages and packets.
+The module handles a range of message types, which can be found
+here .
+
+It was suggested that we need to define metrics for each message type.
+There was also a discussion about the need for reducing the messages to optimize the use of network resources.
+
+The team decided to continue discussing these topics in future meetings.
+They also plan to work on improving the Network and Sync modules based on these discussions.
]]>
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..5b2784dc9
--- /dev/null
+++ b/index.html
@@ -0,0 +1,603 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Home | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Welcome to Pactus
+
Pactus is a community-run blockchain technology with a revolutionary, secure, Solid State Proof of Stake Consensus. Come join us and build a decentralized future together!
+
+
+
+
+
+
+
+
+
+
Get started
+ To start your Pactus journey, you will need to download the latest software. Pactus is designed to be lightweight and user-friendly, offering support for all operating systems and infrastructures with our GUI and CLI applications.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Get PAC
+ Before you can utilize all that Pactus has to offer, you will need to obtain our native coin. PAC is a currency that can be exchanged for products, services and other currencies with a percentage fee based model of 0.01% per tx.
+
+
+
+
+
+
+
+
Become a validator
+ You can become a Pactus validator by staking some coins to your node. As a Pactus validator you will earn rewards, these are given for collecting valid transactions and creating new blocks. The emission is one coin per block.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Make Pactus better
+ There are many ways you can support Pactus and help it grow, from being a valuable community member and sharing with your friends to contributing to our core development. Let's work together to make Pactus even better!
+
+
+
+
+
+
+
+
+
+
+
+
Featured Validators
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/api/grpc/index.html b/learn/api/grpc/index.html
new file mode 100644
index 000000000..ad6988533
--- /dev/null
+++ b/learn/api/grpc/index.html
@@ -0,0 +1,3658 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ gRPC API Reference | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
gRPC API Reference
+
+
Each node in the Pactus network can be configured to use the gRPC protocol for communication.
+Here you can find the list of all gRPC methods and messages.
+
+
Table of Contents
+
+
+
+ Transaction Service
+
+
+ Blockchain Service
+
+
+ Network Service
+
+
+ Wallet Service
+
+
+
+ Messages and Enums
+
+
+
+
+
+
Transaction Service transaction.proto
+
Transaction service defines various RPC methods for interacting with transactions.
+
GetTransaction rpc
+
+
+
GetTransaction retrieves transaction details based on the provided request parameters.
+
CalculateFee rpc
+
+
+
CalculateFee calculates the transaction fee based on the specified amount and payload type.
+
BroadcastTransaction rpc
+
+
+
BroadcastTransaction broadcasts a signed transaction to the network.
+
GetRawTransferTransaction rpc
+
+
+
GetRawTransferTransaction retrieves raw details of a transfer transaction.
+
GetRawBondTransaction rpc
+
+
+
GetRawBondTransaction retrieves raw details of a bond transaction.
+
GetRawUnBondTransaction rpc
+
+
+
GetRawUnBondTransaction retrieves raw details of an unbond transaction.
+
GetRawWithdrawTransaction rpc
+
+
+
GetRawWithdrawTransaction retrieves raw details of a withdraw transaction.
+
Blockchain Service blockchain.proto
+
Blockchain service defines RPC methods for interacting with the blockchain.
+
GetBlock rpc
+
+
+
GetBlock retrieves information about a block based on the provided request parameters.
+
GetBlockHash rpc
+
+
+
GetBlockHash retrieves the hash of a block at the specified height.
+
GetBlockHeight rpc
+
+
+
GetBlockHeight retrieves the height of a block with the specified hash.
+
GetBlockchainInfo rpc
+
+
+
GetBlockchainInfo retrieves general information about the blockchain.
+
GetConsensusInfo rpc
+
+
+
GetConsensusInfo retrieves information about the consensus instances.
+
GetAccount rpc
+
+
+
GetAccount retrieves information about an account based on the provided address.
+
GetValidator rpc
+
+
+
GetValidator retrieves information about a validator based on the provided address.
+
GetValidatorByNumber rpc
+
+
+
GetValidatorByNumber retrieves information about a validator based on the provided number.
+
GetValidatorAddresses rpc
+
+
+
GetValidatorAddresses retrieves a list of all validator addresses.
+
GetPublicKey rpc
+
+
+
GetPublicKey retrieves the public key of an account based on the provided address.
+
Network Service network.proto
+
Network service provides RPCs for retrieving information about the network.
+
GetNetworkInfo rpc
+
+
+
GetNetworkInfo retrieves information about the overall network.
+
GetNodeInfo rpc
+
+
+
GetNodeInfo retrieves information about a specific node in the network.
+
Wallet Service wallet.proto
+
Define the Wallet service with various RPC methods for wallet management.
+
CreateWallet rpc
+
+
+
CreateWallet creates a new wallet with the specified parameters.
+
LoadWallet rpc
+
+
+
LoadWallet loads an existing wallet with the given name.
+
UnloadWallet rpc
+
+
+
UnloadWallet unloads a currently loaded wallet with the specified name.
+
LockWallet rpc
+
+
+
LockWallet locks a currently loaded wallet with the provided password and timeout.
+
UnlockWallet rpc
+
+
+
UnlockWallet unlocks a locked wallet with the provided password and timeout.
+
SignRawTransaction rpc
+
+
+
SignRawTransaction signs a raw transaction for a specified wallet.
+
GetValidatorAddress rpc
+
+
+
GetValidatorAddress retrieves the validator address associated with a public key.
+
Messages and Enums
+
+BroadcastTransactionRequest
+msg
+
+
Request message for broadcasting a signed transaction.
+
+
+
+ Field Type Description
+
+
+
+ signed_raw_transaction
+
+ bytes
+
+ Signed raw transaction data.
+
+
+
+
+BroadcastTransactionResponse
+msg
+
+
Response message containing the ID of the broadcasted transaction.
+
+
+
+ Field Type Description
+
+
+
+ id
+
+ bytes
+
+ Transaction ID.
+
+
+
+
+CalculateFeeRequest
+msg
+
+
Request message for calculating transaction fee.
+
+
+
+ Field Type Description
+
+
+
+ amount
+
+ int64
+
+ Transaction amount.
+
+
+ payloadType
+
+ PayloadType
+
+ Type of transaction payload.
+
+
+
+
+CalculateFeeResponse
+msg
+
+
Response message containing the calculated transaction fee.
+
+
+
+ Field Type Description
+
+
+
+ fee
+
+ int64
+
+ Calculated transaction fee.
+
+
+
+
+GetRawBondTransactionRequest
+msg
+
+
Request message for retrieving raw details of a bond transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ stake
+
+ int64
+
+ Stake amount.
+
+
+ public_key
+
+ string
+
+ Public key of the validator.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetRawTransactionResponse
+msg
+
+
Response message containing raw transaction data.
+
+
+
+ Field Type Description
+
+
+
+ raw_transaction
+
+ bytes
+
+ Raw transaction data.
+
+
+
+
+GetRawTransferTransactionRequest
+msg
+
+
Request message for retrieving raw details of a transfer transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ amount
+
+ int64
+
+ Transaction amount.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetRawUnBondTransactionRequest
+msg
+
+
Request message for retrieving raw details of an unbond transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ validator_address
+
+ string
+
+ Address of the validator to unbond from.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetRawWithdrawTransactionRequest
+msg
+
+
Request message for retrieving raw details of a withdraw transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ validator_address
+
+ string
+
+ Address of the validator to withdraw from.
+
+
+ account_address
+
+ string
+
+ Address of the account to withdraw to.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ amount
+
+ int64
+
+ Withdrawal amount.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetTransactionRequest
+msg
+
+
Request message for retrieving transaction details.
+
+
+
+ Field Type Description
+
+
+
+ id
+
+ bytes
+
+ Transaction ID.
+
+
+ verbosity
+
+ TransactionVerbosity
+
+ Verbosity level for transaction details.
+
+
+
+
+GetTransactionResponse
+msg
+
+
Response message containing details of a transaction.
+
+
+
+ Field Type Description
+
+
+
+ block_height
+
+ uint32
+
+ Height of the block containing the transaction.
+
+
+ block_time
+
+ uint32
+
+ Time of the block containing the transaction.
+
+
+ transaction
+
+ TransactionInfo
+
+ Information about the transaction.
+
+
+
+
+PayloadBond
+msg
+
+
Payload for a bond transaction.
+
+
+
+ Field Type Description
+
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ stake
+
+ int64
+
+ Stake amount.
+
+
+
+
+PayloadSortition
+msg
+
+
Payload for a sortition transaction.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address associated with the sortition.
+
+
+ proof
+
+ bytes
+
+ Proof for the sortition.
+
+
+
+
+PayloadTransfer
+msg
+
+
Payload for a transfer transaction.
+
+
+
+ Field Type Description
+
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ amount
+
+ int64
+
+ Transaction amount.
+
+
+
+
+PayloadUnbond
+msg
+
+
Payload for an unbond transaction.
+
+
+
+ Field Type Description
+
+
+
+ validator
+
+ string
+
+ Address of the validator to unbond from.
+
+
+
+
+PayloadWithdraw
+msg
+
+
Payload for a withdraw transaction.
+
+
+
+ Field Type Description
+
+
+
+ from
+
+ string
+
+ Address to withdraw from.
+
+
+ to
+
+ string
+
+ Address to withdraw to.
+
+
+ amount
+
+ int64
+
+ Withdrawal amount.
+
+
+
+
+TransactionInfo
+msg
+
+
Information about a transaction.
+
+
+
+ Field Type Description
+
+
+
+ id
+
+ bytes
+
+ Transaction ID.
+
+
+ data
+
+ bytes
+
+ Transaction data.
+
+
+ version
+
+ int32
+
+ Transaction version.
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ value
+
+ int64
+
+ Transaction value.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ payloadType
+
+ PayloadType
+
+ Type of transaction payload.
+
+
+ transfer
+
+ PayloadTransfer
+
+ Transfer payload.
+
+
+ bond
+
+ PayloadBond
+
+ Bond payload.
+
+
+ sortition
+
+ PayloadSortition
+
+ Sortition payload.
+
+
+ unbond
+
+ PayloadUnbond
+
+ Unbond payload.
+
+
+ withdraw
+
+ PayloadWithdraw
+
+ Withdraw payload.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+ public_key
+
+ string
+
+ Public key associated with the transaction.
+
+
+ signature
+
+ bytes
+
+ Transaction signature.
+
+
+
+
+AccountInfo
+msg
+
+
Message containing information about an account.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the account.
+
+
+ data
+
+ bytes
+
+ Account data.
+
+
+ number
+
+ int32
+
+ Account number.
+
+
+ balance
+
+ int64
+
+ Account balance.
+
+
+ address
+
+ string
+
+ Address of the account.
+
+
+
+
+
Message containing information about the header of a block.
+
+
+
+ Field Type Description
+
+
+
+ version
+
+ int32
+
+ Block version.
+
+
+ prev_block_hash
+
+ bytes
+
+ Hash of the previous block.
+
+
+ state_root
+
+ bytes
+
+ State root of the block.
+
+
+ sortition_seed
+
+ bytes
+
+ Sortition seed of the block.
+
+
+ proposer_address
+
+ string
+
+ Address of the proposer of the block.
+
+
+
+
+CertificateInfo
+msg
+
+
Message containing information about a certificate.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the certificate.
+
+
+ round
+
+ int32
+
+ Round of the certificate.
+
+
+ committers
+ repeated
+ int32
+
+ List of committers in the certificate.
+
+
+ absentees
+ repeated
+ int32
+
+ List of absentees in the certificate.
+
+
+ signature
+
+ bytes
+
+ Certificate signature.
+
+
+
+
+ConsensusInfo
+msg
+
+
Message containing information about consensus.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address of the consensus instance.
+
+
+ Active
+
+ bool
+
+ Whether the consensus instance is active.
+
+
+ height
+
+ uint32
+
+ Height of the consensus instance.
+
+
+ round
+
+ int32
+
+ Round of the consensus instance.
+
+
+ votes
+ repeated
+ VoteInfo
+
+ List of votes in the consensus instance.
+
+
+
+
+GetAccountRequest
+msg
+
+
Message to request account information based on an address.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address of the account.
+
+
+
+
+GetAccountResponse
+msg
+
+
Message containing the response with account information.
+
+
+
+ Field Type Description
+
+
+
+ account
+
+ AccountInfo
+
+ Account information.
+
+
+
+
+GetBlockHashRequest
+msg
+
+
Message to request block hash based on height.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+
+
+GetBlockHashResponse
+msg
+
+
Message containing the response with the block hash.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the block.
+
+
+
+
+GetBlockHeightRequest
+msg
+
+
Message to request block height based on hash.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the block.
+
+
+
+
+GetBlockHeightResponse
+msg
+
+
Message containing the response with the block height.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+
+
+GetBlockRequest
+msg
+
+
Message to request block information based on height and verbosity.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+ verbosity
+
+ BlockVerbosity
+
+ Verbosity level for block information.
+
+
+
+
+GetBlockResponse
+msg
+
+
Message containing the response with block information.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+ hash
+
+ bytes
+
+ Hash of the block.
+
+
+ data
+
+ bytes
+
+ Block data.
+
+
+ block_time
+
+ uint32
+
+ Block timestamp.
+
+
+ header
+
+ BlockHeaderInfo
+
+ Block header information.
+
+
+ prev_cert
+
+ CertificateInfo
+
+ Certificate information of the previous block.
+
+
+ txs
+ repeated
+ TransactionInfo
+
+ List of transactions in the block.
+
+
+
+
+GetBlockchainInfoRequest
+msg
+
+
Message to request general information about the blockchain.
+
Message has no fields.
+
+GetBlockchainInfoResponse
+msg
+
+
Message containing the response with general blockchain information.
+
+
+
+ Field Type Description
+
+
+
+ last_block_height
+
+ uint32
+
+ Height of the last block.
+
+
+ last_block_hash
+
+ bytes
+
+ Hash of the last block.
+
+
+ total_accounts
+
+ int32
+
+ Total number of accounts.
+
+
+ total_validators
+
+ int32
+
+ Total number of validators.
+
+
+ total_power
+
+ int64
+
+ Total power in the blockchain.
+
+
+ committee_power
+
+ int64
+
+ Power of the committee.
+
+
+ committee_validators
+ repeated
+ ValidatorInfo
+
+ List of committee validators.
+
+
+
+
+GetConsensusInfoRequest
+msg
+
+
Message to request consensus information.
+
Message has no fields.
+
+GetConsensusInfoResponse
+msg
+
+
Message containing the response with consensus information.
+
+
+
+ Field Type Description
+
+
+
+ instances
+ repeated
+ ConsensusInfo
+
+ List of consensus instances.
+
+
+
+
+GetPublicKeyRequest
+msg
+
+
Message to request public key based on an address.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address for which public key is requested.
+
+
+
+
+GetPublicKeyResponse
+msg
+
+
Message containing the response with the public key.
+
+
+
+ Field Type Description
+
+
+
+ public_key
+
+ string
+
+ Public key of the account.
+
+
+
+
+GetValidatorAddressesRequest
+msg
+
+
Message to request validator addresses.
+
Message has no fields.
+
+GetValidatorAddressesResponse
+msg
+
+
Message containing the response with a list of validator addresses.
+
+
+
+ Field Type Description
+
+
+
+ addresses
+ repeated
+ string
+
+ List of validator addresses.
+
+
+
+
+GetValidatorByNumberRequest
+msg
+
+
Message to request validator information based on a validator number.
+
+
+
+ Field Type Description
+
+
+
+ number
+
+ int32
+
+ Validator number.
+
+
+
+
+GetValidatorRequest
+msg
+
+
Message to request validator information based on an address.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address of the validator.
+
+
+
+
+GetValidatorResponse
+msg
+
+
Message containing the response with validator information.
+
+
+
+ Field Type Description
+
+
+
+ validator
+
+ ValidatorInfo
+
+ Validator information.
+
+
+
+
+ValidatorInfo
+msg
+
+
Message containing information about a validator.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the validator.
+
+
+ data
+
+ bytes
+
+ Validator data.
+
+
+ public_key
+
+ string
+
+ Public key of the validator.
+
+
+ number
+
+ int32
+
+ Validator number.
+
+
+ stake
+
+ int64
+
+ Validator stake.
+
+
+ last_bonding_height
+
+ uint32
+
+ Last bonding height.
+
+
+ last_sortition_height
+
+ uint32
+
+ Last sortition height.
+
+
+ unbonding_height
+
+ uint32
+
+ Unbonding height.
+
+
+ address
+
+ string
+
+ Address of the validator.
+
+
+ availability_score
+
+ double
+
+ Availability score of the validator.
+
+
+
+
+VoteInfo
+msg
+
+
Message containing information about a vote.
+
+
+
+ Field Type Description
+
+
+
+ type
+
+ VoteType
+
+ Type of the vote.
+
+
+ voter
+
+ string
+
+ Voter's address.
+
+
+ block_hash
+
+ bytes
+
+ Hash of the block being voted on.
+
+
+ round
+
+ int32
+
+ Round of the vote.
+
+
+ cp_round
+
+ int32
+
+ Consensus round of the vote.
+
+
+ cp_value
+
+ int32
+
+ Consensus value of the vote.
+
+
+
+
+GetNetworkInfoRequest
+msg
+
+
Request message for retrieving overall network information.
+
Message has no fields.
+
+GetNetworkInfoResponse
+msg
+
+
Response message containing information about the overall network.
+
+
+
+ Field Type Description
+
+
+
+ network_name
+
+ string
+
+ Name of the network.
+
+
+ total_sent_bytes
+
+ uint32
+
+ Total bytes sent across the network.
+
+
+ total_received_bytes
+
+ uint32
+
+ Total bytes received across the network.
+
+
+ connected_peers_count
+
+ uint32
+
+ Number of connected peers.
+
+
+ connected_peers
+ repeated
+ PeerInfo
+
+ List of connected peers.
+
+
+ sent_bytes
+ repeated
+ GetNetworkInfoResponse.SentBytesEntry
+
+ Bytes sent per peer ID.
+
+
+ received_bytes
+ repeated
+ GetNetworkInfoResponse.ReceivedBytesEntry
+
+ Bytes received per peer ID.
+
+
+
+
+GetNetworkInfoResponse.ReceivedBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ uint32
+
+
+
+
+ value
+
+ uint64
+
+
+
+
+
+
+GetNetworkInfoResponse.SentBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ uint32
+
+
+
+
+ value
+
+ uint64
+
+
+
+
+
+
+GetNodeInfoRequest
+msg
+
+
Request message for retrieving information about a specific node in the network.
+
Message has no fields.
+
+GetNodeInfoResponse
+msg
+
+
Response message containing information about a specific node in the network.
+
+
+
+ Field Type Description
+
+
+
+ moniker
+
+ string
+
+ Moniker of the node.
+
+
+ agent
+
+ string
+
+ Agent information of the node.
+
+
+ peer_id
+
+ bytes
+
+ Peer ID of the node.
+
+
+ started_at
+
+ uint64
+
+ Timestamp when the node started.
+
+
+ reachability
+
+ string
+
+ Reachability status of the node.
+
+
+ services
+ repeated
+ int32
+
+ List of services provided by the node.
+
+
+ services_names
+ repeated
+ string
+
+ Names of services provided by the node.
+
+
+ addrs
+ repeated
+ string
+
+ List of addresses associated with the node.
+
+
+ protocols
+ repeated
+ string
+
+ List of protocols supported by the node.
+
+
+
+
+PeerInfo
+msg
+
+
Information about a peer in the network.
+
+
+
+ Field Type Description
+
+
+
+ status
+
+ int32
+
+ Status of the peer.
+
+
+ moniker
+
+ string
+
+ Moniker of the peer.
+
+
+ agent
+
+ string
+
+ Agent information of the peer.
+
+
+ peer_id
+
+ bytes
+
+ Peer ID of the peer.
+
+
+ consensus_keys
+ repeated
+ string
+
+ Consensus keys used by the peer.
+
+
+ consensus_address
+ repeated
+ string
+
+ Consensus address of the peer.
+
+
+ services
+
+ uint32
+
+ Services provided by the peer.
+
+
+ last_block_hash
+
+ bytes
+
+ Hash of the last block the peer knows.
+
+
+ height
+
+ uint32
+
+ Height of the peer in the blockchain.
+
+
+ received_messages
+
+ int32
+
+ Count of received messages.
+
+
+ invalid_messages
+
+ int32
+
+ Count of invalid messages received.
+
+
+ last_sent
+
+ int64
+
+ Timestamp of the last sent message.
+
+
+ last_received
+
+ int64
+
+ Timestamp of the last received message.
+
+
+ sent_bytes
+ repeated
+ PeerInfo.SentBytesEntry
+
+ Bytes sent per message type.
+
+
+ received_bytes
+ repeated
+ PeerInfo.ReceivedBytesEntry
+
+ Bytes received per message type.
+
+
+ address
+
+ string
+
+ Network address of the peer.
+
+
+ direction
+
+ string
+
+ Direction of connection with the peer.
+
+
+ protocols
+ repeated
+ string
+
+ List of protocols supported by the peer.
+
+
+ total_sessions
+
+ int32
+
+ Total sessions with the peer.
+
+
+ completed_sessions
+
+ int32
+
+ Completed sessions with the peer.
+
+
+
+
+PeerInfo.ReceivedBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ int32
+
+
+
+
+ value
+
+ int64
+
+
+
+
+
+
+PeerInfo.SentBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ int32
+
+
+
+
+ value
+
+ int64
+
+
+
+
+
+
+CreateWalletRequest
+msg
+
+
Request message for creating a new wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the new wallet.
+
+
+ mnemonic
+
+ string
+
+ Mnemonic for wallet recovery.
+
+
+ language
+
+ string
+
+ Language for the mnemonic.
+
+
+ password
+
+ string
+
+ Password for securing the wallet.
+
+
+
+
+CreateWalletResponse
+msg
+
+
Response message containing the name of the created wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the created wallet.
+
+
+
+
+GetValidatorAddressRequest
+msg
+
+
Request message for obtaining the validator address associated with a public key.
+
+
+
+ Field Type Description
+
+
+
+ public_key
+
+ string
+
+ Public key for which the validator address is requested.
+
+
+
+
+GetValidatorAddressResponse
+msg
+
+
Response message containing the validator address corresponding to a public key.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Validator address associated with the public key.
+
+
+
+
+LoadWalletRequest
+msg
+
+
Request message for loading an existing wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to load.
+
+
+
+
+LoadWalletResponse
+msg
+
+
Response message containing the name of the loaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the loaded wallet.
+
+
+
+
+LockWalletRequest
+msg
+
+
Request message for locking a currently loaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to lock.
+
+
+
+
+LockWalletResponse
+msg
+
+
Response message containing the name of the locked wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the locked wallet.
+
+
+
+
+SignRawTransactionRequest
+msg
+
+
Request message for signing a raw transaction.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet used for signing.
+
+
+ raw_transaction
+
+ bytes
+
+ Raw transaction data to be signed.
+
+
+ password
+
+ string
+
+ Password for unlocking the wallet for signing.
+
+
+
+
+SignRawTransactionResponse
+msg
+
+
Response message containing the transaction ID and signed raw transaction.
+
+
+
+ Field Type Description
+
+
+
+ transaction_id
+
+ bytes
+
+ ID of the signed transaction.
+
+
+ signed_raw_transaction
+
+ bytes
+
+ Signed raw transaction data.
+
+
+
+
+UnloadWalletRequest
+msg
+
+
Request message for unloading a currently loaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to unload.
+
+
+
+
+UnloadWalletResponse
+msg
+
+
Response message containing the name of the unloaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the unloaded wallet.
+
+
+
+
+UnlockWalletRequest
+msg
+
+
Request message for unlocking a wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to unlock.
+
+
+ password
+
+ string
+
+ Password for unlocking the wallet.
+
+
+ timeout
+
+ int32
+
+ Timeout duration for the unlocked state.
+
+
+
+
+UnlockWalletResponse
+msg
+
+
Response message containing the name of the unlocked wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the unlocked wallet.
+
+
+
+
+
+PayloadType
+enum
+
+
Enumeration for different types of transaction payloads.
+
+
+ Name Number Description
+
+
+
+
+ UNKNOWN
+ 0
+ Unknown payload type.
+
+
+
+ TRANSFER_PAYLOAD
+ 1
+ Transfer payload type.
+
+
+
+ BOND_PAYLOAD
+ 2
+ Bond payload type.
+
+
+
+ SORTITION_PAYLOAD
+ 3
+ Sortition payload type.
+
+
+
+ UNBOND_PAYLOAD
+ 4
+ Unbond payload type.
+
+
+
+ WITHDRAW_PAYLOAD
+ 5
+ Withdraw payload type.
+
+
+
+
+
+TransactionVerbosity
+enum
+
+
Enumeration for verbosity level when requesting transaction details.
+
+
+ Name Number Description
+
+
+
+
+ TRANSACTION_DATA
+ 0
+ Request only transaction data.
+
+
+
+ TRANSACTION_INFO
+ 1
+ Request detailed transaction information.
+
+
+
+
+
+BlockVerbosity
+enum
+
+
Enumeration for verbosity level when requesting block information.
+
+
+ Name Number Description
+
+
+
+
+ BLOCK_DATA
+ 0
+ Request block data only.
+
+
+
+ BLOCK_INFO
+ 1
+ Request block information only.
+
+
+
+ BLOCK_TRANSACTIONS
+ 2
+ Request block transactions only.
+
+
+
+
+
+VoteType
+enum
+
+
Enumeration for types of votes.
+
+
+ Name Number Description
+
+
+
+
+ VOTE_UNKNOWN
+ 0
+ Unknown vote type.
+
+
+
+ VOTE_PREPARE
+ 1
+ Prepare vote type.
+
+
+
+ VOTE_PRECOMMIT
+ 2
+ Precommit vote type.
+
+
+
+ VOTE_CHANGE_PROPOSER
+ 3
+ Change proposer vote type.
+
+
+
+
+
+
Scalar Value Types
+
+
+ .proto Type C++ Java Python Go C# PHP
+
+
+
+ double
+ double
+ double
+ float
+ float64
+ double
+ float
+
+
+ float
+ float
+ float
+ float
+ float32
+ float
+ float
+
+
+ int32
+ int32
+ int
+ int
+ int32
+ int
+ integer
+
+
+ int64
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+
+
+ uint32
+ uint32
+ int
+ int/long
+ uint32
+ uint
+ integer
+
+
+ uint64
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+
+
+ sint32
+ int32
+ int
+ int
+ int32
+ int
+ integer
+
+
+ sint64
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+
+
+ fixed32
+ uint32
+ int
+ int
+ uint32
+ uint
+ integer
+
+
+ fixed64
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+
+
+ sfixed32
+ int32
+ int
+ int
+ int32
+ int
+ integer
+
+
+ sfixed64
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+
+
+ bool
+ bool
+ boolean
+ boolean
+ bool
+ bool
+ boolean
+
+
+ string
+ string
+ String
+ str/unicode
+ string
+ string
+ string
+
+
+ bytes
+ string
+ ByteString
+ str
+ []byte
+ ByteString
+ string
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/blockchain/account/index.html b/learn/blockchain/account/index.html
new file mode 100644
index 000000000..f94e63bcb
--- /dev/null
+++ b/learn/blockchain/account/index.html
@@ -0,0 +1,665 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Account | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Account
+
+
An account is an entity that is identified by a unique address ,
+which can send transactions on the blockchain.
+
+
Account Structure
+
+
The account structure is 12 bytes long and consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 4 bytes
+ Number
+
+
+ 8 bytes
+ Balance
+
+
+
+
+
+ Number is a sequential and unique number assigned to each account when it is created for the first time.
+The account number is used to calculate the state hash of the blockchain.
+ Balance holds the balance of the account, which is the amount of Pactus coins held by the account.
+
+
+
Treasury Account
+
+
The Treasury account is a special account in the Pactus blockchain that holds 21 million coins at the genesis time.
+The treasury address is defined as: 000000000000000000000000000000000000000000
.
+The address type is 0, and therefore,
+it doesn’t have any key pair associated with it.
+Every time a block is created, one coin from the Treasury account transfers to the proposer account as a block reward.
+
+
+
+
+
+
+
+
+
diff --git a/learn/blockchain/address/index.html b/learn/blockchain/address/index.html
new file mode 100644
index 000000000..ac9634504
--- /dev/null
+++ b/learn/blockchain/address/index.html
@@ -0,0 +1,672 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Address | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Address
+
+
An address is a unique identifier that is used to send and receive transactions on the Pactus blockchain.
+It is represented as a string of 42 alphanumeric characters and always begins with the letters “pc1”.
+Here is an example of an address on the Pactus blockchain:
+
+
pc1p4e92hx0erqyx939crndvthvpn7qcdhefc9r6s7
+
+
+
Address Structure
+
+
An address in the Pactus blockchain is made up of 21 bytes and it is derived from the public key.
+The first byte of the address specifies the address type,
+while the remaining 20 bytes represent the hash of the public key.
+The hash function used is RIPEMD-160 ,
+which is applied after Blake2b ):
+The resulting byte array is then converted into a bech32m string.
+
+
+
+
Address Type
+
+
The address type specifies the type of the address and its defined as below:
+
+
+ 0: Treasury address
+ 1: Validator address
+ 2: Account address
+
+
+
Treasury Address
+
+
The Treasury address on the Pactus blockchain is a fixed address that is defined as follows:
+
+
TreasuryAddress: 000000000000000000000000000000000000000000
+
+
+
The address type for the Treasury address is set to zero, which
+means there is no key associated with the Treasury address.
+The remaining characters of the address are all zeros.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/blockchain/block/index.html b/learn/blockchain/block/index.html
new file mode 100644
index 000000000..020f0476d
--- /dev/null
+++ b/learn/blockchain/block/index.html
@@ -0,0 +1,788 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Block | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Block
+
+
In the Pactus, a block is a set of data that contains a header, the certificate of the previous block
+and list of the transactions.
+Once a block comes with a valid certificate, it is committed and added to the blockchain, and
+the certificate will be included in the next block.
+A committed block is immutable, and any modifications to the block will invalidate the certificate.
+
+
+
+
+
+
The block header is a data structure in the Pactus blockchain that contains important information about
+the block.
+
+
The block header is 138 bytes long and consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 1 byte
+ Version
+
+
+ 4 bytes
+ Timestamp
+
+
+ 32 bytes
+ Previous Block Hash
+
+
+ 32 bytes
+ State Hash
+
+
+ 48 bytes
+ Sortition Seed
+
+
+ 21 bytes
+ Proposer Address
+
+
+
+
+
+ Version is used to track the software or protocol upgrade, and the current block version is set to 1.
+ Timestamp is the time of the block as the number of seconds since January 1, 1970 (Unix Epoch).
+ Previous Block Hash is the hash of the previous block in the blockchain.
+ State Hash is the state hash of the blockchain at this block.
+The State Hash ensures that all nodes in the network have the same state.
+ Sortition Seed is a verifiable and unpredictable seed data used by
+the sortition algorithm.
+ Proposer Address is the address of the validator who created and proposed the block.
+
+
+
Block Certificate
+
+
A block certificate is a proof of commitment for the block in the Pactus blockchain.
+It is the result of the Pactus consensus algorithm and ensures that the block has been agreed upon by committee members.
+
+
The block certificate consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 4 bytes
+ Height
+
+
+ 2 bytes
+ Round
+
+
+ Variant
+ Committers
+
+
+ Variant
+ Absentees
+
+
+ 48 bytes
+ Signature
+
+
+
+
+
+ Height is the height of the certified block.
+ Round is the consensus round in which this certificate was issued.
+If a proposer fails to propose a block in one round, another validator takes over as the proposer,
+and the round number is increased.
+ Committers is the list of validator numbers in the committee for the current certificate..
+ Absentees is the list of validator numbers that are absent in the committee.
+ Signature is the signature for the certificate that ensures the majority of the committee members have validated and
+signed the proposed block.
+
+
+
Transactions
+
+
Each block in the Pactus blockchain contains a list of transactions.
+The maximum number of transactions in a block is determined by the
+consensus parameters , and currently set to 1000.
+The first transaction in each block is the reward transaction .
+Once a block is committed and added to the blockchain, all the transactions inside the block will be executed.
+This means that the state of the blockchain will be updated based on the transactions in the committed block.
+
+
Block Hash
+
+
The block hash is a unique identifier for each block, which is computed by hashing the following data:
+
+
+ Block header data (138 bytes)
+ Previous certificate hash (32 bytes)
+ Merkle root hash of transactions (32 bytes)
+ Number of transactions (variant)
+
+
+
The previous certificate hash and the Merkle root hash of transactions are included in the block hash to
+ensure that they cannot be modified.
+The block hash is used to link the blocks together in the blockchain.
+
+
FAQ
+
+
Is there any empty block in Pactus?
+
+
There is no completely empty block in Pactus.
+Each block contains at least one transaction, which is the reward transaction.
+
+
How are certificates issued?
+
+
In the Pactus blockchain, a validator called a Proposer is responsible for collecting all transactions and
+creating a block every 10 seconds.
+The Proposer broadcasts the proposed block to other validators inside the committee.
+Other validators verify the proposed block, and if it is valid, they cast their votes in favor of the proposed block by
+signing the combination of the block hash and the consensus round.
+More details about the consensus mechanism can be found in the
+consensus protocol document.
+
+
To issue a valid certificate, signatures from validators who hold more than ⅔ of the stake in
+the committee are required.
+Once enough votes are collected, the signatures are aggregated and combined into a single signature, and
+the certificate is issued.
+
+
How are certificates verified?
+
+
To verify a certificate for a block, the block hash is computed, and
+the aggregated public key can be formed using the Committers and Absentees list.
+Then, the signature can be verified using the aggregated public key and
+the aggregated signature inside the certificate.
+
+
+
+
+
+
+
+
+
diff --git a/learn/blockchain/cryptography/index.html b/learn/blockchain/cryptography/index.html
new file mode 100644
index 000000000..cbf2e1011
--- /dev/null
+++ b/learn/blockchain/cryptography/index.html
@@ -0,0 +1,651 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Cryptography | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Cryptography
+
+
The Pactus blockchain employs various advanced cryptographic algorithms, including hashing and signature schemes,
+to protect user data and transactions.
+
+
Hashing Algorithm
+
+
Pactus uses a hashing algorithm called Blake2b .
+This algorithm is known for being a fast and secure way of creating unique digital fingerprints of data.
+
+
Digital Signature
+
+
To ensure secure transactions, Pactus uses a signature scheme called
+BLS (Boneh–Lynn–Shacham)
+threshold signature for cryptographic signing and verification.
+
+
Signature Aggregation
+
+
One of the advantages of BLS signatures is signature aggregation. BLS individual signatures can be
+combined into one single aggregated signature, so that the overall size does not grow beyond one
+signature.
+
+
Non-Malleability
+
+
BLS signatures have an important property called non-malleability,
+which means that it is impossible to generate two valid signatures for the same message.
+In other words, each message has a unique signature, and signatures cannot be altered without invalidating the signature.
+
+
+
+
+
+
+
+
+
diff --git a/learn/blockchain/genesis/index.html b/learn/blockchain/genesis/index.html
new file mode 100644
index 000000000..8210d1ce7
--- /dev/null
+++ b/learn/blockchain/genesis/index.html
@@ -0,0 +1,673 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Genesis | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Genesis
+
+
The Pactus blockchain starts from scratch, with no pre-existing accounts or pre-allocated coins.
+Its starting point is known as the genesis block, which is created by the bootstrap validators.
+
+
Bootstrapping
+
+
The Pactus blockchain starts with four bootstrap validators.
+These bootstrap validators do not have any stake, however their voting power is set to one within the consensus algorithm.
+Their primary role is to initiate the blockchain during a brief period known as the bootstrapping phase.
+As the bootstrapping phase progresses, these validators are able to earn rewards,
+which they can later use to invite other validators to join the network.
+
+
Once the network reaches 51 validators, the bootstrap validators will retire, and
+the blockchain will be secured by other validators.
+
+
Genesis Block
+
+
The genesis block is the first block in the Pactus blockchain, and it is created by the bootstrap validators.
+This block marks the beginning of the blockchain and serves as the foundation for subsequent blocks.
+
+
The previous block hash in the genesis block sets to 0,
+indicating that it has no predecessor.
+Additionally, the genesis block does not have a previous certificate.
+
+
+
+
In Pactus, the Genesis Information is pre-defined and indicates the initial state of the network.
+These parameters are hardcoded into the project and include:
+
+
+ Genesis Time This is the time when the genesis block should be created.
+The bootstrap validators must be operational before this time.
+ Consensus Parameters : The initial consensus parameters
+are defined at genesis time and ensure that the entire network operates within the same configuration.
+These consensus parameters are discussed in detail in the consensus section of the documentation.
+ Treasury Account : The treasury account
+holds 21 million coins at the genesis time. Each coin is divided into 1 billion units.
+ Reserved Accounts : Reserved account are defined at the Genesis time and at total they have 21 milion coins.
+These coins are reserved and the main purpise is to support the project over time.
+ Bootstrap Validators The bootstrap validators are defined by their public keys.
+
+
+
FAQ
+
+
+
+
You can find the pre-defined Genesis Information for the Testnet of the Pactus blockchain in the genesis.json
file,
+which is located in the project repository, here .
+
+
+
+
+
+
+
+
+
diff --git a/learn/blockchain/incentive/index.html b/learn/blockchain/incentive/index.html
new file mode 100644
index 000000000..65e033423
--- /dev/null
+++ b/learn/blockchain/incentive/index.html
@@ -0,0 +1,691 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Incentive | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Incentive
+
+
+ The incentive may help encourage nodes to stay honest.
+
+ Satoshi Nakamoto
+
+
+
In Pactus, rewards are given to validators for collecting valid transactions and creating new blocks.
+These rewards serve as an incentive for validators to participate in the consensus process and
+maintain the security and integrity of the network.
+
+
Flat Reward
+
+
To better understand the incentive model in Pactus, let’s compare it with the Bitcoin reward model.
+This comparison will help to understand how the incentive model works in Pactus.
+
+
+
+
+ Pactus
+ Bitcoin
+
+
+
+
+ Consensus engine is Proof of Stake
+ Consensus engine is Proof of Work
+
+
+ Exactly every 10 seconds one block is minted
+ Around every 10 minutes one block is mined
+
+
+ Total supply is 42,000,000 coin
+ Total supply is 21,000,000 coin
+
+
+ Always one coin per block
+ Initial block reward is 50 coin
+
+
+ No halving
+ Halving happens every 4 years
+
+
+
+
+
The halving mechanism in Bitcoin rewards early contributors more significantly.
+However, in a Proof-of-Stake blockchain, this mechanism can lead to wealth centralization,
+as early validators gain too much power based on their staked coins.
+
+
To promote fairer block rewards, Pactus has introduced a simple and straightforward incentive model called the “Flat Reward.”
+In this model, the block reward remains constant at one coin per block and does not change over time.
+
+
+
+
+
+
Coin Distribution
+
+
In Pactus, the coin distribution is linear. This linear distribution is a direct result of the Flat Reward system.
+Unlike other blockchains that have a curved distribution, Pactus maintains a consistent coin distribution.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/blockchain/serialization/index.html b/learn/blockchain/serialization/index.html
new file mode 100644
index 000000000..8c2bb2ffc
--- /dev/null
+++ b/learn/blockchain/serialization/index.html
@@ -0,0 +1,776 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Data Serialization | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Data Serialization
+
+
Data serialization is the process of converting data into a format that can be easily stored or transmitted over a network.
+It typically involves encoding data into a sequence of bytes, which can later be decoded to
+reconstruct the original data structure.
+Pactus has two methods for data serialization: Deterministic serialization and CBOR serialization:
+
+
Deterministic Serialization
+
+
Pactus uses a deterministic serialization for the deterministic data like blocks and transactions.
+The serialization format for different types of data is listed in the table below:
+
+
+
+
+ Data Type
+ Size (bytes)
+ Description
+
+
+
+
+ uint8
+ 1
+ An 8 bits unsigned integer
+
+
+ int8
+ 1
+ An 8 bits signed integer
+
+
+ uint16
+ 2
+ A 16 bits unsigned integer
+
+
+ int16
+ 2
+ A 16 bits signed integer
+
+
+ uint32
+ 4
+ A 32 bits unsigned integer
+
+
+ int32
+ 4
+ A 32 bits signed signed integer
+
+
+ uint64
+ 8
+ A 64 bits unsigned integer
+
+
+ int64
+ 8
+ A 64 bits signed signed integer
+
+
+ VarInt
+ Variable
+ A compact representation of an unsigned integer.
+
+
+ VarByte
+ Variable
+ A variable length bytes
+
+
+ VarString
+ Variable
+ A variable length string
+
+
+ Address
+ 21
+ 21 bytes of address data
+
+
+ Hash32
+ 32
+ 32 bytes of hash data
+
+
+
+
+
VarInt
+
+
Variable length integer (VarInt) is encoded by 7-bit chunks. The MSB indicates whether there are
+more octets (1) or it is the last one (0). It means 0x00
to 0x7f
encoded in 1 byte, 0x80
to
+0x3fff
encoded in 2 bytes, …
+
+
Example:
+
+
0x0f -> 0f
+0x1000 -> 8020
+0xffff -> ffff03
+0xffffff -> ffffff07
+
+
+
VarByte
+
+
Variable length byte (VarByte) is encoded as a variable length integer (VarInt) containing the
+length of the array followed by the bytes themselves: VarInt(len(bytes)) || bytes
+
+
VarString
+
+
Variable length string (VarString) is encoded as a variable length integer (VarInt) containing the
+length of the string followed by the bytes that represent the string
+itself:VarInt(len(str)) || str
+
+
Byte Order
+
+
All the internal number representation are in little-endian byte order.
+
+
Example
+
+
Here is an example of a block header data that encoded using deterministic serialization:
+
+
+
+
+
CBOR Serialization
+
+
For non-deterministic data, such as networking messages, Pactus uses
+“Concise Binary Object Representation” or CBOR .
+CBOR is a binary data serialization format that is widely used in various application,
+including IoT, web services, security, and automotive, due to its compact representation and efficient parsing.
+
+
CBOR Me!
+
+
cbor.me
+is an online tool for encoding and decoding CBOR data, offering developers an easy way to test and
+validate their CBOR data without having to set up a local environment.
+
+
Example
+
+
Here is an example of a vote message that encoded using CBOR .
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/blockchain/state-hash/index.html b/learn/blockchain/state-hash/index.html
new file mode 100644
index 000000000..7dc002790
--- /dev/null
+++ b/learn/blockchain/state-hash/index.html
@@ -0,0 +1,683 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ State Hash | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
State Hash
+
+
The State Hash is used to ensure the integrity of the data in the Pactus blockchain.
+It serves as a unique identifier or fingerprint of the current state of the blockchain,
+allowing all nodes to verify that their data matches that of the other nodes.
+This helps to prevent any tampering or inconsistencies in the data, ensuring the accuracy and consistency of the blockchain.
+
+
Merkle Tree
+
+
+ In cryptography and computer science, a hash tree or Merkle tree is a tree in which every leaf node
+is labelled with the cryptographic hash of a data block, and every non-leaf node is labelled with
+the cryptographic hash of the labels of its child nodes. Hash trees allow efficient and secure
+verification of the contents of large data structures.
+
+ From Wikipedia
+
+
+
A Hash tree or Merkle tree is a data structure that used by many blockchains to solve this problem:
+“How can data be securely stored and verified in a decentralized network?”
+
+
By using a Merkle tree, nodes can easily verify that they store the same data
+without having to share the entire dataset. Additionally, this helps to prevent any tampering with the data,
+as any changes made to the data would cause inconsistencies in the Merkle tree and
+can be easily detected by the network.
+
+
State Merkle Trees
+
+
In Pactus, the Merkle tree is used to verify the state of the blockchain in each block.
+The state hash in each block is calculated by taking the hash of two Merkle trees:
+the accounts Merkle tree and the validators Merkle tree.
+Each leaf in these trees contains the hash of the associated account or validator.
+By using the state hash, all nodes in the network can ensure they have the same data stored.
+
+
+
+
Scalability of Merkle Tree
+
+
Using a Merkle tree to calculate the state of the blockchain can be challenging
+because when the number of accounts is large, calculating the root hash can be difficult.
+In other words, a simple Merkle tree may not be scalable because calculating all the leaf
+and node hashes requires a significant amount of computation.
+
+
In Pactus, all accounts and validators have unique and sequential numbers.
+This means that each account and validator has a dedicated account number that helps us to
+calculate the hash of leaf nodes in the Merkle tree.
+By using these account numbers, we can ensure that the position of the leaf nodes in
+the Merkle tree is always the same.
+This approach allows us to avoid rebuilding the Merkle tree whenever an account or validator’s state changes.
+Instead, we can save the previous Merkle tree and recalculate the parent hashes by
+fetching neighbor hashes as needed.
+This helps to ensure scalability and reduces the computational resources required for recalculating the Merkle tree.
+
+
+
+
In this example, only account 6 has been updated.
+By locating the corresponding leaf node in the existing Merkle tree and
+traversing the tree towards the root node, we can calculate new root hash.
+This approach has a complexity of \(O(log n)\), making it efficient for large numbers of accounts.
+
+
+
+
+
+
+
+
+
diff --git a/learn/blockchain/validator/index.html b/learn/blockchain/validator/index.html
new file mode 100644
index 000000000..8f3ce0d8a
--- /dev/null
+++ b/learn/blockchain/validator/index.html
@@ -0,0 +1,679 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Validator | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Validator
+
+
A Validator is an entity that participates in the consensus process by sharing its votes.
+Validators get rewarded for creating new blocks, and to become a Validator,
+they must “bond” or lock up a certain amount of coins as stake.
+The amount of stake held by validators determines their power in the consensus.
+
+
Validator Structure
+
+
The Validator structure is 120 bytes long and consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 96 bytes
+ Public Key
+
+
+ 4 bytes
+ Number
+
+
+ 8 bytes
+ Stake
+
+
+ 4 bytes
+ Last Bonding Height
+
+
+ 4 bytes
+ Unbonding Height
+
+
+ 4 bytes
+ Last Joined Height
+
+
+
+
+
+ Public Key is the Validator’s public key.
+ Number is a sequential and unique number assigned to each validator when it is created for the first time.
+The validator number is used to calculate the state hash of the blockchain.
+ Stake holds the Validator’s stake or the amount of Pactus coins locked or “staked” by the Validator.
+ Bonding Height is the last block height that the validator has bonded their stake.
+ Unbonding Height is the block height that the validator’s stake is unbonded.
+ Last Joined Height is the block height that the validator joined the committee.
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/consensus/committee/index.html b/learn/consensus/committee/index.html
new file mode 100644
index 000000000..eee991f3d
--- /dev/null
+++ b/learn/consensus/committee/index.html
@@ -0,0 +1,767 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Committee | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Committee
+
+
The committee is a group of 51 validators responsible for generating new blocks.
+Validators in the committee participate in the consensus algorithm by casting votes,
+with their voting power determined by their stake.
+While in the committee, validators cannot send Bond or Unbond transactions,
+meaning their voting power remains the same.
+The members of the committee changes randomly over time through Sortition transactions.
+Each block can contain zero or more Sortition transactions.
+
+
These rules are applied when committing sortition transactions:
+
+
+ A minimum of ⅔ of the total stake must be maintained in the committee.
+ If a validator is already in the committee, they will remain in the committee.
+ If a validator is not in the committee, the oldest validator will exit the committee.
+ Each validator should stay in committee at least for 51 blocks.
+
+
+
Proposer Selection
+
+
Proposer selection within the committee operates on a deterministic, clockwise rotation system.
+If a validator is unable to propose, for any reason, it stays within the committee, but
+the proposer’s role shifts to the next validator in the committee.
+
+
+
+
Adding Validators to the Committee
+
+
When a new validator joins the committee, they take a position before the current proposer.
+After the addition of a new validator, the committee adjusts to maintain the total number of validators at 51.
+This is achieved by removing the oldest validator from the committee,
+i.e., the one that has been in the committee for the longest time.
+
+
+
+
Security of the Committee
+
+
For an adversary to take control of the committee, they would need to control more than ⅔ of the stake within the committee.
+To assess the security of the committee, let’s assume all validators in the committee have the same voting power.
+In this case, an adversary would need to control more than ⅔ of the validators in the committee.
+
+
Now, let’s imagine an adversary holds 10% of the total stake.
+As a result, one of their validators can enter the committee every 10 blocks.
+In the first 10 blocks, one of the adversary’s validators enters the committee.
+In the next 10 blocks, another validator enters the committee, giving the adversary two validators within the committee.
+In the subsequent 10 blocks, another validator enters, but at the same time, the first validator leaves the committee.
+Therefore, an adversary with 10 10% of the total stake can have, on average, two validators in a committee of 51 validators.
+
+
Using the Poisson distribution ,
+we can estimate the probability of an adversary controlling ⅔ of the committee:
+
+
+
+
+ Adversarial Stake
+ Committee size
+ ⅔+ of committee
+ Adversarial committee members
+ Probability of controlling ⅔+
+
+
+
+
+ 15%
+ 21
+ 15
+ 3
+ \(5.46 \times 10^{-07}\)
+
+
+ 15%
+ 51
+ 35
+ 7
+ \(3.34 \times 10^{-14}\)
+
+
+ 15%
+ 99
+ 67
+ 14
+ \(1.41 \times 10^{-24}\)
+
+
+ 10%
+ 21
+ 15
+ 2
+ \(3.39 \times 10^{-09}\)
+
+
+ 10%
+ 51
+ 35
+ 5
+ \(1.90 \times 10^{-18}\)
+
+
+ 10%
+ 99
+ 67
+ 9
+ \(2.91 \times 10^{-35}\)
+
+
+ 5%
+ 21
+ 15
+ 1
+ \(2.81 \times 10^{-13}\)
+
+
+ 5%
+ 51
+ 35
+ 2
+ \(4.50 \times 10^{-31}\)
+
+
+ 5%
+ 99
+ 67
+ 4
+ \(1.09 \times 10^{-56}\)
+
+
+
+
+
FAQ
+
+
How can one know when a validator has joined the committee?
+
+
The height at which the validator joined the committee is recorded as the “Last Joined Height” field in
+the validator structure.
+Once a validator enters the committee, this field is set to the current height it
+evaluated the sortition proof.
+
+
Can a validator within the committee run the sortition algorithm?
+
+
A validator within the committee can run the sortition algorithm.
+If they generate a valid sortition transaction, the height of their entry into the committee is set
+to the current block height, allowing them to stay in the committee for a longer period.
+
+
+
+
+
+
+
+
+
diff --git a/learn/consensus/parameters/index.html b/learn/consensus/parameters/index.html
new file mode 100644
index 000000000..e7d68dcde
--- /dev/null
+++ b/learn/consensus/parameters/index.html
@@ -0,0 +1,665 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Consensus Parameters | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Consensus Parameters
+
+
Consensus parameters are a set of configurable settings that determine how the Pactus blockchain operates.
+These parameters are agreed upon by all validators in the network,
+ensuring that validators behave in the same way and that the network operates consistently.
+
+
Here is the list of the consensus parameters:
+
+
+ Block Version: The version number of the blockchain protocol.
+This is set to 1.
+ Block Time: The time interval in seconds between the creation of two consecutive blocks.
+This is set to 10 seconds, which means that a new block is created every 10 seconds.
+ Committee Size The number of validators in the committee.
+This is set to 51 validators.
+ Block Reward The fixed reward amount given to the validator who successfully creates and proposes a new block.
+This is set to 1,000,000,000, which is equivalent to one coin.
+ Time-to-Live Interval : The number of blocks that a transaction can remain unprocessed before
+it is removed from the transaction pool.
+This is set to 8640 blocks, which is almost one day.
+ Bond Interval : The minimum number of blocks that must elapse after a validator has submitted a bond transaction
+before they can participate in the consensus process and join the validator committee.
+This is set to 360 blocks, which is almost one hour.
+ Unbond Interval : The minimum number of blocks that must elapse after a validator has submitted
+an unbond transaction before
+they can withdraw their staked coins.
+This is set to 181440 blocks, which is almost 21 days.
+ Sortition Interval : The maximum number of blocks that a sortition transaction can remain valid and be included
+in a block.
+This is set to 7 blocks.
+ Fee Fraction : The fraction of transaction value that must be paid in order for a transaction to be included in a block.
+This is set to 0.0001 PAC, meaning that 0.01% of transaction value are awarded to the block proposer.
+ Minimum Fee : The minimum transaction fee that must be paid.
+This is set to 1,000 (satoshi), which is equivalent to 0.000001 PAC coin.
+ Maximum Fee : The maximum transaction fee that must be paid.
+This is set to 1,000,000 (satoshi), which is equivalent to 0.001 PAC coin.
+ Maximum Stake : The maximum amount of coins that can be staked by a validator.
+This is set to 1,000,000,000,000 (satoshi), which is 1000 PAC coins.
+ Minimum Stake : The minimum amount of coins that can be staked by a validator.
+This is set to 1,000,000,000 (satoshi), which is 1 PAC coins.
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/consensus/proof-of-stake/index.html b/learn/consensus/proof-of-stake/index.html
new file mode 100644
index 000000000..8a0f26119
--- /dev/null
+++ b/learn/consensus/proof-of-stake/index.html
@@ -0,0 +1,686 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Solid State Proof of Stake | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Solid State Proof of Stake
+
+
Proof of Stake is a way to secure a blockchain through requesting users to stake some amount of their coins.
+These stakeholders, called validators, are responsible to collect, validate and add transactions to the blockchain.
+The validators will be rewarded with native coins.
+
+
Unlike Proof of Work, which is based on competition, Proof of Stake is based on collaboration.
+Validators work together to manage the expansion of the blockchain.
+A Proof of Stake blockchain becomes more decentralized and secure as more validators participate in it.
+
+
An example
+
+
To understand how Proof of Stake works, imagine a community bank without any centralized authority.
+In this bank, users decide to run it together.
+Some of these users volunteer to collect, validate, and record transactions,
+ensuring that everything runs smoothly.
+
+
These volunteers, known as validators, must temporarily lock or freeze some of their money as a stake.
+This stake can’t be transferred or used.
+The more money a validator stakes, the more influence they have in the system.
+
+
From time to time, one of the validators is chosen by the others to collect all the recent transactions,
+bundle them together, and send a copy to the other validators.
+If a supermajority of the validators agree with the proposed bundle by signing it,
+the bundle will be committed to the bank’s ledger.
+
+
In this system, validators have no incentive to behave maliciously or dishonestly.
+If they do, they risk harming the bank’s reputation and the value of their own stakes as well.
+
+
Delegated Proof of Stake
+
+
In Proof of Stake, if the number of validators increases,
+the voting time will also increase, and this can lead to an inefficient consensus mechanism.
+In our community bank example, running the bank becomes more difficult as the number of validators increases.
+
+
To solve this problem, some blockchains use the concept of “delegators”.
+In Delegated Proof of Stake, users entrust their stakes to a small group of “delegates”.
+These delegates are responsible for validating transactions and creating blocks.
+The number of delegates is limited to ensure accountability and efficiency in the validation process.
+
+
+
+
The delegation model puts a lot of trust in the hands of a small number of delegates,
+which goes against the principle of “don’t trust, verify”.
+
+
Consensus without delegation or Solid State Proof of Stake (SSPoS)
+
+
Pactus introduced a mechanism that doesn’t rely on delegation, we call it Solid State Proof of Stake.
+It utilizes a dynamic committee of validators
+that are responsible for creating new blocks.
+The size of the committee is fixed, but the members of the committee are randomly changed.
+On the other hand, the number of validators outside the committee is unlimited, allowing anyone to
+become a validator by staking coins.
+
+
At each block, validators participate in a sortition algorithm
+by generating a random number between zero and the total staked coins.
+If the number is less than the validator’s stake, they can enter the committee and replaces the oldest committee member.
+
+
+
+
The chance of entering the committee depends on the validator’s stake and luck.
+But on average, one validator should enter the committee in each block.
+
+
+
+
+
+
+
+
+
diff --git a/learn/consensus/protocol/index.html b/learn/consensus/protocol/index.html
new file mode 100644
index 000000000..343c53c66
--- /dev/null
+++ b/learn/consensus/protocol/index.html
@@ -0,0 +1,887 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Consensus protocol | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
+ This post is obsolete. check
here for more information.
+
+
+
Consensus Protocol
+
+
Pactus consensus algorithm is a state machine
+replication with Byzantine fault tolerance.
+The Pactus consensus algorithm starts with the block creation phase.
+In this phase one validator acts as the proposer. The proposer collects all the transactions,
+creates a block, and proposes it to other validators.
+
+
When a proposed block is seen by other validators, they validate the block and
+cast their vote for the proposed block, moving to the “prepare” state.
+
+
If more than two-thirds (⅔) of the total stakes cast their votes, the proposed block becomes prepared,
+and validators move to the “precommit” state.
+
+
If, once again, more than two-thirds (⅔) of the total stakes cast their vote for the prepared block,
+the block is committed, and the next proposer is ready to propose a new block. This cycle repeats every 10 seconds.
+
+
If a proposer fails to propose in any round, other validators start the “change proposer” phase to
+decide to change the proposer for this round.
+
+
+
+
The Algorithm
+
+
There are \(R = 3f+1\) validators. where \(f\) is the maximum
+number of validators that may be faulty or byzantine. For example, if there is one faulty validator,
+the resiliency of the algorithm is optimal if we have at least \(3\) non-faulty
+validators. So the minimum number of validators should be \(3+1=4\).
+
+
We denote a message as \(\langle m \rangle\) tuple and a signed message by node \(i\) as
+\(\langle m \rangle_{\sigma_i}\).
+
+
Pactus consensus algorithms has two phases: Block creation phase and change proposer phase.
+
+
Block Creation
+
+
The block creation phase in Pactus consensus algorithm includes these three steps :
+Propose , Prepare and Precommit .
+The protocol proceeds in rounds \(r = 0, 1, 2, \ldots\).
+
+
Propose Step
+
+
In each round \(r\), one validator is the proposer and the others act as validators.
+The proposer \(p\) collects transactions and creates a proposal block \(B\). It signs and
+broadcasts a proposal message with the proposed block piggybacked to all the validators.
+Propose message has this form:
+
+\[\langle \langle \text{PROPOSE},h,r \rangle_{\sigma_p}, B \rangle\]
+
+
where:
+
+
+ \(B\) is the proposed block
+ \(h\) indicates the block height
+ \(r\) is an assigned round number, which is zero for the first round
+
+
+
Prepare Step
+
+
If validator \(i\) accepts the proposal, it enters prepare step and signs and
+broadcasts prepare message to all other validators. Otherwise, it does nothing.
+The prepare message has this form:
+
+\[\langle \text{PREPARE},h,r,d \rangle_{\sigma_i}\]
+
+
where:
+
+
+ \(d\) is digest or hash of proposed block \(B\)
+
+
+
If validator \(i\) received \(2f+1\) prepare messages from other
+validators (including its own), it becomes prepared and enters to precommit step.
+
+
Precommit Step
+
+
In precommit step, validator \(i\) signs and broadcasts precommit message to
+the other validators.
+The precommit message has this form:
+
+\[\langle \text{PRECOMMIT},h,r,d \rangle_{\sigma_i}\]
+
+
Each validator executes and commits block \(b\) after receiving
+\(2f+1\) precommit messages (including its own) and becomes committed .
+
+
Block Announcement
+
+
Each validator that receives a valid proposal and with \(2f+1\) precommit messages from other
+validators (including its own), can create a block-announce messages and broadcasts it to the network.
+The block-announce message has this form:
+
+\[\langle \text{BLOCK-ANNOUNCE} ,h ,r ,B, C \rangle\]
+
+
where:
+
+
+ \(C\) is the quorum certificate for the precommit step.
+
+
+
Validators can move to the next height and clear the message logs after receiving valid
+block-announce message, even if their timer has expired.
+
+
The picture below shows the operation of the algorithm in the normal case. validator 1 is the
+proposer and validator 4 is faulty.
+
+
+
+
Change Proposer
+
+
The change-proposer provides liveness by allowing the system to make progress when the proposer fails.
+The change-proposer phase is triggered by timeouts that
+prevent validators from waiting indefinitely for the proposal to execute.
+
+
If the timer of a validator expires in round \(r\), the validator starts a change-proposer phase.
+The change-proposer phase is an Asynchronous Byzantine Binary Agreement (ABBA) that is biased toward zero (No).
+It means that during this phase, even if they don’t have the proposal, honest validators may decide to vote zero
+if they obtain a valid quorum Certificate for the prepare step.
+
+
If a supermajority of the validators decide to change the proposer, they move to round \(r+1\). However,
+if they decide not to change the proposer, they will return to the prepare state and,
+since a supermajority of the validators attested to a valid proposal, they can commit the proposed block.
+
+
The change proposer phase in Pactus consensus algorithm includes these three steps:
+Pre-vote , Main-vote and Decide
+The protocol proceeds in rounds \(r_{cp} = 0, 1, 2, \ldots\).
+
+
Pre-vote Step
+
+
In Pre-vote step each validator casts a pre-vote for a value \(b \in \{0, 1\}\)
+and broadcasts pre-vote message to the network.
+The pre-vote message has this form:
+
+\[\langle\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle_{\sigma_i}, justification\rangle\]
+
+
The first round is a special round and each validator starts with an initial value.
+If the validator’s timer has expired in the prepare step, its initial value is zero,
+and if the validator’s timer has expired in the precommit step, its initial value is one.
+
+\[b = \begin{cases}
+1 & \text{if timer expired in prepare step,} \\
+0 & \text{if timer expired in precommit step.}
+\end{cases}\]
+
+
In the next rounds, each validator select \(2f+1\) properly justified main-votes from round \(r − 1\) and
+
+\[b = \begin{cases}
+0 & \text{if there is a main-vote for 0,} \\
+1 & \text{if there is a main-vote for 1,} \\
+0 (biased) & \text{if all main-votes are abstain.}
+\end{cases}\]
+
+
These pre-votes must be justified with a appropriate justification.
+For the first round, if the validator’s timer has expired in the prepare step, the justification is \(nil\) ,
+and if the validator’s timer expired in the precommit step,
+the justification is the proper quorum certificate for the prepare step at round \(r\).
+
+
In the next rounds, a pre-vote for \(b\) may be justified in two ways:
+
+
+ Hard : that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp}-1,b \rangle\)
+ Soft : that is the quorum certificate for \(\langle \text{CP:MAIN-VOTE},h,r,r_{cp}-1,abstain \rangle\)
+
+
+
Main-vote Step
+
+
After collecting \(2f+1\) valid and justified pre-votes, each validator casts a main-vote \(v \in \{0, 1, abstain\}\)
+and broadcasts main-vote message to the network.
+The main-vote message has this form:
+
+\[\langle\langle \text{CP:MAIN-VOTE},h,r,r_{cp},v \rangle_{\sigma_i}, justification\rangle\]
+
+
The main-vote value \(v\) determine as below:
+
+\[v = \begin{cases}
+0 & \text{if there are 2f+1 pre-vote for 0,} \\
+1 & \text{if there are 2f+1 pre-vote for 1,} \\
+abstain & \text{if there are pre-votes for 0 and 1.}
+\end{cases}\]
+
+
These main-votes must be justified with a appropriate justification.
+A main-vote for \(v\) may be justified in two ways:
+
+
+ Non-conflicting : that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle\)
+ Conflicting : that consists of the justifications for the two conflicting pre-votes.
+
+
+
Decide Step
+
+
After collecting \(2f+1\) valid and justified main-votes, each validator examines these votes. If all
+votes are for a value \(b \in \{0, 1\}\), then the validator decides \(b\), but continues to
+participate in the protocol for one more round. Otherwise, the validator proceeds to the next round \(r_{cp}+1\).
+
+
Comparison
+
+
Pactus consensus protocl doesn’t have any lcoking mechanism or
+checkpointing and there will at most one valid proposla per round.
+This ensures that each round can begin with a new proposal.
+
+
+
+
+ Protocol
+ Normal case
+ Faulty case
+
+
+ Steps
+ Complexity
+ Locking
+ Checkpointing
+
+
+
+
+ PBFT
+ 3
+ $$O(n^2)$$
+ No
+ Yes
+
+
+ Tendermint
+ 3
+ $$O(n^2)$$
+ Yes
+ No
+
+
+ HotStuff
+ 4
+ $$O(n)$$
+ Yes
+ No
+
+
+ Pactus
+ 3
+ $$O(n^2)$$
+ No
+ No
+
+
+
+
+
+
+
References:
+
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/consensus/sortition/index.html b/learn/consensus/sortition/index.html
new file mode 100644
index 000000000..a0b3baa2f
--- /dev/null
+++ b/learn/consensus/sortition/index.html
@@ -0,0 +1,783 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Sortition Algorithm | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Sortition Algorithm
+
+
The sortition algorithm is an important part of the Pactus blockchain, responsible for the fair, transparent
+and random selection of validators to join the committee .
+It utilizes a Verifiable Random Function, or VRF for short, to generate a verifiable random number.
+
+
The generated random number should be in the range of 0 to the total staked coins.
+If validators can prove that their generated number is less than their stake,
+they can send the sortition transaction .
+Once a sortition transaction is included in a block, the validator will join the committee,
+and the oldest validator in the committee will leave it.
+
+
Verifiable Random Function
+
+
Verifiable Random Function is a pseudo-random function that the owner of key \(s\) can evaluate \(v = f_s(x)\) and also provides
+\(proof_{x}\) efficiently proving that \(v\) is correct. We call such a mathematical
+object a verifiable pseudo-random function, VRF for brevity .
+
+
Pactus uses the BLS signature scheme as the source of VRF.
+Since BLS signatures are unique ,
+the hash of a BLS signature can be used to produce a secure and verifiable random number.
+
+
The VRF takes three parameters:
+
+
+ The secret key of the validator
+ The sortition seed
+ The total stake of the blockchain.
+
+
+
Once the VRF is executed, it produces an index with a proof.
+The index is a number between zero and the total staked coins, and the proof allows other validators to verify the correctness
+of the generated index.
+
+
The pseudocode below demonstrates the evaluation of the VRF for the sortition algorithm:
+
+\[\begin{align*}
+& \textbf{function} \ VRF(sk, seed, total\_stake) \\
+& \qquad pk \gets P_{BLS}(sk) \\
+& \qquad proof \gets S_{BLS}(sk, seed \| pk) \\
+& \qquad rnd \gets H(proof) \\
+& \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\
+& \qquad \\
+& \qquad \textbf{return} \ index, proof \\
+& \textbf{end function}
+\end{align*}\]
+
+
where:
+
+
+ \(sk\) is the secret key of the validator
+ \(seed\) is the sortition seed
+ \(total\_stake\) is the total stake of the blockchain
+ \(P_{BLS}\) is a cryptographic function that derives the public key from the secret key for the BLS signature
+ \(S_{BLS}\) is a cryptographic function that signs a message with the secret key for the BLS signature.
+ \(H\) is a cryptographic hash function that generates a number between \(0\)to \(2 ^{256}\)
+ \(\|\) denotes the concatenation of two values
+
+
+
To verify a sortition proof, both the validator’s public key and stake are required:
+
+\[\begin{align*}
+& \textbf{function} \ verifyVRF(pk, seed, proof, stake, total\_stake) \\
+& \qquad \textbf{if} \ V_{BLS}(pk, seed \| pk, proof) = True \ \textbf{then} \\
+& \qquad \qquad rnd \gets H(proof) \\
+& \qquad \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\
+& \qquad \\
+& \qquad \qquad \textbf{return} \ index \leqslant stake \\
+& \qquad \textbf{else} \\
+& \qquad \qquad \textbf{return} \ False \\
+& \qquad \textbf{end if} \\
+& \textbf{end function}
+\end{align*}\]
+
+
where:
+
+
+ \(V_{BLS}\) is a cryptographic function used to verify a signed message using the BLS signature scheme
+
+
+
There is no need to send \(index\) alongside \(proof\) because the
+result should be less than the validator’s stake, and the validator’s stake is known at each block.
+
+
Sortition Seed
+
+
The sortition algorithm relies on a random and publicly verifiable seed that cannot be manipulated by adversaries.
+Otherwise, adversaries may select a seed that favors the selection of corrupt users.
+
+
To prevent this, the BLS signature scheme is used to generate the sortition seed.
+Since BLS signatures are unique and deterministic, adversaries cannot generate more than one valid signature per block.
+In each block, the block proposer generates a new sortition seed based on the previous seed using the following function:
+
+\[\begin{align*}
+& \textbf{function} \ generateSeed(sk, prev\_seed) \\
+& \qquad \textbf{return} \ S_{BLS}(sk, H(prev\_seed)) \\
+& \textbf{end function}
+\end{align*}\]
+
+
Since the proposer’s public key is known, the seed for the next block can be easily verified.
+If the seed is invalid, the proposed block will be rejected.
+The verification function is as follows:
+
+\[\begin{align*}
+& \textbf{function} \ verifySeed(pk, prev\_seed, seed) \\
+& \qquad \textbf{return} \ V_{BLS}(pk, H(prev\_seed), seed) \\
+& \textbf{end function}
+\end{align*}\]
+
+
The sortition seed for the genesis block set to 0.
+
+
Sortition Probability
+
+
The Sortition probability refers to the expected number of validators that may join the committee in each block,
+assuming all validators are actively online and executing the sortition algorithm.
+
+
The probability of a validator \(i\) being selected depends on their stake relative to the total stake in the system:
+
+\[p_i=\frac{S_i}{S_t}\]
+
+
where:
+
+
+ \(p_i\) is the probability of validator \(i\) being selected
+ \(S_i\) is the stake of validator \(i\)
+ \(S_t\) is the total stake of all validators.
+
+
+
Therefore, the expected number of validators joining the committee at each block can be represented as:
+
+\[P=\sum_{i=1}^{n}{p_i}=\sum_{i=1}^{n}{\frac{S_i}{S_t}}=\frac{S_1+S_2+\ldots+S_n}{S_t}\]
+
+
where \(n\) is the total number of validators. We know that \(S_t={S_1+S_2+\ldots+S_n}\). Therefore we will have:
+
+\[P=\frac{S_t}{S_t}=1\]
+
+
Thus, on average, we expect one validator to join the committee at each block.
+In practice, the actual number of validators joining the committee in each block
+may differ due to the randomness in the sortition algorithm, or the possibility of some validators being offline.
+
+
FAQ
+
+
How is the total staked coin calculated?
+
+
The total staked coin in each block is calculated by summing the staked coins of all active validators.
+An active validator is a validator that has not yet unbonded .
+
+
How is the oldest validator determined?
+
+
The height at which the validator joined the committee is recorded as the “Last Joined Height” field in
+the validator structure.
+The validator with the lowest “Last Joined Height” is considered the oldest.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/consensus/specification/index.html b/learn/consensus/specification/index.html
new file mode 100644
index 000000000..0c3ed901e
--- /dev/null
+++ b/learn/consensus/specification/index.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Consensus specification | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Consensus Specification
+
+
Developing distributed and concurrent systems is a complex task that requires careful attention to the details.
+Testing such systems is challenging because it’s difficult to simulate all possible states,
+including those that can happen due to system failures, network latency, and other factors.
+This makes it hard to ensure that the system behaves correctly in all circumstances.
+
+
Therefore it’s essential to have a proactive approach that involves modeling the system’s behavior in a formal way.
+Such an approach can help identify potential issues before they occur, saving time and preventing costly flaws.
+
+
TLA+
+
+
TLA+ is a formal specification language developed by
+Leslie Lamport based on the idea of
+specifying systems using simple mathematics.
+It is used for designing, modelling, documentation, and verification of programs, especially concurrent and
+distributed systems.
+TLA+ and its tools are useful for eliminating fundamental design errors, which are hard to find and
+expensive to correct in code.
+
+
To know more about TLA+, check The TLA+ Home Page .
+
+
Pactus Consensus Spec
+
+
Pactus consensus specification
+has written in TLA+ format. It includes all invariants that can be held
+in every state of every execution that the protocol allows. The TLA+ specification is compiled into
+PDF file .
+
+
Safety Proof
+
+
By defining some invariants we can ensure the safety of the consensus
+protocol in any possible and
+distinct state, and therefore we have the informal safety proof of the Pactus consensus protocol using TLA+.
+
+
Liveness Proof
+
+
Checking the liveness is not easy, but with defining some constraints, we have the informal proof of
+liveness of Pactus consensus protocol using TLA+.
+
+
+
+
+
+
+
+
+
diff --git a/learn/index.html b/learn/index.html
new file mode 100644
index 000000000..b7ee4b253
--- /dev/null
+++ b/learn/index.html
@@ -0,0 +1,504 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Learn | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Learn
+
+
Here you can find the technical documentations for the Pactus project.
+
+
Table Of Content
+
+
+
+
+ Blockchain
+
+
+
+
+ Consensus
+
+
+
+
+ Transaction
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/smart-contract/storage/index.html b/learn/smart-contract/storage/index.html
new file mode 100644
index 000000000..e838fcf3d
--- /dev/null
+++ b/learn/smart-contract/storage/index.html
@@ -0,0 +1,740 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Storage as file | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Storage as file
+
+
Motivation
+
+
Ethereum friendly blockchains keep storage in a separate key/value database per request. This has
+some drawbacks:
+
+
+ Since there is a global database that stores all storages, the storage key is a combination of
+\(Key_{contract} + Key_{item}\) that is a bit messy.
+ Storage data can’t have any meta data, because they are scattered in different places in the
+key/value database.
+ Storages per smart contract can’t be Merklized. Ethereum came with another solution to calculate
+the hash of the whole storage. They defined a hexary Patricia tree that is quite
+suboptimal .
+
+
+
Here we discuss how we can address the above issues by dedicating a separate file as Storage
+File per smart contract. In this scenario, users should purchase the storage file with required
+capacity before deploying the smart contract. Once the purchase is done, a separate empty file will
+be created and dedicated for the user. The size of the file is the same as the purchase size. For
+example users can purchase 10 MB or 120 MB of storage files depending on their need and renew them
+yearly.
+
+
Structure
+
+
Each storage file has three parts: Header, ByteCodes and contract storage.
+
+
+
+
The Header of the storage file keeps some meta data like storage file index, last payment time,
+total storage size, etc. In the ByteCodes section the byte codes of the smart contract will be saved
+and in the storage section, the actual storage of the smart contract will be stored.
+
+
Storage APIs
+
+
Smart contracts can only change data in storage sections. To achieve that the smart contract
+executer (virtual machine) should introduce these APIs:
+
+
/// This API requests the host to read the slice of `data` from the storage file
+/// at the given `offset`.
+fn read ( & self , offset : u32 , data : & mut [ u8 ]) -> Result < (), HostError > ;
+
+/// This API requests the host to write the slice of `data` into the storage file
+/// at the given `offset`
+fn write ( & self , offset : u32 , data : & [ u8 ]) -> Result < (), HostError > ;
+
+
+
+
These APIs are similar to SLoad
and SStore
opcodes in Ethereum Virtual Machine (EVM). But
+instead of key and value, they accept offset and data parameters.
+
+
Storage Allocation
+
+
In order to allocate storage space safely and efficiently user can use these predefined methods:
+
+
/// Allocates storage space with the specific `length` and returns the
+/// offset of allocated space in the storage file.
+pub fn allocate ( & self , length : u32 ) -> Result < Offset , Error > ;
+
+/// Deallocates the storage space at the specific `offset` and `length`
+pub fn deallocate ( & self , offset : Offset , length : u32 ) -> Result < (), Error > ;
+
+
+
Storage Stack
+
+
There is a fixed stack with 32 elements at the beginning of the storage . The first item in this
+stack is reserved and used for managing deallocated storage spaces. Users can use other stack items
+to keep the offset of the allocated spaces for the smart contract variables.
+
+
+
+
Data Collections
+
+
Usually in smart contracts developers are interested in data collections like Search Trees or Hash
+Tables to look up values by the associated keys. Most programming languages come up with some
+builtin collections, however we can’t use them in smart contracts because they use RAM that is
+inconsistent. However we can have storage equivalent of these data collections that instead of
+dealing with memory they are dealing with the storage file. You can naively consider storage as
+dedicated consistent memory for the smart contract.
+
+
Right now these data collection is available to use inside the smart contract: StorageVector
,
+StorageString
, StorageLinkedList
, StorageBST
and StorageHasTable
.
+
+
+
+
Merklizing Storage
+
+
To make sure all the nodes have the same state we need to calculate the hash of all storage files.
+Merkle tree can help us to easily calculate the root hash very fast. We need two Merkle trees, one
+for calculating the root hash of each storage file and the second for calculating the root hash of
+all storage files.
+
+
Single storage file Merkle tree
+
+
We can divide each file into small chunks of data and calculate the hash of each chunk once. Since
+we know exactly which chunk has changed after executing the smart, contract we can easily
+reconstruct the tree and calculate the merkle root again.
+
+
Whole storage Merkle tree
+
+
Each file has a unique index. With using that index we can make sure that the position of the leaf
+nodes in the Merkle tree is always the same. The same technique we used for calculating the
+state hash .
+
+
+
+
Example
+
+
As an example we have implemented the ERC20 smart contract based on this idea. The implementation
+can be found here
+
+
Testing
+
+
One of the consequences of Storage as File is that testing smart contracts becomes easier. What we
+need is only to mock the storage file.
+
+
+
+
+
+
+
+
+
diff --git a/learn/transaction/bond/index.html b/learn/transaction/bond/index.html
new file mode 100644
index 000000000..262b8d0cb
--- /dev/null
+++ b/learn/transaction/bond/index.html
@@ -0,0 +1,671 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Bond Transaction | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Bond Transaction
+
+
Bond transaction is used to bond stake to a validator .
+If the validator does not exist, it will be created.
+Once a bond transaction committed, the validator cannot participate in the
+sortition algorithm for 1 hour.
+This is called the “bond interval” and is defined in the
+consensus parameter .
+
+
Payload Structure
+
+
The bond transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Sender address
+
+
+ 21 bytes
+ Receiver address
+
+
+ 96 bytes (optional)
+ Public key
+
+
+ Variant
+ Amount
+
+
+
+
+
+ Sender address is the address of the sender account .
+ Receiver address is the address of the receiver validator.
+ Public key is the validator’s public key. If the validator does not exist yet,
+the public key should be set, otherwise it should left empty.
+ Amount is the amount of coins that should be staked or bonded.
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/transaction/fee/index.html b/learn/transaction/fee/index.html
new file mode 100644
index 000000000..a7c39915a
--- /dev/null
+++ b/learn/transaction/fee/index.html
@@ -0,0 +1,673 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transaction Fee | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Transaction Fee
+
+
Transaction fees in the Pactus blockchain are calculated using a percentage-based fee model.
+The fee is a percentage of the transferred amount, within a minimum and maximum range.
+The percentage, minimum fee, and maximum fee parameters are part of the blockchain
+consensus parameters .
+
+
The formula to calculate the transaction fee is as follows:
+
+
+
+\[\begin{align*}
+fee = amount \times percentage \\
+\\
+fee =
+\begin{cases}
+ & fee_{min} & \textbf{ if } \ fee < fee_{min} \\
+ & \\
+ & fee_{max} & \textbf{ if } \ fee > fee_{max} \\
+ & \\
+ & fee & \textbf{otherwise}
+ \end{cases}
+\end{align*}\]
+
+
Examples
+
+
Currently, the fee fraction or percentage is set to 0.01%, the minimum fee is set to 0.000,001 coin,
+and the maximum fee is set to 0.001 coin.
+
+
+ If Alice wants to transfer 2 coins to Bob, she needs to pay 0.000,2 coins as transaction fee.
+ If Alice wants to transfer 0.000,2 coins to Bob, she needs to pay 0.000,001 coins as transaction fee.
+ If Alice wants to transfer 20 coins to Bob, she needs to pay 0.001 coins as transaction fee.
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/transaction/format/index.html b/learn/transaction/format/index.html
new file mode 100644
index 000000000..d776a2410
--- /dev/null
+++ b/learn/transaction/format/index.html
@@ -0,0 +1,710 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transaction Format | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
+
+
Transactions in Pactus consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 1 byte
+ Version
+
+
+ 4 bytes
+ Lock Time
+
+
+ Variant
+ Fee
+
+
+ Variant
+ Memo
+
+
+ 1 byte
+ Payload Type
+
+
+ Variant
+ Payload Data
+
+
+ 48 bytes
+ Signature
+
+
+ 96 bytes
+ Public Key
+
+
+
+
+
+ Version is the version of the transaction format. Different versions may have different fields or
+a different layout, and the current transaction version is set to 1.
+ Lock Time specifies the block number at which the transaction can be unlocked.
+ Fee contains the fee paid by the sender to the network for processing the transaction.
+The fee is calculated based on the percentage fee model.
+ Memo is an optional message that can be included in the transaction.
+The message can be used to provide additional information about the transaction or to communicate with the recipient.
+The maximum size of the memo is 64 characters that is defined in the
+consensus parameters
+ Payload Type specifies the type of the transaction payload.
+Depending on the payload type, the payload data field is decoded differently.
+ Payload Data contains the actual data payload of the transaction.
+The payload data varies depending on the payload type.
+ Signature contains a cryptographic signature created by the sender using their private key.
+The signature is used to ensure that the transaction has not been tampered with and that it was indeed created by the sender.
+ Public Key contains the public key of the sender.
+The public key is used to verify that the sender has the authority to create the transaction.
+The sender’s address should be derived from this public key.
+
+
+
Payload Type
+
+
The payload type field determines the format of the payload data field in the transaction.
+Different payload types have different formats for the payload data.
+The following are the supported transactions in Pactus blockchain:
+
+
+ Transfer transaction
+ Bond transaction
+ Sortition transaction
+ Unbond transaction
+ Withdraw transaction
+
+
+
Transaction ID
+
+
The Transaction ID is a unique identifier for a transaction on the blockchain.
+It is generated by taking the hash of the transaction data without including the public key and signature fields.
+
+
+
+
+
+
+
+
+
diff --git a/learn/transaction/sortition/index.html b/learn/transaction/sortition/index.html
new file mode 100644
index 000000000..5f254e5ea
--- /dev/null
+++ b/learn/transaction/sortition/index.html
@@ -0,0 +1,661 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Sortition Transaction | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Sortition Transaction
+
+
Sortition transaction is used to enter a validator
+in the committee .
+By committing a sortition transaction, the validator will enter the committee.
+Sortition transactions are valid for 7 blocks, which is defined as “sortition interval” in the
+consensus parameters .
+
+
Payload Structure
+
+
The sortition transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Address
+
+
+ 48 bytes
+ Sortition Proof
+
+
+
+
+
+ Address is the address of the validator that evaluated the sortition
+ Sortition Proof is the proof of evaluating the sortition
+
+
+
Validators do not need to pay a fee for sortition transactions, and the fee should be set to zero.
+
+
+
+
+
+
+
+
+
diff --git a/learn/transaction/transfer/index.html b/learn/transaction/transfer/index.html
new file mode 100644
index 000000000..4c20e8d7b
--- /dev/null
+++ b/learn/transaction/transfer/index.html
@@ -0,0 +1,675 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transfer Transaction | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Transfer Transaction
+
+
Transfer transaction is used to transfer coins between the accounts .
+If the receiver account does not exist, it will be created.
+
+
Payload Structure
+
+
The transfer transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Sender address
+
+
+ 21 bytes
+ Receiver address
+
+
+ Variant
+ Amount
+
+
+
+
+
+ Sender address is the account address that transfers the amount
+ Receiver address is the account address that receives the amount
+ Amount is the amount of coins that should be transferred
+
+
+
Reward Transaction
+
+
The reward transaction is the first transaction in each block. There is only one reward transaction
+per block, and it has the same format as a transfer transaction, but with zero fees and no signature.
+
+
The sender address is the Treasury address ,
+and the receiver address is defined by the block proposer.
+The amount of the reward transaction should be equal to the
+block reward plus transaction fees.
+This amount will go to the proposer account as a block reward.
+Therefore, in each block, one coin from the
+Treasury account transfers to
+the proposer account as a block reward.
+
+
+
+
+
+
+
+
+
diff --git a/learn/transaction/unbond/index.html b/learn/transaction/unbond/index.html
new file mode 100644
index 000000000..0faeaa665
--- /dev/null
+++ b/learn/transaction/unbond/index.html
@@ -0,0 +1,652 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Unbond Transaction | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Unond Transaction
+
+
Unbond transaction is used to unbond a validator .
+An unbonded validator cannot participate in the sortition algorithm anymore, and after 21 days, the stake can be withdrawn.
+This is called the “unbond interval” and is defined in the consensus parameter .
+
+
Payload Structure
+
+
The unbond transaction has a payload consists the following field:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Validator address
+
+
+
+
+
+ Validator address is the address of validator that is unbonded.
+
+
+
+
+
+
+
+
+
+
diff --git a/learn/transaction/withdraw/index.html b/learn/transaction/withdraw/index.html
new file mode 100644
index 000000000..84c63df96
--- /dev/null
+++ b/learn/transaction/withdraw/index.html
@@ -0,0 +1,661 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Withdraw Transaction | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Withdraw Transaction
+
+
Withdraw transaction is used to withdraw the staked coins from an unbonded
+validator
+
+
Payload Structure
+
+
The withdraw transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Sender address
+
+
+ 21 bytes
+ Receiver address
+
+
+ Variant
+ Amount
+
+
+
+
+
+ Sender address is the address of the sender validator.
+ Receiver address is the address of the receiver account .
+ Amount is the amount of coins that should be withdrawn
+
+
+
+
+
+
+
+
+
+
diff --git a/mstile-150x150.png b/mstile-150x150.png
new file mode 100644
index 000000000..6c2539a90
Binary files /dev/null and b/mstile-150x150.png differ
diff --git a/robots.txt b/robots.txt
new file mode 100644
index 000000000..0097513b3
--- /dev/null
+++ b/robots.txt
@@ -0,0 +1 @@
+Sitemap: https://pactus.org/sitemap.xml
diff --git a/safari-pinned-tab.svg b/safari-pinned-tab.svg
new file mode 100644
index 000000000..43c436d31
--- /dev/null
+++ b/safari-pinned-tab.svg
@@ -0,0 +1,27 @@
+
+
+
+
+Created by potrace 1.14, written by Peter Selinger 2001-2017
+
+
+
+
+
diff --git a/site.webmanifest b/site.webmanifest
new file mode 100644
index 000000000..c00b17332
--- /dev/null
+++ b/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-256x256.png",
+ "sizes": "256x256",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/sitemap.xml b/sitemap.xml
new file mode 100644
index 000000000..0c9b8774d
--- /dev/null
+++ b/sitemap.xml
@@ -0,0 +1,272 @@
+
+
+
+https://pactus.org/2022/08/29/dev-meeting.html
+2022-08-29T00:00:00+00:00
+
+
+https://pactus.org/2022/09/04/dev-meeting.html
+2022-09-04T00:00:00+00:00
+
+
+https://pactus.org/2022/09/18/dev-meeting.html
+2022-09-18T00:00:00+00:00
+
+
+https://pactus.org/2022/09/20/release-0-9-0.html
+2022-09-20T00:00:00+00:00
+
+
+https://pactus.org/2022/09/24/testnet-0-launched.html
+2022-09-24T00:00:00+00:00
+
+
+https://pactus.org/2022/10/30/dev-meeting.html
+2022-10-30T00:00:00+00:00
+
+
+https://pactus.org/2022/11/24/release-0-9-1.html
+2022-11-24T00:00:00+00:00
+
+
+https://pactus.org/2023/03/01/what-is-testnet.html
+2023-03-01T00:00:00+00:00
+
+
+https://pactus.org/2023/04/21/testnet-0-concluded.html
+2023-04-21T00:00:00+00:00
+
+
+https://pactus.org/2023/05/08/release-0-10-0.html
+2023-05-08T00:00:00+00:00
+
+
+https://pactus.org/2023/05/09/testnet-1-launched.html
+2023-05-09T00:00:00+00:00
+
+
+https://pactus.org/2023/05/29/release-0-11-0.html
+2023-05-29T00:00:00+00:00
+
+
+https://pactus.org/2023/06/19/release-0-12-0.html
+2023-06-19T00:00:00+00:00
+
+
+https://pactus.org/2023/07/01/release-0-13-0.html
+2023-07-01T00:00:00+00:00
+
+
+https://pactus.org/2023/07/05/testnet-500-validators.html
+2023-07-05T00:00:00+00:00
+
+
+https://pactus.org/2023/07/09/dev-meeting.html
+2023-07-09T00:00:00+00:00
+
+
+https://pactus.org/2023/08/01/testnet-1-concluded.html
+2023-08-01T00:00:00+00:00
+
+
+https://pactus.org/2023/08/22/dev-report.html
+2023-08-22T00:00:00+00:00
+
+
+https://pactus.org/2023/09/04/introduction-to-pips.html
+2023-09-04T00:00:00+00:00
+
+
+https://pactus.org/2023/09/24/dev-report-pre-testnet-2.html
+2023-09-24T00:00:00+00:00
+
+
+https://pactus.org/2023/09/28/how-sspos-works-in-simple-word.html
+2023-09-28T00:00:00+00:00
+
+
+https://pactus.org/2023/10/15/release-0-15-0.html
+2023-10-15T00:00:00+00:00
+
+
+https://pactus.org/2023/10/15/testnet-2-launched.html
+2023-10-15T00:00:00+00:00
+
+
+https://pactus.org/2023/10/29/release-0-16-0.html
+2023-10-29T00:00:00+00:00
+
+
+https://pactus.org/2023/11/12/release-0-17-0.html
+2023-11-12T00:00:00+00:00
+
+
+https://pactus.org/2023/12/12/release-0-18-0.html
+2023-12-12T00:00:00+00:00
+
+
+https://pactus.org/2024/01/04/release-0-19-0.html
+2024-01-04T00:00:00+00:00
+
+
+https://pactus.org/2024/01/08/mainnet-announcement.html
+2024-01-08T00:00:00+00:00
+
+
+https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminter.html
+2024-01-10T00:00:00+00:00
+
+
+https://pactus.org/2024/01/11/release-0-20-0.html
+2024-01-11T00:00:00+00:00
+
+
+https://pactus.org/2024/01/22/testnet-2-concluded.html
+2024-01-22T00:00:00+00:00
+
+
+https://pactus.org/2024/01/24/mainnet-launched.html
+2024-01-24T20:24:00+00:00
+
+
+https://pactus.org/2024/01/31/release-1-0-0.html
+2024-01-31T00:00:00+00:00
+
+
+https://pactus.org/2024/02/10/release-1-0-1.html
+2024-02-10T00:00:00+00:00
+
+
+https://pactus.org/2024/02/18/release-1-0-2.html
+2024-02-18T00:00:00+00:00
+
+
+https://pactus.org/blog/
+
+
+https://pactus.org/
+
+
+https://pactus.org/community/
+
+
+https://pactus.org/contributing/
+
+
+https://pactus.org/user-guides/run-pactus-docker/
+
+
+https://pactus.org/user-guides/send-transactions-gui/
+
+
+https://pactus.org/user-guides/grpc-sign-transactions/
+
+
+https://pactus.org/user-guides/reduce-network/
+
+
+https://pactus.org/user-guides/run-pactus-cli/
+
+
+https://pactus.org/user-guides/run-pactus-metrics/
+
+
+https://pactus.org/user-guides/run-pactus-gui/
+
+
+https://pactus.org/user-guides/use-wallet-cli/
+
+
+https://pactus.org/user-guides/
+
+
+https://pactus.org/download/
+
+
+https://pactus.org/term-of-use/
+
+
+https://pactus.org/about/what-is-pactus/
+
+
+https://pactus.org/about/roadmap/
+
+
+https://pactus.org/about/faq/
+
+
+https://pactus.org/learn/blockchain/block/
+
+
+https://pactus.org/learn/blockchain/state-hash/
+
+
+https://pactus.org/learn/blockchain/account/
+
+
+https://pactus.org/learn/blockchain/genesis/
+
+
+https://pactus.org/learn/blockchain/validator/
+
+
+https://pactus.org/learn/blockchain/cryptography/
+
+
+https://pactus.org/learn/blockchain/address/
+
+
+https://pactus.org/learn/blockchain/incentive/
+
+
+https://pactus.org/learn/blockchain/serialization/
+
+
+https://pactus.org/learn/consensus/specification/
+
+
+https://pactus.org/learn/consensus/proof-of-stake/
+
+
+https://pactus.org/learn/consensus/protocol/
+
+
+https://pactus.org/learn/consensus/parameters/
+
+
+https://pactus.org/learn/consensus/committee/
+
+
+https://pactus.org/learn/consensus/sortition/
+
+
+https://pactus.org/learn/smart-contract/storage/
+
+
+https://pactus.org/learn/transaction/transfer/
+
+
+https://pactus.org/learn/transaction/fee/
+
+
+https://pactus.org/learn/transaction/withdraw/
+
+
+https://pactus.org/learn/transaction/unbond/
+
+
+https://pactus.org/learn/transaction/bond/
+
+
+https://pactus.org/learn/transaction/format/
+
+
+https://pactus.org/learn/transaction/sortition/
+
+
+https://pactus.org/learn/api/grpc/
+
+
+https://pactus.org/learn/
+
+
diff --git a/term-of-use/index.html b/term-of-use/index.html
new file mode 100644
index 000000000..76b21526b
--- /dev/null
+++ b/term-of-use/index.html
@@ -0,0 +1,562 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Term of Use | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Terms of Use
+
+
Welcome to Pactus.
+
+
By using our website or services, you agree to these Terms of Use (“Terms”).
+Please review them carefully.
+If you do not accept the Terms, please do not use our website or services.
+
+
We may update the Terms occasionally.
+Your continued use of our website or services after any changes means you accept the updates.
+If you do not agree to the updates, please stop using our website and services.
+
+
“We,” “us,” “our,” and “Pactus” refer to the Pactus Blockchain Project. “You” refers to each user of our
+website or services.
+
+
Website Access and Modifications
+
+
We strive to provide continuous website access but cannot guarantee uninterrupted or error-free service.
+Pactus is not liable for any inaccessible features or website unavailability.
+
+
We may modify, expand, limit, or discontinue any part of the website or
+services at any time to accommodate users or for other reasons, without notice.
+We reserve the right to suspend website access temporarily or permanently, at our discretion, without notice.
+
+
Users may need to update their computer hardware or software to access some website content or features.
+Pactus is not responsible for any inability to access the website or services due to user systems,
+internet networks, or other causes.
+
+
Age Limit
+
+
Our website and services are not intended for those under 18.
+If you are under 18, you may only use this website with the supervision of a parent, guardian, or other responsible adult.
+
+
No Personalized Advice
+
+
This website does not provide individualized legal, tax, financial, or investment advice.
+Since everyone’s situation is different, we recommend consulting a qualified professional for financial decisions.
+
+
PAC coin is meant to be used as a medium of exchange.
+Nothing on this website should be considered investment advice or a solicitation to
+buy, hold, invest in, own, or use PAC coin.
+
+
No Content Guarantees
+
+
We cannot guarantee the accuracy, completeness, or quality of the information on this website.
+All content is provided on an “as is” and “as available” basis, and use is at your own risk.
+
+
The content may be sourced from third parties.
+Pactus is not responsible for any errors, omissions, or inaccuracies.
+The information may not suit everyone and may only apply to certain regions.
+
+
It is your responsibility to evaluate if the information and services are technically and legally suitable for
+your intended use and comply with applicable laws.
+Always verify any information before using it for personal, financial, or business purposes.
+
+
We may modify website content and services at any time without notice.
+We are not obligated to inform you of any changes or corrections.
+
+
External Content
+
+
Any testimonials, opinions, advice, offers, or other third party content on this website reflect the views
+and intentions of those parties/people only.
+They do not represent the views of Pactus.
+
+
We do not guarantee the accuracy, completeness, reliability, or usefulness of external content.
+Users are responsible for assessing external content.
+Pactus is not liable for any damage or loss from relying on or using third party content.
+
+
User Generated Content
+
+
By posting or submitting any material to this website, including the forum, you grant Pactus a
+worldwide, fully paid-up, non-exclusive license to edit and display your materials on our website and
+social media platforms as we deem appropriate.
+
+
You agree to indemnify and hold harmless Pactus and its Users from any third-party claims arising from
+your materials.
+You also represent that you own or have the right to post the materials, that they are
+accurate, their use on the Pactus website complies with laws, and they will not cause harm to any
+person.
+
+
Pactus has the right to remove any materials we deem objectionable, offensive, illegal, harmful, or in
+violation of these Terms.
+We may disclose user information if legally required.
+
+
Please contact info@pactus.org to request the removal of your posted content for reasons such as
+privacy concerns, copyright issues, or no longer wanting your content to appear publicly.
+We will review removal requests on a case-by-case basis.
+
+
File Safety and Security
+
+
Pactus implements measures to protect downloadable files on our website but cannot guarantee they
+are free of infections, viruses, or harmful code.
+
+
We are also not responsible if users’ devices are infected by visiting our website or downloading files in
+the event of a security breach.
+
+
If uncertain, users should consider compiling Pactus from the provided source code.
+Users are responsible for meeting their own security requirements.
+
+
+
+
Pactus works with reputable partners, but does not endorse or take responsibility for sponsored content claims.
+We do not review, recommend, or endorse any products or services promoted on our site.
+
+
Pactus is not liable for damages from misuse of personal information given to sponsors.
+We are also not responsible for losses from using sponsor links or services on our site.
+
+
External Links
+
+
For user convenience, our website may contain links to external sites and resources.
+However, we do not control these external sites and are not responsible for
+their content, products, services, or information.
+
+
Link inclusion does not imply Pactus endorsement or affiliation.
+Users should be aware they may leave our website by clicking links.
+External site terms of use may differ from ours.Pactus is not responsible for
+losses from users following links to external sites.
+We encourage caution and reviewing external sites’ terms and policies before transacting or engaging.
+
+
Electronic Communications
+
+
Our website responses and email communications will be delivered electronically.
+Pactus reserves the right to disclose any user emails or objectionable material
+to comply with legal processes or protect the
+rights and property of Pactus, its customers, suppliers, and users.
+
+
No Financial Services
+
+
This website does not engage in storing, selling, buying, sending, or receiving Pactus coins.
+All activities related to owning and transferring Pactus coins occur on the DEX/CEX/decentralized Pactus network.
+This website does not actively participate in that network.
+
+
No Liability
+
+
Pactus assumes no liability for any damages, claims, or losses related to using Pactus.
+This includes third party actions or inactions and events.
+
+
It includes but is not limited to: security issues when using Pactus software/services, technical problems
+when using Pactus software/services, software or data corruption when using Pactus software/services,
+or user errors when using Pactus software/services.
+
+
Disclaimer of Warranties
+
+
Pactus expressly disclaims all warranties, representations, and conditions, whether express or implied,
+including but not limited to the implied warranties and conditions of merchantability, fitness for a
+particular purpose, and non-infringement.
+
+
This disclaimer extends to the use of this website and its services, as well as the accuracy, completeness,
+timeliness, or currentness of its content, in any manner and for any purpose.
+
+
No Consequential Damages
+
+
Under no circumstances will Pactus be liable for any incidental, special, consequential, exemplary,
+indirect, or other damages arising from use of this website, its services, or content.
+This includes but is not limited to data loss, even if advised of such damage possibilities.
+
+
This disclaimer applies whether based on contract, tort, negligence, product liability, strict liability, or otherwise.
+It extends to all potential scenarios and circumstances.
+
+
General
+
+
These Terms of Use (TOU) and any applicable Terms of Service are the full agreement for website use by
+users and Pactus. They replace previous agreements.
+
+
If Pactus or a user does not exercise a TOU right, this does not waive the right. If a TOU provision is
+invalid, the rest remain valid.
+
+
The TOU and Terms of Service are intentionally in English, the governing language for Pactus and users.
+
+
Copyright
+
+
Attributed Content
+
+
Logos for operating systems, platforms, and sponsors we support are copyrighted by their respective owners.
+Pactus does not own these copyrights but uses the logos with permission or in a clear, non- harmful way.
+
+
Privacy Policy
+
+
Data Collection and Use
+
+
We collect standard server logs from our website.
+This data helps provide site statistics, improve content and information flow, analyze errors, and diagnose dead links.
+A segment of server logs gathers download statistics to better understand user needs.
+
+
+ Last update: 25 January 2024
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user-guides/grpc-sign-transactions/index.html b/user-guides/grpc-sign-transactions/index.html
new file mode 100644
index 000000000..008911e1a
--- /dev/null
+++ b/user-guides/grpc-sign-transactions/index.html
@@ -0,0 +1,525 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to sign transaction using gRPC? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to sign transaction using gRPC?
+
+
Preface
+
+
The Pactus Blockchain provides a gRPC interface that allows users to interact with the blockchain and native wallet.
+This is ideal for merchants and users who want to create, sign, and broadcast transactions using their local node.
+This tutorial will guide you step-by-step on how to use gRPC to sign transactions.
+
+
Setup node
+
+
Initialize the node
+
+
To follow along with this tutorial, you’ll first need to set up and run a localnet blockchain, which is suitable for testing:
+
+
./pactus-daemon init \
+ --localnet \
+ --working-dir ./pactus-localnet \
+ --password "super-secret-password" \
+ --val-num 7 \
+ --restore "fish cool avoid history kitten quick olive purchase blossom grocery cool treat"
+
+
+
This command initializes a Pactus blockchain as a localnet.
+The purpose of this network is for testing.
+The above command actually restores a node from the given mnemonic.
+This helps you to create the same wallet with this tutorial. The first two addresses in this wallet are:
+
+
tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6
+tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7
+
+
+
We are going to transfer 1 PAC from the first account to the second one.
+
+
Run the node
+
+
Now you can run the node simply with this command:
+
+
./pactus-daemon start \
+ --working-dir ./pactus-localnet \
+ --password "super-secret-password"
+
+
+
By running the node, you will see that it starts creating blocks, and
+therefore the reward account address will be rewarded locally.
+We can use this balance for testing purposes.
+
+
Interact with the node
+
+
Open another terminal and run the following command:
+
+
./pactus-ctl --server-addr localhost:50052 \
+ blockchain get-blockchain-info
+
+
+
It should print information about the localnet blockchain.
+The pactus-ctl
application uses gRPC to interact with the blockchain.
+In this tutorial, we use pactus-ctl
to interact with the blockchain.
+You can either use gRPC-gateway REST APIs or make direct gRPC calls to interact with the node.
+They are more or less similar and all interact with the node using gRPC endpoints.
+
+
Signing Transitions
+
+
Create raw transaction
+
+
To sign a transaction, we first need to create a raw transaction and then sign it.
+We can use the get_raw_transfer_transaction
method to create a raw transfer transaction.
+Similar methods can be used to create raw bond, unbond, and withdraw transactions.
+
+
./pactus-ctl --server-addr localhost:50052 \
+ transaction get-raw-transfer-transaction \
+ --sender tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6 \
+ --receiver tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7 \
+ --amount 1
+{
+ "rawTransaction" : "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+}
+
+
+
The sender account is the first reward address in the wallet, therefore it should have some coins in its account.
+
+
Please note that the amount here is in atomic units.
+There is a Working-In-Progress PR to accept and return all amounts in PAC units (10^9).
+
+
Sign transaction
+
+
Now you can sign this raw transaction. To sign a transaction, first, we need to load a wallet.
+At the time of writing this document, Pactus only supports the “default_wallet”.
+Soon, creating wallets through gRPC and loading them will be supported.
+
+
./pactus-ctl --server-addr localhost:50052 \
+ wallet load-wallet --wallet-name "default_wallet"
+{
+ "walletName" : "default_wallet"
+}
+
+
+
Now that the “default_wallet” is loaded, we can proceed to sign the raw transaction:
+
+
./pactus-ctl --server-addr localhost:50052 \
+ wallet sign-raw-transaction \
+ --wallet-name "default_wallet" \
+ --password "super-secret-password" \
+ --raw-transaction "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+{
+ "transactionId" : "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA=" ,
+ "signedRawTransaction" : "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+}
+
+
+
Transaction successfully signed.
+
+
Broadcast signed transaction
+
+
Now you can broadcast the signed transaction:
+
+
./pactus-ctl --server-addr localhost:50052 \
+ transaction broadcast-transaction \
+ --signed-raw-transaction "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+{
+ "id" : "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA="
+}
+
+
+
Transaction successfully broadcasted.
+
+
Production Security Considerations
+
+
In this tutorial, we utilized a localnet version of Pactus.
+For production purposes, you’ll need to set up the node for the Mainnet and synchronize it with the network.
+Additionally, in production, the wallet service is disabled by default.
+You can enable the wallet service in the configuration file.
+
+
When signing transactions in production, you need to prioritize the security of the wallet.
+Make sure you have set a strong password for the native wallet.
+Ensure that it is called on localhost for safety.
+If you intend to call it on a remote server, there are several security measures to consider:
+
+
+ Ensure SSL is installed using Nginx to secure the connections.
+ Secure the API using a password (currently under development; see here: PIP-20 ).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user-guides/index.html b/user-guides/index.html
new file mode 100644
index 000000000..b4e95e48e
--- /dev/null
+++ b/user-guides/index.html
@@ -0,0 +1,389 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ User Guides | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
User Guides
+
+
Here, you can find some guidance to help you use and interact with the Pactus blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user-guides/reduce-network/index.html b/user-guides/reduce-network/index.html
new file mode 100644
index 000000000..c8ebb5847
--- /dev/null
+++ b/user-guides/reduce-network/index.html
@@ -0,0 +1,420 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to reduce the network usage? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to reduce the network usage?
+
+
Preface
+
+
Pactus is designed for low traffic usage.
+However, some users still face bandwidth limitations imposed by their Internet Service Providers (ISPs).
+This guide will explore effective ways to reduce networking usage for a Pactus node.
+
+
Reducing the number of connection
+
+
By default, Pactus attempts to maintain 64 open connections with other nodes,
+split into 32 inbound and 32 outbound connections.
+To reduce networking usage, you can decrease this maximum number of connections.
+However, it’s important to remember that more connections with
+peers usually enable the node to function more effectively and securely.
+The max_connections
setting in the config file can be adjusted to manage the maximum number of connections.
+
+
Disabling Relay
+
+
A relay connection is a type of connection that can be established between two peers,
+usually behind a NAT, by a third-party peer known as a relay.
+This is especially helpful when users run Pactus on a private network like home internet.
+However, the relay connection is not as stable as a direct connection.
+Disabling the relay connection may reduce network usage.
+If you have a reliable and public IP address, you can disable the relay connection.
+The relay connection is enabled by default. To disable the relay connection,
+set enable_relay
to false
inside the config file.
+
+
Disabling Node-Network service
+
+
A node-network is a type of node that provides historical data, such as blocks,
+to other nodes so they can sync with the network.
+By default, this service is enabled.
+Disabling this service helps reduce traffic usage.
+Keep in mind that new nodes rely on other nodes to be able to sync.
+To disable the node-network service, set node_network
to false
.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user-guides/run-pactus-cli/index.html b/user-guides/run-pactus-cli/index.html
new file mode 100644
index 000000000..5776ec571
--- /dev/null
+++ b/user-guides/run-pactus-cli/index.html
@@ -0,0 +1,637 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to run Pactus in Command Line Mode? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to run Pactus in Command Line Mode?
+
+
Preface
+
+
Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI).
+This tutorial will guide you through the steps to run Pactus in CLI mode, suitable for advanced users.
+
+
Prerequisites
+
+
Before proceeding with the steps below, ensure that you have the following:
+
+
+ A computer running Windows, macOS, or Linux
+ Suitable internet connection
+
+
+
Download
+
+
To get started, download and extract the Pactus CLI file from
+here .
+Once you have downloaded and extracted the Pactus CLI file, you can proceed to the next step.
+
+
+
+
Initializing the Node
+
+
Now you need to create a wallet and setup a working directory for your node.
+A working directory is a place where you save blockchain data and wallets.
+Open the Terminal and run the following command:
+
+
+
+
+
+
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus
.
+
+
+
+
+
+
+
+
+
This command creates your wallet and setup the working working directory at C:\Users\<USER_NAME>\pactus
.
+
+
+
+
+
+
+
+ Working director
+
+ By default the working directory that store the blockchain data is set to ~/pactus
in Unix-like systems.
+ For Windows it is set to C:\Users\<USER_NAME>\pactus
.
+
+ If you wish to select or specify a different path, use the --working-dir
option.
+
+
+
+ Wallet seed is important Keep your wallet seed phrase private and secure. If someone else gains access to your seed phrase, they can control your wallet and funds.
+
+
+
+
The working directory contains:
+
+
+ Default wallet
+ Genesis file
+ Config file
+
+
+
Feel free to explore the contents of these files as needed, particularly the config file.
+The config file contains parameters that can customize your node.
+
+
Restoring the Node
+
+
If you ever need to restore your node, for instance on a new device,
+you can use the --restore
option followed by your mnemonic:
+
+
+
+
+
+
+
./pactus-daemon init --restore "<your-mnemonic>"
+
+
+
Replace <your-mnemonic>
with your previously noted mnemonic phrase.
+This command will restore your wallet in the ~/pactus
directory.
+
+
+
+
+
+
+
pactus-daemon.exe init --restore "<your-mnemonic>"
+
+
+
Replace <your-mnemonic>
with your previously noted mnemonic phrase.
+This command will restore your wallet in the C:\Users\<USER_NAME>\pactus
directory.
+
+
+
+
+
+
+
+
+
Running the Node
+
+
Now you can start the node and sync with the network. Run the following command in the Terminal:
+
+
+
+
+
+
+
+
+
pactus-daemon.exe start
+
+
+
+
+
+
+
+
When the Pactus node starts running, it begins syncing with the network.
+This process may take some time, as your node needs to download and verify the entire blockchain history.
+Please be patient while your node syncs.
+
+
Default Ports
+
+
The default network ports in Pactus are defined as follows. It is recommended not to change these default ports:
+
+
+ P2P port is set to 21888. P2P supports both UDP and TCP protocols.
+ gRPC port is set to 50051. The gRPC module is enabled by default for localhost.
+ gRPC-gateway is set to 8080. gRPC-gateway is disabled by default.
+ Nanomsg port is set to 40899. The Nanomsg service is disabled by default.
+
+
+
+
+
Running Pactus in the Background
+
+
To run Pactus commands in the background and keep them running even after you close your terminal or
+log out, you can use terminal multiplexer software.
+Terminal multiplexers allow you to create and manage multiple terminal sessions within a single window.
+
+
Two popular terminal multiplexer options are:
+
+
+ tmux : Tmux is a terminal multiplexer that
+ lets you create, manage, and detach terminal sessions.
+
+ You can install tmux on Unix-like systems using your package manager (e.g., apt
, brew
, yum
).
+
+ Here’s how to use tmux to run Pactus in the background:
+
+
+ Start a new tmux session: tmux
+ Run your Pactus command within the tmux session.
+ Detach from the tmux session: Press Ctrl-b
, followed by d
.
+ Reattach to the tmux session later to check the progress: tmux attach-session
+
+
+ screen : GNU Screen is another terminal multiplexer that
+
+ allows you to run terminal sessions in the background.
+
+ Here’s how to use screen to run Pactus in the background:
+
+
+ Start a new screen session: screen
+ Run your Pactus command within the screen session.
+ Detach from the screen session: Press Ctrl-a
, followed by d
.
+ Reattach to the screen session later to check the progress: screen -r
+
+
+
+
+
Choose the terminal multiplexer that suits your preference and install it using your system’s package manager.
+With these tools, you can run Pactus commands in the background with ease.
+
+
+
+
Become validator
+
+
To become a validator and participate in the
+consensus algorithm to earn rewards, you first need to
+stake some coins. In the next
+tutorial ,
+we will explain how to send a Bond transaction to become a validator.
+
+
+
+
By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network.
+Thank you for your participation!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user-guides/run-pactus-docker/index.html b/user-guides/run-pactus-docker/index.html
new file mode 100644
index 000000000..38bdfca21
--- /dev/null
+++ b/user-guides/run-pactus-docker/index.html
@@ -0,0 +1,626 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to run Pactus using Docker? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to run Pactus using Docker?
+
+
Preface
+
+
Docker is a tool that simplifies the process of creating, deploying, and running applications using containers.
+With containers, developers can bundle all the necessary parts of an application, including libraries and dependencies,
+and deploy them as a single package.
+
+
In this document, we will guide you on how to run Pactus using Docker, step by step.
+
+
Prerequisites
+
+
Before running Pactus with Docker, ensure that you have a clear understanding of
+how pactus-daemon
and pactus-wallet
works.
+Then you need to install docker in your system.
+If you are using Windows please make sure you have installed WSL.
+
+
Docker Images
+
+
The Pactus docker images are available at Docker Hub .
+You can pull the latest image with this command:
+
+
docker pull pactus/pactus
+
+
+
+
+
Initializing the Node
+
+
Now you need to create a wallet and setup a working directory for your node.
+A working directory is a place where you save blockchain data and wallets.
+Open the Terminal and run the following command:
+
+
+
+
+
+
+
docker run -it --rm -v ~/pactus:/root/pactus pactus/pactus pactus-daemon init
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus
.
+
+
+
+
+
+
+
docker run -it --rm -v % USERPROFILE % \pactus:/root/pactus pactus/pactus pactus-daemon init
+
+
+
This command creates your wallet and setup the working working directory at C:\Users\<USER_NAME>\pactus
.
+
+
+
+
+
+
+
Here’s an explanation of the Docker flags:
+
+
+ -it
: Makes the Docker container interactive for command-line interaction.
+ --rm
: Cleans up the temporary environment automatically when you’re done.
+ -v <local_dir>:<container_dir>
: Allows to choose where to store the Pactus data.
+
+
+
+ Wallet seed is important Keep your wallet seed phrase private and secure. If someone else gains access to your seed phrase, they can control your wallet and funds.
+
+
+
+
+
+
Running the Node
+
+
Now you can start the node and sync with the network. Run the following command in the Terminal:
+
+
+
+
+
+
+
docker run -it -d -v ~/pactus:/root/pactus -p 21888:21888 -p 21888:21888/udp -p 50051:50051 -p 8080:8080 --name pactus pactus/pactus pactus-daemon start --password <WALLET_PASSWORD>
+
+
+
+
+
+
+
+
docker run -it -d -v % USERPROFILE % \pactus:/root/pactus -p 21888:21888 -p 21888:21888/udp -p 50051:50051 -p 8080:8080 --name pactus pactus/pactus pactus-daemon start --password { WALLET_PASSWORD }
+
+
+
+
+
+
+
+
This command creates and runs a Docker container named “pactus”.
+Here’s an explanation of the Docker flags:
+
+
+ -p <host_port>:<container_port>
: Maps a port from your host machine to a port in the Docker container.
+ -d
: Starts the container in detached mode. The container runs in the background.
+ --name <NAME>
: Allows you to assign a custom name to a container.
+
+
+
Default Ports
+
+
The default network ports in Pactus are defined as follows. It is recommended not to change these default ports:
+
+
+ P2P port is set to 21888. P2P supports both UDP and TCP protocols.
+ gRPC port is set to 50051. The gRPC module is enabled by default for localhost.
+ gRPC-gateway is set to 8080. gRPC-gateway is disabled by default.
+ Nanomsg port is set to 40899. The Nanomsg service is disabled by default.
+
+
+
Essential Commands
+
+
You can manage the Pactus Docker container with these essential commands:
+
+
Stop the container:
+
+
+
+
This command gracefully stops the “pactus” container.
+
+
Start the container:
+
+
+
+
This command starts the Pactus Docker container.
+
+
View Container Logs:
+
+
To check the logs:
+
+
docker logs pactus --tail 1000 -f
+
+
+
Here’s an explanation of the Docker flags:
+
+
+ --tail 1000
: Displays the last 1000 lines of logs.
+ -f
: Shows the log output in real-time.
+
+
+
Remove Docker container:
+
+
If you want to upgrade the node, you should first remove the current container:
+
+
+
+
After removing the Pactus Docker container, you can create and run a new version, as explained above.
+
+
Enabling IPv6
+
+
By default, Docker only supports IPv4. IPv6 is only supported on Linux systems.
+Enabling IPv6 can help you improve connectivity and security.
+To enable IPv6 for Docker, follow the official documentation here .
+
+
+
+
Managing Wallet Using Docker
+
+
You can use Pactus Docker to manage the wallet.
+For example, you can check the balance of your wallet as shown below:
+
+
+
+
+
+
+
docker run -it --rm -v ~/pactus:/root/pactus pactus/pactus pactus-wallet address all --balance --stake
+
+
+
+
+
+
+
+
+
docker run -it --rm -v % USERPROFILE % \pactus:/root/pactus pactus-wallet address all --balance --stake
+
+
+
+
+
+
+
+
You can check How to use wallet in Command Line Mode?
+for additional commands to manage your wallet.
+
+
+
+
By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. Thank you for your participation!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user-guides/run-pactus-gui/code-certificate-warning.png b/user-guides/run-pactus-gui/code-certificate-warning.png
new file mode 100644
index 000000000..dc03ca8cc
Binary files /dev/null and b/user-guides/run-pactus-gui/code-certificate-warning.png differ
diff --git a/user-guides/run-pactus-gui/default-wallet.png b/user-guides/run-pactus-gui/default-wallet.png
new file mode 100644
index 000000000..a798f3b7d
Binary files /dev/null and b/user-guides/run-pactus-gui/default-wallet.png differ
diff --git a/user-guides/run-pactus-gui/index.html b/user-guides/run-pactus-gui/index.html
new file mode 100644
index 000000000..851e95044
--- /dev/null
+++ b/user-guides/run-pactus-gui/index.html
@@ -0,0 +1,527 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to run Pactus in Graphic Mode? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to run Pactus in Graphic Mode?
+
+
Preface
+
+
Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI).
+This tutorial will guide you through the steps to run Pactus in GUI mode, suitable for beginner to advanced users.
+
+
Prerequisites
+
+
Before proceeding with the steps below, ensure that you have the following:
+
+
+ A computer running Windows, macOS, or Linux
+ Suitable internet connection
+
+
+
Download
+
+
Download the Pactus GUI installer or archived file from
+here .
+
+
Code certificate issue
+
+
Windows and macOS users may encounter a warning message stating that Pactus is an untrusted application.
+This is because Pactus does not have a
+code signing certificate .
+
+
+
+
A code certificate is a digital signature that verifies the identity and authenticity of the software publisher.
+However, obtaining a code certificate is complex and expensive process, and requires registering a company and
+passing Know Your Customer (KYC) checks.
+
+
As Pactus is an open-source and community-based application, we don’t have a code certificate yet.
+Therefore, you can safely ignore the warning message and proceed with installing Pactus.
+
+
Installing
+
+
To install Pactus GUI, simply follow the on-screen instructions provided by the installer.
+The process is straightforward and similar to installing any other application on your computer.
+
+
+
+
Initializing
+
+
When you run Pactus for the first time, a wizard dialog will appear to guide you through the wallet creation and
+initialization process. This process consists of several steps:
+
+
Initialize Mode
+
+
On the first page, you will ask you how you want to create your wallet.
+Select the option to “Create a new wallet from scratch” and proceed to the next page.
+
+
+
+
Wallet Seed
+
+
The next page will display your wallet seed phrase, which consists of 12 words.
+It is essential to securely back up this seed phrase, as it is required for wallet recovery
+in case your computer is lost, damaged, or stolen.
+
+
+
+
+ Wallet seed is important Keep your wallet seed phrase private and secure. If someone else gains access to your seed phrase, they can control your wallet and funds.
+
+
+
+
Seed Confirmation
+
+
In this step, you will be asked to confirm your seed phrase.
+Input the 12 words you received in the previous step into the dialog.
+If the seed phrase is entered correctly, you will be able to proceed to the next page.
+
+
+
+
Wallet Password
+
+
On this page, you will be asked to set a password for your wallet.
+Enter a strong password in the first dialog box and confirm it in the second one.
+This password will be used to encrypt your wallet and protect it from unauthorized access.
+
+
+
+
Note: Choose a strong password and keep it safe.
+If you forget or lose your password, you will need your seed phrase to regain access to your wallet.
+
+
Number of Validators
+
+
Each node in the Pactus blockchain can run up to 32 validators, and each validator can stake up to
+1000 coins. Here, you can define how many validators you want to create for your node.
+Select the number of validators based on the amount of coins you want to stake.
+
+
+
+
If you want to stake more than 32,000 coins, you need to set up a new node.
+
+
+
+
The last page of the initialization process shows the node information, such as the working directory, validator address,
+and reward address. Review this information and click “Close” to complete the initialization process.
+
+
+
+
Upon closing the wizard dialog, your Pactus node will start running. You are now ready to use Pactus in GUI mode.
+
+
Running the Pactus Node
+
+
After completing the initialization process, you are ready to run the Pactus node.
+Running a Pactus node allows you to synchronize with the network, enabling you to manage your wallet and
+sending transactions.
+
+
Syncing with the Network
+
+
When the Pactus node starts running, it begins syncing with the network. This process may take some time,
+as your node needs to download and verify the entire blockchain history.
+Please be patient while your node syncs.
+
+
+
+
Default Wallet
+
+
You can check the “Default Wallet” tab to access your wallet information. Please note that the displayed
+information may not be accurate until the syncing process is complete.
+
+
+
+
In the “Default Wallet” tab, you can view your account details, including your balance and
+address information such as the validator and reward addresses .
+Your computer acts as a node and is recognized by the validator address in the Pactus network.
+The reward address is the account address where you collect the
+rewards earned by participating in
+the consensus algorithm and proposing new blocks.
+
+
To become a validator and participate in the
+consensus algorithm to earn rewards, you first need to
+stake some coins. In the next
+tutorial ,
+we will explain how to send a Bond transaction to become a validator.
+
+
+
+
By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. Thank you for your participation!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user-guides/run-pactus-gui/initialize-mode.png b/user-guides/run-pactus-gui/initialize-mode.png
new file mode 100644
index 000000000..b049dadff
Binary files /dev/null and b/user-guides/run-pactus-gui/initialize-mode.png differ
diff --git a/user-guides/run-pactus-gui/installing.png b/user-guides/run-pactus-gui/installing.png
new file mode 100644
index 000000000..dc9b2085f
Binary files /dev/null and b/user-guides/run-pactus-gui/installing.png differ
diff --git a/user-guides/run-pactus-gui/node-information.png b/user-guides/run-pactus-gui/node-information.png
new file mode 100644
index 000000000..9b91c97d6
Binary files /dev/null and b/user-guides/run-pactus-gui/node-information.png differ
diff --git a/user-guides/run-pactus-gui/number-of-validators.png b/user-guides/run-pactus-gui/number-of-validators.png
new file mode 100644
index 000000000..8f4f401bb
Binary files /dev/null and b/user-guides/run-pactus-gui/number-of-validators.png differ
diff --git a/user-guides/run-pactus-gui/seed-confirmation.png b/user-guides/run-pactus-gui/seed-confirmation.png
new file mode 100644
index 000000000..175f749db
Binary files /dev/null and b/user-guides/run-pactus-gui/seed-confirmation.png differ
diff --git a/user-guides/run-pactus-gui/syncing-progress.png b/user-guides/run-pactus-gui/syncing-progress.png
new file mode 100644
index 000000000..1fe39875a
Binary files /dev/null and b/user-guides/run-pactus-gui/syncing-progress.png differ
diff --git a/user-guides/run-pactus-gui/wallet-password.png b/user-guides/run-pactus-gui/wallet-password.png
new file mode 100644
index 000000000..7ad4a5e9f
Binary files /dev/null and b/user-guides/run-pactus-gui/wallet-password.png differ
diff --git a/user-guides/run-pactus-gui/wallet-seed.png b/user-guides/run-pactus-gui/wallet-seed.png
new file mode 100644
index 000000000..5bfaf9185
Binary files /dev/null and b/user-guides/run-pactus-gui/wallet-seed.png differ
diff --git a/user-guides/run-pactus-metrics/index.html b/user-guides/run-pactus-metrics/index.html
new file mode 100644
index 000000000..eabfc7582
--- /dev/null
+++ b/user-guides/run-pactus-metrics/index.html
@@ -0,0 +1,522 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to run Pactus Metrics? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to run Pactus Metrics?
+
+
Preface
+
+
Pactus can be run with metrics, providing you with the ability to monitor your node.
+This tutorial will guide you through the steps to run Pactus with metrics, suitable for advanced users.
+
+
Prerequisites
+
+
Before proceeding with the steps below, ensure that you have the following:
+
+
+
+
+
+
To Configure the Pactus Node for Metrics, navigate to the Pactus directory; by default, it’s located at the following path.
+
+
/home/YourUsername/pactus
+
+
+
There’s a file named config.toml
that contains all the configurations for your node.
+There are two parameters that you should enable for metrics: the first is enable_metrics
,
+and the second is enable http
. After editing the config.toml
you should restart your node.
+The metrics now can be accessed at http://localhost:80/metrics/prometheus
(this url going to be use by prometheus).
+
+
+
+if you are running Pactus with docker image, make sure to expose :80 port.
+
+
+
+
+
+
+
+
You should run Grafana and Prometheus for gathering metrics and displaying them in charts.
+First, create a directory named prometheus-grafana
. Inside the directory,
+create a docker-compose.yml
file and paste the code below.
+
+
services :
+ prometheus :
+ image : prom/prometheus
+ container_name : prometheus
+ command :
+ - " --config.file=/etc/prometheus/prometheus.yml"
+ ports :
+ - 9090:9090
+ restart : unless-stopped
+ volumes :
+ - ./prometheus:/etc/prometheus
+ - prom_data:/prometheus
+ grafana :
+ image : grafana/grafana
+ container_name : grafana
+ ports :
+ - 3000:3000
+ restart : unless-stopped
+ environment :
+ - GF_SECURITY_ADMIN_USER=admin
+ - GF_SECURITY_ADMIN_PASSWORD=admin
+ volumes :
+ - ./grafana:/etc/grafana/provisioning/datasources
+volumes : prom_data
+
+
+
You can change the default username and password of Grafana by modifying the values of GF_SECURITY_ADMIN_USER
and GF_SECURITY_ADMIN_PASSWORD
.
+Now, save the file. Then, in the current directory (meaning you are inside the prometheus-grafana
directory),
+create another directory named grafana
. Then, go to the directory. So now you’re in the path /prometheus-grafana/grafana/
.
+In the current directory, create a file named datasource.yml
and paste the code below there.
+
+
apiVersion : 1
+
+datasources :
+ - name : Prometheus
+ type : prometheus
+ url : http://prometheus:9090
+ isDefault : true
+ access : proxy
+ editable : true
+
+
+
Then save the file and exit.
+Now, we should go up one directory level from the current directory and navigate to the /prometheus-grafana
directory.
+In the current directory, which is /prometheus-grafana
, create another directory named prometheus
,
+then go into the directory.In the prometheus directory create a file named prometheus.yml
and paste below code there.
+
+
global :
+ scrape_interval : 15s
+ scrape_timeout : 10s
+ evaluation_interval : 15s
+alerting :
+ alertmanagers :
+ - static_configs :
+ - targets : []
+ scheme : http
+ timeout : 10s
+ api_version : v1
+scrape_configs :
+ - job_name : prometheus
+ honor_timestamps : true
+ scrape_interval : 15s
+ scrape_timeout : 10s
+ metrics_path : /metrics/prometheus
+ scheme : http
+ static_configs :
+ - targets :
+ - 127.0.0.1
+
+
+
Then save the file and exit.
+
+
+
+Tip: In the last section of the code, you will see the targets section where I’ve written 127.0.0.1.
+You can change it based on your localhost IP or your website domain.
+Please be aware that your target should match with your node http port.
+The default http port of pactus node is 80.
+
+
+
+
Run Grafana and Prometheus
+
+
Go to the /prometheus-grafana
directory where the docker-compose.yml
is located and run the command below.
+
+
+
+
Congratulations! Grafana and Prometheus are now up and accessible at ports 3000
and 9090
respectively.
+
+
Import Pactus Metrics to Grafana Dashboard
+
+
As Pactus uses libp2p
for its peer-to-peer network, we should import libp2p
metrics that you can find here .
+Download one of the metrics config and then Import it into Grafana Dashboard
.
+
+
Congratulations! You did it. Now, you can perform the same operations for other configurations.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user-guides/send-transactions-gui/bond-transaction-dialog.png b/user-guides/send-transactions-gui/bond-transaction-dialog.png
new file mode 100644
index 000000000..9f92cbd87
Binary files /dev/null and b/user-guides/send-transactions-gui/bond-transaction-dialog.png differ
diff --git a/user-guides/send-transactions-gui/index.html b/user-guides/send-transactions-gui/index.html
new file mode 100644
index 000000000..951b58d33
--- /dev/null
+++ b/user-guides/send-transactions-gui/index.html
@@ -0,0 +1,431 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to send transactions in Graphic Mode? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to send transactions in Graphic Mode?
+
+
Preface
+
+
The Pactus Blockchain offers a Graphical User Interface (GUI) that comes with a built-in wallet to create,
+sign and broadcast transactions.
+This tutorial aims to guide you step-by-step on how to use the GUI application to send transactions to the Pactus blockchain.
+Whether you are a beginner or an advanced user, this tutorial is suitable for you.
+
+
Prerequisites
+
+
Before we begin, you’ll need to run the Pactus GUI application and ensure that it is synced with the network.
+You can find detailed instructions on how to do this in the following tutorial .
+
+
Sending a Transfer Transaction
+
+
To send a transfer transaction , click on the “Transaction” menu and
+select “Transfer”.
+A new window will appear where you can select the
+account address from which you wish to send the “transfer” transaction,
+as well as the recipient’s account address and the amount you wish to send.
+
+
After reviewing the transaction details and ensuring that they are correct,
+click on the “Send” button to sign and broadcast the transaction to the Pactus blockchain.
+
+
+
+
It’s important to note that the transaction fee
+will be calculated based on the amount you’re sending.
+
+
Sending a Bond Transaction
+
+
To send a bond transaction , click on the “Transaction” menu
+and select “Bond”.
+A new window will appear where you can select the account address from which you wish to send the “bond” transaction,
+as well as the recipient’s validator address and
+the amount you wish to stake.
+
+
+
+
If a validator does not yet exist, the public key of the validator should be set.
+For an existing validator, a public key is not required.
+Also, note that if the public key is not set, the system tries to search for it inside the wallet.
+Therefore, if you want to stake on your own validators, you don’t need to set the public key here.
+
+
It’s important to note that the transaction fee
+will be calculated based on the amount you’re sending.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user-guides/send-transactions-gui/transfer-transaction-dialog.png b/user-guides/send-transactions-gui/transfer-transaction-dialog.png
new file mode 100644
index 000000000..f680d23af
Binary files /dev/null and b/user-guides/send-transactions-gui/transfer-transaction-dialog.png differ
diff --git a/user-guides/use-wallet-cli/index.html b/user-guides/use-wallet-cli/index.html
new file mode 100644
index 000000000..7ecc5ba1c
--- /dev/null
+++ b/user-guides/use-wallet-cli/index.html
@@ -0,0 +1,1008 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to use wallet in Command Line Mode? | Welcome to Pactus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to use wallet in Command Line Mode?
+
+
Preface
+
+
The Pactus Blockchain provides a wallet application that allows users to interact with the Pactus blockchain
+without the need to run a node.
+This is ideal for users who do not wish to operate a node but still want to create a personal wallet to manage their funds.
+This tutorial will guide you step-by-step on how to use the wallet application.
+
+
Download
+
+
To get started, download and extract the Pactus CLI file from
+here .
+Once you have downloaded and extracted the Pactus CLI file, you can proceed to the next step.
+
+
+
+
Wallet Commands
+
+
In this section, we will explore various wallet commands that help you create, manage,
+and recover your Pactus wallet.
+
+
+ Wallet Path
+
+ By default, the node’s wallet is stored at ~/pactus/wallets/default_wallet
on Unix-like systems.
+ On Windows, you can find it at C:\Users\<USER_NAME>\pactus\wallets\default_wallet
.
+
+ If you wish to select or specify a different wallet, use the --path
option.
+
+
+
Create a Wallet
+
+
To create a new wallet, run the following command:
+
+
+
+
+
+
+
./pactus-wallet --path <PATH-To-NEW-WALLET> create
+
+
+
+
+
+
+
+
pactus-wallet.exe --path <PATH-To-NEW-WALLET> create
+
+
+
+
+
+
+
+
Replace <PATH-To-NEW-WALLET>
with the file path where you want to create the wallet.
+
+
Recover Wallet
+
+
If you lose your wallet or forget your password, you can recover it by running this command:
+
+
+
+
+
+
+
./pactus-wallet --path <PATH-To-NEW-WALLET> recover
+
+
+
+
+
+
+
+
pactus-wallet.exe --path <PATH-To-NEW-WALLET> recover
+
+
+
+
+
+
+
+
Replace <PATH-To-NEW-WALLET>
with the file path where you want to restore the wallet.
+
+
Wallet Password
+
+
You can change the wallet password by running this command:
+
+
+
+
+
+
+
./pactus-wallet password
+
+
+
+
+
+
+
+
pactus-wallet.exe password
+
+
+
+
+
+
+
+
This command changes the password for the default_wallet
if there is one, or sets a new password.
+
+
Wallet Seed
+
+
You can obtain the wallet seed by running this command:
+
+
+
+
+
The wallet seed is encrypted within your wallet, and
+you’ll need to enter the wallet password to access it.
+
+
+
+
Address Commands
+
+
In this section, we’ll cover address commands that help you manage your wallet addresses.
+
+
Creating New Address
+
+
You can create a new address by running this command:
+
+
+
+
+
+
+
./pactus-wallet address new
+
+
+
+
+
+
+
+
pactus-wallet.exe address new
+
+
+
+
+
+
+
+
You can also assign a label to your address to better organize your address book.
+
+
List of Addresses
+
+
To view the list of wallet addresses, use this command:
+
+
+
+
+
+
+
./pactus-wallet address all
+
+
+
+
+
+
+
+
pactus-wallet.exe address all
+
+
+
+
+
+
+
+
Get Public Key
+
+
To obtain the public key for a specific address, run this command:
+
+
+
+
+
+
+
./pactus-wallet address pub <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe address pub <ADDRESS>
+
+
+
+
+
+
+
+
Replace <ADDRESS>
with the address for which you want to retrieve its public key.
+
+
Get Private Key
+
+
You can get the private key of your address by this command:
+
+
+
+
+
+
+
./pactus-wallet address priv <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe address priv <ADDRESS>
+
+
+
+
+
+
+
+
Replace <ADDRESS>
with the address for which you want to retrieve its private key.
+Keep your private key secure. If someone gains access to your private key,
+they will have full control over that address.
+
+
Get Address Balance
+
+
You can get the balance of your address by this command:
+
+
+
+
+
+
+
./pactus-wallet address balance <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe address balance <ADDRESS>
+
+
+
+
+
+
+
+
Replace <ADDRESS>
with the address for which you want to retrieve your balance.
+
+
+
+
Transaction Commands
+
+
In this section, we’ll cover transaction commands that help you create, sign, and
+broadcast transactions on the Pactus Blockchain.
+You’ll need to provide the password to sign the transaction.
+Please note that once a transaction is broadcasted, it cannot be reversed.
+
+
Sending Transfer Transaction
+
+
To create, sign, and broadcast a
+Transfer transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet tx transfer <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe tx transfer <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
In this command, <FROM>
should be one of the addresses in your wallet as the sender address,
+and <TO>
is the receiver address.
+
+
Sending Bond Transaction
+
+
To create, sign, and broadcast a
+Bond transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet tx bond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe tx bond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
In this command, <FROM>
should be one of the addresses in your wallet as the sender address,
+and <TO>
is the receiver validator address.
+
+
If the validator associated with this address does not exist yet,
+you need to provide the public key to create it:
+
+
+
+
+
+
+
./pactus-wallet tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
Replace <PUBLIC_KEY>
with the validator’s public key,
+which is the public key of the <TO>
address.
+
+
Sending Unbond Transaction
+
+
To create, sign, and broadcast a
+Unbond transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet tx unbond <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe tx unbond <ADDRESS>
+
+
+
+
+
+
+
+
In this command, <ADDRESS>
is the address of the validator that you want to unbond.
+
+
Sending Withdraw Transaction
+
+
To create, sign, and broadcast a
+Withdraw transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet tx unbond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe tx withdraw <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2022/08/29/dev-meeting.html b/zh/2022/08/29/dev-meeting.html
new file mode 100644
index 000000000..7ec685c9c
--- /dev/null
+++ b/zh/2022/08/29/dev-meeting.html
@@ -0,0 +1,400 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
29 August 2022
+
Meeting Summary
+
+
The meeting took place on 04 September 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
NanoMsg instead of ZeroMQ
+
+
During the meeting, Joseph suggested using Nanomsg instead of ZeroMQ because building ZeroMQ is not easy,
+especially in Windows. Additionally, we can use the pure Go implementation of Nanomsg.
+
+
The format of block events was defined as follows:
+
+
<event_id: 1 byte><event_data: variant><height: 4 bytes><seq_num: 4 bytes>
+
+
+
As a consequence of this, smart contracts events can be defined more easily and
+Infura-like services become simple, as we can just replay the events.
+
+
Reviewing a Pull Request
+
+
Nagaraj’s pull request reviewed.
+
+
Renaming project
+
+
The team discussed renaming (rebranding) the project and decided to create an online survey to
+gather suggestions for a new name.
+Everyone is encouraged to participate in the survey and suggest new names for the project.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2022/09/04/dev-meeting.html b/zh/2022/09/04/dev-meeting.html
new file mode 100644
index 000000000..e13a1c05b
--- /dev/null
+++ b/zh/2022/09/04/dev-meeting.html
@@ -0,0 +1,509 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
04 September 2022
+
Meeting Summary
+
+
The meeting took place on 29 August 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
Project renamed to Pactus
+
+
During the last meeting, the team conducted an online survey to rename the project.
+A total of 31 responses were received, and the following names were suggested:
+
+
+
+
+ Name
+ Votes
+
+
+
+
+ Sirius
+ 11
+
+
+ Pactus
+ 10
+
+
+ Nova
+ 7
+
+
+ Texo
+ 6
+
+
+ Zemus
+ 6
+
+
+ Helios
+ 6
+
+
+ Tutti
+ 5
+
+
+ Haki
+ 5
+
+
+ Aegeus
+ 4
+
+
+ Virgo
+ 4
+
+
+ Zentora
+ 3
+
+
+ Zinova
+ 3
+
+
+ Xerxes
+ 2
+
+
+ Ledgeria
+ 2
+
+
+ Solidus
+ 2
+
+
+ Welt
+ 2
+
+
+ Ventura
+ 2
+
+
+ Zebra
+ 2
+
+
+ Miranet
+ 2
+
+
+ Monetha
+ 2
+
+
+ FutureHub
+ 1
+
+
+ Muonet
+ 1
+
+
+ Mentha
+ 1
+
+
+ Hypatios
+ 0
+
+
+ Chaintopia
+ 0
+
+
+ Sycee
+ 0
+
+
+ Lepus
+ 0
+
+
+
+
+
After reviewing the responses, the team chose “Pactus” as the new name for the project. 🎉
+The project will be moved to “pactus-project/pactus,” and the team plans to announce it on social media.
+
+
Discussion on GUI
+
+
In terms of the GUI, Joseph suggested using Flutter, and the team agreed.
+To interact with the wallet, gRPC APIs will be provided, and the GUI will use these APIs.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2022/09/18/dev-meeting.html b/zh/2022/09/18/dev-meeting.html
new file mode 100644
index 000000000..c160aab78
--- /dev/null
+++ b/zh/2022/09/18/dev-meeting.html
@@ -0,0 +1,419 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
18 September 2022
+
Meeting Summary
+
+
The meeting took place on 18 September 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
Discussion about Testnet
+
+
The team discussed Testnet and related issues, including IP block issues that were found by Hadi.
+Due to sanctions, some IPs are blocked, so the team will run a support node to assist users inside Iran.
+The GUI application had some issues on Windows, but they were fixed and tested by Hadi.
+
+
Discussion about Website
+
+
The website still has some issues, such as the need to rename the animation to “Pactus” and the lack of a logo.
+The community suggested some logos. Additionally, the roadmap page is missing.
+
+
+
+
The team discussed the status of social media platforms, including:
+
+
+ Discord: 70 members
+ Instagram: 87 followers
+ Telegram: 20 followers
+ Linkedin: 20 followers
+ Twitter: Not yet
+
+
+
The team also decided to announce the project on social media on 29 September.
+
+
Consensus parameters
+
+
The team discussed the current consensus parameters:
+
+
+ Total supply: 21 million coins
+ Reward: 1 coin per block
+ Block time: 10 second
+ Committee size: 21 members
+ Bond interval: one hour
+ Unbond interval: 21 days
+ Fee fraction: 0.0001
+ Min fee: 0.0000001
+ Max fee: 0.01
+ Maximum stake: 12381
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2022/09/20/release-0-9-0.html b/zh/2022/09/20/release-0-9-0.html
new file mode 100644
index 000000000..c2b3ef5b9
--- /dev/null
+++ b/zh/2022/09/20/release-0-9-0.html
@@ -0,0 +1,389 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.9.0 released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.9.0 released
+
20 September 2022
+
Overview
+
+
Pactus Blockchain Release Version 0.9.0
+is now available for download.
+This release includes a new graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Download
+
+
This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch.
+To get started with the Pactus Blockchain Testnet-0, simply download
+the latest version and run the Pactus software.
+
+
Join the Testnet now and get ready for the future!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2022/09/24/testnet-0-launched.html b/zh/2022/09/24/testnet-0-launched.html
new file mode 100644
index 000000000..533631dd8
--- /dev/null
+++ b/zh/2022/09/24/testnet-0-launched.html
@@ -0,0 +1,385 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Testnet-0 launch announcement | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Testnet-0 launch announcement
+
24 September 2022
+
+
+
The Pactus blockchain Testnet-0 is now accessible.
+To participate, simply download the Pactus application version 0.9.0 and
+connect to the Testnet without any special configurations.
+For test coins, please visit our Discord channel and share your validator address.
+
+
By taking part in the Testnet, you can familiarize yourself with the Pactus blockchain and
+get ready for the Mainnet launch.
+Testnet participants will also be given higher priority during the Mainnet launch.
+
+
Please share your feedback with us to help improve the user experience in future versions of the software.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2022/10/30/dev-meeting.html b/zh/2022/10/30/dev-meeting.html
new file mode 100644
index 000000000..df810626b
--- /dev/null
+++ b/zh/2022/10/30/dev-meeting.html
@@ -0,0 +1,412 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
30 October 2022
+
Meeting Summary
+
+
The meeting took place on 30 October 2022, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
In memory of Mahsa Amini
+
+
The meeting started in memory of Mahsa Amini .
+We in the Pactus family stand in solidarity with courageous people who are fighting for equality, equity and freedom in Iran.
+
+
+
+
Launching Block explorer
+
+
The beta version of the block explorer has been launched 🚀 and is now available at
+https://pacscan.org .
+
+
Nagaraj explained the block explorer and some of the features.
+
+
Project road map
+
+
Project road map was discussed.
+
+
IdeaKita pitch deck
+
+
Ali presented the Pactus pitch deck for the IdeaKita in Malaysia.
+The IdeaKita program, under the Malaysia Digital Economy Corporation (MDEC), is designed to
+support entrepreneurs and startups in Malaysia.
+
+
Latest development progress
+
+
The latest pull requests were reviewed:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2022/11/24/release-0-9-1.html b/zh/2022/11/24/release-0-9-1.html
new file mode 100644
index 000000000..8f03db79d
--- /dev/null
+++ b/zh/2022/11/24/release-0-9-1.html
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.9.1 released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.9.1 released
+
24 November 2022
+
Overview
+
+
Pactus Blockchain Release Version 0.9.1
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Download
+
+
This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch.
+To start using the Pactus Blockchain Testnet-0,
+you can download the latest version from download page
+and join the Testnet.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
+ Blocks can be fully decoded when queried in gRPC
+ The HTTP module now uses gRPC module, making node configuration simpler by removing the CapnP module
+ Reducing the blockchain size by saving blocks by number instead of hash
+ The wallet can hold unconfirmed transactions
+ The wallet can use different gRPC servers
+ The GUI displays committee information
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/03/01/what-is-testnet.html b/zh/2023/03/01/what-is-testnet.html
new file mode 100644
index 000000000..849d1269b
--- /dev/null
+++ b/zh/2023/03/01/what-is-testnet.html
@@ -0,0 +1,456 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ What is a Testnet? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
What is a Testnet?
+
01 March 2023
+
Mainnet vs Testnet?
+
+
If you have ever wondered what Testnet is and how it is different from Mainnet, read this article to the end to find out!
+
+
Mainnet and Testnet are two widely used terminologies in the Blockchain ecosystem;
+so it is important to understand the meaning and differences while working in the industry or
+following announcements of the Blockchain projects like Pactus.
+
+
Here’s a quick explanation:
+Before the actual live version of a Blockchain network that is used for real transactions,
+functions and smart-contracts (which is referred as Mainnet),
+there is a test version of the Blockchain network for testing purposes (which is referred as Testnet).
+In Testnet, a safe environment is provided to help developers experiment and test their applications,
+and make sure that everything functions smoothly in the Mainnet version.
+
+
Testnet
+
+
A Testnet is a simulation of a Blockchain, in which developers can test all the functionalities of
+their Blockchain network without risking their assets and convenience of end-users.
+Using Testnet, any possible error, bug or malfunctions can be fixed before the Mainnet launch.
+Testnet also can be an experimental environment for new features, updates and upgrades.
+So several Testnet networks of the same version or newer version of the Mainnet can be implemented on the roadmap.
+
+
What are use cases of Testnet?
+
+
A secure environment to test development ideas and updates.
+So many features and minor details in Pactus project have been successfully developed so far using the Testnet; such as:
+
+
+ extra details and information on Pactus-GUI;
+ well-functioning Pactus Blockchain explorer to access transactions and block details;
+ Upgrades that led to decreasing the size of the Pactus network
+
+
+
Providing a safe testing ground for resolve scalability and security problems, as well as decentralization issues.
+Pactus network is also a secure and purely decentralized network. However in the last updates during the Testnet,
+developers are now able to decrease the database size by approximately 10% without compromising performance.
+They did it by utilizing block height instead of hash to store blocks within the database. (you can find out more
+here ).
+
+
Testing new versions, patches and features on Testnet. it is vital for enhancing the security, load testing,
+Blockchain migration, integration tests, and etc. This is why you can now use the latest version of Pactus-GUI
+that works like clockwork and is extremely secure.
+
+
Testing the functions of cryptocurrency without disrupting the Mainnet. In the Testnet of Pactus Blockchain,
+you as a user or validator can use all the features to send, receive, bond or unbond your assets in the Pactus-GUI.
+
+
Development and simulation of smart contract features and DApps. Note that many Blockchain projects like Pactus,
+can be used as smart-contract platforms. So the Testnet can be designed in different stages to test and improve
+different applications of the network.
+
+
Please note that after a certain period of time, when developers get satisfied with the functionality and debugging process,
+they launch Mainnet. Mainnet has its own independent genesis blocks;
+so the assets and addresses that users use in Testnet are not valid inside the new Mainnet Blockchain anymore.
+In fact the whole Blockchain network starts working from the scratch and users and validators start to
+work with real coins and transactions instead of the simulated ones. But since Testnet has an important effect
+on the health and improvement of the network, in Pactus Blockchain, we have several advantages
+for the people who join the Testnet.
+
+
Why should you join the Testnet?
+
+
There are different contributors in a Blockchain network;
+Some people are developers and programmers that use the Testnet to contribute, enhance and lead the project to a better future.
+Testnet is actually vital for them to perform their changes and try their innovations and ideas.
+
+
But you might also be an end user; you might want to either be a validator and stake your assets to earn more Pactus coins,
+or you might want to learn how to use the network for future personal applications. Either way,
+you might find it handy to give it a try and be familiar with Pactus-GUI and its different features.
+
+
However, there is another advantage for end users who join the Testnet.
+While using the network, running a node or testing the Pactus-GUI in Testnet period, you are contributing to
+the community to find improvement potentials, that’s why there are more advantages contemplated for the Testnet users;
+Soon our Mainnet will be launched and also Pactus network will be announced and listed in well-known exchanges.
+As an early contributor, you will have the advantage of getting some extra initial coins at the beginning of Mainnet launch.
+So that you can use it to run a validator node and earn more from staking your assets. This airdrop is considered
+for every individual who installs Pactus-GUI and starts a node in Testnet.
+
+
There are other positive conditions you may experience as an early contributor.
+
+
+ Advanced and very responsive support for your issues (we dedicate more time to provide you with solutions)
+ Embracing your suggestions, improvement ideas, needs and information you may require to have a better user experience.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/04/21/testnet-0-concluded.html b/zh/2023/04/21/testnet-0-concluded.html
new file mode 100644
index 000000000..a5c632542
--- /dev/null
+++ b/zh/2023/04/21/testnet-0-concluded.html
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Story of Testnet-0 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Story of Testnet-0
+
21 April 2023
+
What is Testnet?
+
+
Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+
Summary of Testnet-0
+
+
In September 2022, we launched Testnet-0 .
+The purpose of this Testnet was to
+check the consensus protocol ,
+test different transaction types,
+and ensure the stability of the blockchain.
+We also wanted to test the sortition algorithm
+to make sure it works properly.
+
+
The committee
+for the Testnet-0 was set to five validators, and more than 19 validators joined during the Testnet period.
+Over 2 million blocks were created, and more than 3.2 million transactions were processed during this time.
+The size of the blockchain is approximately 1 gigabyte.
+The maximum number of transactions recorded in a single block was 386 . With a block time of 10 seconds,
+we can confirm that Pactus blockchain can support up to 30 transactions per second (TPS),
+which is a reasonable number for TPS. Based on real-time statistics available at realtps ,
+we can see that Pactus is among the top 10 blockchains in terms of TPS.
+
+
At this point, the development team decided to end the Testnet-0 and move on to the next one,
+Testnet-1. We are planning to run the Testnet-1 to prepare for the MainNet launch.
+We will provide updates on our progress and share the details of the new Testnet soon.
+
+
+
+
This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+
We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+
We are grateful to all those who participated in Testnet-0, and
+we encourage them to join our next Testnet to help us improve Pactus.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/05/08/release-0-10-0.html b/zh/2023/05/08/release-0-10-0.html
new file mode 100644
index 000000000..bfaa9431a
--- /dev/null
+++ b/zh/2023/05/08/release-0-10-0.html
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.10.0 released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.10.0 released
+
08 May 2023
+
Overview
+
+
Pactus Blockchain Version 0.10.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlight
+
+
The main update in this version allows users to set up multiple validators in one node.
+Users can set up to 32 validators in a single node, and each validator can stake up to 1,000 coins.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ removing address from account (#454 )
+ supporting multiple consensus instances (#450 )
+ adding sortition interval to the parameters (#442 )
+
+
+
Fix
+
+
+ gui : check if the node has an active consensus instance (#458 )
+ Use of a Persistent Merkle tree to enhance performance of calculating the
+state hash ; fully tested in Testnet-0 (#432 )
+ GetBlockchainInfo
API in gRPC now returns the total number of validators and accounts (#439 )
+ wallet path as argument (#455 )
+ adding reward addresses to config (#453 )
+ removing committers from the certificate hash (#444 )
+ prevent data race conditions in committee (#452 )
+ using 2^256 for the vrf denominator (#445 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/05/09/testnet-1-launched.html b/zh/2023/05/09/testnet-1-launched.html
new file mode 100644
index 000000000..1a2a76dd0
--- /dev/null
+++ b/zh/2023/05/09/testnet-1-launched.html
@@ -0,0 +1,415 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Testnet-1 launch announcement | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Testnet-1 launch announcement
+
09 May 2023
+
Overview
+
+
The Pactus blockchain Testnet-1 is now available for participation.
+This version simulates the Mainnet environment and evaluate the system’s performance, stability,
+and security in a controlled environment.
+The primary goal of this version of Testnet is to determine the efficient and secure committee size for the Mainnet.
+
+
Key Aspects
+
+
+ Simulating the Mainnet environment
+ Determining the actual block creation time
+ Assessing the staking mechanism and consensus protocol
+ Evaluating network usage under different loads
+ Evaluating the syncing process for new nodes joining the network
+ Ensuring network stability with over 1000 validators
+ Evaluating transaction performance
+ Conducting stress tests
+ Performing security tests, including double spend attacks, Sybil attacks
+(nodes with different identities), and forking resistance
+
+
+
Joining Testnet-1
+
+
To join the Testnet, download Pactus software
+version 0.10.0 and
+connect to Testnet without any special configuration or hardware.
+You can run the software on your personal computer or laptop.
+To acquire test coins, visit the Discord channel and
+provide your validator address.
+
+
Benefits for Participation
+
+
By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and
+be well-prepared for the Mainnet launch.
+Testnet participants will also receive higher priority during the Mainnet launch and
+get free coins for initial staking on the Mainnet.
+
+
Your Feedback Matters
+
+
User feedback plays a vital role in the improvement of the Pactus blockchain.
+Share your thoughts and experiences to contribute to the enhancement of future software versions.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/05/29/release-0-11-0.html b/zh/2023/05/29/release-0-11-0.html
new file mode 100644
index 000000000..b35e550b0
--- /dev/null
+++ b/zh/2023/05/29/release-0-11-0.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.11.0 released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.11.0 released
+
29 May 2023
+
Overview
+
+
Pactus Blockchain Version 0.11.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
The main update in this version is the fix for the relay
+connection issue.
+A relay is a peer in the network that facilitates the connection between two peers,
+particularly when they are using home internet.
+
+
Another significant update is that sending a Bond transaction
+is now more user-friendly.
+Users no longer need to set the validator public key if they want to bond Test PAC coins to their validators.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Fix
+
+
+ gui : showing the total number of validators (#474 )
+ network : fixing relay connection issue (#475 )
+ consensus : rejecting vote with round numbers exceeding the limit (#466 )
+ increase failed counter when stream got error (#489 )
+ boosting syncing process (#482 )
+ waiting for proposal in pre-commit phase (#486 )
+ retrieving public key from wallet for bond transactions (#485 )
+ restoring config file to the default (#484 )
+ defining ChainType in genesis to detect the type of network (#483 )
+ reducing the default Argon2d to consume less memory (#480 )
+ adding password option to the start commands (#473 )
+
+
+
Refactor
+
+
+ rename send to transfer. (#469 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/06/19/release-0-12-0.html b/zh/2023/06/19/release-0-12-0.html
new file mode 100644
index 000000000..d456cfc28
--- /dev/null
+++ b/zh/2023/06/19/release-0-12-0.html
@@ -0,0 +1,442 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.12.0 released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.12.0 released
+
19 June 2023
+
Overview
+
+
Pactus Blockchain Version 0.12.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version is focused on improving the sync time to make it faster.
+This is achieved by implementing a caching mechanism that executes transactions more quickly and
+improves the calculation of total power (stake) of the blockchain in a more effective way.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ add GetAccountByNumber API to get account by number (#511 )
+
+
+
Fix
+
+
+ caching account and validator in store (#513 )
+ get recent blocks by stamp (#509 )
+ closing the mDNS connection upon stopping the network (#508 )
+ updating linkedmap to use generic (#507 )
+ removing state from cache (#506 )
+ Typo in GUI (#499 )
+ supporting localnet (#492 )
+
+
+
Refactor
+
+
+ update total power calculation based on power change(deltas) (#518 )
+ GetValidators return all validators in state validators map (#512 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/07/01/release-0-13-0.html b/zh/2023/07/01/release-0-13-0.html
new file mode 100644
index 000000000..ed4b1ec9d
--- /dev/null
+++ b/zh/2023/07/01/release-0-13-0.html
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.13.0 released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.13.0 released
+
01 July 2023
+
Overview
+
+
Pactus Blockchain Version 0.13.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
Users can now restore the default_wallet
during the node initialization.
+If users have a backup of the seed phrase (mnemonic) for the default_wallet
,
+they can now restore it and re-initialize the node.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-1 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Fix
+
+
+ implemented restore wallet base on input seed (#553 )
+ measuring total sent and received bytes (#552 )
+ add validate seed and restore wallet (#533 )
+ HTTP : Missing handlers (#549 )
+ gui : update about dialog and menu items in help (#532 )
+
+
+
Refactor
+
+
+ implementing TestSuite (#535 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/07/05/testnet-500-validators.html b/zh/2023/07/05/testnet-500-validators.html
new file mode 100644
index 000000000..6c15059a1
--- /dev/null
+++ b/zh/2023/07/05/testnet-500-validators.html
@@ -0,0 +1,407 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 500 validators joined Testnet | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
500 validators joined Testnet
+
05 July 2023
+
For a Proof of Stake blockchain, validators are important for
+maintaining the network’s integrity and security. They are similar to miners in Proof of Work blockchains like Bitcoin.
+
+
Pactus as a real Proof of Stake blockchain, has achieved a significant milestone.
+More than 500 validators joined the Testnet
+in less than 2 months.
+This accomplishment proves that Pactus is reliable, resilient, and trustworthy. More importantly, it sets new standards
+in the blockchain world. In fact, the Pactus Testnet is even more decentralized than some well-known blockchains.
+
+
+
+
One key reason why Pactus can accommodate more validators is its powerful
+consensus mechanism .
+The consensus mechanism in Pactus eliminates the need for delegation, making it possible for anyone to become a validator.
+Additionally, the user-friendly application ensures that even those new to blockchain can easily contribute to the network.
+
+
What is the next
+
+
To remain competitive in the market, Pactus recognizes the importance of prioritizing user space.
+We aim to ensure that running Pactus is affordable and accessible to anyone, regardless of their technical expertise or
+available resources.
+
+
To achieve this, the Pactus team constantly monitors network, storage, and computational usage, striving to keep them
+at minimal levels.
+By doing so, we enable more individuals to participate in the Pactus blockchain.
+
+
Currently, the Pactus team is working on optimizing and reducing network usage. This effort will lead to reduced costs,
+especially for users who are using home internet connections.
+
+
Furthermore, we are planning to introduce a pruning mode, allowing users to run the Pactus blockchain with significantly
+less storage.
+Although we believe the storage size is already small, our goal is to enable users to
+retain only the most recent blockchain history.
+This approach ensures that the blockchain size remains as compact as possible by disregarding some history of the blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/07/09/dev-meeting.html b/zh/2023/07/09/dev-meeting.html
new file mode 100644
index 000000000..f139aec9b
--- /dev/null
+++ b/zh/2023/07/09/dev-meeting.html
@@ -0,0 +1,413 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev meeting | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev meeting
+
09 July 2023
+
Meeting Summary
+
+
The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+
Overview to the Network Module
+
+
The meeting began with an overview of the Network module in Pactus.
+This module uses Libp2p as its underlying network protocol.
+
+
The Network module is agnostic about the content of the message and
+handles two types of messages: Gossip messages, which are broadcasted,
+and Stream messages, which are sent directly to a specific peer.
+The team discussed the relay nodes that enable communication for nodes behind NAT.
+Upon receiving a message, the module publishes an event.
+The two types of events are Gossip events and Steam events.
+
+
+
+
The team discussed the issue of Relay connections resetting, and explored solutions such as
+hole punching or using UDP and IPv6.
+
+
Some users in the Testnet reported high network usage.
+The team discussed implementing metrics for LibP2P to monitor network usage effectively.
+The discussion related to this issue can be found here .
+Additionally, the team discussed the customization of network resources,
+including setting limits for inbound and outbound connections.
+
+
Overview to the Sync Module
+
+
Moving on, the Sync module was discussed.
+Unlike the Network module, the Sync module has full knowledge about the messages and packets.
+The module handles a range of message types, which can be found
+here .
+
+
It was suggested that we need to define metrics for each message type.
+There was also a discussion about the need for reducing the messages to optimize the use of network resources.
+
+
The team decided to continue discussing these topics in future meetings.
+They also plan to work on improving the Network and Sync modules based on these discussions.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/08/01/testnet-1-concluded.html b/zh/2023/08/01/testnet-1-concluded.html
new file mode 100644
index 000000000..5afbbe67a
--- /dev/null
+++ b/zh/2023/08/01/testnet-1-concluded.html
@@ -0,0 +1,442 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Story of Testnet-1 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Story of Testnet-1
+
01 August 2023
+
What is Testnet?
+
+
Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+
Summary
+
+
In May 2023, we launched Testnet-1 .
+The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain.
+The development team also focused on evaluating the network’s performance.
+Additionally, the overall performance of the software and the syncing process were closely examined and assessed.
+
+
The committee for Testnet-1 was set to 21 validators,
+and 584 validators joined during the Testnet period.
+More than 600,000 blocks were created, and more than 1 million transactions were processed during this time.
+The size of the blockchain is about 300 megabytes.
+
+
About 300,000 coins were staked during this period, it was almost 50% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+
+
+
We were able to extract the confirmation time of transactions.
+More than 97% of transactions were confirmed in just one block after submission.
+This indicates that the transaction pool and broadcasting models are working fine.
+
+
+
+
Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases.
+More than 97% of blocks are committed in the first rounds.
+
+
+
+
Major updates
+
+
During Testnet-1, we released three versions(Version
+0.11.0 ,
+0.12.0 ,
+0.13.0 ), and the upgrade process was smooth.
+Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future.
+The consensus failure was resolved by requiring some validators to re-sync their nodes.
+At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible,
+including:
+
+
+ Improving the consensus protocol
+ Reducing the blockchain size
+ Optimizing the network usage
+
+
+
After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.
+
+
+
+
This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+
We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+
We are grateful to all those who participated in Testnet-1, and
+we encourage them to join our next Testnet to help us improve Pactus.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/08/22/dev-report.html b/zh/2023/08/22/dev-report.html
new file mode 100644
index 000000000..253815473
--- /dev/null
+++ b/zh/2023/08/22/dev-report.html
@@ -0,0 +1,407 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev report | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev report
+
22 August 2023
+
Abstract
+
+
there is several activities in Pactus github this month, here is a clear report and explain of activities.
+
+
+
+
Linters
+
+
one of new changes in Pactus project is new linters we added this month.
+what is linters?
+linters are just a set of rules for the style of source codes, they force developers to write new codes
+in correct, clean and safe way.
+
+
why we use them?
+the reason we are using linters in Pactus and add new ones, is to make the code more safe,
+and also make it easy to work on for new contributors because we are focus on being decentralized even in development.
+
+
Linters we added till now
+
+
TLA+ spec
+
+
one another new change in Pactus is updating TLA+ spec, which is related to consensus,
+as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.
+
+
link to changes
+
+
if you wish you can learn more about Pactus consensus here.
+
+
Refactoring
+
+
some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries.
+also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.
+
+
one of refactors
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/09/04/introduction-to-pips.html b/zh/2023/09/04/introduction-to-pips.html
new file mode 100644
index 000000000..5f3c7f696
--- /dev/null
+++ b/zh/2023/09/04/introduction-to-pips.html
@@ -0,0 +1,415 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Introduction to PIPs | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Introduction to PIPs
+
04 September 2023
+
Introduction to PIPs
+
+
In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey:
+the Pactus Improvement Proposals, or PIPs.
+
+
+
+
What are PIPs?
+
+
Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform.
+Each PIP has a unique number like PIP-2 ,
+PIP-3 , and so on.
+These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.
+
+
The PIP process
+
+
The PIP process is open, allowing any member of the Pactus community to propose a PIP.
+The author should provide a summary, motivation, and a detailed technical explanation.
+The Pactus Laboratory team will carefully review each PIP.
+Security considerations must be addressed before finalizing a PIP.
+Once finalized, it can be added to the code.
+This process helps avoid unexpected issues during development and maintain consistency and safety.
+
+
The Origins of PIPs
+
+
The Pactus Improvement Proposals (PIPs) was inspired by the
+Ethereum Improvement Proposals (EIPs ) system,
+which had its roots in the Bitcoin Improvement Proposals (BIPs ) and
+Python Enhancement Proposals (PEPs ).
+
+
New Feature Policy
+
+
From now on, all major changes or new features in the Pactus project require a PIP.
+Any implementation must reference its specific PIP.
+Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.
+
+
PIPs Repository
+
+
For a complete list of Pactus Improvement Proposals, visit this link .
+The corresponding GitHub repository is accessible here .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/09/24/dev-report-pre-testnet-2.html b/zh/2023/09/24/dev-report-pre-testnet-2.html
new file mode 100644
index 000000000..f7597bc99
--- /dev/null
+++ b/zh/2023/09/24/dev-report-pre-testnet-2.html
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Dev Report pre-testnet2 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dev Report pre-testnet2
+
24 September 2023
+
Abstract
+
+
there is several activities in Pactus github in September month, here is a clear report and explain of activities.
+
+
+
+
Implementing PIP 2, 3 and 4
+
+
After starting Pactus Labs and PIPs ,
+we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:
+
+
+
+
Network
+
+
There is some very good change and new features for Pactus network module,
+this list contain a list of important changes in Pactus networking:
+
+
+
+
gRPC and nanomessage services
+
+
We also updated, improved and enhanced gRPC and nanomessage services for better developer experience,
+for third-party and side project developers, here is some changes:
+
+
+
+
Refactoring and other new feature or debugs
+
+
We had some not implemented feature request, not fixed bugs and some issue with new golang version,
+list of this changes:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/09/28/how-sspos-works-in-simple-word.html b/zh/2023/09/28/how-sspos-works-in-simple-word.html
new file mode 100644
index 000000000..8383ceb26
--- /dev/null
+++ b/zh/2023/09/28/how-sspos-works-in-simple-word.html
@@ -0,0 +1,459 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How SSPoS (Solid State Proof of Stake) works in simple word | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How SSPoS (Solid State Proof of Stake) works in simple word
+
28 September 2023
+
Abstract
+
+
In all Blockchain protocols, there is a concept called a consensus mechanism.
+This mechanism is used to enable nodes to reach an agreement
+on the state of the Blockchain they are
+maintaining, in order to have a synchronized and integrated Blockchain.
+
+
For now, we have a lot of consensus mechanisms in the Blockchain world.
+Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.
+
+
To explain how it works let’s start with explaining one of the first and simplest
+consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).
+
+
+
+
PoW (Proof of Work)
+
+
In the proof of work model, each node in the network should solve a complex mathematical
+problem that requires lots of computing resources to make a new block.
+
+
In this way, it’s highly unlikely that anyone would be able to change
+past transactions and change Blockchain states such as balances,
+without expending equivalent computational power.
+
+
By doing this we ensure the security and integrity of the Blockchain.
+
+
The concept was adapted from digital tokens by Hal Finney in 2004
+through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).
+
+
Bitcoin uses this consensus model.
+
+
PoS (Proof of Stake)
+
+
On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!
+
+
Validators lock a number of their assets in the Blockchain and they can transfer or use it
+till it is locked which we call staking.
+after each Block is committed one of the validators will be chosen randomly (more amount of stake,
+more chance to be chosen) when a validator is chosen
+it proposes a block and announces it to other nodes to be validated,
+when a supermajority of validators accept the block it’s going to be committed.
+
+
In this system, validators have no incentive to behave maliciously or dishonestly.
+If they do, they risk losing the stake amount.
+
+
More amount of validators in a PoS Blockchain makes it more secure,
+decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.
+
+
Ethereum uses this model.
+
+
DPoS (Delegated Proof of Stake)
+
+
DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm.
+users entrust their stakes to a small group of “delegates”.
+These delegates are responsible for validating transactions
+and creating blocks. The number of delegates is limited
+to ensure accountability and efficiency in the validation process.
+
+
Some Blockchains like Cardano and Tron use DPoS.
+
+
DPoS tries to solve the issue of PoS which when validators
+increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot
+of trust in the hands of a small number of delegates,
+which goes against the principle of “don’t trust, verify”.
+
+
SSPoS (Solid State Proof of Stake)
+
+
BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?
+
+
In Pactus Blockchain, we have something called Solid State Proof of Stake
+and we try to fix the previous model’s issue, let me explain.
+
+
Pactus uses a dynamic committee of validators with a fixed size of 51,
+but the members of the committee randomly change in each round,
+based on stake amount the chance of being chosen is higher. on the other hand,
+the number of validators out on the committee is unlimited, allowing anyone
+to become a validator by staking coins.
+
+
At each block, validators participate in a sortition algorithm by generating a random number
+between zero and the total staked coins. If the number is less
+than the validator’s stake, they can enter the committee and replace the oldest committee member.
+
+
So, in SSPoS models which are a variant of PoS, we can reach a consensus,
+without using high computation resources, having an inefficient
+validation process by increasing validator numbers,
+and also without breaking the principle of “don’t trust, verify”.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/10/15/release-0-15-0.html b/zh/2023/10/15/release-0-15-0.html
new file mode 100644
index 000000000..329474e2d
--- /dev/null
+++ b/zh/2023/10/15/release-0-15-0.html
@@ -0,0 +1,499 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.15.0 released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.15.0 released
+
15 October 2023
+
Overview
+
+
Pactus Blockchain Version 0.15.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+
Download
+
+
This version is the bootstrap version for
+Testnet-2 .
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to run and configure your node:
+
+
+
+
+ If you participated in Testnet-1, ensure to delete your previous working directory and
+ create a new wallet.
+
+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows,
+ or "~/pactus" on Unix-compatible platforms.
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gui : adding the splash screen (#743 )
+ add absentees votes to the certificate (#746 )
+ logger : short stringer for loggers (#732 )
+ implementing pip-7 (#731 )
+ implementing pip-11 (#712 )
+ implementing pip-8 (#711 )
+ implementing pip-9 (#706 )
+ new API to get Public key by address (#704 )
+ Adding address field for AccountInfo (#703 )
+ CreateValidatorEvent and CreateAccountEvent for nanomsg (#702 )
+ implementing PIP-2 and PIP-3 (#699 )
+ Adding Hole Punching to network (#697 )
+ write logs into file (#673 )
+ check protocol support before sending connect/disconnect event (#683 )
+ updating genesis for pre-testnet-2 (#679 )
+ adding udp protocol for network (#672 )
+ implementing pip-4 (#671 )
+ Notifee service events (#628 )
+ adding MinimumStake parameter (#574 )
+ adding Sent and Received bytes per message metrics for peers (#618 )
+ add reason to BlockResponse messages (#607 )
+ Add CalcualteFee in GRPC (#601 )
+ add sent bytes and received bytes metrics to peerset plus update grpc (#606 )
+ added metrics of libp2p with supporting prometheus (#588 )
+ Check node address is valid (#565 )
+ add LastSent and LastReceived properties to peer (#569 )
+
+
+
Fix
+
+
+ data race issue on updating certificate (#747 )
+ network : async connection (#744 )
+ adding query vote timer for CP phase (#738 )
+ trim transactions in proposed block (#737 )
+ fixing query votes and proposal issue (#736 )
+ fixing issue when a block has max transactions (#735 )
+ consensus : anti-entroy mechanism for the consensus (#734 )
+ logger : invalid level parsing error (#733 )
+ cache certificate by height (#730 )
+ fixing a crash on consensus (#729 )
+ consensus : prevent double entry in new height (#728 )
+ resolve consensus halt caused by time discrepancy in network. (#727 )
+ unsorted addresses in wallet listing (#721 )
+ send query votes message, if there is no proposal yet (#723 )
+ fixing logger level issue (#722 )
+ fixing syncing stuck issue (#720 )
+ fixing some minor issues on pre-testnet (#719 )
+ supporting go version 1.21 and higher (#692 )
+ ensure log rotation using tests (#693 )
+ restoring at the first block (#691 )
+ swagger doesn’t work with multiple proto files (#687 )
+ fixing wallet-cli issues (#686 )
+ prevent stripping public key for subsidy transactions (#678 )
+ updating the consensus protocol (#668 )
+ aggregating signature for hello message (#640 )
+ error case for logger (#634 )
+ adding committers to the certificate (#623 )
+ updating sortition executor (#608 )
+ update buf and fixing proto generation issue (#600 )
+ adding block hash to peer (#584 )
+ copy to clipboard option for address and pubkey (#583 )
+ public key aggregate (#576 )
+ remove GetValidators rpc method (#573 )
+ missing swagger ui for grpc get account by number (#564 )
+ incorrect handler for validator by number (#563 )
+
+
+
Refactor
+
+
+ sync : refactoring syncing process (#676 )
+ remove payload prefix from payload transaction type (#669 )
+ change Hello message from broadcasting to direct messaging (#665 )
+ committee : using generic list for validators (#667 )
+ rename SanityCheck to BasicCheck (#643 )
+ cli : Migrating from mow.cli to cobra for wallet (#629 )
+ cli : replacing mow.cli with cobra for daemon (#621 )
+ logger : using fast JSON logger (zerolog) (#613 )
+ Using Generics for calculating Min and Max for numeric type #604 (#609 )
+ Updating LRU cache to version 2 #514 (#602 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/10/15/testnet-2-launched.html b/zh/2023/10/15/testnet-2-launched.html
new file mode 100644
index 000000000..14ebf4ce1
--- /dev/null
+++ b/zh/2023/10/15/testnet-2-launched.html
@@ -0,0 +1,423 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Testnet-2 launch announcement | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Testnet-2 launch announcement
+
15 October 2023
+
Overview
+
+
Exciting news for the Pactus Community: Testnet-2 is has launched!
+The journey through Testnet-1
+brought success and invaluable experiences, with over 500 validators joining the network.
+Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and
+thoroughly address these issues.
+After two months of dedicated work and testing, many problems have been resolved, and
+we feel confident launching the Testnet again.
+Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain.
+Notably, the new consensus mechanism and improved overall network performance.
+
+
At this point, we want to assure the Pactus community that this version of
+the Testnet will not stop until the mainnet launches ,
+and our main focus is on improving its overall performance and launching the Mainnet.
+
+
If you’re new to the concept of Testnet, check out our informative post:
+What is the Testnet?
+
+
Key Focus Areas
+
+
Testnet-2 has important tasks ahead.
+Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient.
+A close eye will be kept on the network’s performance, ensuring it operates as expected.
+For Testnet-2, the committee
+size has been expanded to 51 members.
+Both the committee’s performance and block production will be closely monitored.
+The goal is a blockchain that remains stable and trustworthy,
+even with thousands of validators in the network,
+ensuring it manages its regular duties seamlessly.
+
+
How To Join
+
+
Want to join the Testnet-2? Great! It’s super easy.
+Just download the latest Pactus software and you’re good to go.
+no fancy setups or special gear needed.
+You can run the software straight from your personal computer or laptop.
+Need some test coins? Pop over to our Discord channel and share your validator address there.
+
+
Benefits for Participation
+
+
By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and
+be well-prepared for the Mainnet launch.
+Testnet participants will also receive higher priority during the Mainnet launch and
+get free coins for initial staking on the Mainnet.
+
+
Your Feedback Matters
+
+
User feedback plays a vital role in the improvement of the Pactus blockchain.
+Share your thoughts and experiences to contribute to the enhancement of future software versions.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/10/29/release-0-16-0.html b/zh/2023/10/29/release-0-16-0.html
new file mode 100644
index 000000000..d6c7d423f
--- /dev/null
+++ b/zh/2023/10/29/release-0-16-0.html
@@ -0,0 +1,446 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.16.0 Released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.16.0 Released
+
29 October 2023
+
Overview
+
+
Pactus Blockchain Version 0.16.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version allows users to create new addresses for both validators and accounts.
+The networking module has been improved, and users can now set limits on the number of connections.
+A random crash on the agreement protocol has been fixed in this version.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gui : display network ID (#780 )
+ create new validator address (CLI and GUI) (#757 )
+ add community bootstrap nodes to testnet config (#764 )
+ network : implementing connection manager (#773 )
+ network : adding bootstrapper mode to the network config (#760 )
+
+
+
Fix
+
+
+ network : redefine the network limits (#788 )
+ consensus : not increase the vote-box power on duplicated votes (#785 )
+ network : close connection when unable to get supported protocols (#781 )
+ network : enabling peer exchange for bootstrappers (#779 )
+ network : set connection limit for the resource manager (#775 )
+ sync : peer status set to known on sucessfull handshaking (#774 )
+ consensus : strong termination for the binary agreement (#765 )
+ consensus : not increase the voting power on duplicated binary votes (#762 )
+
+
+
Refactor
+
+
+ network : refactoring peer manager (#787 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/11/12/release-0-17-0.html b/zh/2023/11/12/release-0-17-0.html
new file mode 100644
index 000000000..5cc4692c9
--- /dev/null
+++ b/zh/2023/11/12/release-0-17-0.html
@@ -0,0 +1,455 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.17.0 Released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.17.0 Released
+
12 November 2023
+
Overview
+
+
Pactus Blockchain Version 0.17.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
The Testnet has been upgraded and all validators must update their nodes.
+
+
This version will address major networking issues, reduce network usage, and improve overall performance.
+
+
A new node type, “Node Gossips ”, has been introduced to help broadcast and spread messages across the network.
+Node Gossips support the network by delivering messages to non-gossiping nodes.
+This gossip option is disabled by default but can be enabled in the configuration file.
+If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node.
+Please note that this option is still experimental and subject to potential changes in future releases.
+
+
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After updating the node, the configuration file will be overwritten with a new version.
+You need to make modifications to the config file if you had customized it prior to the update.
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ network : default configs for bootstrap and relay peers (#812 )
+ introducing node gossip type (#811 )
+ sync : adding remote address to the peer info (#804 )
+ network : adding public address to factory (#795 )
+ network : filter private ips (#793 )
+
+
+
Fix
+
+
+ upgrading Testnet (#814 )
+ sync : prevent opening sessions indefinitely (#813 )
+ execution : fixing mistake on calculating unbonded power (#806 )
+ network : check connection threshold on gater (#803 )
+ network : no transient connection (#799 )
+ not close connection for bootstrap nodes (#792 )
+
+
+
Refactor
+
+
+ sync : refactoring sync process (#807 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2023/12/12/release-0-18-0.html b/zh/2023/12/12/release-0-18-0.html
new file mode 100644
index 000000000..f16ac14c7
--- /dev/null
+++ b/zh/2023/12/12/release-0-18-0.html
@@ -0,0 +1,456 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.18.0 Released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.18.0 Released
+
12 December 2023
+
Overview
+
+
Pactus Blockchain Version 0.18.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version has significantly improved the syncing progress.
+The syncing process concurrently requests blocks from 8 different peers and
+actively connects to the most optimal peers for downloading the blockchain.
+
+
Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.
+
+
Breaking change
+
+
For Unix-based systems, please note that the working directory for root users has changed from /pactus
to /root/pactus
.
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After you update the node, the configuration file will automatically get updated, keeping the old settings.
+If you want to return the configuration file to its default settings,
+just delete the current config file and restart the node.
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ implement pip-14 (#841 )
+ sort wallet addresses (#836 )
+ grpc : endpoints for creating raw transaction (#838 )
+ network reachability API (#834 )
+ implement pip-13 (#835 )
+ subscribing to libp2p eventbus (#831 )
+ implement helper methods for wallet address path (#830 )
+ logger : adding rotate log file after days, compress and maxgae for logger config (#822 )
+ enable bandwidth router metric (#819 )
+
+
+
Fix
+
+
+ network : refining the connection limit (#849 )
+ corrected mistake when retrieving the reward address (#848 )
+ config : restore default config when it is deleted (#847 )
+ cmd : changing home directory for root users (#846 )
+ removing BasicCheck for hash (#845 )
+ disabling libp2p ping protocol (#844 )
+ build docker file (#839 )
+ sync : ignore publishing a block if it is received before (#829 )
+ network : subscribing to the Libp2p event bus (#828 )
+ sync : ignore block request if blocks are already inside the cache (#817 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2024/01/04/release-0-19-0.html b/zh/2024/01/04/release-0-19-0.html
new file mode 100644
index 000000000..caf64242f
--- /dev/null
+++ b/zh/2024/01/04/release-0-19-0.html
@@ -0,0 +1,460 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.19.0 Released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.19.0 Released
+
04 January 2024
+
Overview
+
+
Pactus Blockchain Version 0.19.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
This version has improved the overall performance of the blockchain by implementing
+PIP-15 .
+PIP-15 suggests to add caching algorithms to the database for the most frequently used items.
+
+
Additionally, this version has enhanced the connectivity of the nodes in the P2P network.
+
+
Availability Score
+
+
This version comes with the implementation of PIP-19 .
+PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the
+committee .
+Validators with a score less than 0.8 won’t receive the block reward,
+as their proposals will be rejected by other validators.
+The main reason behind this PIP is to prevent users from downgrading
+their node specifications and running Pactus on machines with low resources.
+
+
Breaking change
+
+
The Docker container now contains both daemon and wallet binary files.
+Users who use Docker to run Pacts now need to add the entry point to run Pactus.
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gRPC : defining network and peers info response’s properly (#898 )
+ implementing pip-19 (#899 )
+ network : disabling GosipSub, only FloodSub (#895 )
+ www : adding change proposer round and value to consensus info votes (#892 )
+ network : adding relay service to dial relay nodes (#887 )
+ implementing pip-15 (#843 )
+ check already running by lock file (#871 )
+
+
+
Fix
+
+
+ store : use cache to check if public key exists (#902 )
+ executor : not rejecting bond transaction for bootstrap validator (#901 )
+ GUI : removing unnecessary tags in transaction confirm dialog (#893 )
+ network : close relay connection for public node (#891 )
+ network : refining GossipSubParams for Gossiper node (#882 )
+ sync : adding sequence number to the bundle (#881 )
+ network : turn off mesh for gossiper node (#880 )
+ consensus : check voteset for CP strong termination (#879 )
+ adding querier to query messages (#878 )
+ execution : fixing issue #869 (#870 )
+ fixing logger issue on rotating log file (#859 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2024/01/08/mainnet-announcement.html b/zh/2024/01/08/mainnet-announcement.html
new file mode 100644
index 000000000..06472d641
--- /dev/null
+++ b/zh/2024/01/08/mainnet-announcement.html
@@ -0,0 +1,392 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Mainnet announcement | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mainnet announcement
+
08 January 2024
+
The much-awaited Mainnet Launch of The Pactus Blockchain is finally here!
+On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block ,
+will be minted by four Bootstrap validators.
+After that, every 10 seconds, a new block will be added to the blockchain.
+Each block contains the committed transactions in the network.
+The block finality in the Pactus blockchain is immediate.
+It means that there is no need to wait for block confirmation to ensure a transaction is committed.
+
+
Later, more than 2000 community validators will secure the blockchain and make it decentralized.
+These validators are Testnet participants who helped test Pactus during our testing period.
+The community validators will receive the initial staking coins from a Discord Bot named RoboPac.
+
+
To ensure everything works smoothly on the Mainnet, three different Testnets (
+Testnet0 ,
+Testnet1 , and
+Testnet2 ) have been run.
+
+
The Mainnet will never be stopped or interrupted by the core developers of Pactus,
+and validators should primarily participate in and maintain the security of the blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2024/01/10/pactus-records-its-ips-in-ipminter.html b/zh/2024/01/10/pactus-records-its-ips-in-ipminter.html
new file mode 100644
index 000000000..fd5a5a552
--- /dev/null
+++ b/zh/2024/01/10/pactus-records-its-ips-in-ipminter.html
@@ -0,0 +1,397 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus records its IPs in IPMINTER | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus records its IPs in IPMINTER
+
10 January 2024
+
+
+
In our continuous pursuit of innovation, the recording of our intellectual property is the
+cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a
+slow and expensive hurdle. That is… until we discovered IPMINTER!
+
+
Pactus profile in IPMINTER
+
+
We are ecstatic to announce that the blockchain-based platform by IPMINTER has
+revolutionized the way we secure our creations.
+
+
Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our
+intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes!
+Plus, the moment we received our exquisite certificate, complete with a QR code directly linking
+to our secure blockchain entry, our confidence in this platform soared.
+
+
Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission
+to protect our inventive proposals. The assurance we’ve experienced using their platform has
+been unparalleled.
+
+
We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward,
+economical, and robust IP recording solution. They have our heartfelt endorsement!
+
+
Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2024/01/11/release-0-20-0.html b/zh/2024/01/11/release-0-20-0.html
new file mode 100644
index 000000000..80831615e
--- /dev/null
+++ b/zh/2024/01/11/release-0-20-0.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 0.20.0 Released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 0.20.0 Released
+
11 January 2024
+
Overview
+
+
Pactus Blockchain Version 0.20.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
Highlights
+
+
Validator Stake Management
+
+
The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.
+
+
+
+
Improving Network Connectivity
+
+
Some users have reported that UDP packets are being dropped by their Internet Service Providers.
+Therefore, the UDP protocol is disabled by default.
+Users can still activate the UDP protocol by configuring the settings in the file if necessary.
+
+
Also, the experimental Node Gossip feature has been removed in this version.
+Node gossip could cause some validators to become isolated from the rest of the network.
+
+
Relay service
+
+
This version enables users to turn their node into a relay service.
+A relay service node can help users behind NAT to communicate with each other.
+It is disabled by default and can be enabled inside the config file.
+Please note that it is still in an experimental state.
+
+
Download
+
+
This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
How to Upgrade
+
+
If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ implement relay service (#931 )
+ HTTP : Integrate AddRowDouble and update tests (#926 )
+ network : making listen address private in config (#921 )
+ http : adding AvailabilityScore to http module (#917 )
+ network : adding ‘enable_udp’ config (#918 )
+ network : removing gossip node service (#916 )
+ gRPC : adding AvailabilityScore to gRPC (#910 )
+ GUI : unbond and withdraw transaction dialogs (#908 )
+
+
+
Fix
+
+
+ gRPC : adding missing get raw transaction APIs to gRPC gateway (#925 )
+ network : preventing self dial (#924 )
+ fixing time lag on starting node (#923 )
+ network : fixing network deadlock on linux arm64 (#922 )
+ GUI : updating unbond and withdraw dialogs (#911 )
+ fixing gRPC node info issue (#906 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2024/01/22/testnet-2-concluded.html b/zh/2024/01/22/testnet-2-concluded.html
new file mode 100644
index 000000000..12d7b6a46
--- /dev/null
+++ b/zh/2024/01/22/testnet-2-concluded.html
@@ -0,0 +1,440 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Story of Testnet-2 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Story of Testnet-2
+
22 January 2024
+
What is Testnet?
+
+
Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+
Summary
+
+
In October 2023, we launched Testnet-2 .
+The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.
+
+
The committee for Testnet-2 was set to 51 validators,
+and 2084 validators joined during the Testnet period.
+More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network.
+More than 800,000 blocks were created, and about 2 million transactions were processed during this time.
+The size of the blockchain is about 450 megabytes.
+
+
About 500,000 coins were staked during this period, almost 60% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+
Stability of Consensus
+
+
In Testnet-1, we had one consensus failure that caused us to
+conclude the Testnet-1 .
+During Testnet-2, there were no issues with the consensus mechanism, and
+we had no case of failure during the testing period,
+although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor.
+It proved that the consensus mechanism is in a stable situation.
+
+
Networking issues
+
+
In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem.
+In the second blockage, we had no choice but to ask active validators inside the committee to
+update their nodes to overcome the networking issue.
+The development team faced a difficult situation and had to make the proper decision to fix the networking issues.
+On one hand, the networking traffic increased significantly, and on the other hand, we had to
+make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems.
+After examining different scenarios, the networking issues were resolved, and
+no major problems were reported till the end of Testnet.
+
+
Major updates
+
+
During Testnet-2, we introduced several updates, including versions
+0.15.0 ,
+0.16.0 ,
+0.17.0 ,
+0.18.0 ,
+0.19.0 , and
+0.20.0 .
+The update process went smoothly, and with the stability of Version 0.20.0 confirmed,
+the development team shifted its focus to the Mainnet launch.
+
+
+
+
This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+
We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+
We are grateful to all those who participated in Testnets, and we encourage them to join the Mainnet.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2024/01/24/mainnet-launched.html b/zh/2024/01/24/mainnet-launched.html
new file mode 100644
index 000000000..393f8b4d2
--- /dev/null
+++ b/zh/2024/01/24/mainnet-launched.html
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Mainnet launched 🚀 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mainnet launched 🚀
+
24 January 2024
+
Years to Launch
+
+
Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time.
+Pactus Mainnet is the result of years of hard work, research, and innovation.
+It started from one idea:
+
+
A low-cost, truly decentralized blockchain, built by the people for the people,
+where anyone could run and be their own validator.
+
+
We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.
+
+
+
+
We want to thank Pactus community for helping us on the Testnet.
+
+
You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.
+
+
On the Road
+
+
The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!
+
+
We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!
+
+
We Have a Dream
+
+
We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.
+
+
This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.
+
+
And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2024/01/31/release-1-0-0.html b/zh/2024/01/31/release-1-0-0.html
new file mode 100644
index 000000000..2c602c230
--- /dev/null
+++ b/zh/2024/01/31/release-1-0-0.html
@@ -0,0 +1,445 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 1.0.0 (Beijing) Released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 1.0.0 (Beijing) Released
+
31 January 2024
+
Overview
+
+
Pactus Blockchain Version 1.0.0 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+
Highlights
+
+
Mainnet Official Release v1.0.0 (Beijing)
+
+
The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone
+for our community.
+This impressive mainnet release represents the culmination of extensive development efforts.
+Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain,
+enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software
+and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on
+this exciting journey.
+
+
Onboarding validators
+
+
On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in
+Testnet-0 ,
+Testnet-1 , and
+Testnet-2 .
+This marks the beginning of a new chapter in the decentralized world.
+
+
Download
+
+
This version has been implemented for Mainnet
+To start using Pactus Mainnet, download the latest version from the download
+page and join the Mainnet.
+
+
These guides can help you to download, install and configure your node:
+
+
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ implement get validator address for grpc (#975 )
+ add bootstrap.json and load in config on build (#964 )
+ add mainnet config and genesis files (#951 )
+ add Consensus-address to network info (#952 )
+ grpc : sign transaction using wallet client (#945 )
+ pactus gui lock support (#947 )
+ consensus : turning consensus to a zero-config module (#942 )
+
+
+
Fix
+
+
+ localnet wallet issue (#970 )
+ sync : remove ReachabilityStatus from agent info (#956 )
+ daemon : keeping previous behavior for password flag, linting CLI messages (#950 )
+ consensus : detect if the system time is behind the network (#939 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2024/02/10/release-1-0-1.html b/zh/2024/02/10/release-1-0-1.html
new file mode 100644
index 000000000..54529da02
--- /dev/null
+++ b/zh/2024/02/10/release-1-0-1.html
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 1.0.1 (Beijing) Released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 1.0.1 (Beijing) Released
+
10 February 2024
+
Overview
+
+
Pactus Blockchain Version 1.0.1 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
This release is named after the city of Beijing and it
+was unanimously selected by Pactus community.
+
+
+
+
Highlights
+
+
This update fixes several issues identified after the release of
+1.0.0 (Beijing) .
+Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.
+
+
Download
+
+
To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+
How to Upgrade
+
+
If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Feat
+
+
+ gui : add connections and moniker fields to main windows (#1090 )
+
+
+
Fix
+
+
+ network : set dial and accept limit in connection gater (#1089 )
+ gui stderr logger in windows os (#1081 )
+ sync : improve syncing process (#1087 )
+ network : redefine resource limits (#1086 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/2024/02/18/release-1-0-2.html b/zh/2024/02/18/release-1-0-2.html
new file mode 100644
index 000000000..eacb0374a
--- /dev/null
+++ b/zh/2024/02/18/release-1-0-2.html
@@ -0,0 +1,416 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus 1.0.2 (Istanbul) Released | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pactus 1.0.2 (Istanbul) Released
+
18 February 2024
+
Overview
+
+
Pactus Blockchain Version 1.0.2 (Istanbul)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
This release is named after the city of Istanbul and it
+was unanimously selected by Pactus community.
+
+
+
+
Highlights
+
+
This update fixes a major issue that decreases the number of inbound connections of the nodes over time.
+We highly recommend all users to upgrade to the new version for better connectivity.
+
+
Download
+
+
To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+
How to Upgrade
+
+
If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+
Change log
+
+
This version includes several changes and improvements, such as:
+
+
Fix
+
+
+ sync : fix concurrent map read-write crash (#1112 )
+ network : remove disconnected peers from peerMgr (#1110 )
+
+
+
You can find the full list of changes on Github ,
+as well as the source code
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/404.html b/zh/404.html
new file mode 100644
index 000000000..f55f29460
--- /dev/null
+++ b/zh/404.html
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Error 404, Page Not Found | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
404
+
+
Page not found :(
+
The requested page could not be found.
+
+
+
+
diff --git a/zh/about/faq/index.html b/zh/about/faq/index.html
new file mode 100644
index 000000000..921adcf2d
--- /dev/null
+++ b/zh/about/faq/index.html
@@ -0,0 +1,1525 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 常见问题解答 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
***
+
+
+
+
+
+
+
+
+ Pactus是什么意思?
+
+
+
+
+
+
+
+
+ Pactus一词源自拉丁语,意为共同协议、契约或交易。 在英语中,Pact一词源自拉丁词汇Pactus。
+
+
+
+
+
+
+
+ Pactus是其他任何区块链的副本吗?
+
+
+
+
+
+
+
+
+ 不,Pactus不是任何其他区块链的副本或衍生品。它是一种全新而独特的区块链协议,从头开始设计。Pactus使用的共识机制是独特的,专门为解决权益证明区块链中验证者的可扩展性问题而创建。
+
+
+
+
+
+
+
+ Did Pactus have an ICO?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ 不,Pactus没有ICO(首次代币发行),也没有预定义或特权账户。 Pactus区块链从零开始,所有的币都是通过共识机制铸造的。 这确保了币的分配是公平的,没有财富的集中化。
+
+
+
+
+
+
+
+ Where can I buy Pactus coins?
+
+
+
+
+
+
+
+
+ Pactus does not have any pre-sales coins. The only way to obtain Pactus coins at the moment is by installing the Pactus software and actively participating in block validation. By engaging in the network and contributing to block validation, you will be rewarded with Pactus coins.
+
+
+
+
+
+
+
+ 为什么开发Pactus?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ Pactus的开发目标是在不影响安全性和去中心化的前提下扩展区块链规模。 为了实现这一目标,Pactus采用了独特的共识机制,可以在10秒内创建区块。 此外,Pactus旨在让所有用户更容易使用,无论他们的技术专业知识或财务资源如何。
我们致力于去中心化和公平,这反映在我们从零开始启动Pactus区块链, 并确保所有币都是通过共识机制铸造的,而不是通过ICO或特权账户铸造。
+
+
+
+
+
+
+
+ Pactus解决了其他区块链无法解决的问题是什么?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ Pactus试图解决其他区块链网络面临的几个问题,包括可扩展性、可访问性、分配公平性和存储成本。
可扩展性: Pactus拥有一个独特的共识机制,专门设计用于解决可扩展性问题, 同时不牺牲安全性和去中心化。
可访问性: 在Pactus上运行验证者设计更容易普通用户使用,与其他区块链相比更易上手。
分配公平性: Pactus有一个公平透明的币分配模型,旨在防止财富的集中。
存储成本: Pactus通过允许用户分配专用存储文件提供了一种新颖的存储解决方案, 从而降低存储成本并简化智能合约。
+
+
+
+
+
+
+
+ Pactus与比特币有何不同?
+
+
+
+
+
+
+
+
+ Pactus和比特币是两种不同类型的区块链网络。
+ 比特币使用称为工作量证明的过程来保护其网络,而Pactus使用一种称为股权证明的不同方法。
+这意味着,验证者负责对进入的区块进行投票,必须持有网络的一定数量的代币,即押金,以防止恶意行为。
+
+
+
+
+
+
+
+ Pactus与以太坊有何不同?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ Pactus和以太坊都是股权证明的区块链,但它们在运行验证者方面存在差异。 在以太坊上运行验证者可能具有挑战性,需要至少抵押32个以太币。 相比之下,Pactus的设计更加普及化。 没有最低押注要求,您可以在任何操作系统上使用基本硬件运行Pactus节点。 这种方法反映了我们推广去中心化和让更多人使用区块链技术的承诺。
+
+
+
+
+
+
+
+
+
+
+
+
+ 什么是验证节点?
+
+
+
+
+
+
+
+
+ 在Pactus上,验证者负责处理交易和创建区块,通过这样的方式帮助保护网络并使其去中心化。 他们使用自己的代币作为押金以确保网络的安全,并获得其贡献的奖励。
+
+
+
+
+
+
+
+
+
+ Pactus有多少个验证者?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ Pactus是一个真正的权益证明区块链,这意味着网络中的验证者数量没有限制。但是,由21个验证者组成的委员会负责创建区块。需要注意的是,委员会成员不固定,随时间变化。
+
+
+
+
+
+
+
+
+
+ 我可以质押的最小和最大金额是多少?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ 在Pactus中,没有质押币的最低限制,但您可以质押的最大金额为1000个币。如果您想质押超过1000个币,可以运行新的验证者。运行多个验证者可以保持网络更加去中心化,并有助于维护其安全性和稳定性。
+
+
+
+
+
+
+
+ What are the minimum hardware requirements?
+
+
+
+
+
+
+
+
+ After thorough testing on multiple machines, we can conclude that the reccomended minimum hardware
requirements are as follows:
VPS:
* CPU's: 1/2 physical core / 1vCPU
* RAM: 1 GB Ram
* Storage (SSD): 20 GB NVMe Drive
* Network: stable internet connection with 1 TBps speed
PC:
* CPU's: 2 physical cores / 4vCPU
* RAM: 4 GB Ram
* Storage (SSD): 64 GB SSD Drive
* Network: stable internet connection with over 15 MBps speed
**Note** These specifications have been tested and provide an availabilty score of over 0.9.
+
+
+
+
+
+
+
+
+
+ Why is there a limit for maximum stake?
+
+
+
+
+
+
+
+
+ The limit for the maximum stake per validator enhances decentralization and prevents validators from gaining too much power, which could potentially lead them to control the committee. The maximum staking limit is part of the consensus parameters and can be changed in the future through consensus among the validators.
+
+
+
+
+
+
+
+ Can I run multiple validators on one computer?
+
+
+
+
+
+
+
+
+ The Pactus software allows you to run up to 32 validators on a single node. Running multiple validators may require slightly more memory, but it has no impact on storage, and has a negligible effect on CPU and networking usage. Running multiple validators on a single node enables users to distribute their stake across multiple validators, especially when they want to stake more than the maximum stake per validator. This eliminates the need for additional resources and simplifies node management.
+
+
+
+
+
+
+
+
+
+ 验证者如何获得奖励?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ 一旦验证者提出一个有效的区块,并被网络接受,验证者就会收到一个代币作为区块奖励。 奖励是给予验证者的激励,以表彰他们对网络安全和完整性的贡献,帮助网络平稳运行。
+
+
+
+
+
+
+
+
+
+ Pactus中的区块奖励是多少?
+
+
+
+
+
+
+
+
+ Pactus的区块奖励是固定的,每个区块始终为1枚币。这种平坦奖励方案有助于确保简单性、公平性和更好的币分配。
+
+
+
+
+
+
+
+
+
+
+
+ How many PAC coins are generated per day?
+
+
+
+
+
+
+
+
+ Daily, a total amount of 8640 PAC is generated. This figure translates to 241,000 every 28 days and 3,153,600 per year.
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus区块链是如何工作的?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ Pactus使用一个验证者委员会来创建新的区块。 委员会由21个验证者组成,但委员会成员随时间随机变化。 每10秒,委员会中的验证者(称为提案者)收集所有有效交易,将它们添加到一个区块中, 并与委员会中的其他验证者分享。 如果委员会中的超过2/3的利益相关者签署并认可提议的区块, 区块就会被提交,区块中的所有交易将得到执行。 这个过程每10秒重复一次。
+
+
+
+
+
+
+
+
+
+
+
+ 验证者如何进入委员会?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ 在Pactus中,为了进入委员会,验证者需要参与每个区块的彩票或抽签过程。 在这个过程中,验证者生成一个可证明的随机数,介于0和总质押币之间, 如果这个数字小于他们的质押量,则可以发送一个称为抽签交易的交易,并提供抽签证明。 一旦抽签交易被包含在一个区块中,验证者将取代最老的委员会成员。
+
+
+
+
+
+
+
+
+
+ 委员会内如何选择区块提议者?
+
+
+
+
+
+
+
+
+ 在委员会内部,区块提议者是根据他们进入委员会的时间进行选择的。 这意味着选择过程遵循先来先提出的顺序。
+
+
+
+
+
+
+
+
+
+ 是否可以让多个验证者同时进入委员会?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ Pactus中的抽签过程是随机的,因此有可能出现多个验证者同时进入委员会,或者根本没有验证者进入。 然而,为了使抽签交易被视为有效并被包含在一个区块中,必须满足两个条件: 它不能改变超过委员会总质押的1/3,不能移除尚未有机会提议区块的验证者。
+
+
+
+
+
+
+
+ Pactus区块链是否可能同时出现两个有效区块?
+
+
+
+
+
+
+
+
+ 在Pactus区块链中,不可能同时出现两个有效区块。 Pactus的共识算法防止了同时出现两个区块提议者的可能性。 这确保了网络中不会出现分叉。
+
+
+
+
+
+
+
+
+
+ How much is the block confirmation in the Pactus Blockchain?
+
+
+
+
+
+
+
+
+ Block confirmation refers to the number of blocks that need to be created before a transaction is considered final and irreversible. In Pactus, block confirmation is immediate, meaning that once a transaction is added to a block, it is considered confirmed and cannot be reversed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus币的总供应量是多少?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ Pactus的总供应量为2100万枚币,每枚币被分为10亿个单位。每10秒钟会生成一枚新的币,每天会产生8640枚币,每年约300万枚币。所有币将在7年内产生。
+
+
+
+
+
+
+
+ How are Genesis Coins allocated in Pactus?
+
+
+
+
+
+
+
+
+ The initial allocation of Genesis Coins in the Pactus blockchain is distributed as follows:
+ Genesis Coin Allocation for Pactus
+
+
+ Category
+ Coin Allocation
+ Percentage
+
+
+
+
+ Treasury
+ 21 Million coins
+ 50%
+
+
+ Foundation
+ 8.4 Million coins
+ 20%
+
+
+ VC Allocation
+ 6.3 Million coins
+ 15%
+
+
+ Team and Operations
+ 4.2 Million coins
+ 10%
+
+
+ Community
+ 2.1 Million coins
+ 5%
+
+
+
+
+
+
+
+
+
+
+
+
+ 什么是国库账户?
+
+
+
+
+
+
+
+
+ 国库账户是Pactus区块链中的一个特殊账户,持有总供应量2100万个币。它在创世时创建,没有与之关联的密钥对,这意味着任何人都无法访问或控制它。每当创建一个区块时,从国库账户中转移一枚币到提案者账户作为区块奖励。
+
+
+
+
+
+
+
+
+
+ How are Treasury coins distributed?
+
+
+
+
+
+
+
+
+ Treasury coins are distributed as block rewards to the block proposers. Every 10 seconds, one coin from the Treasury account transfers to the block proposer account. This process is called "coin minting". As a result, the total number of Pactus coins in circulation gradually increases over time as new blocks are added to the blockchain. Every day, 8,640 coins are minted, resulting in approximately 3 million coins being minted annually by the Treasury account.
+
+
+
+
+
+
+
+
+
+
+
+ How will the Support coins be spent?
+
+
+
+
+
+
+
+
+ The support accounts are designed to provide financial backing for the project. Initially, Pactus Genesis contained only the Treasury accounts without any Backup or Support accounts. The introduction of support coins was a strategic response to the absence of investors, despite the significant progress of the project.
These coins are allocated in several ways:
+ Community :
+ This portion will mainly support the community.
+ As part of this, the participants on Testnets receive initial staking coins to
+ setup their validator and secure the Mainnet.
+
+ Team and Operations :
+ Another portion supports the project team.
+ Team members receive a monthly distribution of these coins, which is estimated to sustain the team for over six years.
+
+ Venture Capital (VC) Allocation :
+ Another portion is set aside for any potential venture capitalists who
+ might show interest in investing in the project in the future.
+
+ Foundation :
+ The foundation coins are reserved for future use, potentially in supporting strong projects that align with Pactus's objectives.
+
+
+Transparency is a key aspect of this allocation, as all movements of these coins are trackable due to the fully transparent nature of the blockchain.
+
+
+
+
+
+
+
+
+
+
+
+
+ 什么是转账交易?
+
+
+
+
+
+
+
+
+ 转账交易是一种允许用户将Pactus币从一个账户转移到另一个账户的交易类型。
+
+
+
+
+
+
+
+
+
+ 什么是绑定交易?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ 绑定交易是一种交易类型,允许您通过抵押一些币来成为验证者。 当您发送绑定交易时,您的节点将成为验证者。 抵押的数量确定您在共识中的权力。
+
+
+
+
+
+
+
+
+
+ 什么是随机交易?
+
+
+
+
+
+
+
+
+ 随机交易是一种交易类型,允许验证者进入委员会。
+
+
+
+
+
+
+
+
+
+ 什么是解除绑定交易?
+
+
+
+
+
+
+
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
+ 解除绑定交易是一种交易类型,允许您解除您的验证者身份。 当您发送解除绑定交易时,您将不能再发送随机或绑定交易。
+
+
+
+
+
+
+
+
+
+ 什么是提现交易?
+
+
+
+
+
+
+
+
+ 提现交易是一种交易类型,允许验证者从网络中提取他们抵押的币。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pactus的交易费是如何计算的?
+
+
+
+
+
+
+
+
+ Pactus的交易费是使用基于百分比的费用模型来计算的。 这意味着费用是转账金额的百分比,有最低和最高费用。 百分比、最低费用和最高费用参数是区块链参数的一部分, 可以通过所有验证者的共识机制进行更改。
+
+
+
+
+
+
+
+
+
+ 最低和最高费用是多少?
+
+
+
+
+
+
+
+
+ 这些参数旨在提供更大的控制力来管理费用结构, 并确保费用保持在一定范围内。 如果交易的计算费用低于最低费用,则使用最低费用。 同样,如果计算的费用超过了最高费用,则使用最高费用。 这有助于防止用户为交易支付过高或过低的费用, 并在费用结构上提供更大的可预测性和公平性。
+
+
+
+
+
+
+
+
+
+ 为什么选择基于百分比的费用模型?
+
+
+
+
+
+
+
+
+ 选择基于百分比的费用模型是因为它为用户提供了更加公平和可预测的费用结构, 因为费用与转移金额成比例。 它还允许更大的灵活性来调整费用结构, 以更好地满足区块链及其用户的需求, 因为百分比、最低费用和最高费用参数可以通过所有验证者同意的共识机制进行更改。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/about/roadmap/index.html b/zh/about/roadmap/index.html
new file mode 100644
index 000000000..b27256ef9
--- /dev/null
+++ b/zh/about/roadmap/index.html
@@ -0,0 +1,714 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 路线图 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
路线图
+
+
+
✅ 已完成任务
+
🚧 正在进行的任务
+
⏳ 即将进行的任务
+
+
+
+
+
+
+
+
+
+
+
+
+ Decentralized Storage Platform
+
+
+
Q1 2025
+
+
+
+
+
+
+
+
+
+ Browser Extension Wallet
+
+
+
Q4 2024
+
+
+
+
+
+
+
+
+
+ Desktop and Mobile Friendly GUI
+
+
+
July 2024
+
+
+
+
+
+
+
+
+
+ CLI tools for controlling Pactus node
+
+
+
Jun 2024
+
+
+
+
+
+
+
+
+
+ First Interactive Block Explorer
+
+
+
March 2024
+
+
+
+
+
+
+
+
+
+ Permanent testnet launch
+
+
+
February 2024
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/about/what-is-pactus/index.html b/zh/about/what-is-pactus/index.html
new file mode 100644
index 000000000..3f4073ec8
--- /dev/null
+++ b/zh/about/what-is-pactus/index.html
@@ -0,0 +1,410 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 什么是帕图斯? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
什么是帕图斯?
+
+
+
+
+
+
帕图斯是一个专注于去中心化的区块链
+ 帕图斯建立在这样一个原则之上,即仅通过去中心化才能实现公平和透明的系统。 与许多其他区块链平台不同,帕图斯旨在通过消除委托和矿工的需要,消除集中化和操纵的潜力。 这使任何人都可以成为该生态系统的一部分,并确保平台保持真正的去中心化。
+
+
+
+
+
+
+
帕图斯是一种用户友好的区块链
+ 帕图斯旨在创建一种用户友好的区块链,任何人都可以轻松使用,而不仅仅是技术专家。 我们的协议旨在简单易用、易于维护和开发。帕图斯提供了一个简单的GUI应用程序, 使用户可以轻松运行节点。
+
+
+
+
+
+
+
帕图斯采用基于百分比的费用模型
+ 交易费用是基于百分比模型计算的,设定了最小和最大费用。这些参数提供了更大的费用结构控制, 防止过高或过低的支付。基于百分比的模型确保公平和可预测性, 可通过所有验证人的共识进行调整。
+
+
+
+
+
+
+
帕图斯的专用去中心化存储
+ 在帕图斯中,用户可以购买一个专用存储文件,可每年更新, 从而降低存储和智能合约执行成本。这一独特功能可以为去中心化平台开辟新的协议之路。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/android-chrome-192x192.png b/zh/android-chrome-192x192.png
new file mode 100644
index 000000000..8a8e2b6d8
Binary files /dev/null and b/zh/android-chrome-192x192.png differ
diff --git a/zh/android-chrome-256x256.png b/zh/android-chrome-256x256.png
new file mode 100644
index 000000000..827219e8a
Binary files /dev/null and b/zh/android-chrome-256x256.png differ
diff --git a/zh/apple-touch-icon.png b/zh/apple-touch-icon.png
new file mode 100644
index 000000000..1fa36ea07
Binary files /dev/null and b/zh/apple-touch-icon.png differ
diff --git a/zh/assets/css/custom.css b/zh/assets/css/custom.css
new file mode 100644
index 000000000..309f55ddc
--- /dev/null
+++ b/zh/assets/css/custom.css
@@ -0,0 +1 @@
+:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}:root,[data-bs-theme=light]{--pa-blue: #0d6efd;--pa-indigo: #6610f2;--pa-purple: #6f42c1;--pa-pink: #d63384;--pa-red: #dc3545;--pa-orange: #fd7e14;--pa-yellow: #ffc107;--pa-green: #198754;--pa-teal: #20c997;--pa-cyan: #0dcaf0;--pa-black: #000;--pa-white: #fff;--pa-gray: #6c757d;--pa-gray-dark: #343a40;--pa-gray-100: #f8f9fa;--pa-gray-200: #e9ecef;--pa-gray-300: #dee2e6;--pa-gray-400: #ced4da;--pa-gray-500: #adb5bd;--pa-gray-600: #6c757d;--pa-gray-700: #495057;--pa-gray-800: #343a40;--pa-gray-900: #212529;--pa-primary: #021a34;--pa-secondary: #075f94;--pa-success: #198754;--pa-info: #0dcaf0;--pa-warning: #ffc107;--pa-danger: #dc3545;--pa-light: #f8f9fa;--pa-dark: #212529;--pa-primary-rgb: 2, 26, 52;--pa-secondary-rgb: 7, 95, 148;--pa-success-rgb: 25, 135, 84;--pa-info-rgb: 13, 202, 240;--pa-warning-rgb: 255, 193, 7;--pa-danger-rgb: 220, 53, 69;--pa-light-rgb: 248, 249, 250;--pa-dark-rgb: 33, 37, 41;--pa-primary-text-emphasis: #010a15;--pa-secondary-text-emphasis: #03263b;--pa-success-text-emphasis: #0a3622;--pa-info-text-emphasis: #055160;--pa-warning-text-emphasis: #664d03;--pa-danger-text-emphasis: #58151c;--pa-light-text-emphasis: #495057;--pa-dark-text-emphasis: #495057;--pa-primary-bg-subtle: #ccd1d6;--pa-secondary-bg-subtle: #cddfea;--pa-success-bg-subtle: #d1e7dd;--pa-info-bg-subtle: #cff4fc;--pa-warning-bg-subtle: #fff3cd;--pa-danger-bg-subtle: #f8d7da;--pa-light-bg-subtle: #fcfcfd;--pa-dark-bg-subtle: #ced4da;--pa-primary-border-subtle: #9aa3ae;--pa-secondary-border-subtle: #9cbfd4;--pa-success-border-subtle: #a3cfbb;--pa-info-border-subtle: #9eeaf9;--pa-warning-border-subtle: #ffe69c;--pa-danger-border-subtle: #f1aeb5;--pa-light-border-subtle: #e9ecef;--pa-dark-border-subtle: #adb5bd;--pa-white-rgb: 255, 255, 255;--pa-black-rgb: 0, 0, 0;--pa-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--pa-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--pa-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--pa-body-font-family: var(--pa-font-sans-serif);--pa-body-font-size:1rem;--pa-body-font-weight: 400;--pa-body-line-height: 1.5;--pa-body-color: #212529;--pa-body-color-rgb: 33, 37, 41;--pa-body-bg: #fff;--pa-body-bg-rgb: 255, 255, 255;--pa-emphasis-color: #000;--pa-emphasis-color-rgb: 0, 0, 0;--pa-secondary-color: rgba(33, 37, 41, 0.75);--pa-secondary-color-rgb: 33, 37, 41;--pa-secondary-bg: #e9ecef;--pa-secondary-bg-rgb: 233, 236, 239;--pa-tertiary-color: rgba(33, 37, 41, 0.5);--pa-tertiary-color-rgb: 33, 37, 41;--pa-tertiary-bg: #f8f9fa;--pa-tertiary-bg-rgb: 248, 249, 250;--pa-heading-color: inherit;--pa-link-color: #021a34;--pa-link-color-rgb: 2, 26, 52;--pa-link-decoration: underline;--pa-link-hover-color: #02152a;--pa-link-hover-color-rgb: 2, 21, 42;--pa-code-color: #d63384;--pa-highlight-color: #212529;--pa-highlight-bg: #fff3cd;--pa-border-width: 1px;--pa-border-style: solid;--pa-border-color: #dee2e6;--pa-border-color-translucent: rgba(0, 0, 0, 0.175);--pa-border-radius: 0.375rem;--pa-border-radius-sm: 0.25rem;--pa-border-radius-lg: 0.5rem;--pa-border-radius-xl: 1rem;--pa-border-radius-xxl: 2rem;--pa-border-radius-2xl: var(--pa-border-radius-xxl);--pa-border-radius-pill: 50rem;--pa-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--pa-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--pa-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--pa-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--pa-focus-ring-width: 0.25rem;--pa-focus-ring-opacity: 0.25;--pa-focus-ring-color: rgba(2, 26, 52, 0.25);--pa-form-valid-color: #198754;--pa-form-valid-border-color: #198754;--pa-form-invalid-color: #dc3545;--pa-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--pa-body-color: #dee2e6;--pa-body-color-rgb: 222, 226, 230;--pa-body-bg: #212529;--pa-body-bg-rgb: 33, 37, 41;--pa-emphasis-color: #fff;--pa-emphasis-color-rgb: 255, 255, 255;--pa-secondary-color: rgba(222, 226, 230, 0.75);--pa-secondary-color-rgb: 222, 226, 230;--pa-secondary-bg: #343a40;--pa-secondary-bg-rgb: 52, 58, 64;--pa-tertiary-color: rgba(222, 226, 230, 0.5);--pa-tertiary-color-rgb: 222, 226, 230;--pa-tertiary-bg: #2b3035;--pa-tertiary-bg-rgb: 43, 48, 53;--pa-primary-text-emphasis: #677685;--pa-secondary-text-emphasis: #6a9fbf;--pa-success-text-emphasis: #75b798;--pa-info-text-emphasis: #6edff6;--pa-warning-text-emphasis: #ffda6a;--pa-danger-text-emphasis: #ea868f;--pa-light-text-emphasis: #f8f9fa;--pa-dark-text-emphasis: #dee2e6;--pa-primary-bg-subtle: #00050a;--pa-secondary-bg-subtle: #01131e;--pa-success-bg-subtle: #051b11;--pa-info-bg-subtle: #032830;--pa-warning-bg-subtle: #332701;--pa-danger-bg-subtle: #2c0b0e;--pa-light-bg-subtle: #343a40;--pa-dark-bg-subtle: #1a1d20;--pa-primary-border-subtle: #01101f;--pa-secondary-border-subtle: #043959;--pa-success-border-subtle: #0f5132;--pa-info-border-subtle: #087990;--pa-warning-border-subtle: #997404;--pa-danger-border-subtle: #842029;--pa-light-border-subtle: #495057;--pa-dark-border-subtle: #343a40;--pa-heading-color: inherit;--pa-link-color: #677685;--pa-link-hover-color: #85919d;--pa-link-color-rgb: 103, 118, 133;--pa-link-hover-color-rgb: 133, 145, 157;--pa-code-color: #e685b5;--pa-highlight-color: #dee2e6;--pa-highlight-bg: #664d03;--pa-border-color: #495057;--pa-border-color-translucent: rgba(255, 255, 255, 0.15);--pa-form-valid-color: #75b798;--pa-form-valid-border-color: #75b798;--pa-form-invalid-color: #ea868f;--pa-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--pa-body-font-family);font-size:var(--pa-body-font-size);font-weight:var(--pa-body-font-weight);line-height:var(--pa-body-line-height);color:var(--pa-body-color);text-align:var(--pa-body-text-align);background-color:var(--pa-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--pa-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--pa-heading-color)}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + 0.6vw)}@media(min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + 0.3vw)}@media(min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;color:var(--pa-highlight-color);background-color:var(--pa-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 1));text-decoration:underline}a:hover{--pa-link-color-rgb: var(--pa-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--pa-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--pa-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:0.875em;color:var(--pa-body-bg);background-color:var(--pa-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--pa-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--pa-body-bg);border:var(--pa-border-width) solid var(--pa-border-color);border-radius:var(--pa-border-radius);box-shadow:var(--pa-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:var(--pa-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--pa-breakpoint-xs: 0;--pa-breakpoint-sm: 576px;--pa-breakpoint-md: 768px;--pa-breakpoint-lg: 992px;--pa-breakpoint-xl: 1200px;--pa-breakpoint-xxl: 1400px}.row{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--pa-gutter-y));margin-right:calc(-0.5*var(--pa-gutter-x));margin-left:calc(-0.5*var(--pa-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-top:var(--pa-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--pa-gutter-x: 0}.g-0,.gy-0{--pa-gutter-y: 0}.g-1,.gx-1{--pa-gutter-x: 0.25rem}.g-1,.gy-1{--pa-gutter-y: 0.25rem}.g-2,.gx-2{--pa-gutter-x: 0.5rem}.g-2,.gy-2{--pa-gutter-y: 0.5rem}.g-3,.gx-3{--pa-gutter-x: 1rem}.g-3,.gy-3{--pa-gutter-y: 1rem}.g-4,.gx-4{--pa-gutter-x: 1.5rem}.g-4,.gy-4{--pa-gutter-y: 1.5rem}.g-5,.gx-5{--pa-gutter-x: 3rem}.g-5,.gy-5{--pa-gutter-y: 3rem}@media(min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--pa-gutter-x: 0}.g-sm-0,.gy-sm-0{--pa-gutter-y: 0}.g-sm-1,.gx-sm-1{--pa-gutter-x: 0.25rem}.g-sm-1,.gy-sm-1{--pa-gutter-y: 0.25rem}.g-sm-2,.gx-sm-2{--pa-gutter-x: 0.5rem}.g-sm-2,.gy-sm-2{--pa-gutter-y: 0.5rem}.g-sm-3,.gx-sm-3{--pa-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--pa-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--pa-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--pa-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--pa-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--pa-gutter-y: 3rem}}@media(min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--pa-gutter-x: 0}.g-md-0,.gy-md-0{--pa-gutter-y: 0}.g-md-1,.gx-md-1{--pa-gutter-x: 0.25rem}.g-md-1,.gy-md-1{--pa-gutter-y: 0.25rem}.g-md-2,.gx-md-2{--pa-gutter-x: 0.5rem}.g-md-2,.gy-md-2{--pa-gutter-y: 0.5rem}.g-md-3,.gx-md-3{--pa-gutter-x: 1rem}.g-md-3,.gy-md-3{--pa-gutter-y: 1rem}.g-md-4,.gx-md-4{--pa-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--pa-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--pa-gutter-x: 3rem}.g-md-5,.gy-md-5{--pa-gutter-y: 3rem}}@media(min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--pa-gutter-x: 0}.g-lg-0,.gy-lg-0{--pa-gutter-y: 0}.g-lg-1,.gx-lg-1{--pa-gutter-x: 0.25rem}.g-lg-1,.gy-lg-1{--pa-gutter-y: 0.25rem}.g-lg-2,.gx-lg-2{--pa-gutter-x: 0.5rem}.g-lg-2,.gy-lg-2{--pa-gutter-y: 0.5rem}.g-lg-3,.gx-lg-3{--pa-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--pa-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--pa-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--pa-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--pa-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--pa-gutter-y: 3rem}}@media(min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--pa-gutter-x: 0}.g-xl-0,.gy-xl-0{--pa-gutter-y: 0}.g-xl-1,.gx-xl-1{--pa-gutter-x: 0.25rem}.g-xl-1,.gy-xl-1{--pa-gutter-y: 0.25rem}.g-xl-2,.gx-xl-2{--pa-gutter-x: 0.5rem}.g-xl-2,.gy-xl-2{--pa-gutter-y: 0.5rem}.g-xl-3,.gx-xl-3{--pa-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--pa-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--pa-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--pa-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--pa-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--pa-gutter-y: 3rem}}@media(min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--pa-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--pa-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--pa-gutter-x: 0.25rem}.g-xxl-1,.gy-xxl-1{--pa-gutter-y: 0.25rem}.g-xxl-2,.gx-xxl-2{--pa-gutter-x: 0.5rem}.g-xxl-2,.gy-xxl-2{--pa-gutter-y: 0.5rem}.g-xxl-3,.gx-xxl-3{--pa-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--pa-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--pa-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--pa-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--pa-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--pa-gutter-y: 3rem}}.table{--pa-table-color-type: initial;--pa-table-bg-type: initial;--pa-table-color-state: initial;--pa-table-bg-state: initial;--pa-table-color: var(--pa-emphasis-color);--pa-table-bg: var(--pa-body-bg);--pa-table-border-color: var(--pa-border-color);--pa-table-accent-bg: transparent;--pa-table-striped-color: var(--pa-emphasis-color);--pa-table-striped-bg: rgba(var(--pa-emphasis-color-rgb), 0.05);--pa-table-active-color: var(--pa-emphasis-color);--pa-table-active-bg: rgba(var(--pa-emphasis-color-rgb), 0.1);--pa-table-hover-color: var(--pa-emphasis-color);--pa-table-hover-bg: rgba(var(--pa-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--pa-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--pa-table-color-state, var(--pa-table-color-type, var(--pa-table-color)));background-color:var(--pa-table-bg);border-bottom-width:var(--pa-border-width);box-shadow:inset 0 0 0 9999px var(--pa-table-bg-state, var(--pa-table-bg-type, var(--pa-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--pa-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--pa-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--pa-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-active{--pa-table-color-state: var(--pa-table-active-color);--pa-table-bg-state: var(--pa-table-active-bg)}.table-hover>tbody>tr:hover>*{--pa-table-color-state: var(--pa-table-hover-color);--pa-table-bg-state: var(--pa-table-hover-bg)}.table-primary{--pa-table-color: #000;--pa-table-bg: #ccd1d6;--pa-table-border-color: #a3a7ab;--pa-table-striped-bg: #c2c7cb;--pa-table-striped-color: #000;--pa-table-active-bg: #b8bcc1;--pa-table-active-color: #000;--pa-table-hover-bg: #bdc1c6;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-secondary{--pa-table-color: #000;--pa-table-bg: #cddfea;--pa-table-border-color: #a4b2bb;--pa-table-striped-bg: #c3d4de;--pa-table-striped-color: #000;--pa-table-active-bg: #b9c9d3;--pa-table-active-color: #000;--pa-table-hover-bg: #beced8;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-success{--pa-table-color: #000;--pa-table-bg: #d1e7dd;--pa-table-border-color: #a7b9b1;--pa-table-striped-bg: #c7dbd2;--pa-table-striped-color: #000;--pa-table-active-bg: #bcd0c7;--pa-table-active-color: #000;--pa-table-hover-bg: #c1d6cc;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-info{--pa-table-color: #000;--pa-table-bg: #cff4fc;--pa-table-border-color: #a6c3ca;--pa-table-striped-bg: #c5e8ef;--pa-table-striped-color: #000;--pa-table-active-bg: #badce3;--pa-table-active-color: #000;--pa-table-hover-bg: #bfe2e9;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-warning{--pa-table-color: #000;--pa-table-bg: #fff3cd;--pa-table-border-color: #ccc2a4;--pa-table-striped-bg: #f2e7c3;--pa-table-striped-color: #000;--pa-table-active-bg: #e6dbb9;--pa-table-active-color: #000;--pa-table-hover-bg: #ece1be;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-danger{--pa-table-color: #000;--pa-table-bg: #f8d7da;--pa-table-border-color: #c6acae;--pa-table-striped-bg: #eccccf;--pa-table-striped-color: #000;--pa-table-active-bg: #dfc2c4;--pa-table-active-color: #000;--pa-table-hover-bg: #e5c7ca;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-light{--pa-table-color: #000;--pa-table-bg: #f8f9fa;--pa-table-border-color: #c6c7c8;--pa-table-striped-bg: #ecedee;--pa-table-striped-color: #000;--pa-table-active-bg: #dfe0e1;--pa-table-active-color: #000;--pa-table-hover-bg: #e5e6e7;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-dark{--pa-table-color: #fff;--pa-table-bg: #212529;--pa-table-border-color: #4d5154;--pa-table-striped-bg: #2c3034;--pa-table-striped-color: #fff;--pa-table-active-bg: #373b3e;--pa-table-active-color: #fff;--pa-table-hover-bg: #323539;--pa-table-hover-color: #fff;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.btn{--pa-btn-padding-x: 0.75rem;--pa-btn-padding-y: 0.375rem;--pa-btn-font-family: ;--pa-btn-font-size:1rem;--pa-btn-font-weight: 400;--pa-btn-line-height: 1.5;--pa-btn-color: var(--pa-body-color);--pa-btn-bg: transparent;--pa-btn-border-width: var(--pa-border-width);--pa-btn-border-color: transparent;--pa-btn-border-radius: var(--pa-border-radius);--pa-btn-hover-border-color: transparent;--pa-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--pa-btn-disabled-opacity: 0.65;--pa-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--pa-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--pa-btn-padding-y) var(--pa-btn-padding-x);font-family:var(--pa-btn-font-family);font-size:var(--pa-btn-font-size);font-weight:var(--pa-btn-font-weight);line-height:var(--pa-btn-line-height);color:var(--pa-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;border:var(--pa-btn-border-width) solid var(--pa-btn-border-color);border-radius:var(--pa-btn-border-radius);background-color:var(--pa-btn-bg);box-shadow:var(--pa-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--pa-btn-color);background-color:var(--pa-btn-bg);border-color:var(--pa-btn-border-color)}.btn:focus-visible{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--pa-btn-active-color);background-color:var(--pa-btn-active-bg);border-color:var(--pa-btn-active-border-color);box-shadow:var(--pa-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--pa-btn-active-shadow),var(--pa-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--pa-btn-disabled-color);pointer-events:none;background-color:var(--pa-btn-disabled-bg);border-color:var(--pa-btn-disabled-border-color);opacity:var(--pa-btn-disabled-opacity);box-shadow:none}.btn-primary{--pa-btn-color: #fff;--pa-btn-bg: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #02162c;--pa-btn-hover-border-color: #02152a;--pa-btn-focus-shadow-rgb: 40, 60, 82;--pa-btn-active-color: #fff;--pa-btn-active-bg: #02152a;--pa-btn-active-border-color: #021427;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #021a34;--pa-btn-disabled-border-color: #021a34}.btn-secondary{--pa-btn-color: #fff;--pa-btn-bg: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #06517e;--pa-btn-hover-border-color: #064c76;--pa-btn-focus-shadow-rgb: 44, 119, 164;--pa-btn-active-color: #fff;--pa-btn-active-bg: #064c76;--pa-btn-active-border-color: #05476f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #075f94;--pa-btn-disabled-border-color: #075f94}.btn-success{--pa-btn-color: #fff;--pa-btn-bg: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #157347;--pa-btn-hover-border-color: #146c43;--pa-btn-focus-shadow-rgb: 60, 153, 110;--pa-btn-active-color: #fff;--pa-btn-active-bg: #146c43;--pa-btn-active-border-color: #13653f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #198754;--pa-btn-disabled-border-color: #198754}.btn-info{--pa-btn-color: #000;--pa-btn-bg: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #31d2f2;--pa-btn-hover-border-color: #25cff2;--pa-btn-focus-shadow-rgb: 11, 172, 204;--pa-btn-active-color: #000;--pa-btn-active-bg: #3dd5f3;--pa-btn-active-border-color: #25cff2;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #0dcaf0;--pa-btn-disabled-border-color: #0dcaf0}.btn-warning{--pa-btn-color: #000;--pa-btn-bg: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffca2c;--pa-btn-hover-border-color: #ffc720;--pa-btn-focus-shadow-rgb: 217, 164, 6;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffcd39;--pa-btn-active-border-color: #ffc720;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #ffc107;--pa-btn-disabled-border-color: #ffc107}.btn-danger{--pa-btn-color: #fff;--pa-btn-bg: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #bb2d3b;--pa-btn-hover-border-color: #b02a37;--pa-btn-focus-shadow-rgb: 225, 83, 97;--pa-btn-active-color: #fff;--pa-btn-active-bg: #b02a37;--pa-btn-active-border-color: #a52834;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #dc3545;--pa-btn-disabled-border-color: #dc3545}.btn-light{--pa-btn-color: #000;--pa-btn-bg: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #d3d4d5;--pa-btn-hover-border-color: #c6c7c8;--pa-btn-focus-shadow-rgb: 211, 212, 213;--pa-btn-active-color: #000;--pa-btn-active-bg: #c6c7c8;--pa-btn-active-border-color: #babbbc;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #f8f9fa;--pa-btn-disabled-border-color: #f8f9fa}.btn-dark{--pa-btn-color: #fff;--pa-btn-bg: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #424649;--pa-btn-hover-border-color: #373b3e;--pa-btn-focus-shadow-rgb: 66, 70, 73;--pa-btn-active-color: #fff;--pa-btn-active-bg: #4d5154;--pa-btn-active-border-color: #373b3e;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #212529;--pa-btn-disabled-border-color: #212529}.btn-outline-primary{--pa-btn-color: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #021a34;--pa-btn-hover-border-color: #021a34;--pa-btn-focus-shadow-rgb: 2, 26, 52;--pa-btn-active-color: #fff;--pa-btn-active-bg: #021a34;--pa-btn-active-border-color: #021a34;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #021a34;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #021a34;--pa-gradient: none}.btn-outline-secondary{--pa-btn-color: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #075f94;--pa-btn-hover-border-color: #075f94;--pa-btn-focus-shadow-rgb: 7, 95, 148;--pa-btn-active-color: #fff;--pa-btn-active-bg: #075f94;--pa-btn-active-border-color: #075f94;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #075f94;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #075f94;--pa-gradient: none}.btn-outline-success{--pa-btn-color: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #198754;--pa-btn-hover-border-color: #198754;--pa-btn-focus-shadow-rgb: 25, 135, 84;--pa-btn-active-color: #fff;--pa-btn-active-bg: #198754;--pa-btn-active-border-color: #198754;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #198754;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #198754;--pa-gradient: none}.btn-outline-info{--pa-btn-color: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #0dcaf0;--pa-btn-hover-border-color: #0dcaf0;--pa-btn-focus-shadow-rgb: 13, 202, 240;--pa-btn-active-color: #000;--pa-btn-active-bg: #0dcaf0;--pa-btn-active-border-color: #0dcaf0;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #0dcaf0;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #0dcaf0;--pa-gradient: none}.btn-outline-warning{--pa-btn-color: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffc107;--pa-btn-hover-border-color: #ffc107;--pa-btn-focus-shadow-rgb: 255, 193, 7;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffc107;--pa-btn-active-border-color: #ffc107;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #ffc107;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #ffc107;--pa-gradient: none}.btn-outline-danger{--pa-btn-color: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #dc3545;--pa-btn-hover-border-color: #dc3545;--pa-btn-focus-shadow-rgb: 220, 53, 69;--pa-btn-active-color: #fff;--pa-btn-active-bg: #dc3545;--pa-btn-active-border-color: #dc3545;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #dc3545;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #dc3545;--pa-gradient: none}.btn-outline-light{--pa-btn-color: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #f8f9fa;--pa-btn-hover-border-color: #f8f9fa;--pa-btn-focus-shadow-rgb: 248, 249, 250;--pa-btn-active-color: #000;--pa-btn-active-bg: #f8f9fa;--pa-btn-active-border-color: #f8f9fa;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #f8f9fa;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #f8f9fa;--pa-gradient: none}.btn-outline-dark{--pa-btn-color: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #212529;--pa-btn-hover-border-color: #212529;--pa-btn-focus-shadow-rgb: 33, 37, 41;--pa-btn-active-color: #fff;--pa-btn-active-bg: #212529;--pa-btn-active-border-color: #212529;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #212529;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #212529;--pa-gradient: none}.btn-link{--pa-btn-font-weight: 400;--pa-btn-color: var(--pa-link-color);--pa-btn-bg: transparent;--pa-btn-border-color: transparent;--pa-btn-hover-color: var(--pa-link-hover-color);--pa-btn-hover-border-color: transparent;--pa-btn-active-color: var(--pa-link-hover-color);--pa-btn-active-border-color: transparent;--pa-btn-disabled-color: #6c757d;--pa-btn-disabled-border-color: transparent;--pa-btn-box-shadow: 0 0 0 #000;--pa-btn-focus-shadow-rgb: 40, 60, 82;text-decoration:underline}.btn-link:focus-visible{color:var(--pa-btn-color)}.btn-link:hover{color:var(--pa-btn-hover-color)}.btn-lg{--pa-btn-padding-y: 0.5rem;--pa-btn-padding-x: 1rem;--pa-btn-font-size:1.25rem;--pa-btn-border-radius: var(--pa-border-radius-lg)}.btn-sm{--pa-btn-padding-y: 0.25rem;--pa-btn-padding-x: 0.5rem;--pa-btn-font-size:0.875rem;--pa-btn-border-radius: var(--pa-border-radius-sm)}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--pa-dropdown-zindex: 1000;--pa-dropdown-min-width: 10rem;--pa-dropdown-padding-x: 0;--pa-dropdown-padding-y: 0.5rem;--pa-dropdown-spacer: 0.125rem;--pa-dropdown-font-size:1rem;--pa-dropdown-color: var(--pa-body-color);--pa-dropdown-bg: var(--pa-body-bg);--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-border-radius: var(--pa-border-radius);--pa-dropdown-border-width: var(--pa-border-width);--pa-dropdown-inner-border-radius: calc(var(--pa-border-radius) - var(--pa-border-width));--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-divider-margin-y: 0.5rem;--pa-dropdown-box-shadow: var(--pa-box-shadow);--pa-dropdown-link-color: var(--pa-body-color);--pa-dropdown-link-hover-color: var(--pa-body-color);--pa-dropdown-link-hover-bg: var(--pa-tertiary-bg);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: var(--pa-tertiary-color);--pa-dropdown-item-padding-x: 1rem;--pa-dropdown-item-padding-y: 0.25rem;--pa-dropdown-header-color: #6c757d;--pa-dropdown-header-padding-x: 1rem;--pa-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--pa-dropdown-zindex);display:none;min-width:var(--pa-dropdown-min-width);padding:var(--pa-dropdown-padding-y) var(--pa-dropdown-padding-x);margin:0;font-size:var(--pa-dropdown-font-size);color:var(--pa-dropdown-color);text-align:left;list-style:none;background-color:var(--pa-dropdown-bg);background-clip:padding-box;border:var(--pa-dropdown-border-width) solid var(--pa-dropdown-border-color);border-radius:var(--pa-dropdown-border-radius);box-shadow:var(--pa-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--pa-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--pa-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--pa-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--pa-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--pa-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--pa-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--pa-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--pa-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--pa-dropdown-link-hover-color);background-color:var(--pa-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--pa-dropdown-link-active-color);text-decoration:none;background-color:var(--pa-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--pa-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--pa-dropdown-header-padding-y) var(--pa-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--pa-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);color:var(--pa-dropdown-link-color)}.dropdown-menu-dark{--pa-dropdown-color: #dee2e6;--pa-dropdown-bg: #343a40;--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-box-shadow: ;--pa-dropdown-link-color: #dee2e6;--pa-dropdown-link-hover-color: #fff;--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: #adb5bd;--pa-dropdown-header-color: #adb5bd}.nav{--pa-nav-link-padding-x: 1rem;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-link-color);--pa-nav-link-hover-color: var(--pa-link-hover-color);--pa-nav-link-disabled-color: var(--pa-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--pa-nav-link-padding-y) var(--pa-nav-link-padding-x);font-size:var(--pa-nav-link-font-size);font-weight:var(--pa-nav-link-font-weight);color:var(--pa-nav-link-color);text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--pa-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(2,26,52,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--pa-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--pa-nav-tabs-border-width: var(--pa-border-width);--pa-nav-tabs-border-color: var(--pa-border-color);--pa-nav-tabs-border-radius: var(--pa-border-radius);--pa-nav-tabs-link-hover-border-color: var(--pa-secondary-bg) var(--pa-secondary-bg) var(--pa-border-color);--pa-nav-tabs-link-active-color: var(--pa-emphasis-color);--pa-nav-tabs-link-active-bg: var(--pa-body-bg);--pa-nav-tabs-link-active-border-color: var(--pa-border-color) var(--pa-border-color) var(--pa-body-bg);border-bottom:var(--pa-nav-tabs-border-width) solid var(--pa-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--pa-nav-tabs-border-width));border:var(--pa-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--pa-nav-tabs-border-radius);border-top-right-radius:var(--pa-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--pa-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--pa-nav-tabs-link-active-color);background-color:var(--pa-nav-tabs-link-active-bg);border-color:var(--pa-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--pa-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--pa-nav-pills-border-radius: var(--pa-border-radius);--pa-nav-pills-link-active-color: #fff;--pa-nav-pills-link-active-bg: #021a34}.nav-pills .nav-link{border-radius:var(--pa-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--pa-nav-pills-link-active-color);background-color:var(--pa-nav-pills-link-active-bg)}.nav-underline{--pa-nav-underline-gap: 1rem;--pa-nav-underline-border-width: 0.125rem;--pa-nav-underline-link-active-color: var(--pa-emphasis-color);gap:var(--pa-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--pa-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--pa-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--pa-navbar-padding-x: 0;--pa-navbar-padding-y: 0.5rem;--pa-navbar-color: rgba(var(--pa-emphasis-color-rgb), 0.65);--pa-navbar-hover-color: rgba(var(--pa-emphasis-color-rgb), 0.8);--pa-navbar-disabled-color: rgba(var(--pa-emphasis-color-rgb), 0.3);--pa-navbar-active-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-padding-y: 0.3125rem;--pa-navbar-brand-margin-end: 1rem;--pa-navbar-brand-font-size: 1.25rem;--pa-navbar-brand-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-hover-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-nav-link-padding-x: 0.5rem;--pa-navbar-toggler-padding-y: 0.25rem;--pa-navbar-toggler-padding-x: 0.75rem;--pa-navbar-toggler-font-size: 1.25rem;--pa-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--pa-navbar-toggler-border-color: rgba(var(--pa-emphasis-color-rgb), 0.15);--pa-navbar-toggler-border-radius: var(--pa-border-radius);--pa-navbar-toggler-focus-width: 0.25rem;--pa-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--pa-navbar-padding-y) var(--pa-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--pa-navbar-brand-padding-y);padding-bottom:var(--pa-navbar-brand-padding-y);margin-right:var(--pa-navbar-brand-margin-end);font-size:var(--pa-navbar-brand-font-size);color:var(--pa-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--pa-navbar-brand-hover-color)}.navbar-nav{--pa-nav-link-padding-x: 0;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-navbar-color);--pa-nav-link-hover-color: var(--pa-navbar-hover-color);--pa-nav-link-disabled-color: var(--pa-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--pa-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--pa-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--pa-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--pa-navbar-toggler-padding-y) var(--pa-navbar-toggler-padding-x);font-size:var(--pa-navbar-toggler-font-size);line-height:1;color:var(--pa-navbar-color);background-color:rgba(0,0,0,0);border:var(--pa-border-width) solid var(--pa-navbar-toggler-border-color);border-radius:var(--pa-navbar-toggler-border-radius);transition:var(--pa-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--pa-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--pa-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--pa-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--pa-navbar-color: rgba(255, 255, 255, 0.55);--pa-navbar-hover-color: rgba(255, 255, 255, 0.75);--pa-navbar-disabled-color: rgba(255, 255, 255, 0.25);--pa-navbar-active-color: #fff;--pa-navbar-brand-color: #fff;--pa-navbar-brand-hover-color: #fff;--pa-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);--pa-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--pa-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.badge{--pa-badge-padding-x: 0.65em;--pa-badge-padding-y: 0.35em;--pa-badge-font-size:0.75em;--pa-badge-font-weight: 700;--pa-badge-color: #fff;--pa-badge-border-radius: var(--pa-border-radius);display:inline-block;padding:var(--pa-badge-padding-y) var(--pa-badge-padding-x);font-size:var(--pa-badge-font-size);font-weight:var(--pa-badge-font-weight);line-height:1;color:var(--pa-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--pa-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--pa-alert-bg: transparent;--pa-alert-padding-x: 1rem;--pa-alert-padding-y: 1rem;--pa-alert-margin-bottom: 1rem;--pa-alert-color: inherit;--pa-alert-border-color: transparent;--pa-alert-border: var(--pa-border-width) solid var(--pa-alert-border-color);--pa-alert-border-radius: var(--pa-border-radius);--pa-alert-link-color: inherit;position:relative;padding:var(--pa-alert-padding-y) var(--pa-alert-padding-x);margin-bottom:var(--pa-alert-margin-bottom);color:var(--pa-alert-color);background-color:var(--pa-alert-bg);border:var(--pa-alert-border);border-radius:var(--pa-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--pa-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--pa-alert-color: var(--pa-primary-text-emphasis);--pa-alert-bg: var(--pa-primary-bg-subtle);--pa-alert-border-color: var(--pa-primary-border-subtle);--pa-alert-link-color: var(--pa-primary-text-emphasis)}.alert-secondary{--pa-alert-color: var(--pa-secondary-text-emphasis);--pa-alert-bg: var(--pa-secondary-bg-subtle);--pa-alert-border-color: var(--pa-secondary-border-subtle);--pa-alert-link-color: var(--pa-secondary-text-emphasis)}.alert-success{--pa-alert-color: var(--pa-success-text-emphasis);--pa-alert-bg: var(--pa-success-bg-subtle);--pa-alert-border-color: var(--pa-success-border-subtle);--pa-alert-link-color: var(--pa-success-text-emphasis)}.alert-info{--pa-alert-color: var(--pa-info-text-emphasis);--pa-alert-bg: var(--pa-info-bg-subtle);--pa-alert-border-color: var(--pa-info-border-subtle);--pa-alert-link-color: var(--pa-info-text-emphasis)}.alert-warning{--pa-alert-color: var(--pa-warning-text-emphasis);--pa-alert-bg: var(--pa-warning-bg-subtle);--pa-alert-border-color: var(--pa-warning-border-subtle);--pa-alert-link-color: var(--pa-warning-text-emphasis)}.alert-danger{--pa-alert-color: var(--pa-danger-text-emphasis);--pa-alert-bg: var(--pa-danger-bg-subtle);--pa-alert-border-color: var(--pa-danger-border-subtle);--pa-alert-link-color: var(--pa-danger-text-emphasis)}.alert-light{--pa-alert-color: var(--pa-light-text-emphasis);--pa-alert-bg: var(--pa-light-bg-subtle);--pa-alert-border-color: var(--pa-light-border-subtle);--pa-alert-link-color: var(--pa-light-text-emphasis)}.alert-dark{--pa-alert-color: var(--pa-dark-text-emphasis);--pa-alert-bg: var(--pa-dark-bg-subtle);--pa-alert-border-color: var(--pa-dark-border-subtle);--pa-alert-link-color: var(--pa-dark-text-emphasis)}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--pa-primary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--pa-secondary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--pa-success-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--pa-info-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--pa-warning-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--pa-danger-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--pa-light-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--pa-dark-rgb), var(--pa-bg-opacity, 1)) !important}.link-primary{color:RGBA(var(--pa-primary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-primary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(2, 21, 42, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(2, 21, 42, var(--pa-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--pa-secondary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-secondary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(6, 76, 118, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(6, 76, 118, var(--pa-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--pa-success-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-success-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--pa-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--pa-info-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-info-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--pa-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--pa-warning-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-warning-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--pa-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--pa-danger-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-danger-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--pa-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--pa-light-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-light-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--pa-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--pa-dark-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-dark-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--pa-focus-ring-x, 0) var(--pa-focus-ring-y, 0) var(--pa-focus-ring-blur, 0) var(--pa-focus-ring-width) var(--pa-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--pa-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--pa-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--pa-aspect-ratio: 100%}.ratio-4x3{--pa-aspect-ratio: 75%}.ratio-16x9{--pa-aspect-ratio: 56.25%}.ratio-21x9{--pa-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--pa-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:var(--pa-box-shadow) !important}.shadow-sm{box-shadow:var(--pa-box-shadow-sm) !important}.shadow-lg{box-shadow:var(--pa-box-shadow-lg) !important}.shadow-none{box-shadow:none !important}.focus-ring-primary{--pa-focus-ring-color: rgba(var(--pa-primary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-secondary{--pa-focus-ring-color: rgba(var(--pa-secondary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-success{--pa-focus-ring-color: rgba(var(--pa-success-rgb), var(--pa-focus-ring-opacity))}.focus-ring-info{--pa-focus-ring-color: rgba(var(--pa-info-rgb), var(--pa-focus-ring-opacity))}.focus-ring-warning{--pa-focus-ring-color: rgba(var(--pa-warning-rgb), var(--pa-focus-ring-opacity))}.focus-ring-danger{--pa-focus-ring-color: rgba(var(--pa-danger-rgb), var(--pa-focus-ring-opacity))}.focus-ring-light{--pa-focus-ring-color: rgba(var(--pa-light-rgb), var(--pa-focus-ring-opacity))}.focus-ring-dark{--pa-focus-ring-color: rgba(var(--pa-dark-rgb), var(--pa-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-start-0{border-left:0 !important}.border-primary{--pa-border-opacity: 1;border-color:rgba(var(--pa-primary-rgb), var(--pa-border-opacity)) !important}.border-secondary{--pa-border-opacity: 1;border-color:rgba(var(--pa-secondary-rgb), var(--pa-border-opacity)) !important}.border-success{--pa-border-opacity: 1;border-color:rgba(var(--pa-success-rgb), var(--pa-border-opacity)) !important}.border-info{--pa-border-opacity: 1;border-color:rgba(var(--pa-info-rgb), var(--pa-border-opacity)) !important}.border-warning{--pa-border-opacity: 1;border-color:rgba(var(--pa-warning-rgb), var(--pa-border-opacity)) !important}.border-danger{--pa-border-opacity: 1;border-color:rgba(var(--pa-danger-rgb), var(--pa-border-opacity)) !important}.border-light{--pa-border-opacity: 1;border-color:rgba(var(--pa-light-rgb), var(--pa-border-opacity)) !important}.border-dark{--pa-border-opacity: 1;border-color:rgba(var(--pa-dark-rgb), var(--pa-border-opacity)) !important}.border-black{--pa-border-opacity: 1;border-color:rgba(var(--pa-black-rgb), var(--pa-border-opacity)) !important}.border-white{--pa-border-opacity: 1;border-color:rgba(var(--pa-white-rgb), var(--pa-border-opacity)) !important}.border-primary-subtle{border-color:var(--pa-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--pa-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--pa-success-border-subtle) !important}.border-info-subtle{border-color:var(--pa-info-border-subtle) !important}.border-warning-subtle{border-color:var(--pa-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--pa-danger-border-subtle) !important}.border-light-subtle{border-color:var(--pa-light-border-subtle) !important}.border-dark-subtle{border-color:var(--pa-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--pa-border-opacity: 0.1}.border-opacity-25{--pa-border-opacity: 0.25}.border-opacity-50{--pa-border-opacity: 0.5}.border-opacity-75{--pa-border-opacity: 0.75}.border-opacity-100{--pa-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--pa-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + 0.9vw) !important}.fs-3{font-size:calc(1.3rem + 0.6vw) !important}.fs-4{font-size:calc(1.275rem + 0.3vw) !important}.fs-5{font-size:1.25rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{--pa-text-opacity: 1;color:rgba(var(--pa-primary-rgb), var(--pa-text-opacity)) !important}.text-secondary{--pa-text-opacity: 1;color:rgba(var(--pa-secondary-rgb), var(--pa-text-opacity)) !important}.text-success{--pa-text-opacity: 1;color:rgba(var(--pa-success-rgb), var(--pa-text-opacity)) !important}.text-info{--pa-text-opacity: 1;color:rgba(var(--pa-info-rgb), var(--pa-text-opacity)) !important}.text-warning{--pa-text-opacity: 1;color:rgba(var(--pa-warning-rgb), var(--pa-text-opacity)) !important}.text-danger{--pa-text-opacity: 1;color:rgba(var(--pa-danger-rgb), var(--pa-text-opacity)) !important}.text-light{--pa-text-opacity: 1;color:rgba(var(--pa-light-rgb), var(--pa-text-opacity)) !important}.text-dark{--pa-text-opacity: 1;color:rgba(var(--pa-dark-rgb), var(--pa-text-opacity)) !important}.text-black{--pa-text-opacity: 1;color:rgba(var(--pa-black-rgb), var(--pa-text-opacity)) !important}.text-white{--pa-text-opacity: 1;color:rgba(var(--pa-white-rgb), var(--pa-text-opacity)) !important}.text-body{--pa-text-opacity: 1;color:rgba(var(--pa-body-color-rgb), var(--pa-text-opacity)) !important}.text-muted{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-black-50{--pa-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--pa-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-body-tertiary{--pa-text-opacity: 1;color:var(--pa-tertiary-color) !important}.text-body-emphasis{--pa-text-opacity: 1;color:var(--pa-emphasis-color) !important}.text-reset{--pa-text-opacity: 1;color:inherit !important}.text-opacity-25{--pa-text-opacity: 0.25}.text-opacity-50{--pa-text-opacity: 0.5}.text-opacity-75{--pa-text-opacity: 0.75}.text-opacity-100{--pa-text-opacity: 1}.text-primary-emphasis{color:var(--pa-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--pa-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--pa-success-text-emphasis) !important}.text-info-emphasis{color:var(--pa-info-text-emphasis) !important}.text-warning-emphasis{color:var(--pa-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--pa-danger-text-emphasis) !important}.text-light-emphasis{color:var(--pa-light-text-emphasis) !important}.text-dark-emphasis{color:var(--pa-dark-text-emphasis) !important}.link-opacity-10{--pa-link-opacity: 0.1}.link-opacity-10-hover:hover{--pa-link-opacity: 0.1}.link-opacity-25{--pa-link-opacity: 0.25}.link-opacity-25-hover:hover{--pa-link-opacity: 0.25}.link-opacity-50{--pa-link-opacity: 0.5}.link-opacity-50-hover:hover{--pa-link-opacity: 0.5}.link-opacity-75{--pa-link-opacity: 0.75}.link-opacity-75-hover:hover{--pa-link-opacity: 0.75}.link-opacity-100{--pa-link-opacity: 1}.link-opacity-100-hover:hover{--pa-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-primary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-primary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-secondary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-secondary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-success{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-success-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-info{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-info-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-warning{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-warning-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-danger{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-danger-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-light{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-light-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-dark{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-dark-rgb), var(--pa-link-underline-opacity)) !important}.link-underline{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--pa-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--pa-link-underline-opacity: 0}.link-underline-opacity-10{--pa-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--pa-link-underline-opacity: 0.1}.link-underline-opacity-25{--pa-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--pa-link-underline-opacity: 0.25}.link-underline-opacity-50{--pa-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--pa-link-underline-opacity: 0.5}.link-underline-opacity-75{--pa-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--pa-link-underline-opacity: 0.75}.link-underline-opacity-100{--pa-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--pa-link-underline-opacity: 1}.bg-primary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-primary-rgb), var(--pa-bg-opacity)) !important}.bg-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-rgb), var(--pa-bg-opacity)) !important}.bg-success{--pa-bg-opacity: 1;background-color:rgba(var(--pa-success-rgb), var(--pa-bg-opacity)) !important}.bg-info{--pa-bg-opacity: 1;background-color:rgba(var(--pa-info-rgb), var(--pa-bg-opacity)) !important}.bg-warning{--pa-bg-opacity: 1;background-color:rgba(var(--pa-warning-rgb), var(--pa-bg-opacity)) !important}.bg-danger{--pa-bg-opacity: 1;background-color:rgba(var(--pa-danger-rgb), var(--pa-bg-opacity)) !important}.bg-light{--pa-bg-opacity: 1;background-color:rgba(var(--pa-light-rgb), var(--pa-bg-opacity)) !important}.bg-dark{--pa-bg-opacity: 1;background-color:rgba(var(--pa-dark-rgb), var(--pa-bg-opacity)) !important}.bg-black{--pa-bg-opacity: 1;background-color:rgba(var(--pa-black-rgb), var(--pa-bg-opacity)) !important}.bg-white{--pa-bg-opacity: 1;background-color:rgba(var(--pa-white-rgb), var(--pa-bg-opacity)) !important}.bg-body{--pa-bg-opacity: 1;background-color:rgba(var(--pa-body-bg-rgb), var(--pa-bg-opacity)) !important}.bg-transparent{--pa-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-body-tertiary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-tertiary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-opacity-10{--pa-bg-opacity: 0.1}.bg-opacity-25{--pa-bg-opacity: 0.25}.bg-opacity-50{--pa-bg-opacity: 0.5}.bg-opacity-75{--pa-bg-opacity: 0.75}.bg-opacity-100{--pa-bg-opacity: 1}.bg-primary-subtle{background-color:var(--pa-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--pa-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--pa-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--pa-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--pa-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--pa-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--pa-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--pa-dark-bg-subtle) !important}.bg-gradient{background-image:var(--pa-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--pa-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--pa-border-radius-sm) !important}.rounded-2{border-radius:var(--pa-border-radius) !important}.rounded-3{border-radius:var(--pa-border-radius-lg) !important}.rounded-4{border-radius:var(--pa-border-radius-xl) !important}.rounded-5{border-radius:var(--pa-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--pa-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--pa-border-radius-sm) !important;border-top-right-radius:var(--pa-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--pa-border-radius-lg) !important;border-top-right-radius:var(--pa-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--pa-border-radius-xl) !important;border-top-right-radius:var(--pa-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--pa-border-radius-xxl) !important;border-top-right-radius:var(--pa-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--pa-border-radius-pill) !important;border-top-right-radius:var(--pa-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--pa-border-radius-sm) !important;border-bottom-right-radius:var(--pa-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--pa-border-radius-lg) !important;border-bottom-right-radius:var(--pa-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--pa-border-radius-xl) !important;border-bottom-right-radius:var(--pa-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-right-radius:var(--pa-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--pa-border-radius-pill) !important;border-bottom-right-radius:var(--pa-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--pa-border-radius-sm) !important;border-bottom-left-radius:var(--pa-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--pa-border-radius-lg) !important;border-bottom-left-radius:var(--pa-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--pa-border-radius-xl) !important;border-bottom-left-radius:var(--pa-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-left-radius:var(--pa-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--pa-border-radius-pill) !important;border-bottom-left-radius:var(--pa-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--pa-border-radius-sm) !important;border-top-left-radius:var(--pa-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--pa-border-radius-lg) !important;border-top-left-radius:var(--pa-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--pa-border-radius-xl) !important;border-top-left-radius:var(--pa-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--pa-border-radius-xxl) !important;border-top-left-radius:var(--pa-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--pa-border-radius-pill) !important;border-top-left-radius:var(--pa-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media(min-width: 1200px){.fs-1{font-size:2.5rem !important}.fs-2{font-size:2rem !important}.fs-3{font-size:1.75rem !important}.fs-4{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}body{font-family:"Open Sans",sans-serif;font-weight:400;color:var(--text-color);background-color:var(--bg-color);max-width:1200px;margin:0 auto}.btn-primary{color:var(--text-color-reverse);background-color:var(--primary-color);border-color:var(--primary-color)}.btn-outline-primary{color:var(--primary-color);background:none;border-color:var(--primary-color)}.btn-outline-primary:hover{background-color:var(--primary-color);color:var(--text-color-reverse)}.btn-secondary{color:#fff;background-color:var(--secondary-color);border-color:var(--secondary-color)}.navbar .nav-top{height:86px}.navbar .fixed-menu{width:220px}.navbar .logo img{width:200px}a{text-decoration:underline;color:var(--link-color)}a:hover{color:var(--link-hover-color)}a:active{color:var(--link-color)}h1,.h1,h2,.h2{font-weight:500;line-height:1.25;padding-bottom:12px;padding-top:14px}h1,.h1{font-weight:600}h3,.h3{padding-top:16px}.motto .title{font-weight:600;font-size:32px;padding-top:36px}.motto .motto{font-weight:500;font-size:20px}.btn-fixed{border-width:2px;border-style:solid;width:220px;height:46px;text-transform:uppercase;font-weight:700;border-radius:5px 5px 5px 5px;vertical-align:middle;line-height:42px;padding:0;margin:16px;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)}.pactus-video video{max-width:100%;width:100%;margin-left:auto;margin-right:auto;display:block}.highlighter-rouge .highlight pre{background-color:#0d1117;padding:32px 12px 12px 12px;color:#ccc;position:relative;overflow:auto;direction:ltr}.highlighter-rouge .highlight pre button{position:absolute;top:6px;right:8px;padding:2px;background-color:gray;color:#404040;border-radius:5px;border:ridge 1px gray}.highlighter-rouge .highlight pre button:hover{cursor:pointer;background-color:#bcbabb}.nav-tabs{border-color:#0d1117 !important}.nav-tabs .nav-link{border-width:0 !important}.nav-tabs .nav-link:not(.active):hover{color:#fff !important;background-color:gray !important}.nav-tabs .active{color:#fff !important;background-color:#0d1117 !important}table thead tr th{font-weight:700;background-color:var(--bg-color) !important}blockquote{background:#eee;border-left:10px solid #ccc;padding:16px;quotes:"“" "”" "‘" "’"}blockquote:before{color:#ccc;content:open-quote;font-size:64px;line-height:.1em;vertical-align:-0.4em}blockquote p{margin-top:16px}blockquote p:first-child{display:inline;padding-bottom:160px;margin-bottom:160px}.footer{background-color:var(--primary-color);color:var(--text-color-reverse)}.footer .section{font-size:1.75rem;font-weight:500;line-height:1.25;padding-bottom:20px}.footer li{padding-bottom:8px}.footer.anchor a{color:var(--text-color-reverse)}.footer.anchor a:link{color:var(--text-color-reverse);background-color:rgba(0,0,0,0);text-decoration:none}.footer.anchor a:hover{color:var(--text-color-reverse)}.footer .legal{color:var(--text-color-reverse);font-size:12px}.community img{margin:4px}.community_ran img{margin:4px}#btn-back-to-top{background-color:var(--primary-color);color:var(--bg-color);position:fixed;bottom:20px;right:20px;display:none}.edit-bar{padding-top:30px}.edit-bar .edit-btn,.edit-bar .edit-btn>a:hover{color:var(--text-color);text-decoration:none}.all-posts .post-link{padding-bottom:8px}.blog-post .post-date{padding-bottom:10px;color:gray}.blog-post .content{padding-top:22px;min-height:600px}.partners img{padding-top:24px}.hexdump{font-family:monospace;font-size:12px;padding-bottom:1rem}.hexdump .offset{border-right:2px solid #708090;color:#789}.hexdump .ascii{color:dimgray}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.faq h3,.faq .h3{margin-top:20px;padding-top:16px;border-top:1px solid var(--primary-color)}.faq a{text-decoration:none}.faq .group{padding-top:16px}.faq .group .col{font-weight:600;padding-bottom:10px}.faq .separator{padding-top:12px;padding-bottom:12px}.faq .read_more{padding-top:12px}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.toc .btn,.toc a{color:var(--text-color)}.toc .btn-section{padding:.25rem .5rem;font-weight:600;background-color:rgba(0,0,0,0)}.toc .btn-section:hover,.toc .btn-section:focus{background-color:var(--bg-color)}.toc .btn-page a{padding:.1875rem .5rem;margin-top:.125rem;margin-left:1.25rem}.toc .btn-page a:hover,.toc .btn-page a:focus,.toc .btn-page .selected{background-color:var(--bg-color)}.timeline{position:relative}.timeline::after{content:"";position:absolute;width:6px;background-color:#939597;top:0;bottom:0;left:50%;margin-left:-3px}.timeline-card{position:relative;width:50%}.timeline-card .card{border:1px solid rgba(0,0,0,.175);border-radius:5px;background-color:#eee;color:#4c4c4c}.timeline-card .card a{color:#4c4c4c}.timeline-card .card .text-muted{color:#898b8d !important}.timeline-card .card-title{padding-bottom:12px;font-size:1.1rem;font-weight:500}.timeline-card::after{line-height:38px;font-size:24px;position:absolute;text-align:center;width:48px;height:48px;right:-24px;top:15px;border-radius:50%;z-index:1}.timeline-card.completed::after{content:"✅";background-color:#eee;border:5px solid #77b255}.timeline-card.ongoing::after{content:"🚧";background-color:#eee;border:5px solid #ffcb4b}.timeline-card.upcoming::after{content:"⏳";background-color:#eee;border:5px solid #478ec2}.timeline-card.left{padding:0px 50px 20px 0px;left:0}.timeline-card.right{padding:0px 0px 20px 50px;left:50%}.timeline-card.left::before{content:"";position:absolute;height:20px;width:20px;background-color:#eee;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;right:33px;border-right:1px solid rgba(0,0,0,.175);border-top:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{content:"";position:absolute;height:20px;width:20px;background-color:#eee !important;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:33px;z-index:0;left:48px;border-left:1px solid rgba(0,0,0,.175);border-bottom:1px solid rgba(0,0,0,.175)}.timeline-card.right::after{left:-24px}@media screen and (max-width: 600px){.timeline::after{left:31px}.timeline-card{width:100%;padding-left:80px !important;padding-right:25px !important}.timeline-card::before{left:77px !important}.timeline-card.left::after,.timeline-card.right::after{left:8px !important}.timeline-card.left::before{border-right:none;border-top:none;border-left:1px solid rgba(0,0,0,.175);border-bottom:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{right:auto}.timeline-card.right{left:0%}}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.learn h2,.learn .h2{border-top:1px solid var(--primary-color)}[data-bs-theme=dark] blockquote{background:#14171c}[data-bs-theme=dark] .toc .btn-section::before{--svg-color: var(--text)}[data-bs-theme=dark] .fa-linux{color:#fff}/*# sourceMappingURL=custom.css.map */
\ No newline at end of file
diff --git a/zh/assets/css/custom.css.map b/zh/assets/css/custom.css.map
new file mode 100644
index 000000000..a7da8066e
--- /dev/null
+++ b/zh/assets/css/custom.css.map
@@ -0,0 +1 @@
+{"version":3,"sourceRoot":"","sources":["../../_sass/_vars.scss","../../../node_modules/bootstrap/scss/_root.scss","../../../node_modules/bootstrap/scss/vendor/_rfs.scss","../../../node_modules/bootstrap/scss/mixins/_color-mode.scss","../../../node_modules/bootstrap/scss/_reboot.scss","../../../node_modules/bootstrap/scss/_variables.scss","../../../node_modules/bootstrap/scss/mixins/_border-radius.scss","../../../node_modules/bootstrap/scss/_type.scss","../../../node_modules/bootstrap/scss/mixins/_lists.scss","../../../node_modules/bootstrap/scss/_images.scss","../../../node_modules/bootstrap/scss/mixins/_image.scss","../../../node_modules/bootstrap/scss/mixins/_box-shadow.scss","../../../node_modules/bootstrap/scss/_containers.scss","../../../node_modules/bootstrap/scss/mixins/_container.scss","../../../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../../../node_modules/bootstrap/scss/_grid.scss","../../../node_modules/bootstrap/scss/mixins/_grid.scss","../../../node_modules/bootstrap/scss/_tables.scss","../../../node_modules/bootstrap/scss/mixins/_table-variants.scss","../../../node_modules/bootstrap/scss/_buttons.scss","../../../node_modules/bootstrap/scss/mixins/_gradients.scss","../../../node_modules/bootstrap/scss/mixins/_transition.scss","../../../node_modules/bootstrap/scss/mixins/_buttons.scss","../../../node_modules/bootstrap/scss/_transitions.scss","../../../node_modules/bootstrap/scss/_dropdown.scss","../../../node_modules/bootstrap/scss/mixins/_caret.scss","../../../node_modules/bootstrap/scss/_nav.scss","../../../node_modules/bootstrap/scss/_navbar.scss","../../../node_modules/bootstrap/scss/_badge.scss","../../../node_modules/bootstrap/scss/_alert.scss","../../../node_modules/bootstrap/scss/mixins/_clearfix.scss","../../../node_modules/bootstrap/scss/helpers/_color-bg.scss","../../../node_modules/bootstrap/scss/helpers/_colored-links.scss","../../../node_modules/bootstrap/scss/helpers/_focus-ring.scss","../../../node_modules/bootstrap/scss/helpers/_icon-link.scss","../../../node_modules/bootstrap/scss/helpers/_ratio.scss","../../../node_modules/bootstrap/scss/helpers/_position.scss","../../../node_modules/bootstrap/scss/helpers/_stacks.scss","../../../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../../../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../../../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../../../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../../../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../../../node_modules/bootstrap/scss/helpers/_vr.scss","../../../node_modules/bootstrap/scss/mixins/_utilities.scss","../../../node_modules/bootstrap/scss/utilities/_api.scss","../../_sass/_styles.scss","../../_sass/_hexdump.scss","../../_sass/_faq.scss","../../_sass/_toc.scss","../../_sass/_roadmap.scss","../../_sass/_learn.scss","../../_sass/dark_mode.scss"],"names":[],"mappings":"CAGA,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDChEF,4BASI,mRAIA,+MAIA,yKAIA,wOAIA,yRAIA,yPAIA,yRAGF,8BACA,wBAMA,sNACA,0GACA,0FAOA,iDC2OI,oBALI,KDpOR,2BACA,2BAKA,yBACA,gCACA,mBACA,gCAEA,0BACA,iCAEA,6CACA,qCACA,2BACA,qCAEA,2CACA,oCACA,0BACA,oCAGA,4BAEA,yBACA,+BACA,gCAEA,+BACA,qCAMA,yBACA,8BACA,2BAGA,uBACA,yBACA,2BACA,oDAEA,6BACA,+BACA,8BACA,4BACA,6BACA,oDACA,+BAGA,mDACA,4DACA,qDACA,4DAIA,+BACA,8BACA,6CAIA,+BACA,sCACA,iCACA,wCEhHE,qBFsHA,kBAGA,yBACA,mCACA,sBACA,6BAEA,0BACA,uCAEA,gDACA,wCACA,2BACA,kCAEA,8CACA,uCACA,0BACA,iCAGE,yRAIA,yPAIA,yRAGF,4BAEA,yBACA,+BACA,mCACA,yCAEA,yBACA,8BACA,2BAEA,2BACA,yDAEA,+BACA,sCACA,iCACA,wCGxKJ,qBAGE,sBAeE,8CANJ,MAOM,wBAcN,KACE,SACA,uCF6OI,UALI,yBEtOR,uCACA,uCACA,2BACA,qCACA,mCACA,8BACA,0CASF,GACE,cACA,MCmnB4B,QDlnB5B,SACA,wCACA,QCynB4B,ID/mB9B,0CACE,aACA,cCwjB4B,MDrjB5B,YCwjB4B,IDvjB5B,YCwjB4B,IDvjB5B,8BAGF,OFuMQ,iCA5JJ,0BE3CJ,OF8MQ,kBEzMR,OFkMQ,iCA5JJ,0BEtCJ,OFyMQ,gBEpMR,OF6LQ,+BA5JJ,0BEjCJ,OFoMQ,mBE/LR,OFwLQ,iCA5JJ,0BE5BJ,OF+LQ,kBE1LR,OF+KM,UALI,QErKV,OF0KM,UALI,KE1JV,EACE,aACA,cCwV0B,KD9U5B,YACE,iCACA,YACA,8BAMF,QACE,mBACA,kBACA,oBAMF,MAEE,kBAGF,SAGE,aACA,mBAGF,wBAIE,gBAGF,GACE,YC6b4B,IDxb9B,GACE,oBACA,cAMF,WACE,gBAQF,SAEE,YCsa4B,OD9Z9B,aF6EM,UALI,QEjEV,WACE,QCqf4B,QDpf5B,gCACA,wCASF,QAEE,kBFwDI,UALI,OEjDR,cACA,wBAGF,mBACA,eAKA,EACE,gEACA,gBCgNwC,UD9MxC,QACE,oDAWF,4DAEE,cACA,qBAOJ,kBAIE,YCgV4B,yBHlUxB,UALI,IEDV,IACE,cACA,aACA,mBACA,cFEI,UALI,QEQR,SFHI,UALI,QEUN,cACA,kBAIJ,KFVM,UALI,QEiBR,2BACA,qBAGA,OACE,cAIJ,IACE,yBFtBI,UALI,QE6BR,MCu5CkC,kBDt5ClC,iBCu5CkC,qBC5rDhC,qBFwSF,QACE,UF7BE,UALI,IE6CV,OACE,gBAMF,QAEE,sBAQF,MACE,oBACA,yBAGF,QACE,YC4X4B,MD3X5B,eC2X4B,MD1X5B,MC4Z4B,0BD3Z5B,gBAOF,GAEE,mBACA,gCAGF,2BAME,qBACA,mBACA,eAQF,MACE,qBAMF,OAEE,gBAQF,iCACE,UAKF,sCAKE,SACA,oBF5HI,UALI,QEmIR,oBAIF,cAEE,oBAKF,cACE,eAGF,OAGE,iBAGA,gBACE,UAOJ,0IACE,wBAQF,gDAIE,0BAGE,4GACE,eAON,mBACE,UACA,kBAKF,SACE,gBAUF,SACE,YACA,UACA,SACA,SAQF,OACE,WACA,WACA,UACA,cCmN4B,MHpatB,iCEoNN,oBFhXE,0BEyWJ,OFtMQ,kBE+MN,SACE,WAOJ,+OAOE,UAGF,4BACE,YASF,cACE,6BACA,oBAmBF,4BACE,wBAKF,+BACE,UAOF,uBACE,aACA,0BAKF,OACE,qBAKF,OACE,SAOF,QACE,kBACA,eAQF,SACE,wBAQF,SACE,wBGrkBF,MLmQM,UALI,QK5PR,YFwoB4B,IEnoB5B,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBK/OR,eCvDE,eACA,gBD2DF,aC5DE,eACA,gBD8DF,kBACE,qBAEA,mCACE,aFsoB0B,ME5nB9B,YL8MM,UALI,QKvMR,yBAIF,YACE,cFiUO,KH1HH,UALI,QK/LR,wBACE,gBAIJ,mBACE,iBACA,cFuTO,KH1HH,UALI,QKtLR,MFtFS,QEwFT,2BACE,aEhGJ,WCIE,eAGA,YDDF,eACE,QJ6jDkC,OI5jDlC,iBJ6jDkC,kBI5jDlC,2DHGE,sCKLE,WARW,wBDKf,eAGA,YDcF,QAEE,qBAGF,YACE,oBACA,cAGF,gBPyPM,UALI,QOlPR,MJgjDkC,0BOllDlC,mGCHA,sBACA,iBACA,WACA,0CACA,yCACA,kBACA,iBCsDE,yBF5CE,yBACE,UPkee,OSvbnB,yBF5CE,uCACE,UPkee,OSvbnB,yBF5CE,qDACE,UPkee,OSvbnB,0BF5CE,mEACE,UPkee,QSvbnB,0BF5CE,kFACE,UPkee,QUlfvB,MAEI,2JAKF,KCNA,sBACA,iBACA,aACA,eAEA,uCACA,2CACA,0CDEE,OCOF,cACA,WACA,eACA,0CACA,yCACA,8BA+CI,KACE,YAGF,iBApCJ,cACA,WAcA,cACE,cACA,WAFF,cACE,cACA,UAFF,cACE,cACA,mBAFF,cACE,cACA,UAFF,cACE,cACA,UAFF,cACE,cACA,mBA+BE,UAhDJ,cACA,WAqDQ,OAhEN,cACA,kBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,WAuEQ,UAxDV,wBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,WAxDV,yBAwDU,WAxDV,yBAmEM,WAEE,iBAGF,WAEE,iBAPF,WAEE,uBAGF,WAEE,uBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,0BEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,0BEUE,SACE,YAGF,qBApCJ,cACA,WAcA,kBACE,cACA,WAFF,kBACE,cACA,UAFF,kBACE,cACA,mBAFF,kBACE,cACA,UAFF,kBACE,cACA,UAFF,kBACE,cACA,mBA+BE,cAhDJ,cACA,WAqDQ,WAhEN,cACA,kBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,WAuEQ,cAxDV,cAwDU,cAxDV,wBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,eAxDV,yBAwDU,eAxDV,yBAmEM,mBAEE,iBAGF,mBAEE,iBAPF,mBAEE,uBAGF,mBAEE,uBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,oBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,qBCrHV,OAEE,+BACA,4BACA,gCACA,6BAEA,2CACA,iCACA,gDACA,kCACA,mDACA,gEACA,kDACA,8DACA,iDACA,+DAEA,WACA,cZkYO,KYjYP,eZusB4B,IYtsB5B,0CAOA,yBACE,oBAEA,qFACA,oCACA,oBZ+sB0B,uBY9sB1B,2GAGF,aACE,uBAGF,aACE,sBAIJ,qBACE,+DAOF,aACE,iBAUA,4BACE,sBAeF,gCACE,sCAGA,kCACE,sCAOJ,oCACE,sBAGF,qCACE,mBAUF,2CACE,qDACA,+CAMF,yDACE,qDACA,+CAQJ,cACE,qDACA,+CAQA,8BACE,oDACA,8CC5IF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,iBAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,cAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,aAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CDiJA,kBACE,gBACA,iCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,sBACE,gBACA,kCEnKN,KAEE,4BACA,6BACA,uBjBuRI,mBALI,KiBhRR,0BACA,0BACA,qCACA,yBACA,8CACA,mCACA,gDACA,yCACA,6FACA,gCACA,kFAGA,qBACA,wDACA,sCjBsQI,UALI,wBiB/PR,sCACA,sCACA,0BACA,kBACA,qBAEA,sBACA,eACA,iBACA,mEbjBE,0CcfF,iBDkCqB,iBRxBjB,WARW,yBUUX,WFwBJ,mHEpBI,uCFhBN,KEiBQ,iBFqBN,WACE,gCAEA,wCACA,8CAGF,sBAEE,0BACA,kCACA,wCAGF,mBACE,gCCrDF,iBDsDuB,uBACrB,8CACA,UAGE,mEAMJ,8BACE,8CACA,UAGE,mEAMJ,mGAKE,iCACA,yCAGA,+CR3EE,WARW,4BQsFb,yKAGI,sEAON,mDAGE,mCACA,oBACA,2CAEA,iDACA,uCRhGE,WARW,KQoHf,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,eGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,YGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,WGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHmHA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,qCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,uBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,oBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,mBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBHsGF,UACE,0BACA,qCACA,yBACA,mCACA,iDACA,yCACA,kDACA,0CACA,iCACA,4CACA,gCACA,sCAEA,gBduRwC,Uc7QxC,wBACE,0BAGF,gBACE,gCAWJ,QGxIE,2BACA,yBpB8NI,mBALI,QoBvNR,mDHyIF,QG5IE,4BACA,2BpB8NI,mBALI,SoBvNR,mDCnEF,MFgBM,WEfJ,oBFmBI,uCEpBN,MFqBQ,iBElBN,iBACE,UAMF,qBACE,aAIJ,YACE,SACA,gBFDI,WEEJ,iBFEI,uCELN,YFMQ,iBEDN,gCACE,QACA,YFNE,WEOF,gBFHE,uEACE,iBGpBR,sEAME,kBAGF,iBACE,mBCwBE,wBACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WArCJ,sBACA,sCACA,gBACA,qCA0DE,8BACE,cD9CN,eAEE,2BACA,+BACA,2BACA,gCACA,+BtBuQI,wBALI,KsBhQR,0CACA,oCACA,+DACA,qDACA,mDACA,0FACA,6DACA,uCACA,+CACA,+CACA,qDACA,mDACA,sCACA,sCACA,4DACA,mCACA,sCACA,oCACA,qCACA,uCAGA,kBACA,kCACA,aACA,uCACA,kEACA,StB0OI,UALI,6BsBnOR,+BACA,gBACA,gBACA,uCACA,4BACA,6ElBzCE,+CKLE,WARW,8Ba0Df,+BACE,SACA,OACA,qCAwBA,qBACE,qBAEA,qCACE,WACA,OAIJ,mBACE,mBAEA,mCACE,QACA,UV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,yBACE,qBAEA,yCACE,WACA,OAIJ,uBACE,mBAEA,uCACE,QACA,WAUN,uCACE,SACA,YACA,aACA,wCCpFA,gCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WA9BJ,aACA,sCACA,yBACA,qCAmDE,sCACE,cDgEJ,wCACE,MACA,WACA,UACA,aACA,sCClGA,iCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAvBJ,oCACA,eACA,uCACA,uBA4CE,uCACE,cD0EF,iCACE,iBAMJ,0CACE,MACA,WACA,UACA,aACA,uCCnHA,mCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAWA,mCACE,aAGF,oCACE,qBACA,apB0gBsB,OoBzgBtB,epBwgBsB,OoBvgBtB,WAnCN,oCACA,wBACA,uCAsCE,yCACE,cD2FF,oCACE,iBAON,kBACE,SACA,6CACA,gBACA,mDACA,UAMF,eACE,cACA,WACA,4EACA,WACA,YnByb4B,ImBxb5B,oCACA,mBACA,qBACA,mBACA,+BACA,SlBtKE,uDkByKF,0CAEE,0CJ1LF,iBI4LuB,iCAGvB,4CAEE,2CACA,qBJlMF,iBImMuB,kCAGvB,gDAEE,6CACA,oBACA,+BAMJ,oBACE,cAIF,iBACE,cACA,gFACA,gBtBmEI,UALI,SsB5DR,sCACA,mBAIF,oBACE,cACA,4EACA,oCAIF,oBAEE,6BACA,0BACA,+DACA,2BACA,kCACA,qCACA,6DACA,uDACA,sCACA,sCACA,2CACA,oCElPF,KAEE,8BACA,gCAEA,4BACA,0CACA,sDACA,wDAGA,aACA,eACA,eACA,gBACA,gBAGF,UACE,cACA,kExBsQI,UALI,6BwB/PR,2CACA,+BACA,qBACA,gBACA,SLfI,WKgBJ,uFLZI,uCKGN,ULFQ,iBKaN,gCAEE,qCAIF,wBACE,UACA,WrBkhBoB,+BqB9gBtB,sCAEE,wCACA,oBACA,eAQJ,UAEE,mDACA,mDACA,qDACA,4GACA,0DACA,gDACA,wGAGA,oFAEA,oBACE,uDACA,2DpB7CA,wDACA,yDoB+CA,oDAGE,kBACA,wDAIJ,8DAEE,2CACA,mDACA,yDAGF,yBAEE,oDpBjEA,yBACA,0BoB2EJ,WAEE,sDACA,uCACA,uCAGA,qBpB5FE,gDoBgGF,uDAEE,4CNjHF,iBMkHuB,mCASzB,eAEE,6BACA,0CACA,+DAGA,gCAEA,yBACE,gBACA,eACA,uEAEA,8DAEE,iCAIJ,+DAEE,YrB0d0B,IqBzd1B,gDACA,iCAUF,wCAEE,cACA,kBAKF,kDAEE,aACA,YACA,kBAMF,iEACE,WAUF,uBACE,aAEF,qBACE,cC7LJ,QAEE,yBACA,8BACA,4DACA,iEACA,oEACA,gEACA,uCACA,mCACA,qCACA,+DACA,qEACA,uCACA,uCACA,uCACA,uCACA,4QACA,2EACA,2DACA,yCACA,6DAGA,kBACA,aACA,eACA,mBACA,8BACA,8DAMA,2JACE,aACA,kBACA,mBACA,8BAoBJ,cACE,6CACA,gDACA,+CzB4NI,UALI,iCyBrNR,mCACA,qBACA,mBAEA,wCAEE,yCAUJ,YAEE,2BACA,gCAEA,4BACA,4CACA,wDACA,8DAGA,aACA,sBACA,eACA,gBACA,gBAGE,wDAEE,oCAIJ,2BACE,gBASJ,aACE,YtB8gCkC,MsB7gClC,etB6gCkC,MsB5gClC,6BAEA,yDAGE,oCAaJ,iBACE,gBACA,YAGA,mBAIF,gBACE,8EzByII,UALI,mCyBlIR,cACA,6BACA,+BACA,0ErBxIE,qDeHE,WM6IJ,oCNzII,uCMiIN,gBNhIQ,iBM0IN,sBACE,qBAGF,sBACE,qBACA,UACA,sDAMJ,qBACE,qBACA,YACA,aACA,sBACA,kDACA,4BACA,2BACA,qBAGF,mBACE,yCACA,gBb1HE,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,mBAEI,iBACA,2BAEA,+BACE,mBAEA,8CACE,kBAGF,yCACE,kDACA,iDAIJ,sCACE,iBAGF,oCACE,wBACA,gBAGF,mCACE,aAGF,8BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,gDACE,aAGF,8CACE,aACA,YACA,UACA,oBAtDR,eAEI,iBACA,2BAEA,2BACE,mBAEA,0CACE,kBAGF,qCACE,kDACA,iDAIJ,kCACE,iBAGF,gCACE,wBACA,gBAGF,+BACE,aAGF,0BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,4CACE,aAGF,0CACE,aACA,YACA,UACA,mBAiBZ,yCAGE,6CACA,mDACA,sDACA,+BACA,8BACA,oCACA,2DACA,+QAME,0CACE,+QCxRN,OAEE,6BACA,6B1BuRI,qBALI,O0BhRR,4BACA,uBACA,kDAGA,qBACA,4D1B+QI,UALI,0B0BxQR,wCACA,cACA,4BACA,kBACA,mBACA,wBtBJE,4CsBSF,aACE,aAKJ,YACE,kBACA,SChCF,OAEE,2BACA,2BACA,2BACA,+BACA,0BACA,qCACA,6EACA,kDACA,+BAGA,kBACA,4DACA,4CACA,4BACA,oCACA,8BvBHE,4CuBQJ,eAEE,cAIF,YACE,YxB6kB4B,IwB5kB5B,iCAQF,mBACE,cxBo+C8B,KwBj+C9B,8BACE,kBACA,MACA,QACA,UACA,qBAQF,eACE,kDACA,2CACA,yDACA,uDAJF,iBACE,oDACA,6CACA,2DACA,yDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,YACE,+CACA,wCACA,sDACA,oDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,cACE,iDACA,0CACA,wDACA,sDAJF,aACE,gDACA,yCACA,uDACA,qDAJF,YACE,+CACA,wCACA,sDACA,oDC9DF,iBACE,cACA,WACA,WCHF,iBACE,sBACA,iFAFF,mBACE,sBACA,mFAFF,iBACE,sBACA,iFAFF,cACE,sBACA,8EAFF,iBACE,sBACA,iFAFF,gBACE,sBACA,gFAFF,eACE,sBACA,+EAFF,cACE,sBACA,8ECFF,cACE,wEACA,kGAGE,wCAGE,4DACA,sFATN,gBACE,0EACA,oGAGE,4CAGE,6DACA,uFATN,cACE,wEACA,kGAGE,wCAGE,8DACA,wFATN,WACE,qEACA,+FAGE,kCAGE,+DACA,yFATN,cACE,wEACA,kGAGE,wCAGE,+DACA,yFATN,aACE,uEACA,iGAGE,sCAGE,8DACA,wFATN,YACE,sEACA,gGAGE,oCAGE,gEACA,0FATN,WACE,qEACA,+FAGE,kCAGE,6DACA,uFAOR,oBACE,+EACA,yGAGE,oDAEE,kFACA,4GC1BN,kBACE,UAEA,kJCHF,WACE,oBACA,I7B6c4B,Q6B5c5B,mBACA,kFACA,sB7B2c4B,M6B1c5B,2BAEA,eACE,cACA,M7Buc0B,I6Btc1B,O7Bsc0B,I6Brc1B,kBbIE,WaHF,0BbOE,uCaZJ,ebaM,iBaDJ,8DACE,mECnBN,OACE,kBACA,WAEA,eACE,cACA,mCACA,WAGF,SACE,kBACA,MACA,OACA,WACA,YAKF,WACE,wBADF,WACE,uBADF,YACE,0BADF,YACE,kCCrBJ,WACE,eACA,MACA,QACA,OACA,Q/BumCkC,K+BpmCpC,cACE,eACA,QACA,SACA,OACA,Q/B+lCkC,K+BvlChC,YACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,eACE,gBACA,SACA,Q/B6kC8B,KS9iChC,yBsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,yBsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,yBsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,0BsBxCA,eACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,kBACE,gBACA,SACA,Q/B6kC8B,MS9iChC,0BsBxCA,gBACE,gBACA,MACA,Q/BmlC8B,K+BhlChC,mBACE,gBACA,SACA,Q/B6kC8B,MgC5mCpC,QACE,aACA,mBACA,mBACA,mBAGF,QACE,aACA,cACA,sBACA,mBCRF,2ECIE,qBACA,sBACA,qBACA,uBACA,2BACA,iCACA,8BACA,oBAGA,qGACE,6BCdF,uBACE,kBACA,MACA,QACA,SACA,OACA,QnCgcsC,EmC/btC,WCRJ,+BCCE,uBACA,mBCNF,IACE,qBACA,mBACA,MtCisB4B,uBsChsB5B,eACA,8BACA,QtC2rB4B,IuC/nBtB,gBAOI,mCAPJ,WAOI,8BAPJ,cAOI,iCAPJ,cAOI,iCAPJ,mBAOI,sCAPJ,gBAOI,mCAPJ,aAOI,sBAPJ,WAOI,uBAPJ,YAOI,sBAPJ,oBAOI,8BAPJ,kBAOI,4BAPJ,iBAOI,2BAPJ,kBAOI,iCAPJ,iBAOI,2BAPJ,WAOI,qBAPJ,YAOI,uBAPJ,YAOI,sBAPJ,YAOI,uBAPJ,aAOI,qBAPJ,eAOI,yBAPJ,iBAOI,2BAPJ,kBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,2BAPJ,mBAOI,6BAPJ,oBAOI,8BAPJ,mBAOI,6BAPJ,iBAOI,2BAPJ,mBAOI,6BAPJ,oBAOI,8BAPJ,mBAOI,6BAPJ,UAOI,0BAPJ,gBAOI,gCAPJ,SAOI,yBAPJ,QAOI,wBAPJ,eAOI,+BAPJ,SAOI,yBAPJ,aAOI,6BAPJ,cAOI,8BAPJ,QAOI,wBAPJ,eAOI,+BAPJ,QAOI,wBAPJ,QAOI,2CAPJ,WAOI,8CAPJ,WAOI,8CAPJ,aAOI,2BAjBJ,oBACE,iFADF,sBACE,mFADF,oBACE,iFADF,iBACE,8EADF,oBACE,iFADF,mBACE,gFADF,kBACE,+EADF,iBACE,8EASF,iBAOI,2BAPJ,mBAOI,6BAPJ,mBAOI,6BAPJ,gBAOI,0BAPJ,iBAOI,2BAPJ,OAOI,iBAPJ,QAOI,mBAPJ,SAOI,oBAPJ,UAOI,oBAPJ,WAOI,sBAPJ,YAOI,uBAPJ,SAOI,kBAPJ,UAOI,oBAPJ,WAOI,qBAPJ,OAOI,mBAPJ,QAOI,qBAPJ,SAOI,sBAPJ,kBAOI,2CAPJ,oBAOI,sCAPJ,oBAOI,sCAPJ,QAOI,uFAPJ,UAOI,oBAPJ,YAOI,2FAPJ,cAOI,wBAPJ,YAOI,6FAPJ,cAOI,0BAPJ,eAOI,8FAPJ,iBAOI,2BAPJ,cAOI,4FAPJ,gBAOI,yBAPJ,gBAIQ,uBAGJ,8EAPJ,kBAIQ,uBAGJ,gFAPJ,gBAIQ,uBAGJ,8EAPJ,aAIQ,uBAGJ,2EAPJ,gBAIQ,uBAGJ,8EAPJ,eAIQ,uBAGJ,6EAPJ,cAIQ,uBAGJ,4EAPJ,aAIQ,uBAGJ,2EAPJ,cAIQ,uBAGJ,4EAPJ,cAIQ,uBAGJ,4EAPJ,uBAOI,wDAPJ,yBAOI,0DAPJ,uBAOI,wDAPJ,oBAOI,qDAPJ,uBAOI,wDAPJ,sBAOI,uDAPJ,qBAOI,sDAPJ,oBAOI,qDAPJ,UAOI,4BAPJ,UAOI,4BAPJ,UAOI,4BAPJ,UAOI,4BAPJ,UAOI,4BAjBJ,mBACE,yBADF,mBACE,0BADF,mBACE,yBADF,mBACE,0BADF,oBACE,uBASF,MAOI,qBAPJ,MAOI,qBAPJ,MAOI,qBAPJ,OAOI,sBAPJ,QAOI,sBAPJ,QAOI,0BAPJ,QAOI,uBAPJ,YAOI,2BAPJ,MAOI,sBAPJ,MAOI,sBAPJ,MAOI,sBAPJ,OAOI,uBAPJ,QAOI,uBAPJ,QAOI,2BAPJ,QAOI,wBAPJ,YAOI,4BAPJ,WAOI,yBAPJ,UAOI,8BAPJ,aAOI,iCAPJ,kBAOI,sCAPJ,qBAOI,yCAPJ,aAOI,uBAPJ,aAOI,uBAPJ,eAOI,yBAPJ,eAOI,yBAPJ,WAOI,0BAPJ,aAOI,4BAPJ,mBAOI,kCAPJ,uBAOI,sCAPJ,qBAOI,oCAPJ,wBAOI,kCAPJ,yBAOI,yCAPJ,wBAOI,wCAPJ,wBAOI,wCAPJ,mBAOI,kCAPJ,iBAOI,gCAPJ,oBAOI,8BAPJ,sBAOI,gCAPJ,qBAOI,+BAPJ,qBAOI,oCAPJ,mBAOI,kCAPJ,sBAOI,gCAPJ,uBAOI,uCAPJ,sBAOI,sCAPJ,uBAOI,iCAPJ,iBAOI,2BAPJ,kBAOI,iCAPJ,gBAOI,+BAPJ,mBAOI,6BAPJ,qBAOI,+BAPJ,oBAOI,8BAPJ,aAOI,oBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,SAOI,mBAPJ,YAOI,mBAPJ,KAOI,oBAPJ,KAOI,yBAPJ,KAOI,wBAPJ,KAOI,uBAPJ,KAOI,yBAPJ,KAOI,uBAPJ,QAOI,uBAPJ,MAOI,mDAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,yDAPJ,MAOI,6DAPJ,MAOI,yDAPJ,SAOI,yDAPJ,MAOI,mDAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,yDAPJ,MAOI,6DAPJ,MAOI,yDAPJ,SAOI,yDAPJ,MAOI,wBAPJ,MAOI,6BAPJ,MAOI,4BAPJ,MAOI,2BAPJ,MAOI,6BAPJ,MAOI,2BAPJ,SAOI,2BAPJ,MAOI,0BAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,+BAPJ,MAOI,6BAPJ,SAOI,6BAPJ,MAOI,2BAPJ,MAOI,gCAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,gCAPJ,MAOI,8BAPJ,SAOI,8BAPJ,MAOI,yBAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,4BAPJ,MAOI,8BAPJ,MAOI,4BAPJ,SAOI,4BAPJ,KAOI,qBAPJ,KAOI,0BAPJ,KAOI,yBAPJ,KAOI,wBAPJ,KAOI,0BAPJ,KAOI,wBAPJ,MAOI,qDAPJ,MAOI,+DAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,+DAPJ,MAOI,2DAPJ,MAOI,qDAPJ,MAOI,+DAPJ,MAOI,6DAPJ,MAOI,2DAPJ,MAOI,+DAPJ,MAOI,2DAPJ,MAOI,yBAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,4BAPJ,MAOI,8BAPJ,MAOI,4BAPJ,MAOI,2BAPJ,MAOI,gCAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,gCAPJ,MAOI,8BAPJ,MAOI,4BAPJ,MAOI,iCAPJ,MAOI,gCAPJ,MAOI,+BAPJ,MAOI,iCAPJ,MAOI,+BAPJ,MAOI,0BAPJ,MAOI,+BAPJ,MAOI,8BAPJ,MAOI,6BAPJ,MAOI,+BAPJ,MAOI,6BAPJ,OAOI,iBAPJ,OAOI,sBAPJ,OAOI,qBAPJ,OAOI,oBAPJ,OAOI,sBAPJ,OAOI,oBAPJ,WAOI,qBAPJ,WAOI,0BAPJ,WAOI,yBAPJ,WAOI,wBAPJ,WAOI,0BAPJ,WAOI,wBAPJ,cAOI,wBAPJ,cAOI,6BAPJ,cAOI,4BAPJ,cAOI,2BAPJ,cAOI,6BAPJ,cAOI,2BAPJ,gBAOI,gDAPJ,MAOI,4CAPJ,MAOI,4CAPJ,MAOI,0CAPJ,MAOI,4CAPJ,MAOI,6BAPJ,MAOI,0BAPJ,YAOI,6BAPJ,YAOI,6BAPJ,YAOI,+BAPJ,UAOI,2BAPJ,WAOI,2BAPJ,WAOI,2BAPJ,aAOI,2BAPJ,SAOI,2BAPJ,WAOI,8BAPJ,MAOI,yBAPJ,OAOI,4BAPJ,SAOI,2BAPJ,OAOI,yBAPJ,YAOI,2BAPJ,UAOI,4BAPJ,aAOI,6BAPJ,sBAOI,gCAPJ,2BAOI,qCAPJ,8BAOI,wCAPJ,gBAOI,oCAPJ,gBAOI,oCAPJ,iBAOI,qCAPJ,WAOI,8BAPJ,aAOI,8BAPJ,YAOI,iEAPJ,cAIQ,qBAGJ,qEAPJ,gBAIQ,qBAGJ,uEAPJ,cAIQ,qBAGJ,qEAPJ,WAIQ,qBAGJ,kEAPJ,cAIQ,qBAGJ,qEAPJ,aAIQ,qBAGJ,oEAPJ,YAIQ,qBAGJ,mEAPJ,WAIQ,qBAGJ,kEAPJ,YAIQ,qBAGJ,mEAPJ,YAIQ,qBAGJ,mEAPJ,WAIQ,qBAGJ,wEAPJ,YAIQ,qBAGJ,2CAPJ,eAIQ,qBAGJ,gCAPJ,eAIQ,qBAGJ,sCAPJ,qBAIQ,qBAGJ,2CAPJ,oBAIQ,qBAGJ,0CAPJ,oBAIQ,qBAGJ,0CAPJ,YAIQ,qBAGJ,yBAjBJ,iBACE,wBADF,iBACE,uBADF,iBACE,wBADF,kBACE,qBASF,uBAOI,iDAPJ,yBAOI,mDAPJ,uBAOI,iDAPJ,oBAOI,8CAPJ,uBAOI,iDAPJ,sBAOI,gDAPJ,qBAOI,+CAPJ,oBAOI,8CAjBJ,iBACE,uBAIA,6BACE,uBANJ,iBACE,wBAIA,6BACE,wBANJ,iBACE,uBAIA,6BACE,uBANJ,iBACE,wBAIA,6BACE,wBANJ,kBACE,qBAIA,8BACE,qBAIJ,eAOI,wCAKF,2BAOI,wCAnBN,eAOI,uCAKF,2BAOI,uCAnBN,eAOI,wCAKF,2BAOI,wCAnBN,wBAIQ,+BAGJ,+FAPJ,0BAIQ,+BAGJ,iGAPJ,wBAIQ,+BAGJ,+FAPJ,qBAIQ,+BAGJ,4FAPJ,wBAIQ,+BAGJ,+FAPJ,uBAIQ,+BAGJ,8FAPJ,sBAIQ,+BAGJ,6FAPJ,qBAIQ,+BAGJ,4FAPJ,gBAIQ,+BAGJ,qGAjBJ,0BACE,+BAIA,sCACE,+BANJ,2BACE,iCAIA,uCACE,iCANJ,2BACE,kCAIA,uCACE,kCANJ,2BACE,iCAIA,uCACE,iCANJ,2BACE,kCAIA,uCACE,kCANJ,4BACE,+BAIA,wCACE,+BAIJ,YAIQ,mBAGJ,8EAPJ,cAIQ,mBAGJ,gFAPJ,YAIQ,mBAGJ,8EAPJ,SAIQ,mBAGJ,2EAPJ,YAIQ,mBAGJ,8EAPJ,WAIQ,mBAGJ,6EAPJ,UAIQ,mBAGJ,4EAPJ,SAIQ,mBAGJ,2EAPJ,UAIQ,mBAGJ,4EAPJ,UAIQ,mBAGJ,4EAPJ,SAIQ,mBAGJ,8EAPJ,gBAIQ,mBAGJ,0CAPJ,mBAIQ,mBAGJ,mFAPJ,kBAIQ,mBAGJ,kFAjBJ,eACE,qBADF,eACE,sBADF,eACE,qBADF,eACE,sBADF,gBACE,mBASF,mBAOI,wDAPJ,qBAOI,0DAPJ,mBAOI,wDAPJ,gBAOI,qDAPJ,mBAOI,wDAPJ,kBAOI,uDAPJ,iBAOI,sDAPJ,gBAOI,qDAPJ,aAOI,+CAPJ,iBAOI,2BAPJ,kBAOI,4BAPJ,kBAOI,4BAPJ,SAOI,+BAPJ,SAOI,+BAPJ,SAOI,iDAPJ,WAOI,2BAPJ,WAOI,oDAPJ,WAOI,iDAPJ,WAOI,oDAPJ,WAOI,oDAPJ,WAOI,qDAPJ,gBAOI,6BAPJ,cAOI,sDAPJ,aAOI,qHAPJ,eAOI,yEAPJ,eAOI,2HAPJ,eAOI,qHAPJ,eAOI,2HAPJ,eAOI,2HAPJ,eAOI,6HAPJ,oBAOI,6EAPJ,kBAOI,+HAPJ,aAOI,yHAPJ,eAOI,6EAPJ,eAOI,+HAPJ,eAOI,yHAPJ,eAOI,+HAPJ,eAOI,+HAPJ,eAOI,iIAPJ,oBAOI,iFAPJ,kBAOI,mIAPJ,gBAOI,2HAPJ,kBAOI,+EAPJ,kBAOI,iIAPJ,kBAOI,2HAPJ,kBAOI,iIAPJ,kBAOI,iIAPJ,kBAOI,mIAPJ,uBAOI,mFAPJ,qBAOI,qIAPJ,eAOI,uHAPJ,iBAOI,2EAPJ,iBAOI,6HAPJ,iBAOI,uHAPJ,iBAOI,6HAPJ,iBAOI,6HAPJ,iBAOI,+HAPJ,sBAOI,+EAPJ,oBAOI,iIAPJ,SAOI,8BAPJ,WAOI,6BAPJ,MAOI,sBAPJ,KAOI,qBAPJ,KAOI,qBAPJ,KAOI,qBAPJ,KAOI,qB9BVR,yB8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,yB8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,yB8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,0B8BGI,gBAOI,sBAPJ,cAOI,uBAPJ,eAOI,sBAPJ,uBAOI,8BAPJ,qBAOI,4BAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,oBAOI,2BAPJ,aAOI,0BAPJ,mBAOI,gCAPJ,YAOI,yBAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,YAOI,yBAPJ,gBAOI,6BAPJ,iBAOI,8BAPJ,WAOI,wBAPJ,kBAOI,+BAPJ,WAOI,wBAPJ,cAOI,yBAPJ,aAOI,8BAPJ,gBAOI,iCAPJ,qBAOI,sCAPJ,wBAOI,yCAPJ,gBAOI,uBAPJ,gBAOI,uBAPJ,kBAOI,yBAPJ,kBAOI,yBAPJ,cAOI,0BAPJ,gBAOI,4BAPJ,sBAOI,kCAPJ,0BAOI,sCAPJ,wBAOI,oCAPJ,2BAOI,kCAPJ,4BAOI,yCAPJ,2BAOI,wCAPJ,2BAOI,wCAPJ,sBAOI,kCAPJ,oBAOI,gCAPJ,uBAOI,8BAPJ,yBAOI,gCAPJ,wBAOI,+BAPJ,wBAOI,oCAPJ,sBAOI,kCAPJ,yBAOI,gCAPJ,0BAOI,uCAPJ,yBAOI,sCAPJ,0BAOI,iCAPJ,oBAOI,2BAPJ,qBAOI,iCAPJ,mBAOI,+BAPJ,sBAOI,6BAPJ,wBAOI,+BAPJ,uBAOI,8BAPJ,gBAOI,oBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,YAOI,mBAPJ,eAOI,mBAPJ,QAOI,oBAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,uBAPJ,QAOI,yBAPJ,QAOI,uBAPJ,WAOI,uBAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,mDAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,yDAPJ,SAOI,6DAPJ,SAOI,yDAPJ,YAOI,yDAPJ,SAOI,wBAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,6BAPJ,SAOI,2BAPJ,YAOI,2BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,YAOI,6BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,YAOI,8BAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,YAOI,4BAPJ,QAOI,qBAPJ,QAOI,0BAPJ,QAOI,yBAPJ,QAOI,wBAPJ,QAOI,0BAPJ,QAOI,wBAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,qDAPJ,SAOI,+DAPJ,SAOI,6DAPJ,SAOI,2DAPJ,SAOI,+DAPJ,SAOI,2DAPJ,SAOI,yBAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,4BAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,2BAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,gCAPJ,SAOI,8BAPJ,SAOI,4BAPJ,SAOI,iCAPJ,SAOI,gCAPJ,SAOI,+BAPJ,SAOI,iCAPJ,SAOI,+BAPJ,SAOI,0BAPJ,SAOI,+BAPJ,SAOI,8BAPJ,SAOI,6BAPJ,SAOI,+BAPJ,SAOI,6BAPJ,UAOI,iBAPJ,UAOI,sBAPJ,UAOI,qBAPJ,UAOI,oBAPJ,UAOI,sBAPJ,UAOI,oBAPJ,cAOI,qBAPJ,cAOI,0BAPJ,cAOI,yBAPJ,cAOI,wBAPJ,cAOI,0BAPJ,cAOI,wBAPJ,iBAOI,wBAPJ,iBAOI,6BAPJ,iBAOI,4BAPJ,iBAOI,2BAPJ,iBAOI,6BAPJ,iBAOI,2BAPJ,eAOI,2BAPJ,aAOI,4BAPJ,gBAOI,8B9BVR,0B8BGI,iBAOI,sBAPJ,eAOI,uBAPJ,gBAOI,sBAPJ,wBAOI,8BAPJ,sBAOI,4BAPJ,qBAOI,2BAPJ,sBAOI,iCAPJ,qBAOI,2BAPJ,cAOI,0BAPJ,oBAOI,gCAPJ,aAOI,yBAPJ,YAOI,wBAPJ,mBAOI,+BAPJ,aAOI,yBAPJ,iBAOI,6BAPJ,kBAOI,8BAPJ,YAOI,wBAPJ,mBAOI,+BAPJ,YAOI,wBAPJ,eAOI,yBAPJ,cAOI,8BAPJ,iBAOI,iCAPJ,sBAOI,sCAPJ,yBAOI,yCAPJ,iBAOI,uBAPJ,iBAOI,uBAPJ,mBAOI,yBAPJ,mBAOI,yBAPJ,eAOI,0BAPJ,iBAOI,4BAPJ,uBAOI,kCAPJ,2BAOI,sCAPJ,yBAOI,oCAPJ,4BAOI,kCAPJ,6BAOI,yCAPJ,4BAOI,wCAPJ,4BAOI,wCAPJ,uBAOI,kCAPJ,qBAOI,gCAPJ,wBAOI,8BAPJ,0BAOI,gCAPJ,yBAOI,+BAPJ,yBAOI,oCAPJ,uBAOI,kCAPJ,0BAOI,gCAPJ,2BAOI,uCAPJ,0BAOI,sCAPJ,2BAOI,iCAPJ,qBAOI,2BAPJ,sBAOI,iCAPJ,oBAOI,+BAPJ,uBAOI,6BAPJ,yBAOI,+BAPJ,wBAOI,8BAPJ,iBAOI,oBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,aAOI,mBAPJ,gBAOI,mBAPJ,SAOI,oBAPJ,SAOI,yBAPJ,SAOI,wBAPJ,SAOI,uBAPJ,SAOI,yBAPJ,SAOI,uBAPJ,YAOI,uBAPJ,UAOI,mDAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,yDAPJ,UAOI,6DAPJ,UAOI,yDAPJ,aAOI,yDAPJ,UAOI,mDAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,yDAPJ,UAOI,6DAPJ,UAOI,yDAPJ,aAOI,yDAPJ,UAOI,wBAPJ,UAOI,6BAPJ,UAOI,4BAPJ,UAOI,2BAPJ,UAOI,6BAPJ,UAOI,2BAPJ,aAOI,2BAPJ,UAOI,0BAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,+BAPJ,UAOI,6BAPJ,aAOI,6BAPJ,UAOI,2BAPJ,UAOI,gCAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,gCAPJ,UAOI,8BAPJ,aAOI,8BAPJ,UAOI,yBAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,4BAPJ,UAOI,8BAPJ,UAOI,4BAPJ,aAOI,4BAPJ,SAOI,qBAPJ,SAOI,0BAPJ,SAOI,yBAPJ,SAOI,wBAPJ,SAOI,0BAPJ,SAOI,wBAPJ,UAOI,qDAPJ,UAOI,+DAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,+DAPJ,UAOI,2DAPJ,UAOI,qDAPJ,UAOI,+DAPJ,UAOI,6DAPJ,UAOI,2DAPJ,UAOI,+DAPJ,UAOI,2DAPJ,UAOI,yBAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,4BAPJ,UAOI,8BAPJ,UAOI,4BAPJ,UAOI,2BAPJ,UAOI,gCAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,gCAPJ,UAOI,8BAPJ,UAOI,4BAPJ,UAOI,iCAPJ,UAOI,gCAPJ,UAOI,+BAPJ,UAOI,iCAPJ,UAOI,+BAPJ,UAOI,0BAPJ,UAOI,+BAPJ,UAOI,8BAPJ,UAOI,6BAPJ,UAOI,+BAPJ,UAOI,6BAPJ,WAOI,iBAPJ,WAOI,sBAPJ,WAOI,qBAPJ,WAOI,oBAPJ,WAOI,sBAPJ,WAOI,oBAPJ,eAOI,qBAPJ,eAOI,0BAPJ,eAOI,yBAPJ,eAOI,wBAPJ,eAOI,0BAPJ,eAOI,wBAPJ,kBAOI,wBAPJ,kBAOI,6BAPJ,kBAOI,4BAPJ,kBAOI,2BAPJ,kBAOI,6BAPJ,kBAOI,2BAPJ,gBAOI,2BAPJ,cAOI,4BAPJ,iBAOI,8BCtDZ,0BD+CQ,MAOI,4BAPJ,MAOI,0BAPJ,MAOI,6BAPJ,MAOI,6BCnCZ,aD4BQ,gBAOI,0BAPJ,sBAOI,gCAPJ,eAOI,yBAPJ,cAOI,wBAPJ,qBAOI,+BAPJ,eAOI,yBAPJ,mBAOI,6BAPJ,oBAOI,8BAPJ,cAOI,wBAPJ,qBAOI,+BAPJ,cAOI,yBEnBZ,KACE,mCACA,gBACA,wBACA,iCACA,iBACA,cAGF,aACE,gCACA,sCACA,kCAGF,qBACE,2BACA,gBACA,kCAEA,2BACE,sCACA,gCAIJ,eACE,WACA,wCACA,oCAIA,iBACE,YAGF,oBACE,YAGF,kBACE,YAIJ,EACE,0BACA,wBAEA,QACE,8BAGF,SACE,wBAIJ,cAEE,gBACA,iBACA,oBACA,iBAGF,OACE,gBAGF,OACE,iBAIA,cACE,gBACA,eACA,iBAGF,cACE,gBACA,eAKJ,WACE,iBACA,mBACA,YACA,YACA,yBACA,gBACA,8BACA,sBACA,iBACA,UACA,YACA,6CAKA,oBACE,eACA,WACA,iBACA,kBACA,cAIJ,kCACE,yBACA,4BACA,WACA,kBACA,cACA,cAEA,yCACE,kBACA,QACA,UAEA,YACA,sBACA,cACA,kBACA,sBAEA,+CACE,eACA,yBAKN,UACE,gCAEA,oBACE,0BAEA,uCACE,sBACA,iCAIJ,kBACE,sBACA,oCAKF,kBACE,gBACA,4CAQJ,WACE,gBACA,4BACA,aACA,uBAEA,kBACE,WACA,mBACA,eACA,iBACA,sBAGF,aACE,gBAGF,yBACE,eACA,qBACA,oBAIJ,QACE,sCACA,gCAEA,iBACE,kBACA,gBACA,iBACA,oBAGF,WACE,mBAIA,iBACE,gCAGF,sBACE,gCACA,+BACA,qBAGF,uBACE,gCAIJ,eACE,gCACA,eAKF,eACE,WAKF,mBACE,WAIJ,iBACE,sCACA,sBACA,eACA,YACA,WACA,aAGF,UACE,iBAEA,gDAEE,wBACA,qBAKF,sBACE,mBAKF,sBACE,oBACA,WAGF,oBACE,iBACA,iBAKF,cACE,iBCjVJ,SACE,sBACA,eACA,oBAGF,iBACE,+BACA,WAEF,gBACE,c/CRF,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDgD7DA,iBACE,gBACA,iBACA,0CAGF,OACE,qBAGF,YACE,iBAEA,iBACE,gBACA,oBAIJ,gBACE,iBACA,oBAGF,gBACE,iBhDzBJ,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDiD5DA,iBAEE,wBAGF,kBACE,qBACA,gBACA,+BAGF,gDAEE,iCAGF,iBACE,uBACA,mBACA,oBAGF,uEAGE,iCC1BJ,UACE,kBAGA,iBACE,WACA,kBACA,UACA,iBAXS,QAYT,MACA,SACA,SACA,iBAKJ,eACE,kBACA,UAEA,qBACE,kCACA,kBACA,sBACA,cAEA,uBACE,cAGF,iCACE,yBAIJ,2BACE,oBACA,iBACA,gBAIF,sBACE,iBACA,eACA,kBACA,kBACA,WACA,YACA,YACA,SACA,kBACA,UAGF,gCACE,YACA,sBACA,yBAGF,8BACE,aACA,sBACA,yBAGF,+BACE,YACA,sBACA,yBAIF,oBACE,0BACA,OAIF,qBACE,0BACA,SAIF,4BACE,WACA,kBACA,YACA,WACA,sBACA,sBACA,wCACA,SACA,UACA,WACA,wCACA,sCAIF,6BACE,WACA,kBACA,YACA,WACA,iCACA,sBACA,wCACA,SACA,UACA,UACA,uCACA,yCAIF,4BACE,WAKJ,qCAGE,iBACE,UAIF,eACE,WACA,6BACA,8BAGA,uBACE,qBAIF,uDAEE,oBAGF,4BACE,kBACA,gBACA,uCACA,yCAGF,6BACE,WAIF,qBACE,SlDlKN,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDmD7DA,qBACE,0CCHF,gCACE,mBAKA,+CACE,yBAIJ,+BACE","sourcesContent":["$primary-color: #021a34;\n$secondary-color: #075f94;\n\n:root {\n // -- Light\n --primary-color-light: #021a34;\n --secondary-color-light: #075f94;\n\n --bg-color-light: #edeef0;\n --bg-color-reverse-light: #021a34;\n --bg-color-tinted-light: #b0b2b4;\n\n --text-color-light: #4c4c4c;\n --text-color-reverse-light: #edeef0;\n --text-muted-color-light: #4c4c4c;\n\n --link-color-light: #4c4c4c;\n --link-hover-color-light: #6c6c6c;\n\n // -- Dark\n --primary-color-dark: #edeef0;\n --secondary-color-dark: #075f94;\n\n --bg-color-dark: #14171c;\n --bg-color-reverse-dark: #edeef0;\n --bg-color-tinted-dark: #627191;\n\n --text-color-dark: #edeef0;\n --text-color-reverse-dark: #14171c;\n --text-muted-color-dark: #edeef0;\n\n --link-color-dark: #edeef0;\n --link-hover-color-dark: #ffffff;\n}\n\n[data-bs-theme=\"light\"] {\n --primary-color: var(--primary-color-light);\n --secondary-color: var(--secondary-color-light);\n --bg-color-tinted: var(--bg-color-tinted-light);\n\n --bg-color: var(--bg-color-light);\n --bg-color-reverse: var(--bg-color-reverse-light);\n --text-color: var(--text-color-light);\n\n --text-color-reverse: var(--text-color-reverse-light);\n --text-muted-color: var(--text-muted-color-light);\n\n --link-color: var(--link-color-light);\n --link-hover-color: var(--link-hover-color-light);\n}\n\n[data-bs-theme=\"dark\"] {\n --primary-color: var(--primary-color-dark);\n --secondary-color: var(--secondary-color-dark);\n\n --bg-color: var(--bg-color-dark);\n --bg-color-reverse: var(--bg-color-reverse-dark);\n --bg-color-tinted: var(--bg-color-tinted-dark);\n\n --text-color: var(--text-color-dark);\n --text-color-reverse: var(--text-color-reverse-dark);\n --text-muted-color: var(--text-muted-color-dark);\n\n --link-color: var(--link-color-dark);\n --link-hover-color: var(--link-hover-color-dark);\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, ``-`` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on ` `s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `
` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.\n// See https://stackoverflow.com/a/54997118\n\n[list]:not([type=\"date\"]):not([type=\"datetime-local\"]):not([type=\"month\"]):not([type=\"week\"]):not([type=\"time\"])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. ``s, which have `min-width: 0;` by default.\n// So we reset that to ensure fieldsets behave more like a standard block element.\n// See https://github.com/twbs/bootstrap/issues/12359\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n min-width: 0; // 1\n padding: 0; // 2\n margin: 0; // 2\n border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n// This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n// See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n float: left; // 1\n width: 100%;\n padding: 0;\n margin-bottom: $legend-margin-bottom;\n @include font-size($legend-font-size);\n font-weight: $legend-font-weight;\n line-height: inherit;\n\n + * {\n clear: left; // 2\n }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n// 1. This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n// 2. Correct the outline style in Safari.\n\n[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n outline-offset: -2px; // 2\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n\n// 1. Inherit font family and line height for file input buttons\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::file-selector-button {\n font: inherit; // 1\n -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n display: list-item; // 1\n cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,
\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,
\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,
\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,
\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,
\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,
\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,
\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,
\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,
\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,
\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,
\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,
\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,
\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,
\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,
\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,
\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n","//\n// Headings\n//\n.h1 {\n @extend h1;\n}\n\n.h2 {\n @extend h2;\n}\n\n.h3 {\n @extend h3;\n}\n\n.h4 {\n @extend h4;\n}\n\n.h5 {\n @extend h5;\n}\n\n.h6 {\n @extend h6;\n}\n\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n@each $display, $font-size in $display-font-sizes {\n .display-#{$display} {\n @include font-size($font-size);\n font-family: $display-font-family;\n font-style: $display-font-style;\n font-weight: $display-font-weight;\n line-height: $display-line-height;\n }\n}\n\n//\n// Emphasis\n//\n.small {\n @extend small;\n}\n\n.mark {\n @extend mark;\n}\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled();\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled();\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size($initialism-font-size);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-font-size);\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n.blockquote-footer {\n margin-top: -$blockquote-margin-y;\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-footer-font-size);\n color: $blockquote-footer-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `
`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid();\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid();\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer * .5;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n","@mixin box-shadow($shadow...) {\n @if $enable-shadows {\n $result: ();\n\n @each $value in $shadow {\n @if $value != null {\n $result: append($result, $value, \"comma\");\n }\n @if $value == none and length($shadow) > 1 {\n @warn \"The keyword 'none' must be used as a single argument.\";\n }\n }\n\n @if (length($result) > 0) {\n box-shadow: $result;\n }\n }\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n // Reset needed for nesting tables\n --#{$prefix}table-color-type: initial;\n --#{$prefix}table-bg-type: initial;\n --#{$prefix}table-color-state: initial;\n --#{$prefix}table-bg-state: initial;\n // End of reset\n --#{$prefix}table-color: #{$table-color};\n --#{$prefix}table-bg: #{$table-bg};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-accent-bg: #{$table-accent-bg};\n --#{$prefix}table-striped-color: #{$table-striped-color};\n --#{$prefix}table-striped-bg: #{$table-striped-bg};\n --#{$prefix}table-active-color: #{$table-active-color};\n --#{$prefix}table-active-bg: #{$table-active-bg};\n --#{$prefix}table-hover-color: #{$table-hover-color};\n --#{$prefix}table-hover-bg: #{$table-hover-bg};\n\n width: 100%;\n margin-bottom: $spacer;\n vertical-align: $table-cell-vertical-align;\n border-color: var(--#{$prefix}table-border-color);\n\n // Target th & td\n // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.\n // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).\n // Another advantage is that this generates less code and makes the selector less specific making it easier to override.\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y $table-cell-padding-x;\n // Following the precept of cascades: https://codepen.io/miriamsuzanne/full/vYNgodb\n color: var(--#{$prefix}table-color-state, var(--#{$prefix}table-color-type, var(--#{$prefix}table-color)));\n background-color: var(--#{$prefix}table-bg);\n border-bottom-width: $table-border-width;\n box-shadow: inset 0 0 0 9999px var(--#{$prefix}table-bg-state, var(--#{$prefix}table-bg-type, var(--#{$prefix}table-accent-bg)));\n }\n\n > tbody {\n vertical-align: inherit;\n }\n\n > thead {\n vertical-align: bottom;\n }\n}\n\n.table-group-divider {\n border-top: calc(#{$table-border-width} * 2) solid $table-group-separator-color; // stylelint-disable-line function-disallowed-list\n}\n\n//\n// Change placement of captions with a class\n//\n\n.caption-top {\n caption-side: top;\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n//\n// When borders are added on all sides of the cells, the corners can render odd when\n// these borders do not have the same color or if they are semi-transparent.\n// Therefor we add top and border bottoms to the `tr`s and left and right borders\n// to the `td`s or `th`s\n\n.table-bordered {\n > :not(caption) > * {\n border-width: $table-border-width 0;\n\n // stylelint-disable-next-line selector-max-universal\n > * {\n border-width: 0 $table-border-width;\n }\n }\n}\n\n.table-borderless {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n border-bottom-width: 0;\n }\n\n > :not(:first-child) {\n border-top-width: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n// For rows\n.table-striped {\n > tbody > tr:nth-of-type(#{$table-striped-order}) > * {\n --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\n --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\n }\n}\n\n// For columns\n.table-striped-columns {\n > :not(caption) > tr > :nth-child(#{$table-striped-columns-order}) {\n --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\n --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\n }\n}\n\n// Active table\n//\n// The `.table-active` class can be added to highlight rows or cells\n\n.table-active {\n --#{$prefix}table-color-state: var(--#{$prefix}table-active-color);\n --#{$prefix}table-bg-state: var(--#{$prefix}table-active-bg);\n}\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover > * {\n --#{$prefix}table-color-state: var(--#{$prefix}table-hover-color);\n --#{$prefix}table-bg-state: var(--#{$prefix}table-hover-bg);\n }\n}\n\n\n// Table variants\n//\n// Table variants set the table cell backgrounds, border colors\n// and the colors of the striped, hovered & active tables\n\n@each $color, $value in $table-variants {\n @include table-variant($color, $value);\n}\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @include media-breakpoint-down($breakpoint) {\n .table-responsive#{$infix} {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n }\n}\n","// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n $table-border-color: mix($color, $background, percentage($table-border-factor));\n\n --#{$prefix}table-color: #{$color};\n --#{$prefix}table-bg: #{$background};\n --#{$prefix}table-border-color: #{$table-border-color};\n --#{$prefix}table-striped-bg: #{$striped-bg};\n --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$prefix}table-active-bg: #{$active-bg};\n --#{$prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$prefix}table-hover-bg: #{$hover-bg};\n --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: var(--#{$prefix}table-color);\n border-color: var(--#{$prefix}table-border-color);\n }\n}\n// scss-docs-end table-variant\n","//\n// Base styles\n//\n\n.btn {\n // scss-docs-start btn-css-vars\n --#{$prefix}btn-padding-x: #{$btn-padding-x};\n --#{$prefix}btn-padding-y: #{$btn-padding-y};\n --#{$prefix}btn-font-family: #{$btn-font-family};\n @include rfs($btn-font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-font-weight: #{$btn-font-weight};\n --#{$prefix}btn-line-height: #{$btn-line-height};\n --#{$prefix}btn-color: #{$btn-color};\n --#{$prefix}btn-bg: transparent;\n --#{$prefix}btn-border-width: #{$btn-border-width};\n --#{$prefix}btn-border-color: transparent;\n --#{$prefix}btn-border-radius: #{$btn-border-radius};\n --#{$prefix}btn-hover-border-color: transparent;\n --#{$prefix}btn-box-shadow: #{$btn-box-shadow};\n --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity};\n --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5);\n // scss-docs-end btn-css-vars\n\n display: inline-block;\n padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x);\n font-family: var(--#{$prefix}btn-font-family);\n @include font-size(var(--#{$prefix}btn-font-size));\n font-weight: var(--#{$prefix}btn-font-weight);\n line-height: var(--#{$prefix}btn-line-height);\n color: var(--#{$prefix}btn-color);\n text-align: center;\n text-decoration: if($link-decoration == none, null, none);\n white-space: $btn-white-space;\n vertical-align: middle;\n cursor: if($enable-button-pointers, pointer, null);\n user-select: none;\n border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color);\n @include border-radius(var(--#{$prefix}btn-border-radius));\n @include gradient-bg(var(--#{$prefix}btn-bg));\n @include box-shadow(var(--#{$prefix}btn-box-shadow));\n @include transition($btn-transition);\n\n &:hover {\n color: var(--#{$prefix}btn-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n background-color: var(--#{$prefix}btn-hover-bg);\n border-color: var(--#{$prefix}btn-hover-border-color);\n }\n\n .btn-check + &:hover {\n // override for the checkbox/radio buttons\n color: var(--#{$prefix}btn-color);\n background-color: var(--#{$prefix}btn-bg);\n border-color: var(--#{$prefix}btn-border-color);\n }\n\n &:focus-visible {\n color: var(--#{$prefix}btn-hover-color);\n @include gradient-bg(var(--#{$prefix}btn-hover-bg));\n border-color: var(--#{$prefix}btn-hover-border-color);\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\n } @else {\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n }\n }\n\n .btn-check:focus-visible + & {\n border-color: var(--#{$prefix}btn-hover-border-color);\n outline: 0;\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\n } @else {\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n }\n }\n\n .btn-check:checked + &,\n :not(.btn-check) + &:active,\n &:first-child:active,\n &.active,\n &.show {\n color: var(--#{$prefix}btn-active-color);\n background-color: var(--#{$prefix}btn-active-bg);\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: var(--#{$prefix}btn-active-border-color);\n @include box-shadow(var(--#{$prefix}btn-active-shadow));\n\n &:focus-visible {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow);\n } @else {\n box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n }\n }\n }\n\n &:disabled,\n &.disabled,\n fieldset:disabled & {\n color: var(--#{$prefix}btn-disabled-color);\n pointer-events: none;\n background-color: var(--#{$prefix}btn-disabled-bg);\n background-image: if($enable-gradients, none, null);\n border-color: var(--#{$prefix}btn-disabled-border-color);\n opacity: var(--#{$prefix}btn-disabled-opacity);\n @include box-shadow(none);\n }\n}\n\n\n//\n// Alternate buttons\n//\n\n// scss-docs-start btn-variant-loops\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @if $color == \"light\" {\n @include button-variant(\n $value,\n $value,\n $hover-background: shade-color($value, $btn-hover-bg-shade-amount),\n $hover-border: shade-color($value, $btn-hover-border-shade-amount),\n $active-background: shade-color($value, $btn-active-bg-shade-amount),\n $active-border: shade-color($value, $btn-active-border-shade-amount)\n );\n } @else if $color == \"dark\" {\n @include button-variant(\n $value,\n $value,\n $hover-background: tint-color($value, $btn-hover-bg-tint-amount),\n $hover-border: tint-color($value, $btn-hover-border-tint-amount),\n $active-background: tint-color($value, $btn-active-bg-tint-amount),\n $active-border: tint-color($value, $btn-active-border-tint-amount)\n );\n } @else {\n @include button-variant($value, $value);\n }\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n// scss-docs-end btn-variant-loops\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n --#{$prefix}btn-font-weight: #{$font-weight-normal};\n --#{$prefix}btn-color: #{$btn-link-color};\n --#{$prefix}btn-bg: transparent;\n --#{$prefix}btn-border-color: transparent;\n --#{$prefix}btn-hover-color: #{$btn-link-hover-color};\n --#{$prefix}btn-hover-border-color: transparent;\n --#{$prefix}btn-active-color: #{$btn-link-hover-color};\n --#{$prefix}btn-active-border-color: transparent;\n --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color};\n --#{$prefix}btn-disabled-border-color: transparent;\n --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows\n --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb};\n\n text-decoration: $link-decoration;\n @if $enable-gradients {\n background-image: none;\n }\n\n &:hover,\n &:focus-visible {\n text-decoration: $link-hover-decoration;\n }\n\n &:focus-visible {\n color: var(--#{$prefix}btn-color);\n }\n\n &:hover {\n color: var(--#{$prefix}btn-hover-color);\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);\n}\n","// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n","// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-bg: #{$background};\n --#{$prefix}btn-border-color: #{$border};\n --#{$prefix}btn-hover-color: #{$hover-color};\n --#{$prefix}btn-hover-bg: #{$hover-background};\n --#{$prefix}btn-hover-border-color: #{$hover-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$disabled-color};\n --#{$prefix}btn-disabled-bg: #{$disabled-background};\n --#{$prefix}btn-disabled-border-color: #{$disabled-border};\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n --#{$prefix}btn-color: #{$color};\n --#{$prefix}btn-border-color: #{$color};\n --#{$prefix}btn-hover-color: #{$color-hover};\n --#{$prefix}btn-hover-bg: #{$active-background};\n --#{$prefix}btn-hover-border-color: #{$active-border};\n --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};\n --#{$prefix}btn-active-color: #{$active-color};\n --#{$prefix}btn-active-bg: #{$active-background};\n --#{$prefix}btn-active-border-color: #{$active-border};\n --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n --#{$prefix}btn-disabled-color: #{$color};\n --#{$prefix}btn-disabled-bg: transparent;\n --#{$prefix}btn-disabled-border-color: #{$color};\n --#{$prefix}gradient: none;\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n --#{$prefix}btn-padding-y: #{$padding-y};\n --#{$prefix}btn-padding-x: #{$padding-x};\n @include rfs($font-size, --#{$prefix}btn-font-size);\n --#{$prefix}btn-border-radius: #{$border-radius};\n}\n// scss-docs-end btn-size-mixin\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n// scss-docs-start collapse-classes\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n\n &.collapse-horizontal {\n width: 0;\n height: auto;\n @include transition($transition-collapse-width);\n }\n}\n// scss-docs-end collapse-classes\n","// The dropdown wrapper (`
`)\n.dropup,\n.dropend,\n.dropdown,\n.dropstart,\n.dropup-center,\n.dropdown-center {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret();\n}\n\n// The dropdown menu\n.dropdown-menu {\n // scss-docs-start dropdown-css-vars\n --#{$prefix}dropdown-zindex: #{$zindex-dropdown};\n --#{$prefix}dropdown-min-width: #{$dropdown-min-width};\n --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x};\n --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y};\n --#{$prefix}dropdown-spacer: #{$dropdown-spacer};\n @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size);\n --#{$prefix}dropdown-color: #{$dropdown-color};\n --#{$prefix}dropdown-bg: #{$dropdown-bg};\n --#{$prefix}dropdown-border-color: #{$dropdown-border-color};\n --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius};\n --#{$prefix}dropdown-border-width: #{$dropdown-border-width};\n --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius};\n --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg};\n --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y};\n --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow};\n --#{$prefix}dropdown-link-color: #{$dropdown-link-color};\n --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color};\n --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg};\n --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color};\n --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg};\n --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color};\n --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x};\n --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y};\n --#{$prefix}dropdown-header-color: #{$dropdown-header-color};\n --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x};\n --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y};\n // scss-docs-end dropdown-css-vars\n\n position: absolute;\n z-index: var(--#{$prefix}dropdown-zindex);\n display: none; // none by default, but block on \"open\" of the menu\n min-width: var(--#{$prefix}dropdown-min-width);\n padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x);\n margin: 0; // Override default margin of ul\n @include font-size(var(--#{$prefix}dropdown-font-size));\n color: var(--#{$prefix}dropdown-color);\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: var(--#{$prefix}dropdown-bg);\n background-clip: padding-box;\n border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color);\n @include border-radius(var(--#{$prefix}dropdown-border-radius));\n @include box-shadow(var(--#{$prefix}dropdown-box-shadow));\n\n &[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: var(--#{$prefix}dropdown-spacer);\n }\n\n @if $dropdown-padding-y == 0 {\n > .dropdown-item:first-child,\n > li:first-child .dropdown-item {\n @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius));\n }\n > .dropdown-item:last-child,\n > li:last-child .dropdown-item {\n @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius));\n }\n\n }\n}\n\n// scss-docs-start responsive-breakpoints\n// We deliberately hardcode the `bs-` prefix because we check\n// this custom property in JS to determine Popper's positioning\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-start {\n --bs-position: start;\n\n &[data-bs-popper] {\n right: auto;\n left: 0;\n }\n }\n\n .dropdown-menu#{$infix}-end {\n --bs-position: end;\n\n &[data-bs-popper] {\n right: 0;\n left: auto;\n }\n }\n }\n}\n// scss-docs-end responsive-breakpoints\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: var(--#{$prefix}dropdown-spacer);\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropend {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: var(--#{$prefix}dropdown-spacer);\n }\n\n .dropdown-toggle {\n @include caret(end);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropstart {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: var(--#{$prefix}dropdown-spacer);\n }\n\n .dropdown-toggle {\n @include caret(start);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n\n// Dividers (basically an `
`) within the dropdown\n.dropdown-divider {\n height: 0;\n margin: var(--#{$prefix}dropdown-divider-margin-y) 0;\n overflow: hidden;\n border-top: 1px solid var(--#{$prefix}dropdown-divider-bg);\n opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
element\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `
`-specific styles are denoted with `// For s`\n.dropdown-item {\n display: block;\n width: 100%; // For ``s\n padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\n clear: both;\n font-weight: $font-weight-normal;\n color: var(--#{$prefix}dropdown-link-color);\n text-align: inherit; // For ``s\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For ``s\n border: 0; // For ``s\n @include border-radius(var(--#{$prefix}dropdown-item-border-radius, 0));\n\n &:hover,\n &:focus {\n color: var(--#{$prefix}dropdown-link-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n @include gradient-bg(var(--#{$prefix}dropdown-link-hover-bg));\n }\n\n &.active,\n &:active {\n color: var(--#{$prefix}dropdown-link-active-color);\n text-decoration: none;\n @include gradient-bg(var(--#{$prefix}dropdown-link-active-bg));\n }\n\n &.disabled,\n &:disabled {\n color: var(--#{$prefix}dropdown-link-disabled-color);\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: var(--#{$prefix}dropdown-header-padding-y) var(--#{$prefix}dropdown-header-padding-x);\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: var(--#{$prefix}dropdown-header-color);\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\n color: var(--#{$prefix}dropdown-link-color);\n}\n\n// Dark dropdowns\n.dropdown-menu-dark {\n // scss-docs-start dropdown-dark-css-vars\n --#{$prefix}dropdown-color: #{$dropdown-dark-color};\n --#{$prefix}dropdown-bg: #{$dropdown-dark-bg};\n --#{$prefix}dropdown-border-color: #{$dropdown-dark-border-color};\n --#{$prefix}dropdown-box-shadow: #{$dropdown-dark-box-shadow};\n --#{$prefix}dropdown-link-color: #{$dropdown-dark-link-color};\n --#{$prefix}dropdown-link-hover-color: #{$dropdown-dark-link-hover-color};\n --#{$prefix}dropdown-divider-bg: #{$dropdown-dark-divider-bg};\n --#{$prefix}dropdown-link-hover-bg: #{$dropdown-dark-link-hover-bg};\n --#{$prefix}dropdown-link-active-color: #{$dropdown-dark-link-active-color};\n --#{$prefix}dropdown-link-active-bg: #{$dropdown-dark-link-active-bg};\n --#{$prefix}dropdown-link-disabled-color: #{$dropdown-dark-link-disabled-color};\n --#{$prefix}dropdown-header-color: #{$dropdown-dark-header-color};\n // scss-docs-end dropdown-dark-css-vars\n}\n","// scss-docs-start caret-mixins\n@mixin caret-down($width: $caret-width) {\n border-top: $width solid;\n border-right: $width solid transparent;\n border-bottom: 0;\n border-left: $width solid transparent;\n}\n\n@mixin caret-up($width: $caret-width) {\n border-top: 0;\n border-right: $width solid transparent;\n border-bottom: $width solid;\n border-left: $width solid transparent;\n}\n\n@mixin caret-end($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: 0;\n border-bottom: $width solid transparent;\n border-left: $width solid;\n}\n\n@mixin caret-start($width: $caret-width) {\n border-top: $width solid transparent;\n border-right: $width solid;\n border-bottom: $width solid transparent;\n}\n\n@mixin caret(\n $direction: down,\n $width: $caret-width,\n $spacing: $caret-spacing,\n $vertical-align: $caret-vertical-align\n) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down($width);\n } @else if $direction == up {\n @include caret-up($width);\n } @else if $direction == end {\n @include caret-end($width);\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $spacing;\n vertical-align: $vertical-align;\n content: \"\";\n @include caret-start($width);\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// ``s, ``s or ``s.\n\n.nav {\n // scss-docs-start nav-css-vars\n --#{$prefix}nav-link-padding-x: #{$nav-link-padding-x};\n --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\n @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\n --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\n --#{$prefix}nav-link-color: #{$nav-link-color};\n --#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};\n --#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};\n // scss-docs-end nav-css-vars\n\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: var(--#{$prefix}nav-link-padding-y) var(--#{$prefix}nav-link-padding-x);\n @include font-size(var(--#{$prefix}nav-link-font-size));\n font-weight: var(--#{$prefix}nav-link-font-weight);\n color: var(--#{$prefix}nav-link-color);\n text-decoration: if($link-decoration == none, null, none);\n background: none;\n border: 0;\n @include transition($nav-link-transition);\n\n &:hover,\n &:focus {\n color: var(--#{$prefix}nav-link-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n &:focus-visible {\n outline: 0;\n box-shadow: $nav-link-focus-box-shadow;\n }\n\n // Disabled state lightens text\n &.disabled,\n &:disabled {\n color: var(--#{$prefix}nav-link-disabled-color);\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n // scss-docs-start nav-tabs-css-vars\n --#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};\n --#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};\n --#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};\n --#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};\n --#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};\n --#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};\n --#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};\n // scss-docs-end nav-tabs-css-vars\n\n border-bottom: var(--#{$prefix}nav-tabs-border-width) solid var(--#{$prefix}nav-tabs-border-color);\n\n .nav-link {\n margin-bottom: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\n border: var(--#{$prefix}nav-tabs-border-width) solid transparent;\n @include border-top-radius(var(--#{$prefix}nav-tabs-border-radius));\n\n &:hover,\n &:focus {\n // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link\n isolation: isolate;\n border-color: var(--#{$prefix}nav-tabs-link-hover-border-color);\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: var(--#{$prefix}nav-tabs-link-active-color);\n background-color: var(--#{$prefix}nav-tabs-link-active-bg);\n border-color: var(--#{$prefix}nav-tabs-link-active-border-color);\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n // scss-docs-start nav-pills-css-vars\n --#{$prefix}nav-pills-border-radius: #{$nav-pills-border-radius};\n --#{$prefix}nav-pills-link-active-color: #{$nav-pills-link-active-color};\n --#{$prefix}nav-pills-link-active-bg: #{$nav-pills-link-active-bg};\n // scss-docs-end nav-pills-css-vars\n\n .nav-link {\n @include border-radius(var(--#{$prefix}nav-pills-border-radius));\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: var(--#{$prefix}nav-pills-link-active-color);\n @include gradient-bg(var(--#{$prefix}nav-pills-link-active-bg));\n }\n}\n\n\n//\n// Underline\n//\n\n.nav-underline {\n // scss-docs-start nav-underline-css-vars\n --#{$prefix}nav-underline-gap: #{$nav-underline-gap};\n --#{$prefix}nav-underline-border-width: #{$nav-underline-border-width};\n --#{$prefix}nav-underline-link-active-color: #{$nav-underline-link-active-color};\n // scss-docs-end nav-underline-css-vars\n\n gap: var(--#{$prefix}nav-underline-gap);\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n border-bottom: var(--#{$prefix}nav-underline-border-width) solid transparent;\n\n &:hover,\n &:focus {\n border-bottom-color: currentcolor;\n }\n }\n\n .nav-link.active,\n .show > .nav-link {\n font-weight: $font-weight-bold;\n color: var(--#{$prefix}nav-underline-link-active-color);\n border-bottom-color: currentcolor;\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n > .nav-link,\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n > .nav-link,\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n.nav-fill,\n.nav-justified {\n .nav-item .nav-link {\n width: 100%; // Make sure button will grow\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n // scss-docs-start navbar-css-vars\n --#{$prefix}navbar-padding-x: #{if($navbar-padding-x == null, 0, $navbar-padding-x)};\n --#{$prefix}navbar-padding-y: #{$navbar-padding-y};\n --#{$prefix}navbar-color: #{$navbar-light-color};\n --#{$prefix}navbar-hover-color: #{$navbar-light-hover-color};\n --#{$prefix}navbar-disabled-color: #{$navbar-light-disabled-color};\n --#{$prefix}navbar-active-color: #{$navbar-light-active-color};\n --#{$prefix}navbar-brand-padding-y: #{$navbar-brand-padding-y};\n --#{$prefix}navbar-brand-margin-end: #{$navbar-brand-margin-end};\n --#{$prefix}navbar-brand-font-size: #{$navbar-brand-font-size};\n --#{$prefix}navbar-brand-color: #{$navbar-light-brand-color};\n --#{$prefix}navbar-brand-hover-color: #{$navbar-light-brand-hover-color};\n --#{$prefix}navbar-nav-link-padding-x: #{$navbar-nav-link-padding-x};\n --#{$prefix}navbar-toggler-padding-y: #{$navbar-toggler-padding-y};\n --#{$prefix}navbar-toggler-padding-x: #{$navbar-toggler-padding-x};\n --#{$prefix}navbar-toggler-font-size: #{$navbar-toggler-font-size};\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-light-toggler-icon-bg)};\n --#{$prefix}navbar-toggler-border-color: #{$navbar-light-toggler-border-color};\n --#{$prefix}navbar-toggler-border-radius: #{$navbar-toggler-border-radius};\n --#{$prefix}navbar-toggler-focus-width: #{$navbar-toggler-focus-width};\n --#{$prefix}navbar-toggler-transition: #{$navbar-toggler-transition};\n // scss-docs-end navbar-css-vars\n\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: var(--#{$prefix}navbar-padding-y) var(--#{$prefix}navbar-padding-x);\n @include gradient-bg();\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n // The `flex-wrap` property is inherited to simplify the expanded navbars\n %container-flex-properties {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n }\n\n > .container,\n > .container-fluid {\n @extend %container-flex-properties;\n }\n\n @each $breakpoint, $container-max-width in $container-max-widths {\n > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {\n @extend %container-flex-properties;\n }\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n padding-top: var(--#{$prefix}navbar-brand-padding-y);\n padding-bottom: var(--#{$prefix}navbar-brand-padding-y);\n margin-right: var(--#{$prefix}navbar-brand-margin-end);\n @include font-size(var(--#{$prefix}navbar-brand-font-size));\n color: var(--#{$prefix}navbar-brand-color);\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap;\n\n &:hover,\n &:focus {\n color: var(--#{$prefix}navbar-brand-hover-color);\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n // scss-docs-start navbar-nav-css-vars\n --#{$prefix}nav-link-padding-x: 0;\n --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\n @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\n --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\n --#{$prefix}nav-link-color: var(--#{$prefix}navbar-color);\n --#{$prefix}nav-link-hover-color: var(--#{$prefix}navbar-hover-color);\n --#{$prefix}nav-link-disabled-color: var(--#{$prefix}navbar-disabled-color);\n // scss-docs-end navbar-nav-css-vars\n\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n &.active,\n &.show {\n color: var(--#{$prefix}navbar-active-color);\n }\n }\n\n .dropdown-menu {\n position: static;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n color: var(--#{$prefix}navbar-color);\n\n a,\n a:hover,\n a:focus {\n color: var(--#{$prefix}navbar-active-color);\n }\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: var(--#{$prefix}navbar-toggler-padding-y) var(--#{$prefix}navbar-toggler-padding-x);\n @include font-size(var(--#{$prefix}navbar-toggler-font-size));\n line-height: 1;\n color: var(--#{$prefix}navbar-color);\n background-color: transparent; // remove default button style\n border: var(--#{$prefix}border-width) solid var(--#{$prefix}navbar-toggler-border-color); // remove default button style\n @include border-radius(var(--#{$prefix}navbar-toggler-border-radius));\n @include transition(var(--#{$prefix}navbar-toggler-transition));\n\n &:hover {\n text-decoration: none;\n }\n\n &:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 var(--#{$prefix}navbar-toggler-focus-width);\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-image: var(--#{$prefix}navbar-toggler-icon-bg);\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--#{$prefix}scroll-height, 75vh);\n overflow-y: auto;\n}\n\n// scss-docs-start navbar-expand-loop\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n // stylelint-disable-next-line scss/selector-no-union-class-name\n {$infix} {\n @include media-breakpoint-up($next) {\n flex-wrap: nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .nav-link {\n padding-right: var(--#{$prefix}navbar-nav-link-padding-x);\n padding-left: var(--#{$prefix}navbar-nav-link-padding-x);\n }\n }\n\n .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n\n .offcanvas {\n // stylelint-disable declaration-no-important\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n @include box-shadow(none);\n @include transition(none);\n // stylelint-enable declaration-no-important\n\n .offcanvas-header {\n display: none;\n }\n\n .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n }\n }\n }\n }\n}\n// scss-docs-end navbar-expand-loop\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n.navbar-light {\n @include deprecate(\"`.navbar-light`\", \"v5.2.0\", \"v6.0.0\", true);\n}\n\n.navbar-dark,\n.navbar[data-bs-theme=\"dark\"] {\n // scss-docs-start navbar-dark-css-vars\n --#{$prefix}navbar-color: #{$navbar-dark-color};\n --#{$prefix}navbar-hover-color: #{$navbar-dark-hover-color};\n --#{$prefix}navbar-disabled-color: #{$navbar-dark-disabled-color};\n --#{$prefix}navbar-active-color: #{$navbar-dark-active-color};\n --#{$prefix}navbar-brand-color: #{$navbar-dark-brand-color};\n --#{$prefix}navbar-brand-hover-color: #{$navbar-dark-brand-hover-color};\n --#{$prefix}navbar-toggler-border-color: #{$navbar-dark-toggler-border-color};\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\n // scss-docs-end navbar-dark-css-vars\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark) {\n .navbar-toggler-icon {\n --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n // scss-docs-start badge-css-vars\n --#{$prefix}badge-padding-x: #{$badge-padding-x};\n --#{$prefix}badge-padding-y: #{$badge-padding-y};\n @include rfs($badge-font-size, --#{$prefix}badge-font-size);\n --#{$prefix}badge-font-weight: #{$badge-font-weight};\n --#{$prefix}badge-color: #{$badge-color};\n --#{$prefix}badge-border-radius: #{$badge-border-radius};\n // scss-docs-end badge-css-vars\n\n display: inline-block;\n padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x);\n @include font-size(var(--#{$prefix}badge-font-size));\n font-weight: var(--#{$prefix}badge-font-weight);\n line-height: 1;\n color: var(--#{$prefix}badge-color);\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius(var(--#{$prefix}badge-border-radius));\n @include gradient-bg();\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n","//\n// Base styles\n//\n\n.alert {\n // scss-docs-start alert-css-vars\n --#{$prefix}alert-bg: transparent;\n --#{$prefix}alert-padding-x: #{$alert-padding-x};\n --#{$prefix}alert-padding-y: #{$alert-padding-y};\n --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom};\n --#{$prefix}alert-color: inherit;\n --#{$prefix}alert-border-color: transparent;\n --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color);\n --#{$prefix}alert-border-radius: #{$alert-border-radius};\n --#{$prefix}alert-link-color: inherit;\n // scss-docs-end alert-css-vars\n\n position: relative;\n padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x);\n margin-bottom: var(--#{$prefix}alert-margin-bottom);\n color: var(--#{$prefix}alert-color);\n background-color: var(--#{$prefix}alert-bg);\n border: var(--#{$prefix}alert-border);\n @include border-radius(var(--#{$prefix}alert-border-radius));\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n color: var(--#{$prefix}alert-link-color);\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $alert-dismissible-padding-r;\n\n // Adjust close link position\n .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: $stretched-link-z-index + 1;\n padding: $alert-padding-y * 1.25 $alert-padding-x;\n }\n}\n\n\n// scss-docs-start alert-modifiers\n// Generate contextual modifier classes for colorizing the alert\n@each $state in map-keys($theme-colors) {\n .alert-#{$state} {\n --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis);\n --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle);\n --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle);\n --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis);\n }\n}\n// scss-docs-end alert-modifiers\n","// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n","// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\n@each $color, $value in $theme-colors {\n .text-bg-#{$color} {\n color: color-contrast($value) if($enable-important-utilities, !important, null);\n background-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}bg-opacity, 1)) if($enable-important-utilities, !important, null);\n }\n}\n","// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\n@each $color, $value in $theme-colors {\n .link-#{$color} {\n color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n\n @if $link-shade-percentage != 0 {\n &:hover,\n &:focus {\n $hover-color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));\n color: RGBA(#{to-rgb($hover-color)}, var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(to-rgb($hover-color), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n }\n }\n }\n}\n\n// One-off special link helper as a bridge until v6\n.link-body-emphasis {\n color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n\n @if $link-shade-percentage != 0 {\n &:hover,\n &:focus {\n color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, .75)) if($enable-important-utilities, !important, null);\n text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, .75)) if($enable-important-utilities, !important, null);\n }\n }\n}\n",".focus-ring:focus {\n outline: 0;\n // By default, there is no `--bs-focus-ring-x`, `--bs-focus-ring-y`, or `--bs-focus-ring-blur`, but we provide CSS variables with fallbacks to initial `0` values\n box-shadow: var(--#{$prefix}focus-ring-x, 0) var(--#{$prefix}focus-ring-y, 0) var(--#{$prefix}focus-ring-blur, 0) var(--#{$prefix}focus-ring-width) var(--#{$prefix}focus-ring-color);\n}\n",".icon-link {\n display: inline-flex;\n gap: $icon-link-gap;\n align-items: center;\n text-decoration-color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, .5));\n text-underline-offset: $icon-link-underline-offset;\n backface-visibility: hidden;\n\n > .bi {\n flex-shrink: 0;\n width: $icon-link-icon-size;\n height: $icon-link-icon-size;\n fill: currentcolor;\n @include transition($icon-link-icon-transition);\n }\n}\n\n.icon-link-hover {\n &:hover,\n &:focus-visible {\n > .bi {\n transform: var(--#{$prefix}icon-link-transform, $icon-link-icon-transform);\n }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.ratio {\n position: relative;\n width: 100%;\n\n &::before {\n display: block;\n padding-top: var(--#{$prefix}aspect-ratio);\n content: \"\";\n }\n\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n\n@each $key, $ratio in $aspect-ratios {\n .ratio-#{$key} {\n --#{$prefix}aspect-ratio: #{$ratio};\n }\n}\n","// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n// Responsive sticky top and bottom\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .sticky#{$infix}-top {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n\n .sticky#{$infix}-bottom {\n position: sticky;\n bottom: 0;\n z-index: $zindex-sticky;\n }\n }\n}\n","// scss-docs-start stacks\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n// scss-docs-end stacks\n","//\n// Visually hidden\n//\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n @include visually-hidden();\n}\n","// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n\n // Fix for positioned table caption that could become anonymous cells\n &:not(caption) {\n position: absolute !important;\n }\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::#{$stretched-link-pseudo-element} {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $stretched-link-z-index;\n content: \"\";\n }\n}\n","//\n// Text truncation\n//\n\n.text-truncate {\n @include text-truncate();\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n",".vr {\n display: inline-block;\n align-self: stretch;\n width: $vr-border-width;\n min-height: 1em;\n background-color: currentcolor;\n opacity: $hr-opacity;\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n","@import \"vars\";\n\n// Variable overrides first\n$primary: $primary-color;\n$secondary: $secondary-color;\n$enable-shadows: true;\n$prefix: \"pa-\";\n\n// Required\n@import \"../../node_modules/bootstrap/scss/functions\";\n@import \"../../node_modules/bootstrap/scss/variables\";\n@import \"../../node_modules/bootstrap/scss/variables-dark\";\n@import \"../../node_modules/bootstrap/scss/maps\";\n@import \"../../node_modules/bootstrap/scss/mixins\";\n@import \"../../node_modules/bootstrap/scss/utilities\";\n@import \"../../node_modules/bootstrap/scss/root\";\n@import \"../../node_modules/bootstrap/scss/reboot\";\n\n@import \"../../node_modules/bootstrap/scss/type\";\n@import \"../../node_modules/bootstrap/scss/images\";\n@import \"../../node_modules/bootstrap/scss/containers\";\n@import \"../../node_modules/bootstrap/scss/grid\";\n@import \"../../node_modules/bootstrap/scss/tables\";\n// @import \"../../node_modules/bootstrap/scss/forms\";\n@import \"../../node_modules/bootstrap/scss/buttons\";\n@import \"../../node_modules/bootstrap/scss/transitions\";\n@import \"../../node_modules/bootstrap/scss/dropdown\";\n// @import \"../../node_modules/bootstrap/scss/button-group\";\n@import \"../../node_modules/bootstrap/scss/nav\";\n@import \"../../node_modules/bootstrap/scss/navbar\"; // Requires nav\n// @import \"../../node_modules/bootstrap/scss/card\";\n// @import \"../../node_modules/bootstrap/scss/breadcrumb\";\n// @import \"../../node_modules/bootstrap/scss/accordion\";\n// @import \"../../node_modules/bootstrap/scss/pagination\";\n@import \"../../node_modules/bootstrap/scss/badge\";\n@import \"../../node_modules/bootstrap/scss/alert\";\n// @import \"../../node_modules/bootstrap/scss/progress\";\n// @import \"../../node_modules/bootstrap/scss/list-group\";\n// @import \"../../node_modules/bootstrap/scss/close\";\n// @import \"../../node_modules/bootstrap/scss/toasts\";\n// @import \"../../node_modules/bootstrap/scss/modal\"; // Requires transitions\n// @import \"../../node_modules/bootstrap/scss/tooltip\";\n// @import \"../../node_modules/bootstrap/scss/popover\";\n// @import \"../../node_modules/bootstrap/scss/carousel\";\n// @import \"../../node_modules/bootstrap/scss/spinners\";\n// @import \"../../node_modules/bootstrap/scss/offcanvas\"; // Requires transitions\n// @import \"../../node_modules/bootstrap/scss/placeholders\";\n\n// Helpers\n@import \"../../node_modules/bootstrap/scss/helpers\";\n\n// Utilities\n@import \"../../node_modules/bootstrap/scss/utilities/api\";\n\nbody {\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: var(--text-color);\n background-color: var(--bg-color);\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.btn-primary {\n color: var(--text-color-reverse);\n background-color: var(--primary-color);\n border-color: var(--primary-color);\n}\n\n.btn-outline-primary {\n color: var(--primary-color);\n background: none;\n border-color: var(--primary-color);\n\n &:hover {\n background-color: var(--primary-color);\n color: var(--text-color-reverse);\n }\n}\n\n.btn-secondary {\n color: #ffffff;\n background-color: var(--secondary-color);\n border-color: var(--secondary-color);\n}\n\n.navbar {\n .nav-top {\n height: 86px;\n }\n\n .fixed-menu {\n width: 220px;\n }\n\n .logo img {\n width: 200px;\n }\n}\n\na {\n text-decoration: underline;\n color: var(--link-color);\n\n &:hover {\n color: var(--link-hover-color);\n }\n\n &:active {\n color: var(--link-color);\n }\n}\n\nh1,\nh2 {\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 12px;\n padding-top: 14px;\n}\n\nh1 {\n font-weight: 600;\n}\n\nh3 {\n padding-top: 16px;\n}\n\n.motto {\n .title {\n font-weight: 600;\n font-size: 32px;\n padding-top: 36px;\n }\n\n .motto {\n font-weight: 500;\n font-size: 20px;\n }\n\n}\n\n.btn-fixed {\n border-width: 2px;\n border-style: solid;\n width: 220px;\n height: 46px;\n text-transform: uppercase;\n font-weight: 700;\n border-radius: 5px 5px 5px 5px;\n vertical-align: middle;\n line-height: 42px;\n padding: 0;\n margin: 16px;\n box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075);\n}\n\n\n.pactus-video {\n video {\n max-width: 100%;\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n display: block;\n }\n}\n\n.highlighter-rouge .highlight pre {\n background-color: #0d1117;\n padding: 32px 12px 12px 12px;\n color: #cccccc;\n position: relative;\n overflow: auto;\n direction: ltr;\n\n button {\n position: absolute;\n top: 6px;\n right: 8px;\n\n padding: 2px;\n background-color: #808080;\n color: #404040;\n border-radius: 5px;\n border: ridge 1px #808080;\n\n &:hover {\n cursor: pointer;\n background-color: #bcbabb;\n }\n }\n}\n\n.nav-tabs {\n border-color: #0d1117 !important;\n\n .nav-link {\n border-width: 0 !important;\n\n &:not(.active):hover {\n color: #ffffff !important;\n background-color: #808080 !important;\n }\n }\n\n .active {\n color: #ffffff !important;\n background-color: #0d1117 !important;\n }\n}\n\ntable {\n thead tr th {\n font-weight: 700;\n background-color: var(--bg-color) !important;\n }\n\n // tbody tr:nth-child(2n + 1) td {\n // background-color: #eee;\n // }\n}\n\nblockquote {\n background: #eee;\n border-left: 10px solid #ccc;\n padding: 16px;\n quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n\n &:before {\n color: #ccc;\n content: open-quote;\n font-size: 64px;\n line-height: 0.1em;\n vertical-align: -0.4em;\n }\n\n p {\n margin-top: 16px;\n }\n\n & p:first-child {\n display: inline;\n padding-bottom: 160px;\n margin-bottom: 160px;\n }\n}\n\n.footer {\n background-color: var(--primary-color);\n color: var(--text-color-reverse);\n\n .section {\n font-size: 1.75rem;\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 20px;\n }\n\n li {\n padding-bottom: 8px;\n }\n\n &.anchor {\n a {\n color: var(--text-color-reverse);\n }\n\n a:link {\n color: var(--text-color-reverse);\n background-color: transparent;\n text-decoration: none;\n }\n\n a:hover {\n color: var(--text-color-reverse);\n }\n }\n\n .legal {\n color: var(--text-color-reverse);\n font-size: 12px;\n }\n}\n\n.community {\n img {\n margin: 4px;\n }\n}\n\n.community_ran {\n img {\n margin: 4px;\n }\n}\n\n#btn-back-to-top {\n background-color: var(--primary-color);\n color: var(--bg-color);\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: none;\n}\n\n.edit-bar {\n padding-top: 30px;\n\n .edit-btn,\n .edit-btn>a:hover {\n color: var(--text-color);\n text-decoration: none;\n }\n}\n\n.all-posts {\n .post-link {\n padding-bottom: 8px;\n }\n}\n\n.blog-post {\n .post-date {\n padding-bottom: 10px;\n color: #808080;\n }\n\n .content {\n padding-top: 22px;\n min-height: 600px;\n }\n}\n\n.partners {\n img {\n padding-top: 24px;\n }\n}\n",".hexdump {\n font-family: monospace;\n font-size: 12px;\n padding-bottom: 1rem;\n}\n\n.hexdump .offset {\n border-right: 2px solid #708090;\n color: #778899;\n}\n.hexdump .ascii {\n color: #696969;\n}\n","@import \"vars\";\n\n.faq {\n h3 {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid var(--primary-color);\n }\n\n a {\n text-decoration: none;\n }\n\n .group {\n padding-top: 16px;\n\n .col {\n font-weight: 600;\n padding-bottom: 10px;\n }\n }\n\n .separator {\n padding-top: 12px;\n padding-bottom: 12px;\n }\n\n .read_more {\n padding-top: 12px;\n }\n}\n","@import \"vars\";\n\n.toc {\n\n .btn,\n a {\n color: var(--text-color);\n }\n\n .btn-section {\n padding: 0.25rem 0.5rem;\n font-weight: 600;\n background-color: transparent;\n }\n\n .btn-section:hover,\n .btn-section:focus {\n background-color: var(--bg-color);\n }\n\n .btn-page a {\n padding: 0.1875rem 0.5rem;\n margin-top: 0.125rem;\n margin-left: 1.25rem;\n }\n\n .btn-page a:hover,\n .btn-page a:focus,\n .btn-page .selected {\n background-color: var(--bg-color);\n }\n}\n","$line-color: #939597;\n\n/* The actual timeline (the vertical ruler) */\n.timeline {\n position: relative;\n\n /* The actual timeline (the vertical ruler) */\n &::after {\n content: \"\";\n position: absolute;\n width: 6px;\n background-color: $line-color;\n top: 0;\n bottom: 0;\n left: 50%;\n margin-left: -3px;\n }\n}\n\n/* Container around content */\n.timeline-card {\n position: relative;\n width: 50%;\n\n .card {\n border: 1px solid rgba(0, 0, 0, 0.175);\n border-radius: 5px;\n background-color: #eeeeee;\n color: #4c4c4c;\n\n a {\n color: #4c4c4c;\n }\n\n .text-muted {\n color: #898b8d !important;\n }\n }\n\n .card-title {\n padding-bottom: 12px;\n font-size: 1.1rem;\n font-weight: 500;\n }\n\n /* The circles on the timeline */\n &::after {\n line-height: 38px;\n font-size: 24px;\n position: absolute;\n text-align: center;\n width: 48px;\n height: 48px;\n right: -24px;\n top: 15px;\n border-radius: 50%;\n z-index: 1;\n }\n\n &.completed::after {\n content: \"✅\";\n background-color: #eeeeee;\n border: 5px solid #77b255;\n }\n\n &.ongoing::after {\n content: \"🚧\";\n background-color: #eeeeee;\n border: 5px solid #ffcb4b;\n }\n\n &.upcoming::after {\n content: \"⏳\";\n background-color: #eeeeee;\n border: 5px solid #478ec2;\n }\n\n /* Place the container to the left */\n &.left {\n padding: 0px 50px 20px 0px;\n left: 0;\n }\n\n /* Place the container to the right */\n &.right {\n padding: 0px 0px 20px 50px;\n left: 50%;\n }\n\n /* Add arrows to the left container (pointing right) */\n &.left::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background-color: #eeeeee;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 34px;\n z-index: 0;\n right: 33px;\n border-right: 1px solid rgba(0, 0, 0, 0.175);\n border-top: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Add arrows to the right container (pointing left) */\n &.right::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background-color: #eeeeee !important;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 33px;\n z-index: 0;\n left: 48px;\n border-left: 1px solid rgba(0, 0, 0, 0.175);\n border-bottom: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Fix the circle for containers on the right side */\n &.right::after {\n left: -24px;\n }\n}\n\n/* Media queries - Responsive timeline on screens less than 600px wide */\n@media screen and (max-width: 600px) {\n\n /* Place the timeline to the left */\n .timeline::after {\n left: 31px;\n }\n\n /* Full-width containers */\n .timeline-card {\n width: 100%;\n padding-left: 80px !important;\n padding-right: 25px !important;\n\n /* Make sure that all arrows are pointing leftwards */\n &::before {\n left: 77px !important;\n }\n\n /* Make sure all circles are at the same spot */\n &.left::after,\n &.right::after {\n left: 8px !important;\n }\n\n &.left::before {\n border-right: none;\n border-top: none;\n border-left: 1px solid rgba(0, 0, 0, 0.175);\n border-bottom: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n &.right::before {\n right: auto;\n }\n\n /* Make all right containers behave like the left ones */\n &.right {\n left: 0%;\n }\n }\n}\n","@import \"vars\";\n\n.learn {\n h2 {\n border-top: 1px solid var(--primary-color);\n }\n}\n","@include color-mode(dark) {\n blockquote {\n background: #14171c;\n }\n\n\n .toc {\n .btn-section::before {\n --svg-color: var(--text);\n }\n }\n\n .fa-linux {\n color: #ffffff;\n }\n}\n"],"file":"custom.css"}
\ No newline at end of file
diff --git a/zh/blog/index.html b/zh/blog/index.html
new file mode 100644
index 000000000..2c98a4f0c
--- /dev/null
+++ b/zh/blog/index.html
@@ -0,0 +1,571 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
所有文章
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- 28 September 2023
+
+
+
+
+
- 24 September 2023
+
+
+
+
+
- 04 September 2023
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- 24 September 2022
+
+
+
+
+
- 20 September 2022
+
+
+
+
+
- 18 September 2022
+
+
+
+
+
- 04 September 2022
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/browserconfig.xml b/zh/browserconfig.xml
new file mode 100644
index 000000000..b3930d0f0
--- /dev/null
+++ b/zh/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #da532c
+
+
+
diff --git a/zh/community/index.html b/zh/community/index.html
new file mode 100644
index 000000000..0c2c1c29e
--- /dev/null
+++ b/zh/community/index.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 社区 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
加入帕图斯社区
+
+
加入帕图斯社区,您将成为一个全球创新者、思想家和实践者网络的一部分, 所有这些人都有一个共同的愿景,即利用区块链技术构建更美好的未来。无论您是开发人员、企业家、投资者, 还是一个区块链爱好者,在这里,都有一个属于您的位置。 所以,让我们携手并肩,创造改变吧!
+
+
+
+
To explore the communities managed by members of the community, you can follow the links below.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/contributing/index.html b/zh/contributing/index.html
new file mode 100644
index 000000000..796b684a5
--- /dev/null
+++ b/zh/contributing/index.html
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 贡献 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
贡献
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
As an open-source platform, Pactus blockchain empowers from its community.
+Whether you’re a developer, designer, or enthusiast, your contributions can make a meaningful impact.
+
+
There are several ways to support the Pactus project:
+
+
Run a Node
+
+
One of the most effective ways to contribute to the Pactus network is by running a node.
+A “node” is a software program that downloads a copy of the Pactus blockchain and
+ensure the network keeps running safe and decentralized.
+
+
These guides can help you to run and configure your node:
+
+
+
+
Become a Validator
+
+
Validators play an important role in the Pactus blockchain by verifying transactions and
+adding them to the blockchain.
+By becoming a validator, you can earn rewards
+for contributing to the network’s security and decentralization.
+
+
To become a validator, you will need to stake a certain amount of Pactus coins.
+These guides can help you to send a Bond transaction and stake some coins:
+
+
+
+
Develop
+
+
Pactus is an open-source project that welcomes and encourages contributions from developers.
+By contributing to the project, you can help improve the Pactus platform and create new features that
+benefit the entire community.
+
+
You can check our Contributing page
+for more information on how to get involved and contribute to the project.
+
+
Translation
+
+
Another way to contribute to the Pactus project is by translating this website into other languages and
+improving its content.
+
+
Spread the Word
+
+
The more people who know about Pactus, the more opportunities there are for collaboration and growth.
+Share our project on social media, attend Pactus events, or simply tell your friends and colleagues about us.
+
+
+
+
Together, Let’s build a better future for blockchain technology.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/download/index.html b/zh/download/index.html
new file mode 100644
index 000000000..5c925e328
--- /dev/null
+++ b/zh/download/index.html
@@ -0,0 +1,543 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 下载 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
资源下载
+
+
在此页面上,您可以找到如何下载和获取帕图斯软件的最新版本。
+
+
+
+
🏗️ 从源代码编译
+
+
帕图斯项目是作为开源软件分发的,因此安装的首选方法是从 GitHub 存储库克隆源代码并编译源代码。
+
+
有关编译帕图斯的说明在安装 页面中提供。
+
+
+
+
⬇️ 下载稳定版
+
+
您还可以下载最新的稳定版本的帕图斯。 这些版本会在发布GitHub存储库 中的新版本时自动更新。
+
+
帕图斯图形用户界面(GUI)
+
+
您可以以图形用户界面(GUI)模式运行帕图斯,适用于初学者和高级用户。
+
+
+
+
+
+
+ 不受信任的应用程序 请注意,预编译的二进制文件不包含任何 <a href=https://pactus.org/user-guides/run-pactus-gui/#code-certificate-issue>代码签名证书</a>。 在Windows和macOS中,下载的二进制文件可能会被检测为不受信任的应用程序。
+
+
+
+
一旦您下载了帕图斯GUI,您可以按照本教程设置和运行节点:
+ 如何以图形模式运行帕图斯?
+
+
+
+
帕图斯命令行界面(CLI)
+
+
高级用户可以以命令行界面(CLI)模式运行帕图斯。
+
+
+
+
+
+
一旦您下载了帕图斯CLI,您可以按照本教程设置和运行节点:
+ 如何以命令行模式运行帕图斯?
+
+
Downloader script
+
+
For Unix-like systems (e.g., Linux, macOS, or MSYS2 on Windows), there is a downloader script available. This script can download the archived file, verify it, and extract it for you. To use it, simply run the following command in your terminal:
+
+
curl --proto '=https' --tlsv1 .2 -sSL https://github.com/pactus-project/pactus/releases/download/v1.0.2/pactus_downloader.sh | sh
+
+
+
+
+
🐳 Docker容器
+
+
高级用户可以从Docker Hub 获取帕图斯docker镜像。
+
+
您可以按照本教程使用Docker设置和运行节点:
+ 如何使用Docker运行帕图斯?
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/favicon-128x128.png b/zh/favicon-128x128.png
new file mode 100644
index 000000000..56c2f6cb2
Binary files /dev/null and b/zh/favicon-128x128.png differ
diff --git a/zh/favicon-16x16.png b/zh/favicon-16x16.png
new file mode 100644
index 000000000..4babb6356
Binary files /dev/null and b/zh/favicon-16x16.png differ
diff --git a/zh/favicon-32x32.png b/zh/favicon-32x32.png
new file mode 100644
index 000000000..e22d5d721
Binary files /dev/null and b/zh/favicon-32x32.png differ
diff --git a/zh/favicon-64x64.png b/zh/favicon-64x64.png
new file mode 100644
index 000000000..e8d111c2e
Binary files /dev/null and b/zh/favicon-64x64.png differ
diff --git a/zh/favicon.ico b/zh/favicon.ico
new file mode 100644
index 000000000..64080c0ee
Binary files /dev/null and b/zh/favicon.ico differ
diff --git a/zh/feed.xml b/zh/feed.xml
new file mode 100644
index 000000000..99ad248f6
--- /dev/null
+++ b/zh/feed.xml
@@ -0,0 +1,1223 @@
+Jekyll 2024-03-10T09:34:39+00:00 https://pactus.org/feed.xml Pactus blockchain Pactus 1.0.2 (Istanbul) Released 2024-02-18T00:00:00+00:00 2024-02-18T00:00:00+00:00 https://pactus.org/2024/02/18/release-1-0-2 Overview
+
+Pactus Blockchain Version 1.0.2 (Istanbul)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+This release is named after the city of Istanbul and it
+was unanimously selected by Pactus community.
+
+
+
+Highlights
+
+This update fixes a major issue that decreases the number of inbound connections of the nodes over time.
+We highly recommend all users to upgrade to the new version for better connectivity.
+
+Download
+
+To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+How to Upgrade
+
+If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Fix
+
+
+ sync : fix concurrent map read-write crash (#1112 )
+ network : remove disconnected peers from peerMgr (#1110 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 1.0.1 (Beijing) Released 2024-02-10T00:00:00+00:00 2024-02-10T00:00:00+00:00 https://pactus.org/2024/02/10/release-1-0-1 Overview
+
+Pactus Blockchain Version 1.0.1 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+This release is named after the city of Beijing and it
+was unanimously selected by Pactus community.
+
+
+
+Highlights
+
+This update fixes several issues identified after the release of
+1.0.0 (Beijing) .
+Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.
+
+Download
+
+To start using Pactus blockchain, download the latest version from the download
+page and join the Mainnet.
+
+How to Upgrade
+
+If you are running an older version, close it first.
+Then uninstall the previous version and install the newer version.
+If you are using the archived version, simply replace it with the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gui : add connections and moniker fields to main windows (#1090 )
+
+
+Fix
+
+
+ network : set dial and accept limit in connection gater (#1089 )
+ gui stderr logger in windows os (#1081 )
+ sync : improve syncing process (#1087 )
+ network : redefine resource limits (#1086 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 1.0.0 (Beijing) Released 2024-01-31T00:00:00+00:00 2024-01-31T00:00:00+00:00 https://pactus.org/2024/01/31/release-1-0-0 Overview
+
+Pactus Blockchain Version 1.0.0 (Beijing)
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+Highlights
+
+Mainnet Official Release v1.0.0 (Beijing)
+
+The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone
+for our community.
+This impressive mainnet release represents the culmination of extensive development efforts.
+Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain,
+enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software
+and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on
+this exciting journey.
+
+Onboarding validators
+
+On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in
+Testnet-0 ,
+Testnet-1 , and
+Testnet-2 .
+This marks the beginning of a new chapter in the decentralized world.
+
+Download
+
+This version has been implemented for Mainnet
+To start using Pactus Mainnet, download the latest version from the download
+page and join the Mainnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ implement get validator address for grpc (#975 )
+ add bootstrap.json and load in config on build (#964 )
+ add mainnet config and genesis files (#951 )
+ add Consensus-address to network info (#952 )
+ grpc : sign transaction using wallet client (#945 )
+ pactus gui lock support (#947 )
+ consensus : turning consensus to a zero-config module (#942 )
+
+
+Fix
+
+
+ localnet wallet issue (#970 )
+ sync : remove ReachabilityStatus from agent info (#956 )
+ daemon : keeping previous behavior for password flag, linting CLI messages (#950 )
+ consensus : detect if the system time is behind the network (#939 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Mainnet launched 🚀 2024-01-24T20:24:00+00:00 2024-01-24T20:24:00+00:00 https://pactus.org/2024/01/24/mainnet-launched Years to Launch
+
+Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time.
+Pactus Mainnet is the result of years of hard work, research, and innovation.
+It started from one idea:
+
+A low-cost, truly decentralized blockchain, built by the people for the people,
+where anyone could run and be their own validator.
+
+We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.
+
+
+
+We want to thank Pactus community for helping us on the Testnet.
+
+You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.
+
+On the Road
+
+The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!
+
+We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!
+
+We Have a Dream
+
+We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.
+
+This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.
+
+And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!
]]> Story of Testnet-2 2024-01-22T00:00:00+00:00 2024-01-22T00:00:00+00:00 https://pactus.org/2024/01/22/testnet-2-concluded What is Testnet?
+
+Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+Summary
+
+In October 2023, we launched Testnet-2 .
+The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.
+
+The committee for Testnet-2 was set to 51 validators,
+and 2084 validators joined during the Testnet period.
+More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network.
+More than 800,000 blocks were created, and about 2 million transactions were processed during this time.
+The size of the blockchain is about 450 megabytes.
+
+About 500,000 coins were staked during this period, almost 60% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+Stability of Consensus
+
+In Testnet-1, we had one consensus failure that caused us to
+conclude the Testnet-1 .
+During Testnet-2, there were no issues with the consensus mechanism, and
+we had no case of failure during the testing period,
+although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor.
+It proved that the consensus mechanism is in a stable situation.
+
+Networking issues
+
+In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem.
+In the second blockage, we had no choice but to ask active validators inside the committee to
+update their nodes to overcome the networking issue.
+The development team faced a difficult situation and had to make the proper decision to fix the networking issues.
+On one hand, the networking traffic increased significantly, and on the other hand, we had to
+make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems.
+After examining different scenarios, the networking issues were resolved, and
+no major problems were reported till the end of Testnet.
+
+Major updates
+
+During Testnet-2, we introduced several updates, including versions
+0.15.0 ,
+0.16.0 ,
+0.17.0 ,
+0.18.0 ,
+0.19.0 , and
+0.20.0 .
+The update process went smoothly, and with the stability of Version 0.20.0 confirmed,
+the development team shifted its focus to the Mainnet launch.
+
+
+
+This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+We are grateful to all those who participated in Testnets, and we encourage them to join the Mainnet.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
]]> Pactus 0.20.0 Released 2024-01-11T00:00:00+00:00 2024-01-11T00:00:00+00:00 https://pactus.org/2024/01/11/release-0-20-0 Overview
+
+Pactus Blockchain Version 0.20.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+Validator Stake Management
+
+The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.
+
+
+
+Improving Network Connectivity
+
+Some users have reported that UDP packets are being dropped by their Internet Service Providers.
+Therefore, the UDP protocol is disabled by default.
+Users can still activate the UDP protocol by configuring the settings in the file if necessary.
+
+Also, the experimental Node Gossip feature has been removed in this version.
+Node gossip could cause some validators to become isolated from the rest of the network.
+
+Relay service
+
+This version enables users to turn their node into a relay service.
+A relay service node can help users behind NAT to communicate with each other.
+It is disabled by default and can be enabled inside the config file.
+Please note that it is still in an experimental state.
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ implement relay service (#931 )
+ HTTP : Integrate AddRowDouble and update tests (#926 )
+ network : making listen address private in config (#921 )
+ http : adding AvailabilityScore to http module (#917 )
+ network : adding ‘enable_udp’ config (#918 )
+ network : removing gossip node service (#916 )
+ gRPC : adding AvailabilityScore to gRPC (#910 )
+ GUI : unbond and withdraw transaction dialogs (#908 )
+
+
+Fix
+
+
+ gRPC : adding missing get raw transaction APIs to gRPC gateway (#925 )
+ network : preventing self dial (#924 )
+ fixing time lag on starting node (#923 )
+ network : fixing network deadlock on linux arm64 (#922 )
+ GUI : updating unbond and withdraw dialogs (#911 )
+ fixing gRPC node info issue (#906 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus records its IPs in IPMINTER 2024-01-10T00:00:00+00:00 2024-01-10T00:00:00+00:00 https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminter
+
+In our continuous pursuit of innovation, the recording of our intellectual property is the
+cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a
+slow and expensive hurdle. That is… until we discovered IPMINTER!
+
+Pactus profile in IPMINTER
+
+We are ecstatic to announce that the blockchain-based platform by IPMINTER has
+revolutionized the way we secure our creations.
+
+Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our
+intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes!
+Plus, the moment we received our exquisite certificate, complete with a QR code directly linking
+to our secure blockchain entry, our confidence in this platform soared.
+
+Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission
+to protect our inventive proposals. The assurance we’ve experienced using their platform has
+been unparalleled.
+
+We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward,
+economical, and robust IP recording solution. They have our heartfelt endorsement!
+
+Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!
]]>Mainnet announcement 2024-01-08T00:00:00+00:00 2024-01-08T00:00:00+00:00 https://pactus.org/2024/01/08/mainnet-announcement The much-awaited Mainnet Launch of The Pactus Blockchain is finally here!
+On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block ,
+will be minted by four Bootstrap validators.
+After that, every 10 seconds, a new block will be added to the blockchain.
+Each block contains the committed transactions in the network.
+The block finality in the Pactus blockchain is immediate.
+It means that there is no need to wait for block confirmation to ensure a transaction is committed.
+
+Later, more than 2000 community validators will secure the blockchain and make it decentralized.
+These validators are Testnet participants who helped test Pactus during our testing period.
+The community validators will receive the initial staking coins from a Discord Bot named RoboPac.
+
+To ensure everything works smoothly on the Mainnet, three different Testnets (
+Testnet0 ,
+Testnet1 , and
+Testnet2 ) have been run.
+
+The Mainnet will never be stopped or interrupted by the core developers of Pactus,
+and validators should primarily participate in and maintain the security of the blockchain.
]]> Pactus 0.19.0 Released 2024-01-04T00:00:00+00:00 2024-01-04T00:00:00+00:00 https://pactus.org/2024/01/04/release-0-19-0 Overview
+
+Pactus Blockchain Version 0.19.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+This version has improved the overall performance of the blockchain by implementing
+PIP-15 .
+PIP-15 suggests to add caching algorithms to the database for the most frequently used items.
+
+Additionally, this version has enhanced the connectivity of the nodes in the P2P network.
+
+Availability Score
+
+This version comes with the implementation of PIP-19 .
+PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the
+committee .
+Validators with a score less than 0.8 won’t receive the block reward,
+as their proposals will be rejected by other validators.
+The main reason behind this PIP is to prevent users from downgrading
+their node specifications and running Pactus on machines with low resources.
+
+Breaking change
+
+The Docker container now contains both daemon and wallet binary files.
+Users who use Docker to run Pacts now need to add the entry point to run Pactus.
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gRPC : defining network and peers info response’s properly (#898 )
+ implementing pip-19 (#899 )
+ network : disabling GosipSub, only FloodSub (#895 )
+ www : adding change proposer round and value to consensus info votes (#892 )
+ network : adding relay service to dial relay nodes (#887 )
+ implementing pip-15 (#843 )
+ check already running by lock file (#871 )
+
+
+Fix
+
+
+ store : use cache to check if public key exists (#902 )
+ executor : not rejecting bond transaction for bootstrap validator (#901 )
+ GUI : removing unnecessary tags in transaction confirm dialog (#893 )
+ network : close relay connection for public node (#891 )
+ network : refining GossipSubParams for Gossiper node (#882 )
+ sync : adding sequence number to the bundle (#881 )
+ network : turn off mesh for gossiper node (#880 )
+ consensus : check voteset for CP strong termination (#879 )
+ adding querier to query messages (#878 )
+ execution : fixing issue #869 (#870 )
+ fixing logger issue on rotating log file (#859 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.18.0 Released 2023-12-12T00:00:00+00:00 2023-12-12T00:00:00+00:00 https://pactus.org/2023/12/12/release-0-18-0 Overview
+
+Pactus Blockchain Version 0.18.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+This version has significantly improved the syncing progress.
+The syncing process concurrently requests blocks from 8 different peers and
+actively connects to the most optimal peers for downloading the blockchain.
+
+Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.
+
+Breaking change
+
+For Unix-based systems, please note that the working directory for root users has changed from /pactus
to /root/pactus
.
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After you update the node, the configuration file will automatically get updated, keeping the old settings.
+If you want to return the configuration file to its default settings,
+just delete the current config file and restart the node.
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ implement pip-14 (#841 )
+ sort wallet addresses (#836 )
+ grpc : endpoints for creating raw transaction (#838 )
+ network reachability API (#834 )
+ implement pip-13 (#835 )
+ subscribing to libp2p eventbus (#831 )
+ implement helper methods for wallet address path (#830 )
+ logger : adding rotate log file after days, compress and maxgae for logger config (#822 )
+ enable bandwidth router metric (#819 )
+
+
+Fix
+
+
+ network : refining the connection limit (#849 )
+ corrected mistake when retrieving the reward address (#848 )
+ config : restore default config when it is deleted (#847 )
+ cmd : changing home directory for root users (#846 )
+ removing BasicCheck for hash (#845 )
+ disabling libp2p ping protocol (#844 )
+ build docker file (#839 )
+ sync : ignore publishing a block if it is received before (#829 )
+ network : subscribing to the Libp2p event bus (#828 )
+ sync : ignore block request if blocks are already inside the cache (#817 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.17.0 Released 2023-11-12T00:00:00+00:00 2023-11-12T00:00:00+00:00 https://pactus.org/2023/11/12/release-0-17-0 Overview
+
+Pactus Blockchain Version 0.17.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+The Testnet has been upgraded and all validators must update their nodes.
+
+This version will address major networking issues, reduce network usage, and improve overall performance.
+
+A new node type, “Node Gossips ”, has been introduced to help broadcast and spread messages across the network.
+Node Gossips support the network by delivering messages to non-gossiping nodes.
+This gossip option is disabled by default but can be enabled in the configuration file.
+If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node.
+Please note that this option is still experimental and subject to potential changes in future releases.
+
+
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+
+After updating the node, the configuration file will be overwritten with a new version.
+You need to make modifications to the config file if you had customized it prior to the update.
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ network : default configs for bootstrap and relay peers (#812 )
+ introducing node gossip type (#811 )
+ sync : adding remote address to the peer info (#804 )
+ network : adding public address to factory (#795 )
+ network : filter private ips (#793 )
+
+
+Fix
+
+
+ upgrading Testnet (#814 )
+ sync : prevent opening sessions indefinitely (#813 )
+ execution : fixing mistake on calculating unbonded power (#806 )
+ network : check connection threshold on gater (#803 )
+ network : no transient connection (#799 )
+ not close connection for bootstrap nodes (#792 )
+
+
+Refactor
+
+
+ sync : refactoring sync process (#807 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.16.0 Released 2023-10-29T00:00:00+00:00 2023-10-29T00:00:00+00:00 https://pactus.org/2023/10/29/release-0-16-0 Overview
+
+Pactus Blockchain Version 0.16.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+Highlights
+
+This version allows users to create new addresses for both validators and accounts.
+The networking module has been improved, and users can now set limits on the number of connections.
+A random crash on the agreement protocol has been fixed in this version.
+
+
+
+Download
+
+This version has been implemented for Testnet-2 and
+is being prepared for the upcoming Mainnet launch.
+To start using Pactus Blockchain Testnet-2, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to download, install and configure your node:
+
+
+
+How to Upgrade
+
+If you are running an older version, shut it down.
+Uninstall the previous version and install the newer version.
+If you are using the archived version, simply use the new version.
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gui : display network ID (#780 )
+ create new validator address (CLI and GUI) (#757 )
+ add community bootstrap nodes to testnet config (#764 )
+ network : implementing connection manager (#773 )
+ network : adding bootstrapper mode to the network config (#760 )
+
+
+Fix
+
+
+ network : redefine the network limits (#788 )
+ consensus : not increase the vote-box power on duplicated votes (#785 )
+ network : close connection when unable to get supported protocols (#781 )
+ network : enabling peer exchange for bootstrappers (#779 )
+ network : set connection limit for the resource manager (#775 )
+ sync : peer status set to known on sucessfull handshaking (#774 )
+ consensus : strong termination for the binary agreement (#765 )
+ consensus : not increase the voting power on duplicated binary votes (#762 )
+
+
+Refactor
+
+
+ network : refactoring peer manager (#787 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Pactus 0.15.0 released 2023-10-15T00:00:00+00:00 2023-10-15T00:00:00+00:00 https://pactus.org/2023/10/15/release-0-15-0 Overview
+
+Pactus Blockchain Version 0.15.0
+is now available for download.
+This release includes a graphical user interface (GUI) that
+is suitable for both beginners and experienced users.
+It also includes a command-line interface (CLI) for advanced users and wallet software
+that allows users to interact with the blockchain without the need to sync the entire blockchain.
+
+
+
+Download
+
+This version is the bootstrap version for
+Testnet-2 .
+To start using Pactus Blockchain Testnet-1, download the latest version from the
+download page and join the Testnet.
+
+These guides can help you to run and configure your node:
+
+
+
+
+ If you participated in Testnet-1, ensure to delete your previous working directory and
+ create a new wallet.
+
+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows,
+ or "~/pactus" on Unix-compatible platforms.
+
+
+Change log
+
+This version includes several changes and improvements, such as:
+
+Feat
+
+
+ gui : adding the splash screen (#743 )
+ add absentees votes to the certificate (#746 )
+ logger : short stringer for loggers (#732 )
+ implementing pip-7 (#731 )
+ implementing pip-11 (#712 )
+ implementing pip-8 (#711 )
+ implementing pip-9 (#706 )
+ new API to get Public key by address (#704 )
+ Adding address field for AccountInfo (#703 )
+ CreateValidatorEvent and CreateAccountEvent for nanomsg (#702 )
+ implementing PIP-2 and PIP-3 (#699 )
+ Adding Hole Punching to network (#697 )
+ write logs into file (#673 )
+ check protocol support before sending connect/disconnect event (#683 )
+ updating genesis for pre-testnet-2 (#679 )
+ adding udp protocol for network (#672 )
+ implementing pip-4 (#671 )
+ Notifee service events (#628 )
+ adding MinimumStake parameter (#574 )
+ adding Sent and Received bytes per message metrics for peers (#618 )
+ add reason to BlockResponse messages (#607 )
+ Add CalcualteFee in GRPC (#601 )
+ add sent bytes and received bytes metrics to peerset plus update grpc (#606 )
+ added metrics of libp2p with supporting prometheus (#588 )
+ Check node address is valid (#565 )
+ add LastSent and LastReceived properties to peer (#569 )
+
+
+Fix
+
+
+ data race issue on updating certificate (#747 )
+ network : async connection (#744 )
+ adding query vote timer for CP phase (#738 )
+ trim transactions in proposed block (#737 )
+ fixing query votes and proposal issue (#736 )
+ fixing issue when a block has max transactions (#735 )
+ consensus : anti-entroy mechanism for the consensus (#734 )
+ logger : invalid level parsing error (#733 )
+ cache certificate by height (#730 )
+ fixing a crash on consensus (#729 )
+ consensus : prevent double entry in new height (#728 )
+ resolve consensus halt caused by time discrepancy in network. (#727 )
+ unsorted addresses in wallet listing (#721 )
+ send query votes message, if there is no proposal yet (#723 )
+ fixing logger level issue (#722 )
+ fixing syncing stuck issue (#720 )
+ fixing some minor issues on pre-testnet (#719 )
+ supporting go version 1.21 and higher (#692 )
+ ensure log rotation using tests (#693 )
+ restoring at the first block (#691 )
+ swagger doesn’t work with multiple proto files (#687 )
+ fixing wallet-cli issues (#686 )
+ prevent stripping public key for subsidy transactions (#678 )
+ updating the consensus protocol (#668 )
+ aggregating signature for hello message (#640 )
+ error case for logger (#634 )
+ adding committers to the certificate (#623 )
+ updating sortition executor (#608 )
+ update buf and fixing proto generation issue (#600 )
+ adding block hash to peer (#584 )
+ copy to clipboard option for address and pubkey (#583 )
+ public key aggregate (#576 )
+ remove GetValidators rpc method (#573 )
+ missing swagger ui for grpc get account by number (#564 )
+ incorrect handler for validator by number (#563 )
+
+
+Refactor
+
+
+ sync : refactoring syncing process (#676 )
+ remove payload prefix from payload transaction type (#669 )
+ change Hello message from broadcasting to direct messaging (#665 )
+ committee : using generic list for validators (#667 )
+ rename SanityCheck to BasicCheck (#643 )
+ cli : Migrating from mow.cli to cobra for wallet (#629 )
+ cli : replacing mow.cli with cobra for daemon (#621 )
+ logger : using fast JSON logger (zerolog) (#613 )
+ Using Generics for calculating Min and Max for numeric type #604 (#609 )
+ Updating LRU cache to version 2 #514 (#602 )
+
+
+You can find the full list of changes on Github ,
+as well as the source code
]]> Testnet-2 launch announcement 2023-10-15T00:00:00+00:00 2023-10-15T00:00:00+00:00 https://pactus.org/2023/10/15/testnet-2-launched Overview
+
+Exciting news for the Pactus Community: Testnet-2 is has launched!
+The journey through Testnet-1
+brought success and invaluable experiences, with over 500 validators joining the network.
+Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and
+thoroughly address these issues.
+After two months of dedicated work and testing, many problems have been resolved, and
+we feel confident launching the Testnet again.
+Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain.
+Notably, the new consensus mechanism and improved overall network performance.
+
+At this point, we want to assure the Pactus community that this version of
+the Testnet will not stop until the mainnet launches ,
+and our main focus is on improving its overall performance and launching the Mainnet.
+
+If you’re new to the concept of Testnet, check out our informative post:
+What is the Testnet?
+
+Key Focus Areas
+
+Testnet-2 has important tasks ahead.
+Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient.
+A close eye will be kept on the network’s performance, ensuring it operates as expected.
+For Testnet-2, the committee
+size has been expanded to 51 members.
+Both the committee’s performance and block production will be closely monitored.
+The goal is a blockchain that remains stable and trustworthy,
+even with thousands of validators in the network,
+ensuring it manages its regular duties seamlessly.
+
+How To Join
+
+Want to join the Testnet-2? Great! It’s super easy.
+Just download the latest Pactus software and you’re good to go.
+no fancy setups or special gear needed.
+You can run the software straight from your personal computer or laptop.
+Need some test coins? Pop over to our Discord channel and share your validator address there.
+
+Benefits for Participation
+
+By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and
+be well-prepared for the Mainnet launch.
+Testnet participants will also receive higher priority during the Mainnet launch and
+get free coins for initial staking on the Mainnet.
+
+Your Feedback Matters
+
+User feedback plays a vital role in the improvement of the Pactus blockchain.
+Share your thoughts and experiences to contribute to the enhancement of future software versions.
]]> How SSPoS (Solid State Proof of Stake) works in simple word 2023-09-28T00:00:00+00:00 2023-09-28T00:00:00+00:00 https://pactus.org/2023/09/28/how-sspos-works-in-simple-word Abstract
+
+In all Blockchain protocols, there is a concept called a consensus mechanism.
+This mechanism is used to enable nodes to reach an agreement
+on the state of the Blockchain they are
+maintaining, in order to have a synchronized and integrated Blockchain.
+
+For now, we have a lot of consensus mechanisms in the Blockchain world.
+Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.
+
+To explain how it works let’s start with explaining one of the first and simplest
+consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).
+
+
+
+PoW (Proof of Work)
+
+In the proof of work model, each node in the network should solve a complex mathematical
+problem that requires lots of computing resources to make a new block.
+
+In this way, it’s highly unlikely that anyone would be able to change
+past transactions and change Blockchain states such as balances,
+without expending equivalent computational power.
+
+By doing this we ensure the security and integrity of the Blockchain.
+
+The concept was adapted from digital tokens by Hal Finney in 2004
+through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).
+
+Bitcoin uses this consensus model.
+
+PoS (Proof of Stake)
+
+On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!
+
+Validators lock a number of their assets in the Blockchain and they can transfer or use it
+till it is locked which we call staking.
+after each Block is committed one of the validators will be chosen randomly (more amount of stake,
+more chance to be chosen) when a validator is chosen
+it proposes a block and announces it to other nodes to be validated,
+when a supermajority of validators accept the block it’s going to be committed.
+
+In this system, validators have no incentive to behave maliciously or dishonestly.
+If they do, they risk losing the stake amount.
+
+More amount of validators in a PoS Blockchain makes it more secure,
+decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.
+
+Ethereum uses this model.
+
+DPoS (Delegated Proof of Stake)
+
+DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm.
+users entrust their stakes to a small group of “delegates”.
+These delegates are responsible for validating transactions
+and creating blocks. The number of delegates is limited
+to ensure accountability and efficiency in the validation process.
+
+Some Blockchains like Cardano and Tron use DPoS.
+
+DPoS tries to solve the issue of PoS which when validators
+increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot
+of trust in the hands of a small number of delegates,
+which goes against the principle of “don’t trust, verify”.
+
+SSPoS (Solid State Proof of Stake)
+
+BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?
+
+In Pactus Blockchain, we have something called Solid State Proof of Stake
+and we try to fix the previous model’s issue, let me explain.
+
+Pactus uses a dynamic committee of validators with a fixed size of 51,
+but the members of the committee randomly change in each round,
+based on stake amount the chance of being chosen is higher. on the other hand,
+the number of validators out on the committee is unlimited, allowing anyone
+to become a validator by staking coins.
+
+At each block, validators participate in a sortition algorithm by generating a random number
+between zero and the total staked coins. If the number is less
+than the validator’s stake, they can enter the committee and replace the oldest committee member.
+
+So, in SSPoS models which are a variant of PoS, we can reach a consensus,
+without using high computation resources, having an inefficient
+validation process by increasing validator numbers,
+and also without breaking the principle of “don’t trust, verify”.
]]> Dev Report pre-testnet2 2023-09-24T00:00:00+00:00 2023-09-24T00:00:00+00:00 https://pactus.org/2023/09/24/dev-report-pre-testnet-2 Abstract
+
+there is several activities in Pactus github in September month, here is a clear report and explain of activities.
+
+
+
+Implementing PIP 2, 3 and 4
+
+After starting Pactus Labs and PIPs ,
+we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:
+
+
+
+Network
+
+There is some very good change and new features for Pactus network module,
+this list contain a list of important changes in Pactus networking:
+
+
+
+gRPC and nanomessage services
+
+We also updated, improved and enhanced gRPC and nanomessage services for better developer experience,
+for third-party and side project developers, here is some changes:
+
+
+
+Refactoring and other new feature or debugs
+
+We had some not implemented feature request, not fixed bugs and some issue with new golang version,
+list of this changes:
+
+]]> Introduction to PIPs 2023-09-04T00:00:00+00:00 2023-09-04T00:00:00+00:00 https://pactus.org/2023/09/04/introduction-to-pips Introduction to PIPs
+
+In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey:
+the Pactus Improvement Proposals, or PIPs.
+
+
+
+What are PIPs?
+
+Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform.
+Each PIP has a unique number like PIP-2 ,
+PIP-3 , and so on.
+These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.
+
+The PIP process
+
+The PIP process is open, allowing any member of the Pactus community to propose a PIP.
+The author should provide a summary, motivation, and a detailed technical explanation.
+The Pactus Laboratory team will carefully review each PIP.
+Security considerations must be addressed before finalizing a PIP.
+Once finalized, it can be added to the code.
+This process helps avoid unexpected issues during development and maintain consistency and safety.
+
+The Origins of PIPs
+
+The Pactus Improvement Proposals (PIPs) was inspired by the
+Ethereum Improvement Proposals (EIPs ) system,
+which had its roots in the Bitcoin Improvement Proposals (BIPs ) and
+Python Enhancement Proposals (PEPs ).
+
+New Feature Policy
+
+From now on, all major changes or new features in the Pactus project require a PIP.
+Any implementation must reference its specific PIP.
+Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.
+
+PIPs Repository
+
+For a complete list of Pactus Improvement Proposals, visit this link .
+The corresponding GitHub repository is accessible here .
+
+
]]> Dev report 2023-08-22T00:00:00+00:00 2023-08-22T00:00:00+00:00 https://pactus.org/2023/08/22/dev-report Abstract
+
+there is several activities in Pactus github this month, here is a clear report and explain of activities.
+
+
+
+Linters
+
+one of new changes in Pactus project is new linters we added this month.
+what is linters?
+linters are just a set of rules for the style of source codes, they force developers to write new codes
+in correct, clean and safe way.
+
+why we use them?
+the reason we are using linters in Pactus and add new ones, is to make the code more safe,
+and also make it easy to work on for new contributors because we are focus on being decentralized even in development.
+
+Linters we added till now
+
+TLA+ spec
+
+one another new change in Pactus is updating TLA+ spec, which is related to consensus,
+as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.
+
+link to changes
+
+if you wish you can learn more about Pactus consensus here.
+
+Refactoring
+
+some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries.
+also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.
+
+one of refactors
]]> Story of Testnet-1 2023-08-01T00:00:00+00:00 2023-08-01T00:00:00+00:00 https://pactus.org/2023/08/01/testnet-1-concluded What is Testnet?
+
+Testnet is a testing environment where developers and users can try out the functionality of a blockchain project,
+without putting real assets or data at risk.
+It helps to ensure that the final product is reliable and secure for users to use.
+If you like to read more about the Testnet you can check out our post on
+“What is Testnet? ”.
+
+Summary
+
+In May 2023, we launched Testnet-1 .
+The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain.
+The development team also focused on evaluating the network’s performance.
+Additionally, the overall performance of the software and the syncing process were closely examined and assessed.
+
+The committee for Testnet-1 was set to 21 validators,
+and 584 validators joined during the Testnet period.
+More than 600,000 blocks were created, and more than 1 million transactions were processed during this time.
+The size of the blockchain is about 300 megabytes.
+
+About 300,000 coins were staked during this period, it was almost 50% of the total generated coins.
+It shows that users, even in Testnet, tend to stake their coins.
+
+
+
+We were able to extract the confirmation time of transactions.
+More than 97% of transactions were confirmed in just one block after submission.
+This indicates that the transaction pool and broadcasting models are working fine.
+
+
+
+Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases.
+More than 97% of blocks are committed in the first rounds.
+
+
+
+Major updates
+
+During Testnet-1, we released three versions(Version
+0.11.0 ,
+0.12.0 ,
+0.13.0 ), and the upgrade process was smooth.
+Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future.
+The consensus failure was resolved by requiring some validators to re-sync their nodes.
+At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible,
+including:
+
+
+ Improving the consensus protocol
+ Reducing the blockchain size
+ Optimizing the network usage
+
+
+After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.
+
+
+
+This Testnet was important for us.
+It helped us learn what we need to do to make Pactus work even better.
+Without the community that supports us and dedicates their time and resources to testing and feedback,
+we wouldn’t have been able to progress as we have.
+
+We thank all of them for their valuable contributions.
+As promised, participants in Testnets will be given priority as validators for the MainNet , and
+will receive bounty PAC coins to set up their validators.
+
+We are grateful to all those who participated in Testnet-1, and
+we encourage them to join our next Testnet to help us improve Pactus.
+As a community-based project, we rely on the support of our community members, and we value any help we receive.
]]> Dev meeting 2023-07-09T00:00:00+00:00 2023-07-09T00:00:00+00:00 https://pactus.org/2023/07/09/dev-meeting Meeting Summary
+
+The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet,
+with team members from different time zones joining to discuss key aspects of the Pactus project.
+
+Overview to the Network Module
+
+The meeting began with an overview of the Network module in Pactus.
+This module uses Libp2p as its underlying network protocol.
+
+The Network module is agnostic about the content of the message and
+handles two types of messages: Gossip messages, which are broadcasted,
+and Stream messages, which are sent directly to a specific peer.
+The team discussed the relay nodes that enable communication for nodes behind NAT.
+Upon receiving a message, the module publishes an event.
+The two types of events are Gossip events and Steam events.
+
+
+
+The team discussed the issue of Relay connections resetting, and explored solutions such as
+hole punching or using UDP and IPv6.
+
+Some users in the Testnet reported high network usage.
+The team discussed implementing metrics for LibP2P to monitor network usage effectively.
+The discussion related to this issue can be found here .
+Additionally, the team discussed the customization of network resources,
+including setting limits for inbound and outbound connections.
+
+Overview to the Sync Module
+
+Moving on, the Sync module was discussed.
+Unlike the Network module, the Sync module has full knowledge about the messages and packets.
+The module handles a range of message types, which can be found
+here .
+
+It was suggested that we need to define metrics for each message type.
+There was also a discussion about the need for reducing the messages to optimize the use of network resources.
+
+The team decided to continue discussing these topics in future meetings.
+They also plan to work on improving the Network and Sync modules based on these discussions.
]]>
\ No newline at end of file
diff --git a/zh/index.html b/zh/index.html
new file mode 100644
index 000000000..4e0df5e0d
--- /dev/null
+++ b/zh/index.html
@@ -0,0 +1,601 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 主页 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
帕图斯区块链
+
帕图斯是一个由社区运营的区块链技术。 采用了革命性且安全的Solid State Proof of Stake共识机制。 快来加入我们,共同构建去中心化的未来吧!
+
+
+
+
+
+
+
+
+
+
运行节点
+ 下载最新版本的节点程序,创建您的钱包,并开始运行节点。
帕图斯是一款轻量、友好、易于操作的节点程序。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
获取代币
+ 节点运行之后,您可以质押代币成为验证者。获取方式有多种,比如购买,好友赠送等。也可以加入我们的社区参与贡献获取代币奖励。
+
+
+
+
+
+
+
+
成为验证者
+ 通过抵押代币,您的节点将升级为验证者节点,验证者节点有机会当选委员会成员,每当您提出一个block时,您将获得 1 个 PAC 代币作为奖励。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
让帕图斯变得更好
+ 相信帕图斯在所有验证者和社区贡献者的支持下会变的更好。
让我们一起努力,共同创造属于我们的世界!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/api/grpc/index.html b/zh/learn/api/grpc/index.html
new file mode 100644
index 000000000..f947e8ed3
--- /dev/null
+++ b/zh/learn/api/grpc/index.html
@@ -0,0 +1,3656 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ gRPC API Reference | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
gRPC API Reference
+
+
Each node in the Pactus network can be configured to use the gRPC protocol for communication.
+Here you can find the list of all gRPC methods and messages.
+
+
Table of Contents
+
+
+
+ Transaction Service
+
+
+ Blockchain Service
+
+
+ Network Service
+
+
+ Wallet Service
+
+
+
+ Messages and Enums
+
+
+
+
+
+
Transaction Service transaction.proto
+
Transaction service defines various RPC methods for interacting with transactions.
+
GetTransaction rpc
+
+
+
GetTransaction retrieves transaction details based on the provided request parameters.
+
CalculateFee rpc
+
+
+
CalculateFee calculates the transaction fee based on the specified amount and payload type.
+
BroadcastTransaction rpc
+
+
+
BroadcastTransaction broadcasts a signed transaction to the network.
+
GetRawTransferTransaction rpc
+
+
+
GetRawTransferTransaction retrieves raw details of a transfer transaction.
+
GetRawBondTransaction rpc
+
+
+
GetRawBondTransaction retrieves raw details of a bond transaction.
+
GetRawUnBondTransaction rpc
+
+
+
GetRawUnBondTransaction retrieves raw details of an unbond transaction.
+
GetRawWithdrawTransaction rpc
+
+
+
GetRawWithdrawTransaction retrieves raw details of a withdraw transaction.
+
Blockchain Service blockchain.proto
+
Blockchain service defines RPC methods for interacting with the blockchain.
+
GetBlock rpc
+
+
+
GetBlock retrieves information about a block based on the provided request parameters.
+
GetBlockHash rpc
+
+
+
GetBlockHash retrieves the hash of a block at the specified height.
+
GetBlockHeight rpc
+
+
+
GetBlockHeight retrieves the height of a block with the specified hash.
+
GetBlockchainInfo rpc
+
+
+
GetBlockchainInfo retrieves general information about the blockchain.
+
GetConsensusInfo rpc
+
+
+
GetConsensusInfo retrieves information about the consensus instances.
+
GetAccount rpc
+
+
+
GetAccount retrieves information about an account based on the provided address.
+
GetValidator rpc
+
+
+
GetValidator retrieves information about a validator based on the provided address.
+
GetValidatorByNumber rpc
+
+
+
GetValidatorByNumber retrieves information about a validator based on the provided number.
+
GetValidatorAddresses rpc
+
+
+
GetValidatorAddresses retrieves a list of all validator addresses.
+
GetPublicKey rpc
+
+
+
GetPublicKey retrieves the public key of an account based on the provided address.
+
Network Service network.proto
+
Network service provides RPCs for retrieving information about the network.
+
GetNetworkInfo rpc
+
+
+
GetNetworkInfo retrieves information about the overall network.
+
GetNodeInfo rpc
+
+
+
GetNodeInfo retrieves information about a specific node in the network.
+
Wallet Service wallet.proto
+
Define the Wallet service with various RPC methods for wallet management.
+
CreateWallet rpc
+
+
+
CreateWallet creates a new wallet with the specified parameters.
+
LoadWallet rpc
+
+
+
LoadWallet loads an existing wallet with the given name.
+
UnloadWallet rpc
+
+
+
UnloadWallet unloads a currently loaded wallet with the specified name.
+
LockWallet rpc
+
+
+
LockWallet locks a currently loaded wallet with the provided password and timeout.
+
UnlockWallet rpc
+
+
+
UnlockWallet unlocks a locked wallet with the provided password and timeout.
+
SignRawTransaction rpc
+
+
+
SignRawTransaction signs a raw transaction for a specified wallet.
+
GetValidatorAddress rpc
+
+
+
GetValidatorAddress retrieves the validator address associated with a public key.
+
Messages and Enums
+
+BroadcastTransactionRequest
+msg
+
+
Request message for broadcasting a signed transaction.
+
+
+
+ Field Type Description
+
+
+
+ signed_raw_transaction
+
+ bytes
+
+ Signed raw transaction data.
+
+
+
+
+BroadcastTransactionResponse
+msg
+
+
Response message containing the ID of the broadcasted transaction.
+
+
+
+ Field Type Description
+
+
+
+ id
+
+ bytes
+
+ Transaction ID.
+
+
+
+
+CalculateFeeRequest
+msg
+
+
Request message for calculating transaction fee.
+
+
+
+ Field Type Description
+
+
+
+ amount
+
+ int64
+
+ Transaction amount.
+
+
+ payloadType
+
+ PayloadType
+
+ Type of transaction payload.
+
+
+
+
+CalculateFeeResponse
+msg
+
+
Response message containing the calculated transaction fee.
+
+
+
+ Field Type Description
+
+
+
+ fee
+
+ int64
+
+ Calculated transaction fee.
+
+
+
+
+GetRawBondTransactionRequest
+msg
+
+
Request message for retrieving raw details of a bond transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ stake
+
+ int64
+
+ Stake amount.
+
+
+ public_key
+
+ string
+
+ Public key of the validator.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetRawTransactionResponse
+msg
+
+
Response message containing raw transaction data.
+
+
+
+ Field Type Description
+
+
+
+ raw_transaction
+
+ bytes
+
+ Raw transaction data.
+
+
+
+
+GetRawTransferTransactionRequest
+msg
+
+
Request message for retrieving raw details of a transfer transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ amount
+
+ int64
+
+ Transaction amount.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetRawUnBondTransactionRequest
+msg
+
+
Request message for retrieving raw details of an unbond transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ validator_address
+
+ string
+
+ Address of the validator to unbond from.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetRawWithdrawTransactionRequest
+msg
+
+
Request message for retrieving raw details of a withdraw transaction.
+
+
+
+ Field Type Description
+
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ validator_address
+
+ string
+
+ Address of the validator to withdraw from.
+
+
+ account_address
+
+ string
+
+ Address of the account to withdraw to.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ amount
+
+ int64
+
+ Withdrawal amount.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+
+
+GetTransactionRequest
+msg
+
+
Request message for retrieving transaction details.
+
+
+
+ Field Type Description
+
+
+
+ id
+
+ bytes
+
+ Transaction ID.
+
+
+ verbosity
+
+ TransactionVerbosity
+
+ Verbosity level for transaction details.
+
+
+
+
+GetTransactionResponse
+msg
+
+
Response message containing details of a transaction.
+
+
+
+ Field Type Description
+
+
+
+ block_height
+
+ uint32
+
+ Height of the block containing the transaction.
+
+
+ block_time
+
+ uint32
+
+ Time of the block containing the transaction.
+
+
+ transaction
+
+ TransactionInfo
+
+ Information about the transaction.
+
+
+
+
+PayloadBond
+msg
+
+
Payload for a bond transaction.
+
+
+
+ Field Type Description
+
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ stake
+
+ int64
+
+ Stake amount.
+
+
+
+
+PayloadSortition
+msg
+
+
Payload for a sortition transaction.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address associated with the sortition.
+
+
+ proof
+
+ bytes
+
+ Proof for the sortition.
+
+
+
+
+PayloadTransfer
+msg
+
+
Payload for a transfer transaction.
+
+
+
+ Field Type Description
+
+
+
+ sender
+
+ string
+
+ Sender's address.
+
+
+ receiver
+
+ string
+
+ Receiver's address.
+
+
+ amount
+
+ int64
+
+ Transaction amount.
+
+
+
+
+PayloadUnbond
+msg
+
+
Payload for an unbond transaction.
+
+
+
+ Field Type Description
+
+
+
+ validator
+
+ string
+
+ Address of the validator to unbond from.
+
+
+
+
+PayloadWithdraw
+msg
+
+
Payload for a withdraw transaction.
+
+
+
+ Field Type Description
+
+
+
+ from
+
+ string
+
+ Address to withdraw from.
+
+
+ to
+
+ string
+
+ Address to withdraw to.
+
+
+ amount
+
+ int64
+
+ Withdrawal amount.
+
+
+
+
+TransactionInfo
+msg
+
+
Information about a transaction.
+
+
+
+ Field Type Description
+
+
+
+ id
+
+ bytes
+
+ Transaction ID.
+
+
+ data
+
+ bytes
+
+ Transaction data.
+
+
+ version
+
+ int32
+
+ Transaction version.
+
+
+ lock_time
+
+ uint32
+
+ Lock time for the transaction.
+
+
+ value
+
+ int64
+
+ Transaction value.
+
+
+ fee
+
+ int64
+
+ Transaction fee.
+
+
+ payloadType
+
+ PayloadType
+
+ Type of transaction payload.
+
+
+ transfer
+
+ PayloadTransfer
+
+ Transfer payload.
+
+
+ bond
+
+ PayloadBond
+
+ Bond payload.
+
+
+ sortition
+
+ PayloadSortition
+
+ Sortition payload.
+
+
+ unbond
+
+ PayloadUnbond
+
+ Unbond payload.
+
+
+ withdraw
+
+ PayloadWithdraw
+
+ Withdraw payload.
+
+
+ memo
+
+ string
+
+ Transaction memo.
+
+
+ public_key
+
+ string
+
+ Public key associated with the transaction.
+
+
+ signature
+
+ bytes
+
+ Transaction signature.
+
+
+
+
+AccountInfo
+msg
+
+
Message containing information about an account.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the account.
+
+
+ data
+
+ bytes
+
+ Account data.
+
+
+ number
+
+ int32
+
+ Account number.
+
+
+ balance
+
+ int64
+
+ Account balance.
+
+
+ address
+
+ string
+
+ Address of the account.
+
+
+
+
+
Message containing information about the header of a block.
+
+
+
+ Field Type Description
+
+
+
+ version
+
+ int32
+
+ Block version.
+
+
+ prev_block_hash
+
+ bytes
+
+ Hash of the previous block.
+
+
+ state_root
+
+ bytes
+
+ State root of the block.
+
+
+ sortition_seed
+
+ bytes
+
+ Sortition seed of the block.
+
+
+ proposer_address
+
+ string
+
+ Address of the proposer of the block.
+
+
+
+
+CertificateInfo
+msg
+
+
Message containing information about a certificate.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the certificate.
+
+
+ round
+
+ int32
+
+ Round of the certificate.
+
+
+ committers
+ repeated
+ int32
+
+ List of committers in the certificate.
+
+
+ absentees
+ repeated
+ int32
+
+ List of absentees in the certificate.
+
+
+ signature
+
+ bytes
+
+ Certificate signature.
+
+
+
+
+ConsensusInfo
+msg
+
+
Message containing information about consensus.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address of the consensus instance.
+
+
+ Active
+
+ bool
+
+ Whether the consensus instance is active.
+
+
+ height
+
+ uint32
+
+ Height of the consensus instance.
+
+
+ round
+
+ int32
+
+ Round of the consensus instance.
+
+
+ votes
+ repeated
+ VoteInfo
+
+ List of votes in the consensus instance.
+
+
+
+
+GetAccountRequest
+msg
+
+
Message to request account information based on an address.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address of the account.
+
+
+
+
+GetAccountResponse
+msg
+
+
Message containing the response with account information.
+
+
+
+ Field Type Description
+
+
+
+ account
+
+ AccountInfo
+
+ Account information.
+
+
+
+
+GetBlockHashRequest
+msg
+
+
Message to request block hash based on height.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+
+
+GetBlockHashResponse
+msg
+
+
Message containing the response with the block hash.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the block.
+
+
+
+
+GetBlockHeightRequest
+msg
+
+
Message to request block height based on hash.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the block.
+
+
+
+
+GetBlockHeightResponse
+msg
+
+
Message containing the response with the block height.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+
+
+GetBlockRequest
+msg
+
+
Message to request block information based on height and verbosity.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+ verbosity
+
+ BlockVerbosity
+
+ Verbosity level for block information.
+
+
+
+
+GetBlockResponse
+msg
+
+
Message containing the response with block information.
+
+
+
+ Field Type Description
+
+
+
+ height
+
+ uint32
+
+ Height of the block.
+
+
+ hash
+
+ bytes
+
+ Hash of the block.
+
+
+ data
+
+ bytes
+
+ Block data.
+
+
+ block_time
+
+ uint32
+
+ Block timestamp.
+
+
+ header
+
+ BlockHeaderInfo
+
+ Block header information.
+
+
+ prev_cert
+
+ CertificateInfo
+
+ Certificate information of the previous block.
+
+
+ txs
+ repeated
+ TransactionInfo
+
+ List of transactions in the block.
+
+
+
+
+GetBlockchainInfoRequest
+msg
+
+
Message to request general information about the blockchain.
+
Message has no fields.
+
+GetBlockchainInfoResponse
+msg
+
+
Message containing the response with general blockchain information.
+
+
+
+ Field Type Description
+
+
+
+ last_block_height
+
+ uint32
+
+ Height of the last block.
+
+
+ last_block_hash
+
+ bytes
+
+ Hash of the last block.
+
+
+ total_accounts
+
+ int32
+
+ Total number of accounts.
+
+
+ total_validators
+
+ int32
+
+ Total number of validators.
+
+
+ total_power
+
+ int64
+
+ Total power in the blockchain.
+
+
+ committee_power
+
+ int64
+
+ Power of the committee.
+
+
+ committee_validators
+ repeated
+ ValidatorInfo
+
+ List of committee validators.
+
+
+
+
+GetConsensusInfoRequest
+msg
+
+
Message to request consensus information.
+
Message has no fields.
+
+GetConsensusInfoResponse
+msg
+
+
Message containing the response with consensus information.
+
+
+
+ Field Type Description
+
+
+
+ instances
+ repeated
+ ConsensusInfo
+
+ List of consensus instances.
+
+
+
+
+GetPublicKeyRequest
+msg
+
+
Message to request public key based on an address.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address for which public key is requested.
+
+
+
+
+GetPublicKeyResponse
+msg
+
+
Message containing the response with the public key.
+
+
+
+ Field Type Description
+
+
+
+ public_key
+
+ string
+
+ Public key of the account.
+
+
+
+
+GetValidatorAddressesRequest
+msg
+
+
Message to request validator addresses.
+
Message has no fields.
+
+GetValidatorAddressesResponse
+msg
+
+
Message containing the response with a list of validator addresses.
+
+
+
+ Field Type Description
+
+
+
+ addresses
+ repeated
+ string
+
+ List of validator addresses.
+
+
+
+
+GetValidatorByNumberRequest
+msg
+
+
Message to request validator information based on a validator number.
+
+
+
+ Field Type Description
+
+
+
+ number
+
+ int32
+
+ Validator number.
+
+
+
+
+GetValidatorRequest
+msg
+
+
Message to request validator information based on an address.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Address of the validator.
+
+
+
+
+GetValidatorResponse
+msg
+
+
Message containing the response with validator information.
+
+
+
+ Field Type Description
+
+
+
+ validator
+
+ ValidatorInfo
+
+ Validator information.
+
+
+
+
+ValidatorInfo
+msg
+
+
Message containing information about a validator.
+
+
+
+ Field Type Description
+
+
+
+ hash
+
+ bytes
+
+ Hash of the validator.
+
+
+ data
+
+ bytes
+
+ Validator data.
+
+
+ public_key
+
+ string
+
+ Public key of the validator.
+
+
+ number
+
+ int32
+
+ Validator number.
+
+
+ stake
+
+ int64
+
+ Validator stake.
+
+
+ last_bonding_height
+
+ uint32
+
+ Last bonding height.
+
+
+ last_sortition_height
+
+ uint32
+
+ Last sortition height.
+
+
+ unbonding_height
+
+ uint32
+
+ Unbonding height.
+
+
+ address
+
+ string
+
+ Address of the validator.
+
+
+ availability_score
+
+ double
+
+ Availability score of the validator.
+
+
+
+
+VoteInfo
+msg
+
+
Message containing information about a vote.
+
+
+
+ Field Type Description
+
+
+
+ type
+
+ VoteType
+
+ Type of the vote.
+
+
+ voter
+
+ string
+
+ Voter's address.
+
+
+ block_hash
+
+ bytes
+
+ Hash of the block being voted on.
+
+
+ round
+
+ int32
+
+ Round of the vote.
+
+
+ cp_round
+
+ int32
+
+ Consensus round of the vote.
+
+
+ cp_value
+
+ int32
+
+ Consensus value of the vote.
+
+
+
+
+GetNetworkInfoRequest
+msg
+
+
Request message for retrieving overall network information.
+
Message has no fields.
+
+GetNetworkInfoResponse
+msg
+
+
Response message containing information about the overall network.
+
+
+
+ Field Type Description
+
+
+
+ network_name
+
+ string
+
+ Name of the network.
+
+
+ total_sent_bytes
+
+ uint32
+
+ Total bytes sent across the network.
+
+
+ total_received_bytes
+
+ uint32
+
+ Total bytes received across the network.
+
+
+ connected_peers_count
+
+ uint32
+
+ Number of connected peers.
+
+
+ connected_peers
+ repeated
+ PeerInfo
+
+ List of connected peers.
+
+
+ sent_bytes
+ repeated
+ GetNetworkInfoResponse.SentBytesEntry
+
+ Bytes sent per peer ID.
+
+
+ received_bytes
+ repeated
+ GetNetworkInfoResponse.ReceivedBytesEntry
+
+ Bytes received per peer ID.
+
+
+
+
+GetNetworkInfoResponse.ReceivedBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ uint32
+
+
+
+
+ value
+
+ uint64
+
+
+
+
+
+
+GetNetworkInfoResponse.SentBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ uint32
+
+
+
+
+ value
+
+ uint64
+
+
+
+
+
+
+GetNodeInfoRequest
+msg
+
+
Request message for retrieving information about a specific node in the network.
+
Message has no fields.
+
+GetNodeInfoResponse
+msg
+
+
Response message containing information about a specific node in the network.
+
+
+
+ Field Type Description
+
+
+
+ moniker
+
+ string
+
+ Moniker of the node.
+
+
+ agent
+
+ string
+
+ Agent information of the node.
+
+
+ peer_id
+
+ bytes
+
+ Peer ID of the node.
+
+
+ started_at
+
+ uint64
+
+ Timestamp when the node started.
+
+
+ reachability
+
+ string
+
+ Reachability status of the node.
+
+
+ services
+ repeated
+ int32
+
+ List of services provided by the node.
+
+
+ services_names
+ repeated
+ string
+
+ Names of services provided by the node.
+
+
+ addrs
+ repeated
+ string
+
+ List of addresses associated with the node.
+
+
+ protocols
+ repeated
+ string
+
+ List of protocols supported by the node.
+
+
+
+
+PeerInfo
+msg
+
+
Information about a peer in the network.
+
+
+
+ Field Type Description
+
+
+
+ status
+
+ int32
+
+ Status of the peer.
+
+
+ moniker
+
+ string
+
+ Moniker of the peer.
+
+
+ agent
+
+ string
+
+ Agent information of the peer.
+
+
+ peer_id
+
+ bytes
+
+ Peer ID of the peer.
+
+
+ consensus_keys
+ repeated
+ string
+
+ Consensus keys used by the peer.
+
+
+ consensus_address
+ repeated
+ string
+
+ Consensus address of the peer.
+
+
+ services
+
+ uint32
+
+ Services provided by the peer.
+
+
+ last_block_hash
+
+ bytes
+
+ Hash of the last block the peer knows.
+
+
+ height
+
+ uint32
+
+ Height of the peer in the blockchain.
+
+
+ received_messages
+
+ int32
+
+ Count of received messages.
+
+
+ invalid_messages
+
+ int32
+
+ Count of invalid messages received.
+
+
+ last_sent
+
+ int64
+
+ Timestamp of the last sent message.
+
+
+ last_received
+
+ int64
+
+ Timestamp of the last received message.
+
+
+ sent_bytes
+ repeated
+ PeerInfo.SentBytesEntry
+
+ Bytes sent per message type.
+
+
+ received_bytes
+ repeated
+ PeerInfo.ReceivedBytesEntry
+
+ Bytes received per message type.
+
+
+ address
+
+ string
+
+ Network address of the peer.
+
+
+ direction
+
+ string
+
+ Direction of connection with the peer.
+
+
+ protocols
+ repeated
+ string
+
+ List of protocols supported by the peer.
+
+
+ total_sessions
+
+ int32
+
+ Total sessions with the peer.
+
+
+ completed_sessions
+
+ int32
+
+ Completed sessions with the peer.
+
+
+
+
+PeerInfo.ReceivedBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ int32
+
+
+
+
+ value
+
+ int64
+
+
+
+
+
+
+PeerInfo.SentBytesEntry
+msg
+
+
+
+
+
+ Field Type Description
+
+
+
+ key
+
+ int32
+
+
+
+
+ value
+
+ int64
+
+
+
+
+
+
+CreateWalletRequest
+msg
+
+
Request message for creating a new wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the new wallet.
+
+
+ mnemonic
+
+ string
+
+ Mnemonic for wallet recovery.
+
+
+ language
+
+ string
+
+ Language for the mnemonic.
+
+
+ password
+
+ string
+
+ Password for securing the wallet.
+
+
+
+
+CreateWalletResponse
+msg
+
+
Response message containing the name of the created wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the created wallet.
+
+
+
+
+GetValidatorAddressRequest
+msg
+
+
Request message for obtaining the validator address associated with a public key.
+
+
+
+ Field Type Description
+
+
+
+ public_key
+
+ string
+
+ Public key for which the validator address is requested.
+
+
+
+
+GetValidatorAddressResponse
+msg
+
+
Response message containing the validator address corresponding to a public key.
+
+
+
+ Field Type Description
+
+
+
+ address
+
+ string
+
+ Validator address associated with the public key.
+
+
+
+
+LoadWalletRequest
+msg
+
+
Request message for loading an existing wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to load.
+
+
+
+
+LoadWalletResponse
+msg
+
+
Response message containing the name of the loaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the loaded wallet.
+
+
+
+
+LockWalletRequest
+msg
+
+
Request message for locking a currently loaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to lock.
+
+
+
+
+LockWalletResponse
+msg
+
+
Response message containing the name of the locked wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the locked wallet.
+
+
+
+
+SignRawTransactionRequest
+msg
+
+
Request message for signing a raw transaction.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet used for signing.
+
+
+ raw_transaction
+
+ bytes
+
+ Raw transaction data to be signed.
+
+
+ password
+
+ string
+
+ Password for unlocking the wallet for signing.
+
+
+
+
+SignRawTransactionResponse
+msg
+
+
Response message containing the transaction ID and signed raw transaction.
+
+
+
+ Field Type Description
+
+
+
+ transaction_id
+
+ bytes
+
+ ID of the signed transaction.
+
+
+ signed_raw_transaction
+
+ bytes
+
+ Signed raw transaction data.
+
+
+
+
+UnloadWalletRequest
+msg
+
+
Request message for unloading a currently loaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to unload.
+
+
+
+
+UnloadWalletResponse
+msg
+
+
Response message containing the name of the unloaded wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the unloaded wallet.
+
+
+
+
+UnlockWalletRequest
+msg
+
+
Request message for unlocking a wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the wallet to unlock.
+
+
+ password
+
+ string
+
+ Password for unlocking the wallet.
+
+
+ timeout
+
+ int32
+
+ Timeout duration for the unlocked state.
+
+
+
+
+UnlockWalletResponse
+msg
+
+
Response message containing the name of the unlocked wallet.
+
+
+
+ Field Type Description
+
+
+
+ wallet_name
+
+ string
+
+ Name of the unlocked wallet.
+
+
+
+
+
+PayloadType
+enum
+
+
Enumeration for different types of transaction payloads.
+
+
+ Name Number Description
+
+
+
+
+ UNKNOWN
+ 0
+ Unknown payload type.
+
+
+
+ TRANSFER_PAYLOAD
+ 1
+ Transfer payload type.
+
+
+
+ BOND_PAYLOAD
+ 2
+ Bond payload type.
+
+
+
+ SORTITION_PAYLOAD
+ 3
+ Sortition payload type.
+
+
+
+ UNBOND_PAYLOAD
+ 4
+ Unbond payload type.
+
+
+
+ WITHDRAW_PAYLOAD
+ 5
+ Withdraw payload type.
+
+
+
+
+
+TransactionVerbosity
+enum
+
+
Enumeration for verbosity level when requesting transaction details.
+
+
+ Name Number Description
+
+
+
+
+ TRANSACTION_DATA
+ 0
+ Request only transaction data.
+
+
+
+ TRANSACTION_INFO
+ 1
+ Request detailed transaction information.
+
+
+
+
+
+BlockVerbosity
+enum
+
+
Enumeration for verbosity level when requesting block information.
+
+
+ Name Number Description
+
+
+
+
+ BLOCK_DATA
+ 0
+ Request block data only.
+
+
+
+ BLOCK_INFO
+ 1
+ Request block information only.
+
+
+
+ BLOCK_TRANSACTIONS
+ 2
+ Request block transactions only.
+
+
+
+
+
+VoteType
+enum
+
+
Enumeration for types of votes.
+
+
+ Name Number Description
+
+
+
+
+ VOTE_UNKNOWN
+ 0
+ Unknown vote type.
+
+
+
+ VOTE_PREPARE
+ 1
+ Prepare vote type.
+
+
+
+ VOTE_PRECOMMIT
+ 2
+ Precommit vote type.
+
+
+
+ VOTE_CHANGE_PROPOSER
+ 3
+ Change proposer vote type.
+
+
+
+
+
+
Scalar Value Types
+
+
+ .proto Type C++ Java Python Go C# PHP
+
+
+
+ double
+ double
+ double
+ float
+ float64
+ double
+ float
+
+
+ float
+ float
+ float
+ float
+ float32
+ float
+ float
+
+
+ int32
+ int32
+ int
+ int
+ int32
+ int
+ integer
+
+
+ int64
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+
+
+ uint32
+ uint32
+ int
+ int/long
+ uint32
+ uint
+ integer
+
+
+ uint64
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+
+
+ sint32
+ int32
+ int
+ int
+ int32
+ int
+ integer
+
+
+ sint64
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+
+
+ fixed32
+ uint32
+ int
+ int
+ uint32
+ uint
+ integer
+
+
+ fixed64
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+
+
+ sfixed32
+ int32
+ int
+ int
+ int32
+ int
+ integer
+
+
+ sfixed64
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+
+
+ bool
+ bool
+ boolean
+ boolean
+ bool
+ bool
+ boolean
+
+
+ string
+ string
+ String
+ str/unicode
+ string
+ string
+ string
+
+
+ bytes
+ string
+ ByteString
+ str
+ []byte
+ ByteString
+ string
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/blockchain/account/index.html b/zh/learn/blockchain/account/index.html
new file mode 100644
index 000000000..14e17f5a2
--- /dev/null
+++ b/zh/learn/blockchain/account/index.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Account | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Account
+
+
An account is an entity that is identified by a unique address ,
+which can send transactions on the blockchain.
+
+
Account Structure
+
+
The account structure is 12 bytes long and consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 4 bytes
+ Number
+
+
+ 8 bytes
+ Balance
+
+
+
+
+
+ Number is a sequential and unique number assigned to each account when it is created for the first time.
+The account number is used to calculate the state hash of the blockchain.
+ Balance holds the balance of the account, which is the amount of Pactus coins held by the account.
+
+
+
Treasury Account
+
+
The Treasury account is a special account in the Pactus blockchain that holds 21 million coins at the genesis time.
+The treasury address is defined as: 000000000000000000000000000000000000000000
.
+The address type is 0, and therefore,
+it doesn’t have any key pair associated with it.
+Every time a block is created, one coin from the Treasury account transfers to the proposer account as a block reward.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/blockchain/address/index.html b/zh/learn/blockchain/address/index.html
new file mode 100644
index 000000000..649ab529d
--- /dev/null
+++ b/zh/learn/blockchain/address/index.html
@@ -0,0 +1,670 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Address | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Address
+
+
An address is a unique identifier that is used to send and receive transactions on the Pactus blockchain.
+It is represented as a string of 42 alphanumeric characters and always begins with the letters “pc1”.
+Here is an example of an address on the Pactus blockchain:
+
+
pc1p4e92hx0erqyx939crndvthvpn7qcdhefc9r6s7
+
+
+
Address Structure
+
+
An address in the Pactus blockchain is made up of 21 bytes and it is derived from the public key.
+The first byte of the address specifies the address type,
+while the remaining 20 bytes represent the hash of the public key.
+The hash function used is RIPEMD-160 ,
+which is applied after Blake2b ):
+The resulting byte array is then converted into a bech32m string.
+
+
+
+
Address Type
+
+
The address type specifies the type of the address and its defined as below:
+
+
+ 0: Treasury address
+ 1: Validator address
+ 2: Account address
+
+
+
Treasury Address
+
+
The Treasury address on the Pactus blockchain is a fixed address that is defined as follows:
+
+
TreasuryAddress: 000000000000000000000000000000000000000000
+
+
+
The address type for the Treasury address is set to zero, which
+means there is no key associated with the Treasury address.
+The remaining characters of the address are all zeros.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/blockchain/block/index.html b/zh/learn/blockchain/block/index.html
new file mode 100644
index 000000000..3309707da
--- /dev/null
+++ b/zh/learn/blockchain/block/index.html
@@ -0,0 +1,786 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Block | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Block
+
+
In the Pactus, a block is a set of data that contains a header, the certificate of the previous block
+and list of the transactions.
+Once a block comes with a valid certificate, it is committed and added to the blockchain, and
+the certificate will be included in the next block.
+A committed block is immutable, and any modifications to the block will invalidate the certificate.
+
+
+
+
+
+
The block header is a data structure in the Pactus blockchain that contains important information about
+the block.
+
+
The block header is 138 bytes long and consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 1 byte
+ Version
+
+
+ 4 bytes
+ Timestamp
+
+
+ 32 bytes
+ Previous Block Hash
+
+
+ 32 bytes
+ State Hash
+
+
+ 48 bytes
+ Sortition Seed
+
+
+ 21 bytes
+ Proposer Address
+
+
+
+
+
+ Version is used to track the software or protocol upgrade, and the current block version is set to 1.
+ Timestamp is the time of the block as the number of seconds since January 1, 1970 (Unix Epoch).
+ Previous Block Hash is the hash of the previous block in the blockchain.
+ State Hash is the state hash of the blockchain at this block.
+The State Hash ensures that all nodes in the network have the same state.
+ Sortition Seed is a verifiable and unpredictable seed data used by
+the sortition algorithm.
+ Proposer Address is the address of the validator who created and proposed the block.
+
+
+
Block Certificate
+
+
A block certificate is a proof of commitment for the block in the Pactus blockchain.
+It is the result of the Pactus consensus algorithm and ensures that the block has been agreed upon by committee members.
+
+
The block certificate consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 4 bytes
+ Height
+
+
+ 2 bytes
+ Round
+
+
+ Variant
+ Committers
+
+
+ Variant
+ Absentees
+
+
+ 48 bytes
+ Signature
+
+
+
+
+
+ Height is the height of the certified block.
+ Round is the consensus round in which this certificate was issued.
+If a proposer fails to propose a block in one round, another validator takes over as the proposer,
+and the round number is increased.
+ Committers is the list of validator numbers in the committee for the current certificate..
+ Absentees is the list of validator numbers that are absent in the committee.
+ Signature is the signature for the certificate that ensures the majority of the committee members have validated and
+signed the proposed block.
+
+
+
Transactions
+
+
Each block in the Pactus blockchain contains a list of transactions.
+The maximum number of transactions in a block is determined by the
+consensus parameters , and currently set to 1000.
+The first transaction in each block is the reward transaction .
+Once a block is committed and added to the blockchain, all the transactions inside the block will be executed.
+This means that the state of the blockchain will be updated based on the transactions in the committed block.
+
+
Block Hash
+
+
The block hash is a unique identifier for each block, which is computed by hashing the following data:
+
+
+ Block header data (138 bytes)
+ Previous certificate hash (32 bytes)
+ Merkle root hash of transactions (32 bytes)
+ Number of transactions (variant)
+
+
+
The previous certificate hash and the Merkle root hash of transactions are included in the block hash to
+ensure that they cannot be modified.
+The block hash is used to link the blocks together in the blockchain.
+
+
FAQ
+
+
Is there any empty block in Pactus?
+
+
There is no completely empty block in Pactus.
+Each block contains at least one transaction, which is the reward transaction.
+
+
How are certificates issued?
+
+
In the Pactus blockchain, a validator called a Proposer is responsible for collecting all transactions and
+creating a block every 10 seconds.
+The Proposer broadcasts the proposed block to other validators inside the committee.
+Other validators verify the proposed block, and if it is valid, they cast their votes in favor of the proposed block by
+signing the combination of the block hash and the consensus round.
+More details about the consensus mechanism can be found in the
+consensus protocol document.
+
+
To issue a valid certificate, signatures from validators who hold more than ⅔ of the stake in
+the committee are required.
+Once enough votes are collected, the signatures are aggregated and combined into a single signature, and
+the certificate is issued.
+
+
How are certificates verified?
+
+
To verify a certificate for a block, the block hash is computed, and
+the aggregated public key can be formed using the Committers and Absentees list.
+Then, the signature can be verified using the aggregated public key and
+the aggregated signature inside the certificate.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/blockchain/cryptography/index.html b/zh/learn/blockchain/cryptography/index.html
new file mode 100644
index 000000000..965a7b3e1
--- /dev/null
+++ b/zh/learn/blockchain/cryptography/index.html
@@ -0,0 +1,649 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Cryptography | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Cryptography
+
+
The Pactus blockchain employs various advanced cryptographic algorithms, including hashing and signature schemes,
+to protect user data and transactions.
+
+
Hashing Algorithm
+
+
Pactus uses a hashing algorithm called Blake2b .
+This algorithm is known for being a fast and secure way of creating unique digital fingerprints of data.
+
+
Digital Signature
+
+
To ensure secure transactions, Pactus uses a signature scheme called
+BLS (Boneh–Lynn–Shacham)
+threshold signature for cryptographic signing and verification.
+
+
Signature Aggregation
+
+
One of the advantages of BLS signatures is signature aggregation. BLS individual signatures can be
+combined into one single aggregated signature, so that the overall size does not grow beyond one
+signature.
+
+
Non-Malleability
+
+
BLS signatures have an important property called non-malleability,
+which means that it is impossible to generate two valid signatures for the same message.
+In other words, each message has a unique signature, and signatures cannot be altered without invalidating the signature.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/blockchain/genesis/index.html b/zh/learn/blockchain/genesis/index.html
new file mode 100644
index 000000000..8645b91d2
--- /dev/null
+++ b/zh/learn/blockchain/genesis/index.html
@@ -0,0 +1,671 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Genesis | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Genesis
+
+
The Pactus blockchain starts from scratch, with no pre-existing accounts or pre-allocated coins.
+Its starting point is known as the genesis block, which is created by the bootstrap validators.
+
+
Bootstrapping
+
+
The Pactus blockchain starts with four bootstrap validators.
+These bootstrap validators do not have any stake, however their voting power is set to one within the consensus algorithm.
+Their primary role is to initiate the blockchain during a brief period known as the bootstrapping phase.
+As the bootstrapping phase progresses, these validators are able to earn rewards,
+which they can later use to invite other validators to join the network.
+
+
Once the network reaches 51 validators, the bootstrap validators will retire, and
+the blockchain will be secured by other validators.
+
+
Genesis Block
+
+
The genesis block is the first block in the Pactus blockchain, and it is created by the bootstrap validators.
+This block marks the beginning of the blockchain and serves as the foundation for subsequent blocks.
+
+
The previous block hash in the genesis block sets to 0,
+indicating that it has no predecessor.
+Additionally, the genesis block does not have a previous certificate.
+
+
+
+
In Pactus, the Genesis Information is pre-defined and indicates the initial state of the network.
+These parameters are hardcoded into the project and include:
+
+
+ Genesis Time This is the time when the genesis block should be created.
+The bootstrap validators must be operational before this time.
+ Consensus Parameters : The initial consensus parameters
+are defined at genesis time and ensure that the entire network operates within the same configuration.
+These consensus parameters are discussed in detail in the consensus section of the documentation.
+ Treasury Account : The treasury account
+holds 21 million coins at the genesis time. Each coin is divided into 1 billion units.
+ Reserved Accounts : Reserved account are defined at the Genesis time and at total they have 21 milion coins.
+These coins are reserved and the main purpise is to support the project over time.
+ Bootstrap Validators The bootstrap validators are defined by their public keys.
+
+
+
FAQ
+
+
+
+
You can find the pre-defined Genesis Information for the Testnet of the Pactus blockchain in the genesis.json
file,
+which is located in the project repository, here .
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/blockchain/incentive/index.html b/zh/learn/blockchain/incentive/index.html
new file mode 100644
index 000000000..bac4a163c
--- /dev/null
+++ b/zh/learn/blockchain/incentive/index.html
@@ -0,0 +1,689 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Incentive | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Incentive
+
+
+ The incentive may help encourage nodes to stay honest.
+
+ Satoshi Nakamoto
+
+
+
In Pactus, rewards are given to validators for collecting valid transactions and creating new blocks.
+These rewards serve as an incentive for validators to participate in the consensus process and
+maintain the security and integrity of the network.
+
+
Flat Reward
+
+
To better understand the incentive model in Pactus, let’s compare it with the Bitcoin reward model.
+This comparison will help to understand how the incentive model works in Pactus.
+
+
+
+
+ Pactus
+ Bitcoin
+
+
+
+
+ Consensus engine is Proof of Stake
+ Consensus engine is Proof of Work
+
+
+ Exactly every 10 seconds one block is minted
+ Around every 10 minutes one block is mined
+
+
+ Total supply is 42,000,000 coin
+ Total supply is 21,000,000 coin
+
+
+ Always one coin per block
+ Initial block reward is 50 coin
+
+
+ No halving
+ Halving happens every 4 years
+
+
+
+
+
The halving mechanism in Bitcoin rewards early contributors more significantly.
+However, in a Proof-of-Stake blockchain, this mechanism can lead to wealth centralization,
+as early validators gain too much power based on their staked coins.
+
+
To promote fairer block rewards, Pactus has introduced a simple and straightforward incentive model called the “Flat Reward.”
+In this model, the block reward remains constant at one coin per block and does not change over time.
+
+
+
+
+
+
Coin Distribution
+
+
In Pactus, the coin distribution is linear. This linear distribution is a direct result of the Flat Reward system.
+Unlike other blockchains that have a curved distribution, Pactus maintains a consistent coin distribution.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/blockchain/serialization/index.html b/zh/learn/blockchain/serialization/index.html
new file mode 100644
index 000000000..353c18d83
--- /dev/null
+++ b/zh/learn/blockchain/serialization/index.html
@@ -0,0 +1,774 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Data Serialization | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Data Serialization
+
+
Data serialization is the process of converting data into a format that can be easily stored or transmitted over a network.
+It typically involves encoding data into a sequence of bytes, which can later be decoded to
+reconstruct the original data structure.
+Pactus has two methods for data serialization: Deterministic serialization and CBOR serialization:
+
+
Deterministic Serialization
+
+
Pactus uses a deterministic serialization for the deterministic data like blocks and transactions.
+The serialization format for different types of data is listed in the table below:
+
+
+
+
+ Data Type
+ Size (bytes)
+ Description
+
+
+
+
+ uint8
+ 1
+ An 8 bits unsigned integer
+
+
+ int8
+ 1
+ An 8 bits signed integer
+
+
+ uint16
+ 2
+ A 16 bits unsigned integer
+
+
+ int16
+ 2
+ A 16 bits signed integer
+
+
+ uint32
+ 4
+ A 32 bits unsigned integer
+
+
+ int32
+ 4
+ A 32 bits signed signed integer
+
+
+ uint64
+ 8
+ A 64 bits unsigned integer
+
+
+ int64
+ 8
+ A 64 bits signed signed integer
+
+
+ VarInt
+ Variable
+ A compact representation of an unsigned integer.
+
+
+ VarByte
+ Variable
+ A variable length bytes
+
+
+ VarString
+ Variable
+ A variable length string
+
+
+ Address
+ 21
+ 21 bytes of address data
+
+
+ Hash32
+ 32
+ 32 bytes of hash data
+
+
+
+
+
VarInt
+
+
Variable length integer (VarInt) is encoded by 7-bit chunks. The MSB indicates whether there are
+more octets (1) or it is the last one (0). It means 0x00
to 0x7f
encoded in 1 byte, 0x80
to
+0x3fff
encoded in 2 bytes, …
+
+
Example:
+
+
0x0f -> 0f
+0x1000 -> 8020
+0xffff -> ffff03
+0xffffff -> ffffff07
+
+
+
VarByte
+
+
Variable length byte (VarByte) is encoded as a variable length integer (VarInt) containing the
+length of the array followed by the bytes themselves: VarInt(len(bytes)) || bytes
+
+
VarString
+
+
Variable length string (VarString) is encoded as a variable length integer (VarInt) containing the
+length of the string followed by the bytes that represent the string
+itself:VarInt(len(str)) || str
+
+
Byte Order
+
+
All the internal number representation are in little-endian byte order.
+
+
Example
+
+
Here is an example of a block header data that encoded using deterministic serialization:
+
+
+
+
+
CBOR Serialization
+
+
For non-deterministic data, such as networking messages, Pactus uses
+“Concise Binary Object Representation” or CBOR .
+CBOR is a binary data serialization format that is widely used in various application,
+including IoT, web services, security, and automotive, due to its compact representation and efficient parsing.
+
+
CBOR Me!
+
+
cbor.me
+is an online tool for encoding and decoding CBOR data, offering developers an easy way to test and
+validate their CBOR data without having to set up a local environment.
+
+
Example
+
+
Here is an example of a vote message that encoded using CBOR .
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/blockchain/state-hash/index.html b/zh/learn/blockchain/state-hash/index.html
new file mode 100644
index 000000000..f4fc3932e
--- /dev/null
+++ b/zh/learn/blockchain/state-hash/index.html
@@ -0,0 +1,681 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ State Hash | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
State Hash
+
+
The State Hash is used to ensure the integrity of the data in the Pactus blockchain.
+It serves as a unique identifier or fingerprint of the current state of the blockchain,
+allowing all nodes to verify that their data matches that of the other nodes.
+This helps to prevent any tampering or inconsistencies in the data, ensuring the accuracy and consistency of the blockchain.
+
+
Merkle Tree
+
+
+ In cryptography and computer science, a hash tree or Merkle tree is a tree in which every leaf node
+is labelled with the cryptographic hash of a data block, and every non-leaf node is labelled with
+the cryptographic hash of the labels of its child nodes. Hash trees allow efficient and secure
+verification of the contents of large data structures.
+
+ From Wikipedia
+
+
+
A Hash tree or Merkle tree is a data structure that used by many blockchains to solve this problem:
+“How can data be securely stored and verified in a decentralized network?”
+
+
By using a Merkle tree, nodes can easily verify that they store the same data
+without having to share the entire dataset. Additionally, this helps to prevent any tampering with the data,
+as any changes made to the data would cause inconsistencies in the Merkle tree and
+can be easily detected by the network.
+
+
State Merkle Trees
+
+
In Pactus, the Merkle tree is used to verify the state of the blockchain in each block.
+The state hash in each block is calculated by taking the hash of two Merkle trees:
+the accounts Merkle tree and the validators Merkle tree.
+Each leaf in these trees contains the hash of the associated account or validator.
+By using the state hash, all nodes in the network can ensure they have the same data stored.
+
+
+
+
Scalability of Merkle Tree
+
+
Using a Merkle tree to calculate the state of the blockchain can be challenging
+because when the number of accounts is large, calculating the root hash can be difficult.
+In other words, a simple Merkle tree may not be scalable because calculating all the leaf
+and node hashes requires a significant amount of computation.
+
+
In Pactus, all accounts and validators have unique and sequential numbers.
+This means that each account and validator has a dedicated account number that helps us to
+calculate the hash of leaf nodes in the Merkle tree.
+By using these account numbers, we can ensure that the position of the leaf nodes in
+the Merkle tree is always the same.
+This approach allows us to avoid rebuilding the Merkle tree whenever an account or validator’s state changes.
+Instead, we can save the previous Merkle tree and recalculate the parent hashes by
+fetching neighbor hashes as needed.
+This helps to ensure scalability and reduces the computational resources required for recalculating the Merkle tree.
+
+
+
+
In this example, only account 6 has been updated.
+By locating the corresponding leaf node in the existing Merkle tree and
+traversing the tree towards the root node, we can calculate new root hash.
+This approach has a complexity of \(O(log n)\), making it efficient for large numbers of accounts.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/blockchain/validator/index.html b/zh/learn/blockchain/validator/index.html
new file mode 100644
index 000000000..2e3df2035
--- /dev/null
+++ b/zh/learn/blockchain/validator/index.html
@@ -0,0 +1,677 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Validator | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Validator
+
+
A Validator is an entity that participates in the consensus process by sharing its votes.
+Validators get rewarded for creating new blocks, and to become a Validator,
+they must “bond” or lock up a certain amount of coins as stake.
+The amount of stake held by validators determines their power in the consensus.
+
+
Validator Structure
+
+
The Validator structure is 120 bytes long and consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 96 bytes
+ Public Key
+
+
+ 4 bytes
+ Number
+
+
+ 8 bytes
+ Stake
+
+
+ 4 bytes
+ Last Bonding Height
+
+
+ 4 bytes
+ Unbonding Height
+
+
+ 4 bytes
+ Last Joined Height
+
+
+
+
+
+ Public Key is the Validator’s public key.
+ Number is a sequential and unique number assigned to each validator when it is created for the first time.
+The validator number is used to calculate the state hash of the blockchain.
+ Stake holds the Validator’s stake or the amount of Pactus coins locked or “staked” by the Validator.
+ Bonding Height is the last block height that the validator has bonded their stake.
+ Unbonding Height is the block height that the validator’s stake is unbonded.
+ Last Joined Height is the block height that the validator joined the committee.
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/consensus/committee/index.html b/zh/learn/consensus/committee/index.html
new file mode 100644
index 000000000..6e63c97db
--- /dev/null
+++ b/zh/learn/consensus/committee/index.html
@@ -0,0 +1,765 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Committee | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Committee
+
+
The committee is a group of 51 validators responsible for generating new blocks.
+Validators in the committee participate in the consensus algorithm by casting votes,
+with their voting power determined by their stake.
+While in the committee, validators cannot send Bond or Unbond transactions,
+meaning their voting power remains the same.
+The members of the committee changes randomly over time through Sortition transactions.
+Each block can contain zero or more Sortition transactions.
+
+
These rules are applied when committing sortition transactions:
+
+
+ A minimum of ⅔ of the total stake must be maintained in the committee.
+ If a validator is already in the committee, they will remain in the committee.
+ If a validator is not in the committee, the oldest validator will exit the committee.
+ Each validator should stay in committee at least for 51 blocks.
+
+
+
Proposer Selection
+
+
Proposer selection within the committee operates on a deterministic, clockwise rotation system.
+If a validator is unable to propose, for any reason, it stays within the committee, but
+the proposer’s role shifts to the next validator in the committee.
+
+
+
+
Adding Validators to the Committee
+
+
When a new validator joins the committee, they take a position before the current proposer.
+After the addition of a new validator, the committee adjusts to maintain the total number of validators at 51.
+This is achieved by removing the oldest validator from the committee,
+i.e., the one that has been in the committee for the longest time.
+
+
+
+
Security of the Committee
+
+
For an adversary to take control of the committee, they would need to control more than ⅔ of the stake within the committee.
+To assess the security of the committee, let’s assume all validators in the committee have the same voting power.
+In this case, an adversary would need to control more than ⅔ of the validators in the committee.
+
+
Now, let’s imagine an adversary holds 10% of the total stake.
+As a result, one of their validators can enter the committee every 10 blocks.
+In the first 10 blocks, one of the adversary’s validators enters the committee.
+In the next 10 blocks, another validator enters the committee, giving the adversary two validators within the committee.
+In the subsequent 10 blocks, another validator enters, but at the same time, the first validator leaves the committee.
+Therefore, an adversary with 10 10% of the total stake can have, on average, two validators in a committee of 51 validators.
+
+
Using the Poisson distribution ,
+we can estimate the probability of an adversary controlling ⅔ of the committee:
+
+
+
+
+ Adversarial Stake
+ Committee size
+ ⅔+ of committee
+ Adversarial committee members
+ Probability of controlling ⅔+
+
+
+
+
+ 15%
+ 21
+ 15
+ 3
+ \(5.46 \times 10^{-07}\)
+
+
+ 15%
+ 51
+ 35
+ 7
+ \(3.34 \times 10^{-14}\)
+
+
+ 15%
+ 99
+ 67
+ 14
+ \(1.41 \times 10^{-24}\)
+
+
+ 10%
+ 21
+ 15
+ 2
+ \(3.39 \times 10^{-09}\)
+
+
+ 10%
+ 51
+ 35
+ 5
+ \(1.90 \times 10^{-18}\)
+
+
+ 10%
+ 99
+ 67
+ 9
+ \(2.91 \times 10^{-35}\)
+
+
+ 5%
+ 21
+ 15
+ 1
+ \(2.81 \times 10^{-13}\)
+
+
+ 5%
+ 51
+ 35
+ 2
+ \(4.50 \times 10^{-31}\)
+
+
+ 5%
+ 99
+ 67
+ 4
+ \(1.09 \times 10^{-56}\)
+
+
+
+
+
FAQ
+
+
How can one know when a validator has joined the committee?
+
+
The height at which the validator joined the committee is recorded as the “Last Joined Height” field in
+the validator structure.
+Once a validator enters the committee, this field is set to the current height it
+evaluated the sortition proof.
+
+
Can a validator within the committee run the sortition algorithm?
+
+
A validator within the committee can run the sortition algorithm.
+If they generate a valid sortition transaction, the height of their entry into the committee is set
+to the current block height, allowing them to stay in the committee for a longer period.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/consensus/parameters/index.html b/zh/learn/consensus/parameters/index.html
new file mode 100644
index 000000000..7118bfe93
--- /dev/null
+++ b/zh/learn/consensus/parameters/index.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Consensus Parameters | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Consensus Parameters
+
+
Consensus parameters are a set of configurable settings that determine how the Pactus blockchain operates.
+These parameters are agreed upon by all validators in the network,
+ensuring that validators behave in the same way and that the network operates consistently.
+
+
Here is the list of the consensus parameters:
+
+
+ Block Version: The version number of the blockchain protocol.
+This is set to 1.
+ Block Time: The time interval in seconds between the creation of two consecutive blocks.
+This is set to 10 seconds, which means that a new block is created every 10 seconds.
+ Committee Size The number of validators in the committee.
+This is set to 51 validators.
+ Block Reward The fixed reward amount given to the validator who successfully creates and proposes a new block.
+This is set to 1,000,000,000, which is equivalent to one coin.
+ Time-to-Live Interval : The number of blocks that a transaction can remain unprocessed before
+it is removed from the transaction pool.
+This is set to 8640 blocks, which is almost one day.
+ Bond Interval : The minimum number of blocks that must elapse after a validator has submitted a bond transaction
+before they can participate in the consensus process and join the validator committee.
+This is set to 360 blocks, which is almost one hour.
+ Unbond Interval : The minimum number of blocks that must elapse after a validator has submitted
+an unbond transaction before
+they can withdraw their staked coins.
+This is set to 181440 blocks, which is almost 21 days.
+ Sortition Interval : The maximum number of blocks that a sortition transaction can remain valid and be included
+in a block.
+This is set to 7 blocks.
+ Fee Fraction : The fraction of transaction value that must be paid in order for a transaction to be included in a block.
+This is set to 0.0001 PAC, meaning that 0.01% of transaction value are awarded to the block proposer.
+ Minimum Fee : The minimum transaction fee that must be paid.
+This is set to 1,000 (satoshi), which is equivalent to 0.000001 PAC coin.
+ Maximum Fee : The maximum transaction fee that must be paid.
+This is set to 1,000,000 (satoshi), which is equivalent to 0.001 PAC coin.
+ Maximum Stake : The maximum amount of coins that can be staked by a validator.
+This is set to 1,000,000,000,000 (satoshi), which is 1000 PAC coins.
+ Minimum Stake : The minimum amount of coins that can be staked by a validator.
+This is set to 1,000,000,000 (satoshi), which is 1 PAC coins.
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/consensus/proof-of-stake/index.html b/zh/learn/consensus/proof-of-stake/index.html
new file mode 100644
index 000000000..b5e40a3b8
--- /dev/null
+++ b/zh/learn/consensus/proof-of-stake/index.html
@@ -0,0 +1,684 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Solid State Proof of Stake | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Solid State Proof of Stake
+
+
Proof of Stake is a way to secure a blockchain through requesting users to stake some amount of their coins.
+These stakeholders, called validators, are responsible to collect, validate and add transactions to the blockchain.
+The validators will be rewarded with native coins.
+
+
Unlike Proof of Work, which is based on competition, Proof of Stake is based on collaboration.
+Validators work together to manage the expansion of the blockchain.
+A Proof of Stake blockchain becomes more decentralized and secure as more validators participate in it.
+
+
An example
+
+
To understand how Proof of Stake works, imagine a community bank without any centralized authority.
+In this bank, users decide to run it together.
+Some of these users volunteer to collect, validate, and record transactions,
+ensuring that everything runs smoothly.
+
+
These volunteers, known as validators, must temporarily lock or freeze some of their money as a stake.
+This stake can’t be transferred or used.
+The more money a validator stakes, the more influence they have in the system.
+
+
From time to time, one of the validators is chosen by the others to collect all the recent transactions,
+bundle them together, and send a copy to the other validators.
+If a supermajority of the validators agree with the proposed bundle by signing it,
+the bundle will be committed to the bank’s ledger.
+
+
In this system, validators have no incentive to behave maliciously or dishonestly.
+If they do, they risk harming the bank’s reputation and the value of their own stakes as well.
+
+
Delegated Proof of Stake
+
+
In Proof of Stake, if the number of validators increases,
+the voting time will also increase, and this can lead to an inefficient consensus mechanism.
+In our community bank example, running the bank becomes more difficult as the number of validators increases.
+
+
To solve this problem, some blockchains use the concept of “delegators”.
+In Delegated Proof of Stake, users entrust their stakes to a small group of “delegates”.
+These delegates are responsible for validating transactions and creating blocks.
+The number of delegates is limited to ensure accountability and efficiency in the validation process.
+
+
+
+
The delegation model puts a lot of trust in the hands of a small number of delegates,
+which goes against the principle of “don’t trust, verify”.
+
+
Consensus without delegation or Solid State Proof of Stake (SSPoS)
+
+
Pactus introduced a mechanism that doesn’t rely on delegation, we call it Solid State Proof of Stake.
+It utilizes a dynamic committee of validators
+that are responsible for creating new blocks.
+The size of the committee is fixed, but the members of the committee are randomly changed.
+On the other hand, the number of validators outside the committee is unlimited, allowing anyone to
+become a validator by staking coins.
+
+
At each block, validators participate in a sortition algorithm
+by generating a random number between zero and the total staked coins.
+If the number is less than the validator’s stake, they can enter the committee and replaces the oldest committee member.
+
+
+
+
The chance of entering the committee depends on the validator’s stake and luck.
+But on average, one validator should enter the committee in each block.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/consensus/protocol/index.html b/zh/learn/consensus/protocol/index.html
new file mode 100644
index 000000000..f34212767
--- /dev/null
+++ b/zh/learn/consensus/protocol/index.html
@@ -0,0 +1,885 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Consensus protocol | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
+ This post is obsolete. check
here for more information.
+
+
+
Consensus Protocol
+
+
Pactus consensus algorithm is a state machine
+replication with Byzantine fault tolerance.
+The Pactus consensus algorithm starts with the block creation phase.
+In this phase one validator acts as the proposer. The proposer collects all the transactions,
+creates a block, and proposes it to other validators.
+
+
When a proposed block is seen by other validators, they validate the block and
+cast their vote for the proposed block, moving to the “prepare” state.
+
+
If more than two-thirds (⅔) of the total stakes cast their votes, the proposed block becomes prepared,
+and validators move to the “precommit” state.
+
+
If, once again, more than two-thirds (⅔) of the total stakes cast their vote for the prepared block,
+the block is committed, and the next proposer is ready to propose a new block. This cycle repeats every 10 seconds.
+
+
If a proposer fails to propose in any round, other validators start the “change proposer” phase to
+decide to change the proposer for this round.
+
+
+
+
The Algorithm
+
+
There are \(R = 3f+1\) validators. where \(f\) is the maximum
+number of validators that may be faulty or byzantine. For example, if there is one faulty validator,
+the resiliency of the algorithm is optimal if we have at least \(3\) non-faulty
+validators. So the minimum number of validators should be \(3+1=4\).
+
+
We denote a message as \(\langle m \rangle\) tuple and a signed message by node \(i\) as
+\(\langle m \rangle_{\sigma_i}\).
+
+
Pactus consensus algorithms has two phases: Block creation phase and change proposer phase.
+
+
Block Creation
+
+
The block creation phase in Pactus consensus algorithm includes these three steps :
+Propose , Prepare and Precommit .
+The protocol proceeds in rounds \(r = 0, 1, 2, \ldots\).
+
+
Propose Step
+
+
In each round \(r\), one validator is the proposer and the others act as validators.
+The proposer \(p\) collects transactions and creates a proposal block \(B\). It signs and
+broadcasts a proposal message with the proposed block piggybacked to all the validators.
+Propose message has this form:
+
+\[\langle \langle \text{PROPOSE},h,r \rangle_{\sigma_p}, B \rangle\]
+
+
where:
+
+
+ \(B\) is the proposed block
+ \(h\) indicates the block height
+ \(r\) is an assigned round number, which is zero for the first round
+
+
+
Prepare Step
+
+
If validator \(i\) accepts the proposal, it enters prepare step and signs and
+broadcasts prepare message to all other validators. Otherwise, it does nothing.
+The prepare message has this form:
+
+\[\langle \text{PREPARE},h,r,d \rangle_{\sigma_i}\]
+
+
where:
+
+
+ \(d\) is digest or hash of proposed block \(B\)
+
+
+
If validator \(i\) received \(2f+1\) prepare messages from other
+validators (including its own), it becomes prepared and enters to precommit step.
+
+
Precommit Step
+
+
In precommit step, validator \(i\) signs and broadcasts precommit message to
+the other validators.
+The precommit message has this form:
+
+\[\langle \text{PRECOMMIT},h,r,d \rangle_{\sigma_i}\]
+
+
Each validator executes and commits block \(b\) after receiving
+\(2f+1\) precommit messages (including its own) and becomes committed .
+
+
Block Announcement
+
+
Each validator that receives a valid proposal and with \(2f+1\) precommit messages from other
+validators (including its own), can create a block-announce messages and broadcasts it to the network.
+The block-announce message has this form:
+
+\[\langle \text{BLOCK-ANNOUNCE} ,h ,r ,B, C \rangle\]
+
+
where:
+
+
+ \(C\) is the quorum certificate for the precommit step.
+
+
+
Validators can move to the next height and clear the message logs after receiving valid
+block-announce message, even if their timer has expired.
+
+
The picture below shows the operation of the algorithm in the normal case. validator 1 is the
+proposer and validator 4 is faulty.
+
+
+
+
Change Proposer
+
+
The change-proposer provides liveness by allowing the system to make progress when the proposer fails.
+The change-proposer phase is triggered by timeouts that
+prevent validators from waiting indefinitely for the proposal to execute.
+
+
If the timer of a validator expires in round \(r\), the validator starts a change-proposer phase.
+The change-proposer phase is an Asynchronous Byzantine Binary Agreement (ABBA) that is biased toward zero (No).
+It means that during this phase, even if they don’t have the proposal, honest validators may decide to vote zero
+if they obtain a valid quorum Certificate for the prepare step.
+
+
If a supermajority of the validators decide to change the proposer, they move to round \(r+1\). However,
+if they decide not to change the proposer, they will return to the prepare state and,
+since a supermajority of the validators attested to a valid proposal, they can commit the proposed block.
+
+
The change proposer phase in Pactus consensus algorithm includes these three steps:
+Pre-vote , Main-vote and Decide
+The protocol proceeds in rounds \(r_{cp} = 0, 1, 2, \ldots\).
+
+
Pre-vote Step
+
+
In Pre-vote step each validator casts a pre-vote for a value \(b \in \{0, 1\}\)
+and broadcasts pre-vote message to the network.
+The pre-vote message has this form:
+
+\[\langle\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle_{\sigma_i}, justification\rangle\]
+
+
The first round is a special round and each validator starts with an initial value.
+If the validator’s timer has expired in the prepare step, its initial value is zero,
+and if the validator’s timer has expired in the precommit step, its initial value is one.
+
+\[b = \begin{cases}
+1 & \text{if timer expired in prepare step,} \\
+0 & \text{if timer expired in precommit step.}
+\end{cases}\]
+
+
In the next rounds, each validator select \(2f+1\) properly justified main-votes from round \(r − 1\) and
+
+\[b = \begin{cases}
+0 & \text{if there is a main-vote for 0,} \\
+1 & \text{if there is a main-vote for 1,} \\
+0 (biased) & \text{if all main-votes are abstain.}
+\end{cases}\]
+
+
These pre-votes must be justified with a appropriate justification.
+For the first round, if the validator’s timer has expired in the prepare step, the justification is \(nil\) ,
+and if the validator’s timer expired in the precommit step,
+the justification is the proper quorum certificate for the prepare step at round \(r\).
+
+
In the next rounds, a pre-vote for \(b\) may be justified in two ways:
+
+
+ Hard : that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp}-1,b \rangle\)
+ Soft : that is the quorum certificate for \(\langle \text{CP:MAIN-VOTE},h,r,r_{cp}-1,abstain \rangle\)
+
+
+
Main-vote Step
+
+
After collecting \(2f+1\) valid and justified pre-votes, each validator casts a main-vote \(v \in \{0, 1, abstain\}\)
+and broadcasts main-vote message to the network.
+The main-vote message has this form:
+
+\[\langle\langle \text{CP:MAIN-VOTE},h,r,r_{cp},v \rangle_{\sigma_i}, justification\rangle\]
+
+
The main-vote value \(v\) determine as below:
+
+\[v = \begin{cases}
+0 & \text{if there are 2f+1 pre-vote for 0,} \\
+1 & \text{if there are 2f+1 pre-vote for 1,} \\
+abstain & \text{if there are pre-votes for 0 and 1.}
+\end{cases}\]
+
+
These main-votes must be justified with a appropriate justification.
+A main-vote for \(v\) may be justified in two ways:
+
+
+ Non-conflicting : that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle\)
+ Conflicting : that consists of the justifications for the two conflicting pre-votes.
+
+
+
Decide Step
+
+
After collecting \(2f+1\) valid and justified main-votes, each validator examines these votes. If all
+votes are for a value \(b \in \{0, 1\}\), then the validator decides \(b\), but continues to
+participate in the protocol for one more round. Otherwise, the validator proceeds to the next round \(r_{cp}+1\).
+
+
Comparison
+
+
Pactus consensus protocl doesn’t have any lcoking mechanism or
+checkpointing and there will at most one valid proposla per round.
+This ensures that each round can begin with a new proposal.
+
+
+
+
+ Protocol
+ Normal case
+ Faulty case
+
+
+ Steps
+ Complexity
+ Locking
+ Checkpointing
+
+
+
+
+ PBFT
+ 3
+ $$O(n^2)$$
+ No
+ Yes
+
+
+ Tendermint
+ 3
+ $$O(n^2)$$
+ Yes
+ No
+
+
+ HotStuff
+ 4
+ $$O(n)$$
+ Yes
+ No
+
+
+ Pactus
+ 3
+ $$O(n^2)$$
+ No
+ No
+
+
+
+
+
+
+
References:
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/consensus/sortition/index.html b/zh/learn/consensus/sortition/index.html
new file mode 100644
index 000000000..470c46a12
--- /dev/null
+++ b/zh/learn/consensus/sortition/index.html
@@ -0,0 +1,781 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Sortition Algorithm | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Sortition Algorithm
+
+
The sortition algorithm is an important part of the Pactus blockchain, responsible for the fair, transparent
+and random selection of validators to join the committee .
+It utilizes a Verifiable Random Function, or VRF for short, to generate a verifiable random number.
+
+
The generated random number should be in the range of 0 to the total staked coins.
+If validators can prove that their generated number is less than their stake,
+they can send the sortition transaction .
+Once a sortition transaction is included in a block, the validator will join the committee,
+and the oldest validator in the committee will leave it.
+
+
Verifiable Random Function
+
+
Verifiable Random Function is a pseudo-random function that the owner of key \(s\) can evaluate \(v = f_s(x)\) and also provides
+\(proof_{x}\) efficiently proving that \(v\) is correct. We call such a mathematical
+object a verifiable pseudo-random function, VRF for brevity .
+
+
Pactus uses the BLS signature scheme as the source of VRF.
+Since BLS signatures are unique ,
+the hash of a BLS signature can be used to produce a secure and verifiable random number.
+
+
The VRF takes three parameters:
+
+
+ The secret key of the validator
+ The sortition seed
+ The total stake of the blockchain.
+
+
+
Once the VRF is executed, it produces an index with a proof.
+The index is a number between zero and the total staked coins, and the proof allows other validators to verify the correctness
+of the generated index.
+
+
The pseudocode below demonstrates the evaluation of the VRF for the sortition algorithm:
+
+\[\begin{align*}
+& \textbf{function} \ VRF(sk, seed, total\_stake) \\
+& \qquad pk \gets P_{BLS}(sk) \\
+& \qquad proof \gets S_{BLS}(sk, seed \| pk) \\
+& \qquad rnd \gets H(proof) \\
+& \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\
+& \qquad \\
+& \qquad \textbf{return} \ index, proof \\
+& \textbf{end function}
+\end{align*}\]
+
+
where:
+
+
+ \(sk\) is the secret key of the validator
+ \(seed\) is the sortition seed
+ \(total\_stake\) is the total stake of the blockchain
+ \(P_{BLS}\) is a cryptographic function that derives the public key from the secret key for the BLS signature
+ \(S_{BLS}\) is a cryptographic function that signs a message with the secret key for the BLS signature.
+ \(H\) is a cryptographic hash function that generates a number between \(0\)to \(2 ^{256}\)
+ \(\|\) denotes the concatenation of two values
+
+
+
To verify a sortition proof, both the validator’s public key and stake are required:
+
+\[\begin{align*}
+& \textbf{function} \ verifyVRF(pk, seed, proof, stake, total\_stake) \\
+& \qquad \textbf{if} \ V_{BLS}(pk, seed \| pk, proof) = True \ \textbf{then} \\
+& \qquad \qquad rnd \gets H(proof) \\
+& \qquad \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\
+& \qquad \\
+& \qquad \qquad \textbf{return} \ index \leqslant stake \\
+& \qquad \textbf{else} \\
+& \qquad \qquad \textbf{return} \ False \\
+& \qquad \textbf{end if} \\
+& \textbf{end function}
+\end{align*}\]
+
+
where:
+
+
+ \(V_{BLS}\) is a cryptographic function used to verify a signed message using the BLS signature scheme
+
+
+
There is no need to send \(index\) alongside \(proof\) because the
+result should be less than the validator’s stake, and the validator’s stake is known at each block.
+
+
Sortition Seed
+
+
The sortition algorithm relies on a random and publicly verifiable seed that cannot be manipulated by adversaries.
+Otherwise, adversaries may select a seed that favors the selection of corrupt users.
+
+
To prevent this, the BLS signature scheme is used to generate the sortition seed.
+Since BLS signatures are unique and deterministic, adversaries cannot generate more than one valid signature per block.
+In each block, the block proposer generates a new sortition seed based on the previous seed using the following function:
+
+\[\begin{align*}
+& \textbf{function} \ generateSeed(sk, prev\_seed) \\
+& \qquad \textbf{return} \ S_{BLS}(sk, H(prev\_seed)) \\
+& \textbf{end function}
+\end{align*}\]
+
+
Since the proposer’s public key is known, the seed for the next block can be easily verified.
+If the seed is invalid, the proposed block will be rejected.
+The verification function is as follows:
+
+\[\begin{align*}
+& \textbf{function} \ verifySeed(pk, prev\_seed, seed) \\
+& \qquad \textbf{return} \ V_{BLS}(pk, H(prev\_seed), seed) \\
+& \textbf{end function}
+\end{align*}\]
+
+
The sortition seed for the genesis block set to 0.
+
+
Sortition Probability
+
+
The Sortition probability refers to the expected number of validators that may join the committee in each block,
+assuming all validators are actively online and executing the sortition algorithm.
+
+
The probability of a validator \(i\) being selected depends on their stake relative to the total stake in the system:
+
+\[p_i=\frac{S_i}{S_t}\]
+
+
where:
+
+
+ \(p_i\) is the probability of validator \(i\) being selected
+ \(S_i\) is the stake of validator \(i\)
+ \(S_t\) is the total stake of all validators.
+
+
+
Therefore, the expected number of validators joining the committee at each block can be represented as:
+
+\[P=\sum_{i=1}^{n}{p_i}=\sum_{i=1}^{n}{\frac{S_i}{S_t}}=\frac{S_1+S_2+\ldots+S_n}{S_t}\]
+
+
where \(n\) is the total number of validators. We know that \(S_t={S_1+S_2+\ldots+S_n}\). Therefore we will have:
+
+\[P=\frac{S_t}{S_t}=1\]
+
+
Thus, on average, we expect one validator to join the committee at each block.
+In practice, the actual number of validators joining the committee in each block
+may differ due to the randomness in the sortition algorithm, or the possibility of some validators being offline.
+
+
FAQ
+
+
How is the total staked coin calculated?
+
+
The total staked coin in each block is calculated by summing the staked coins of all active validators.
+An active validator is a validator that has not yet unbonded .
+
+
How is the oldest validator determined?
+
+
The height at which the validator joined the committee is recorded as the “Last Joined Height” field in
+the validator structure.
+The validator with the lowest “Last Joined Height” is considered the oldest.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/consensus/specification/index.html b/zh/learn/consensus/specification/index.html
new file mode 100644
index 000000000..460e8ac8d
--- /dev/null
+++ b/zh/learn/consensus/specification/index.html
@@ -0,0 +1,661 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Consensus specification | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Consensus Specification
+
+
Developing distributed and concurrent systems is a complex task that requires careful attention to the details.
+Testing such systems is challenging because it’s difficult to simulate all possible states,
+including those that can happen due to system failures, network latency, and other factors.
+This makes it hard to ensure that the system behaves correctly in all circumstances.
+
+
Therefore it’s essential to have a proactive approach that involves modeling the system’s behavior in a formal way.
+Such an approach can help identify potential issues before they occur, saving time and preventing costly flaws.
+
+
TLA+
+
+
TLA+ is a formal specification language developed by
+Leslie Lamport based on the idea of
+specifying systems using simple mathematics.
+It is used for designing, modelling, documentation, and verification of programs, especially concurrent and
+distributed systems.
+TLA+ and its tools are useful for eliminating fundamental design errors, which are hard to find and
+expensive to correct in code.
+
+
To know more about TLA+, check The TLA+ Home Page .
+
+
Pactus Consensus Spec
+
+
Pactus consensus specification
+has written in TLA+ format. It includes all invariants that can be held
+in every state of every execution that the protocol allows. The TLA+ specification is compiled into
+PDF file .
+
+
Safety Proof
+
+
By defining some invariants we can ensure the safety of the consensus
+protocol in any possible and
+distinct state, and therefore we have the informal safety proof of the Pactus consensus protocol using TLA+.
+
+
Liveness Proof
+
+
Checking the liveness is not easy, but with defining some constraints, we have the informal proof of
+liveness of Pactus consensus protocol using TLA+.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/index.html b/zh/learn/index.html
new file mode 100644
index 000000000..a83402a71
--- /dev/null
+++ b/zh/learn/index.html
@@ -0,0 +1,502 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 资料 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
资料
+
+
在这里,您可以找到帕图斯项目的技术文档。
+
+
Table Of Content
+
+
+
+
+ Blockchain
+
+
+
+
+ Consensus
+
+
+
+
+ Transaction
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/smart-contract/storage/index.html b/zh/learn/smart-contract/storage/index.html
new file mode 100644
index 000000000..d01001fa0
--- /dev/null
+++ b/zh/learn/smart-contract/storage/index.html
@@ -0,0 +1,738 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Storage as file | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Storage as file
+
+
Motivation
+
+
Ethereum friendly blockchains keep storage in a separate key/value database per request. This has
+some drawbacks:
+
+
+ Since there is a global database that stores all storages, the storage key is a combination of
+\(Key_{contract} + Key_{item}\) that is a bit messy.
+ Storage data can’t have any meta data, because they are scattered in different places in the
+key/value database.
+ Storages per smart contract can’t be Merklized. Ethereum came with another solution to calculate
+the hash of the whole storage. They defined a hexary Patricia tree that is quite
+suboptimal .
+
+
+
Here we discuss how we can address the above issues by dedicating a separate file as Storage
+File per smart contract. In this scenario, users should purchase the storage file with required
+capacity before deploying the smart contract. Once the purchase is done, a separate empty file will
+be created and dedicated for the user. The size of the file is the same as the purchase size. For
+example users can purchase 10 MB or 120 MB of storage files depending on their need and renew them
+yearly.
+
+
Structure
+
+
Each storage file has three parts: Header, ByteCodes and contract storage.
+
+
+
+
The Header of the storage file keeps some meta data like storage file index, last payment time,
+total storage size, etc. In the ByteCodes section the byte codes of the smart contract will be saved
+and in the storage section, the actual storage of the smart contract will be stored.
+
+
Storage APIs
+
+
Smart contracts can only change data in storage sections. To achieve that the smart contract
+executer (virtual machine) should introduce these APIs:
+
+
/// This API requests the host to read the slice of `data` from the storage file
+/// at the given `offset`.
+fn read ( & self , offset : u32 , data : & mut [ u8 ]) -> Result < (), HostError > ;
+
+/// This API requests the host to write the slice of `data` into the storage file
+/// at the given `offset`
+fn write ( & self , offset : u32 , data : & [ u8 ]) -> Result < (), HostError > ;
+
+
+
+
These APIs are similar to SLoad
and SStore
opcodes in Ethereum Virtual Machine (EVM). But
+instead of key and value, they accept offset and data parameters.
+
+
Storage Allocation
+
+
In order to allocate storage space safely and efficiently user can use these predefined methods:
+
+
/// Allocates storage space with the specific `length` and returns the
+/// offset of allocated space in the storage file.
+pub fn allocate ( & self , length : u32 ) -> Result < Offset , Error > ;
+
+/// Deallocates the storage space at the specific `offset` and `length`
+pub fn deallocate ( & self , offset : Offset , length : u32 ) -> Result < (), Error > ;
+
+
+
Storage Stack
+
+
There is a fixed stack with 32 elements at the beginning of the storage . The first item in this
+stack is reserved and used for managing deallocated storage spaces. Users can use other stack items
+to keep the offset of the allocated spaces for the smart contract variables.
+
+
+
+
Data Collections
+
+
Usually in smart contracts developers are interested in data collections like Search Trees or Hash
+Tables to look up values by the associated keys. Most programming languages come up with some
+builtin collections, however we can’t use them in smart contracts because they use RAM that is
+inconsistent. However we can have storage equivalent of these data collections that instead of
+dealing with memory they are dealing with the storage file. You can naively consider storage as
+dedicated consistent memory for the smart contract.
+
+
Right now these data collection is available to use inside the smart contract: StorageVector
,
+StorageString
, StorageLinkedList
, StorageBST
and StorageHasTable
.
+
+
+
+
Merklizing Storage
+
+
To make sure all the nodes have the same state we need to calculate the hash of all storage files.
+Merkle tree can help us to easily calculate the root hash very fast. We need two Merkle trees, one
+for calculating the root hash of each storage file and the second for calculating the root hash of
+all storage files.
+
+
Single storage file Merkle tree
+
+
We can divide each file into small chunks of data and calculate the hash of each chunk once. Since
+we know exactly which chunk has changed after executing the smart, contract we can easily
+reconstruct the tree and calculate the merkle root again.
+
+
Whole storage Merkle tree
+
+
Each file has a unique index. With using that index we can make sure that the position of the leaf
+nodes in the Merkle tree is always the same. The same technique we used for calculating the
+state hash .
+
+
+
+
Example
+
+
As an example we have implemented the ERC20 smart contract based on this idea. The implementation
+can be found here
+
+
Testing
+
+
One of the consequences of Storage as File is that testing smart contracts becomes easier. What we
+need is only to mock the storage file.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/transaction/bond/index.html b/zh/learn/transaction/bond/index.html
new file mode 100644
index 000000000..2e2232cac
--- /dev/null
+++ b/zh/learn/transaction/bond/index.html
@@ -0,0 +1,669 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Bond Transaction | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Bond Transaction
+
+
Bond transaction is used to bond stake to a validator .
+If the validator does not exist, it will be created.
+Once a bond transaction committed, the validator cannot participate in the
+sortition algorithm for 1 hour.
+This is called the “bond interval” and is defined in the
+consensus parameter .
+
+
Payload Structure
+
+
The bond transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Sender address
+
+
+ 21 bytes
+ Receiver address
+
+
+ 96 bytes (optional)
+ Public key
+
+
+ Variant
+ Amount
+
+
+
+
+
+ Sender address is the address of the sender account .
+ Receiver address is the address of the receiver validator.
+ Public key is the validator’s public key. If the validator does not exist yet,
+the public key should be set, otherwise it should left empty.
+ Amount is the amount of coins that should be staked or bonded.
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/transaction/fee/index.html b/zh/learn/transaction/fee/index.html
new file mode 100644
index 000000000..42b9a8db7
--- /dev/null
+++ b/zh/learn/transaction/fee/index.html
@@ -0,0 +1,671 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transaction Fee | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Transaction Fee
+
+
Transaction fees in the Pactus blockchain are calculated using a percentage-based fee model.
+The fee is a percentage of the transferred amount, within a minimum and maximum range.
+The percentage, minimum fee, and maximum fee parameters are part of the blockchain
+consensus parameters .
+
+
The formula to calculate the transaction fee is as follows:
+
+
+
+\[\begin{align*}
+fee = amount \times percentage \\
+\\
+fee =
+\begin{cases}
+ & fee_{min} & \textbf{ if } \ fee < fee_{min} \\
+ & \\
+ & fee_{max} & \textbf{ if } \ fee > fee_{max} \\
+ & \\
+ & fee & \textbf{otherwise}
+ \end{cases}
+\end{align*}\]
+
+
Examples
+
+
Currently, the fee fraction or percentage is set to 0.01%, the minimum fee is set to 0.000,001 coin,
+and the maximum fee is set to 0.001 coin.
+
+
+ If Alice wants to transfer 2 coins to Bob, she needs to pay 0.000,2 coins as transaction fee.
+ If Alice wants to transfer 0.000,2 coins to Bob, she needs to pay 0.000,001 coins as transaction fee.
+ If Alice wants to transfer 20 coins to Bob, she needs to pay 0.001 coins as transaction fee.
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/transaction/format/index.html b/zh/learn/transaction/format/index.html
new file mode 100644
index 000000000..c970bbc90
--- /dev/null
+++ b/zh/learn/transaction/format/index.html
@@ -0,0 +1,708 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transaction Format | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
+
+
Transactions in Pactus consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 1 byte
+ Version
+
+
+ 4 bytes
+ Lock Time
+
+
+ Variant
+ Fee
+
+
+ Variant
+ Memo
+
+
+ 1 byte
+ Payload Type
+
+
+ Variant
+ Payload Data
+
+
+ 48 bytes
+ Signature
+
+
+ 96 bytes
+ Public Key
+
+
+
+
+
+ Version is the version of the transaction format. Different versions may have different fields or
+a different layout, and the current transaction version is set to 1.
+ Lock Time specifies the block number at which the transaction can be unlocked.
+ Fee contains the fee paid by the sender to the network for processing the transaction.
+The fee is calculated based on the percentage fee model.
+ Memo is an optional message that can be included in the transaction.
+The message can be used to provide additional information about the transaction or to communicate with the recipient.
+The maximum size of the memo is 64 characters that is defined in the
+consensus parameters
+ Payload Type specifies the type of the transaction payload.
+Depending on the payload type, the payload data field is decoded differently.
+ Payload Data contains the actual data payload of the transaction.
+The payload data varies depending on the payload type.
+ Signature contains a cryptographic signature created by the sender using their private key.
+The signature is used to ensure that the transaction has not been tampered with and that it was indeed created by the sender.
+ Public Key contains the public key of the sender.
+The public key is used to verify that the sender has the authority to create the transaction.
+The sender’s address should be derived from this public key.
+
+
+
Payload Type
+
+
The payload type field determines the format of the payload data field in the transaction.
+Different payload types have different formats for the payload data.
+The following are the supported transactions in Pactus blockchain:
+
+
+ Transfer transaction
+ Bond transaction
+ Sortition transaction
+ Unbond transaction
+ Withdraw transaction
+
+
+
Transaction ID
+
+
The Transaction ID is a unique identifier for a transaction on the blockchain.
+It is generated by taking the hash of the transaction data without including the public key and signature fields.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/transaction/sortition/index.html b/zh/learn/transaction/sortition/index.html
new file mode 100644
index 000000000..8017cb81d
--- /dev/null
+++ b/zh/learn/transaction/sortition/index.html
@@ -0,0 +1,659 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Sortition Transaction | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Sortition Transaction
+
+
Sortition transaction is used to enter a validator
+in the committee .
+By committing a sortition transaction, the validator will enter the committee.
+Sortition transactions are valid for 7 blocks, which is defined as “sortition interval” in the
+consensus parameters .
+
+
Payload Structure
+
+
The sortition transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Address
+
+
+ 48 bytes
+ Sortition Proof
+
+
+
+
+
+ Address is the address of the validator that evaluated the sortition
+ Sortition Proof is the proof of evaluating the sortition
+
+
+
Validators do not need to pay a fee for sortition transactions, and the fee should be set to zero.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/transaction/transfer/index.html b/zh/learn/transaction/transfer/index.html
new file mode 100644
index 000000000..93b0bf10a
--- /dev/null
+++ b/zh/learn/transaction/transfer/index.html
@@ -0,0 +1,673 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Transfer Transaction | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Transfer Transaction
+
+
Transfer transaction is used to transfer coins between the accounts .
+If the receiver account does not exist, it will be created.
+
+
Payload Structure
+
+
The transfer transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Sender address
+
+
+ 21 bytes
+ Receiver address
+
+
+ Variant
+ Amount
+
+
+
+
+
+ Sender address is the account address that transfers the amount
+ Receiver address is the account address that receives the amount
+ Amount is the amount of coins that should be transferred
+
+
+
Reward Transaction
+
+
The reward transaction is the first transaction in each block. There is only one reward transaction
+per block, and it has the same format as a transfer transaction, but with zero fees and no signature.
+
+
The sender address is the Treasury address ,
+and the receiver address is defined by the block proposer.
+The amount of the reward transaction should be equal to the
+block reward plus transaction fees.
+This amount will go to the proposer account as a block reward.
+Therefore, in each block, one coin from the
+Treasury account transfers to
+the proposer account as a block reward.
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/transaction/unbond/index.html b/zh/learn/transaction/unbond/index.html
new file mode 100644
index 000000000..83630f0c8
--- /dev/null
+++ b/zh/learn/transaction/unbond/index.html
@@ -0,0 +1,650 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Unbond Transaction | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Unond Transaction
+
+
Unbond transaction is used to unbond a validator .
+An unbonded validator cannot participate in the sortition algorithm anymore, and after 21 days, the stake can be withdrawn.
+This is called the “unbond interval” and is defined in the consensus parameter .
+
+
Payload Structure
+
+
The unbond transaction has a payload consists the following field:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Validator address
+
+
+
+
+
+ Validator address is the address of validator that is unbonded.
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/learn/transaction/withdraw/index.html b/zh/learn/transaction/withdraw/index.html
new file mode 100644
index 000000000..daa13fd9a
--- /dev/null
+++ b/zh/learn/transaction/withdraw/index.html
@@ -0,0 +1,659 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Withdraw Transaction | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blockchain
+
+
+
+
+
+
+ Consensus
+
+
+
+
+
+
+ Transaction
+
+
+
+
+
+
+ API Reference
+
+
+
+
+
+
+
+
Withdraw Transaction
+
+
Withdraw transaction is used to withdraw the staked coins from an unbonded
+validator
+
+
Payload Structure
+
+
The withdraw transaction has a payload consists the following fields:
+
+
+
+
+ Size
+ Field
+
+
+
+
+ 21 bytes
+ Sender address
+
+
+ 21 bytes
+ Receiver address
+
+
+ Variant
+ Amount
+
+
+
+
+
+ Sender address is the address of the sender validator.
+ Receiver address is the address of the receiver account .
+ Amount is the amount of coins that should be withdrawn
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/mstile-150x150.png b/zh/mstile-150x150.png
new file mode 100644
index 000000000..187b08cc8
Binary files /dev/null and b/zh/mstile-150x150.png differ
diff --git a/zh/robots.txt b/zh/robots.txt
new file mode 100644
index 000000000..0097513b3
--- /dev/null
+++ b/zh/robots.txt
@@ -0,0 +1 @@
+Sitemap: https://pactus.org/sitemap.xml
diff --git a/zh/safari-pinned-tab.svg b/zh/safari-pinned-tab.svg
new file mode 100644
index 000000000..43c436d31
--- /dev/null
+++ b/zh/safari-pinned-tab.svg
@@ -0,0 +1,27 @@
+
+
+
+
+Created by potrace 1.14, written by Peter Selinger 2001-2017
+
+
+
+
+
diff --git a/zh/site.webmanifest b/zh/site.webmanifest
new file mode 100644
index 000000000..c00b17332
--- /dev/null
+++ b/zh/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-256x256.png",
+ "sizes": "256x256",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/zh/sitemap.xml b/zh/sitemap.xml
new file mode 100644
index 000000000..0c9b8774d
--- /dev/null
+++ b/zh/sitemap.xml
@@ -0,0 +1,272 @@
+
+
+
+https://pactus.org/2022/08/29/dev-meeting.html
+2022-08-29T00:00:00+00:00
+
+
+https://pactus.org/2022/09/04/dev-meeting.html
+2022-09-04T00:00:00+00:00
+
+
+https://pactus.org/2022/09/18/dev-meeting.html
+2022-09-18T00:00:00+00:00
+
+
+https://pactus.org/2022/09/20/release-0-9-0.html
+2022-09-20T00:00:00+00:00
+
+
+https://pactus.org/2022/09/24/testnet-0-launched.html
+2022-09-24T00:00:00+00:00
+
+
+https://pactus.org/2022/10/30/dev-meeting.html
+2022-10-30T00:00:00+00:00
+
+
+https://pactus.org/2022/11/24/release-0-9-1.html
+2022-11-24T00:00:00+00:00
+
+
+https://pactus.org/2023/03/01/what-is-testnet.html
+2023-03-01T00:00:00+00:00
+
+
+https://pactus.org/2023/04/21/testnet-0-concluded.html
+2023-04-21T00:00:00+00:00
+
+
+https://pactus.org/2023/05/08/release-0-10-0.html
+2023-05-08T00:00:00+00:00
+
+
+https://pactus.org/2023/05/09/testnet-1-launched.html
+2023-05-09T00:00:00+00:00
+
+
+https://pactus.org/2023/05/29/release-0-11-0.html
+2023-05-29T00:00:00+00:00
+
+
+https://pactus.org/2023/06/19/release-0-12-0.html
+2023-06-19T00:00:00+00:00
+
+
+https://pactus.org/2023/07/01/release-0-13-0.html
+2023-07-01T00:00:00+00:00
+
+
+https://pactus.org/2023/07/05/testnet-500-validators.html
+2023-07-05T00:00:00+00:00
+
+
+https://pactus.org/2023/07/09/dev-meeting.html
+2023-07-09T00:00:00+00:00
+
+
+https://pactus.org/2023/08/01/testnet-1-concluded.html
+2023-08-01T00:00:00+00:00
+
+
+https://pactus.org/2023/08/22/dev-report.html
+2023-08-22T00:00:00+00:00
+
+
+https://pactus.org/2023/09/04/introduction-to-pips.html
+2023-09-04T00:00:00+00:00
+
+
+https://pactus.org/2023/09/24/dev-report-pre-testnet-2.html
+2023-09-24T00:00:00+00:00
+
+
+https://pactus.org/2023/09/28/how-sspos-works-in-simple-word.html
+2023-09-28T00:00:00+00:00
+
+
+https://pactus.org/2023/10/15/release-0-15-0.html
+2023-10-15T00:00:00+00:00
+
+
+https://pactus.org/2023/10/15/testnet-2-launched.html
+2023-10-15T00:00:00+00:00
+
+
+https://pactus.org/2023/10/29/release-0-16-0.html
+2023-10-29T00:00:00+00:00
+
+
+https://pactus.org/2023/11/12/release-0-17-0.html
+2023-11-12T00:00:00+00:00
+
+
+https://pactus.org/2023/12/12/release-0-18-0.html
+2023-12-12T00:00:00+00:00
+
+
+https://pactus.org/2024/01/04/release-0-19-0.html
+2024-01-04T00:00:00+00:00
+
+
+https://pactus.org/2024/01/08/mainnet-announcement.html
+2024-01-08T00:00:00+00:00
+
+
+https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminter.html
+2024-01-10T00:00:00+00:00
+
+
+https://pactus.org/2024/01/11/release-0-20-0.html
+2024-01-11T00:00:00+00:00
+
+
+https://pactus.org/2024/01/22/testnet-2-concluded.html
+2024-01-22T00:00:00+00:00
+
+
+https://pactus.org/2024/01/24/mainnet-launched.html
+2024-01-24T20:24:00+00:00
+
+
+https://pactus.org/2024/01/31/release-1-0-0.html
+2024-01-31T00:00:00+00:00
+
+
+https://pactus.org/2024/02/10/release-1-0-1.html
+2024-02-10T00:00:00+00:00
+
+
+https://pactus.org/2024/02/18/release-1-0-2.html
+2024-02-18T00:00:00+00:00
+
+
+https://pactus.org/blog/
+
+
+https://pactus.org/
+
+
+https://pactus.org/community/
+
+
+https://pactus.org/contributing/
+
+
+https://pactus.org/user-guides/run-pactus-docker/
+
+
+https://pactus.org/user-guides/send-transactions-gui/
+
+
+https://pactus.org/user-guides/grpc-sign-transactions/
+
+
+https://pactus.org/user-guides/reduce-network/
+
+
+https://pactus.org/user-guides/run-pactus-cli/
+
+
+https://pactus.org/user-guides/run-pactus-metrics/
+
+
+https://pactus.org/user-guides/run-pactus-gui/
+
+
+https://pactus.org/user-guides/use-wallet-cli/
+
+
+https://pactus.org/user-guides/
+
+
+https://pactus.org/download/
+
+
+https://pactus.org/term-of-use/
+
+
+https://pactus.org/about/what-is-pactus/
+
+
+https://pactus.org/about/roadmap/
+
+
+https://pactus.org/about/faq/
+
+
+https://pactus.org/learn/blockchain/block/
+
+
+https://pactus.org/learn/blockchain/state-hash/
+
+
+https://pactus.org/learn/blockchain/account/
+
+
+https://pactus.org/learn/blockchain/genesis/
+
+
+https://pactus.org/learn/blockchain/validator/
+
+
+https://pactus.org/learn/blockchain/cryptography/
+
+
+https://pactus.org/learn/blockchain/address/
+
+
+https://pactus.org/learn/blockchain/incentive/
+
+
+https://pactus.org/learn/blockchain/serialization/
+
+
+https://pactus.org/learn/consensus/specification/
+
+
+https://pactus.org/learn/consensus/proof-of-stake/
+
+
+https://pactus.org/learn/consensus/protocol/
+
+
+https://pactus.org/learn/consensus/parameters/
+
+
+https://pactus.org/learn/consensus/committee/
+
+
+https://pactus.org/learn/consensus/sortition/
+
+
+https://pactus.org/learn/smart-contract/storage/
+
+
+https://pactus.org/learn/transaction/transfer/
+
+
+https://pactus.org/learn/transaction/fee/
+
+
+https://pactus.org/learn/transaction/withdraw/
+
+
+https://pactus.org/learn/transaction/unbond/
+
+
+https://pactus.org/learn/transaction/bond/
+
+
+https://pactus.org/learn/transaction/format/
+
+
+https://pactus.org/learn/transaction/sortition/
+
+
+https://pactus.org/learn/api/grpc/
+
+
+https://pactus.org/learn/
+
+
diff --git a/zh/term-of-use/index.html b/zh/term-of-use/index.html
new file mode 100644
index 000000000..c34d5c6d1
--- /dev/null
+++ b/zh/term-of-use/index.html
@@ -0,0 +1,560 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Term of Use | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Terms of Use
+
+
Welcome to Pactus.
+
+
By using our website or services, you agree to these Terms of Use (“Terms”).
+Please review them carefully.
+If you do not accept the Terms, please do not use our website or services.
+
+
We may update the Terms occasionally.
+Your continued use of our website or services after any changes means you accept the updates.
+If you do not agree to the updates, please stop using our website and services.
+
+
“We,” “us,” “our,” and “Pactus” refer to the Pactus Blockchain Project. “You” refers to each user of our
+website or services.
+
+
Website Access and Modifications
+
+
We strive to provide continuous website access but cannot guarantee uninterrupted or error-free service.
+Pactus is not liable for any inaccessible features or website unavailability.
+
+
We may modify, expand, limit, or discontinue any part of the website or
+services at any time to accommodate users or for other reasons, without notice.
+We reserve the right to suspend website access temporarily or permanently, at our discretion, without notice.
+
+
Users may need to update their computer hardware or software to access some website content or features.
+Pactus is not responsible for any inability to access the website or services due to user systems,
+internet networks, or other causes.
+
+
Age Limit
+
+
Our website and services are not intended for those under 18.
+If you are under 18, you may only use this website with the supervision of a parent, guardian, or other responsible adult.
+
+
No Personalized Advice
+
+
This website does not provide individualized legal, tax, financial, or investment advice.
+Since everyone’s situation is different, we recommend consulting a qualified professional for financial decisions.
+
+
PAC coin is meant to be used as a medium of exchange.
+Nothing on this website should be considered investment advice or a solicitation to
+buy, hold, invest in, own, or use PAC coin.
+
+
No Content Guarantees
+
+
We cannot guarantee the accuracy, completeness, or quality of the information on this website.
+All content is provided on an “as is” and “as available” basis, and use is at your own risk.
+
+
The content may be sourced from third parties.
+Pactus is not responsible for any errors, omissions, or inaccuracies.
+The information may not suit everyone and may only apply to certain regions.
+
+
It is your responsibility to evaluate if the information and services are technically and legally suitable for
+your intended use and comply with applicable laws.
+Always verify any information before using it for personal, financial, or business purposes.
+
+
We may modify website content and services at any time without notice.
+We are not obligated to inform you of any changes or corrections.
+
+
External Content
+
+
Any testimonials, opinions, advice, offers, or other third party content on this website reflect the views
+and intentions of those parties/people only.
+They do not represent the views of Pactus.
+
+
We do not guarantee the accuracy, completeness, reliability, or usefulness of external content.
+Users are responsible for assessing external content.
+Pactus is not liable for any damage or loss from relying on or using third party content.
+
+
User Generated Content
+
+
By posting or submitting any material to this website, including the forum, you grant Pactus a
+worldwide, fully paid-up, non-exclusive license to edit and display your materials on our website and
+social media platforms as we deem appropriate.
+
+
You agree to indemnify and hold harmless Pactus and its Users from any third-party claims arising from
+your materials.
+You also represent that you own or have the right to post the materials, that they are
+accurate, their use on the Pactus website complies with laws, and they will not cause harm to any
+person.
+
+
Pactus has the right to remove any materials we deem objectionable, offensive, illegal, harmful, or in
+violation of these Terms.
+We may disclose user information if legally required.
+
+
Please contact info@pactus.org to request the removal of your posted content for reasons such as
+privacy concerns, copyright issues, or no longer wanting your content to appear publicly.
+We will review removal requests on a case-by-case basis.
+
+
File Safety and Security
+
+
Pactus implements measures to protect downloadable files on our website but cannot guarantee they
+are free of infections, viruses, or harmful code.
+
+
We are also not responsible if users’ devices are infected by visiting our website or downloading files in
+the event of a security breach.
+
+
If uncertain, users should consider compiling Pactus from the provided source code.
+Users are responsible for meeting their own security requirements.
+
+
+
+
Pactus works with reputable partners, but does not endorse or take responsibility for sponsored content claims.
+We do not review, recommend, or endorse any products or services promoted on our site.
+
+
Pactus is not liable for damages from misuse of personal information given to sponsors.
+We are also not responsible for losses from using sponsor links or services on our site.
+
+
External Links
+
+
For user convenience, our website may contain links to external sites and resources.
+However, we do not control these external sites and are not responsible for
+their content, products, services, or information.
+
+
Link inclusion does not imply Pactus endorsement or affiliation.
+Users should be aware they may leave our website by clicking links.
+External site terms of use may differ from ours.Pactus is not responsible for
+losses from users following links to external sites.
+We encourage caution and reviewing external sites’ terms and policies before transacting or engaging.
+
+
Electronic Communications
+
+
Our website responses and email communications will be delivered electronically.
+Pactus reserves the right to disclose any user emails or objectionable material
+to comply with legal processes or protect the
+rights and property of Pactus, its customers, suppliers, and users.
+
+
No Financial Services
+
+
This website does not engage in storing, selling, buying, sending, or receiving Pactus coins.
+All activities related to owning and transferring Pactus coins occur on the DEX/CEX/decentralized Pactus network.
+This website does not actively participate in that network.
+
+
No Liability
+
+
Pactus assumes no liability for any damages, claims, or losses related to using Pactus.
+This includes third party actions or inactions and events.
+
+
It includes but is not limited to: security issues when using Pactus software/services, technical problems
+when using Pactus software/services, software or data corruption when using Pactus software/services,
+or user errors when using Pactus software/services.
+
+
Disclaimer of Warranties
+
+
Pactus expressly disclaims all warranties, representations, and conditions, whether express or implied,
+including but not limited to the implied warranties and conditions of merchantability, fitness for a
+particular purpose, and non-infringement.
+
+
This disclaimer extends to the use of this website and its services, as well as the accuracy, completeness,
+timeliness, or currentness of its content, in any manner and for any purpose.
+
+
No Consequential Damages
+
+
Under no circumstances will Pactus be liable for any incidental, special, consequential, exemplary,
+indirect, or other damages arising from use of this website, its services, or content.
+This includes but is not limited to data loss, even if advised of such damage possibilities.
+
+
This disclaimer applies whether based on contract, tort, negligence, product liability, strict liability, or otherwise.
+It extends to all potential scenarios and circumstances.
+
+
General
+
+
These Terms of Use (TOU) and any applicable Terms of Service are the full agreement for website use by
+users and Pactus. They replace previous agreements.
+
+
If Pactus or a user does not exercise a TOU right, this does not waive the right. If a TOU provision is
+invalid, the rest remain valid.
+
+
The TOU and Terms of Service are intentionally in English, the governing language for Pactus and users.
+
+
Copyright
+
+
Attributed Content
+
+
Logos for operating systems, platforms, and sponsors we support are copyrighted by their respective owners.
+Pactus does not own these copyrights but uses the logos with permission or in a clear, non- harmful way.
+
+
Privacy Policy
+
+
Data Collection and Use
+
+
We collect standard server logs from our website.
+This data helps provide site statistics, improve content and information flow, analyze errors, and diagnose dead links.
+A segment of server logs gathers download statistics to better understand user needs.
+
+
+ Last update: 25 January 2024
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/user-guides/grpc-sign-transactions/index.html b/zh/user-guides/grpc-sign-transactions/index.html
new file mode 100644
index 000000000..9f0fce63c
--- /dev/null
+++ b/zh/user-guides/grpc-sign-transactions/index.html
@@ -0,0 +1,523 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to sign transaction using gRPC? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to sign transaction using gRPC?
+
+
Preface
+
+
The Pactus Blockchain provides a gRPC interface that allows users to interact with the blockchain and native wallet.
+This is ideal for merchants and users who want to create, sign, and broadcast transactions using their local node.
+This tutorial will guide you step-by-step on how to use gRPC to sign transactions.
+
+
Setup node
+
+
Initialize the node
+
+
To follow along with this tutorial, you’ll first need to set up and run a localnet blockchain, which is suitable for testing:
+
+
./build/pactus-daemon init \
+ --localnet \
+ --working-dir ./pactus-localnet \
+ --password "super-secret-password" \
+ --val-num 7 \
+ --restore "fish cool avoid history kitten quick olive purchase blossom grocery cool treat"
+
+
+
This command initializes a Pactus blockchain as a localnet.
+The purpose of this network is for testing.
+The above command actually restores a node from the given mnemonic.
+This helps you to create the same wallet with this tutorial. The first two addresses in this wallet are:
+
+
tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6
+tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7
+
+
+
We are going to transfer 1 PAC from the first account to the second one.
+
+
Run the node
+
+
Now you can run the node simply with this command:
+
+
./build/pactus-daemon start \
+ --working-dir ./pactus-localnet \
+ --password "super-secret-password"
+
+
+
By running the node, you will see that it starts creating blocks, and
+therefore the reward account address will be rewarded locally.
+We can use this balance for testing purposes.
+
+
Interact with the node
+
+
Open another terminal and run the following command:
+
+
./pactus-ctl --server-addr localhost:50052 \
+ blockchain get-blockchain-info
+
+
+
It should print information about the localnet blockchain.
+The pactus-ctl
application uses gRPC to interact with the blockchain.
+In this tutorial, we use pactus-ctl
to interact with the blockchain.
+You can either use gRPC-gateway REST APIs or make direct gRPC calls to interact with the node.
+They are more or less similar and all interact with the node using gRPC endpoints.
+
+
Signing Transitions
+
+
Create raw transaction
+
+
To sign a transaction, we first need to create a raw transaction and then sign it.
+We can use the get_raw_transfer_transaction
method to create a raw transfer transaction.
+Similar methods can be used to create raw bond, unbond, and withdraw transactions.
+
+
./pactus-ctl --server-addr localhost:50052 \
+ transaction get-raw-transfer-transaction \
+ --sender tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6 \
+ --receiver tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7 \
+ --amount 1
+{
+ "rawTransaction" : "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+}
+
+
+
The sender account is the first reward address in the wallet, therefore it should have some coins in its account.
+
+
Please note that the amount here is in atomic units.
+There is a Working-In-Progress PR to accept and return all amounts in PAC units (10^9).
+
+
Sign transaction
+
+
Now you can sign this raw transaction. To sign a transaction, first, we need to load a wallet.
+At the time of writing this document, Pactus only supports the “default_wallet”.
+Soon, creating wallets through gRPC and loading them will be supported.
+
+
./pactus-ctl --server-addr localhost:50052 \
+ wallet load-wallet --wallet-name "default_wallet"
+{
+ "walletName" : "default_wallet"
+}
+
+
+
Now that the “default_wallet” is loaded, we can proceed to sign the raw transaction:
+
+
./pactus-ctl --server-addr localhost:50052 \
+ wallet sign-raw-transaction \
+ --wallet-name "default_wallet" \
+ --password "super-secret-password" \
+ --raw-transaction "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+{
+ "transactionId" : "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA=" ,
+ "signedRawTransaction" : "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+}
+
+
+
Transaction successfully signed.
+
+
Broadcast signed transaction
+
+
Now you can broadcast the signed transaction:
+
+
./pactus-ctl --server-addr localhost:50052 \
+ transaction broadcast-transaction \
+ --signed-raw-transaction "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+{
+ "id" : "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA="
+}
+
+
+
Transaction successfully broadcasted.
+
+
Production Security Considerations
+
+
In this tutorial, we utilized a localnet version of Pactus.
+For production purposes, you’ll need to set up the node for the Mainnet and synchronize it with the network.
+Additionally, in production, the wallet service is disabled by default.
+You can enable the wallet service in the configuration file.
+
+
When signing transactions in production, you need to prioritize the security of the wallet.
+Make sure you have set a strong password for the native wallet.
+Ensure that it is called on localhost for safety.
+If you intend to call it on a remote server, there are several security measures to consider:
+
+
+ Ensure SSL is installed using Nginx to secure the connections.
+ Secure the API using a password (currently under development; see here: PIP-20 ).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/user-guides/index.html b/zh/user-guides/index.html
new file mode 100644
index 000000000..87bf6297a
--- /dev/null
+++ b/zh/user-guides/index.html
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 用户指南 | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
用户指南
+
+
在这里,您可以找到一些指南,帮助您使用和与帕图斯区块链进行交互。
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/user-guides/reduce-network/index.html b/zh/user-guides/reduce-network/index.html
new file mode 100644
index 000000000..e04084a56
--- /dev/null
+++ b/zh/user-guides/reduce-network/index.html
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to reduce the network usage? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to reduce the network usage?
+
+
Preface
+
+
Pactus is designed for low traffic usage.
+However, some users still face bandwidth limitations imposed by their Internet Service Providers (ISPs).
+This guide will explore effective ways to reduce networking usage for a Pactus node.
+
+
Reducing the number of connection
+
+
By default, Pactus attempts to maintain 64 open connections with other nodes,
+split into 32 inbound and 32 outbound connections.
+To reduce networking usage, you can decrease this maximum number of connections.
+However, it’s important to remember that more connections with
+peers usually enable the node to function more effectively and securely.
+The max_connections
setting in the config file can be adjusted to manage the maximum number of connections.
+
+
Disabling Relay
+
+
A relay connection is a type of connection that can be established between two peers,
+usually behind a NAT, by a third-party peer known as a relay.
+This is especially helpful when users run Pactus on a private network like home internet.
+However, the relay connection is not as stable as a direct connection.
+Disabling the relay connection may reduce network usage.
+If you have a reliable and public IP address, you can disable the relay connection.
+The relay connection is enabled by default. To disable the relay connection,
+set enable_relay
to false
inside the config file.
+
+
Disabling Node-Network service
+
+
A node-network is a type of node that provides historical data, such as blocks,
+to other nodes so they can sync with the network.
+By default, this service is enabled.
+Disabling this service helps reduce traffic usage.
+Keep in mind that new nodes rely on other nodes to be able to sync.
+To disable the node-network service, set node_network
to false
.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/user-guides/run-pactus-cli/index.html b/zh/user-guides/run-pactus-cli/index.html
new file mode 100644
index 000000000..573777a10
--- /dev/null
+++ b/zh/user-guides/run-pactus-cli/index.html
@@ -0,0 +1,546 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 如何以命令行模式运行帕图斯? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
如何以命令行模式运行帕图斯?
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
Preface
+
+
Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI).
+This tutorial will guide you through the steps to run Pactus in CLI mode, suitable for advanced users.
+
+
Prerequisites
+
+
Before proceeding with the steps below, ensure that you have the following:
+
+
+ A computer running Windows, macOS, or Linux
+ Suitable internet connection
+
+
+
Download
+
+
To get started, download and extract the Pactus CLI file from
+here .
+
+
Initializing the node
+
+
Now you need to create a wallet and setup a working directory for your node.
+A working directory is a place where you save blockchain data and wallets.
+Open the Terminal and run the following command:
+
+
+
+
+
+
+
./pactus-daemon init -w ~/pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus
.
+
+
+
+
+
+
+
./pactus-daemon init -w ~/pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus
.
+
+
+
+
+
+
+
pactus-daemon.exe init -w c:\pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at c:\pactus
.
+
+
+
+
+
+
+
Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future
+in case your computer is lost, damaged, or stolen.
+
+
The working directory contains:
+
+
+ Default wallet
+ Genesis file
+ Config file
+
+
+
Feel free to take a look at these files.
+
+
Running the node
+
+
Now you can start the node and sync with the network. Run the following command in the Terminal:
+
+
+
+
+
+
+
./pactus-daemon start -w ~/pactus
+
+
+
+
+
+
+
+
./pactus-daemon start -w ~/pactus
+
+
+
+
+
+
+
+
pactus-daemon.exe start -w c:\pactus
+
+
+
+
+
+
+
+
When the Pactus node starts running, it begins syncing with the network.
+This process may take some time, as your node needs to download and verify the entire blockchain history.
+Please be patient while your node syncs.
+
+
To become a validator and participate in the
+consensus algorithm to earn rewards, you first need to
+stake some coins. In the next
+tutorial ,
+we will explain how to send a Bond transaction to become a validator.
+
+
+
+
By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network.
+Thank you for your participation!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/user-guides/run-pactus-docker/index.html b/zh/user-guides/run-pactus-docker/index.html
new file mode 100644
index 000000000..8295d834d
--- /dev/null
+++ b/zh/user-guides/run-pactus-docker/index.html
@@ -0,0 +1,559 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 如何使用Docker运行帕图斯? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
如何使用Docker运行帕图斯?
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
Preface
+
+
Docker is a tool that simplifies the process of creating, deploying, and running applications using containers.
+With containers, developers can bundle all the necessary parts of an application, including libraries and dependencies,
+and deploy them as a single package.
+
+
In this document, we will guide you on how to run Pactus using Docker, step by step.
+
+
Prerequisites
+
+
The only thing you need is installing docker in your machine.
+If you are using Windows please make sure you have installed WSL.
+
+
Docker Images
+
+
The Pactus docker images are available at Docker Hub .
+You can pull the latest image with this command:
+
+
docker pull pactus/pactus
+
+
+
Initializing the node
+
+
Now you need to create a wallet and setup a working directory for your node.
+A working directory is a place where you save blockchain data and wallets.
+Open the Terminal and run the following command:
+
+
+
+
+
+
+
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus/testnet
.
+
+
+
+
+
+
+
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at ~/pactus/testnet
.
+
+
+
+
+
+
+
docker run -it --rm -v c:\pactus\testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+
+
This command creates your wallet and setup the working working directory at c:\pactus\testnet
.
+
+
+
+
+
+
+
Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future
+in case your computer is lost, damaged, or stolen.
+
+
The working directory contains:
+
+
+ Default wallet
+ Genesis file
+ Config file
+
+
+
Feel free to take a look at these files.
+
+
Running the node
+
+
Now you can start the node and sync with the network. Run the following command in the Terminal:
+
+
+
+
+
+
+
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+
+
+
+
+
+
+
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+
+
+
+
+
+
+
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+
+
+
+
+
+
+
To run pactus-testnet in background just add a -d flag in the command.
+
+
Hint: Remember to pass in your wallet passphrase as well with -p flag after /pactus.
+
+
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p { YOUR_PASSPHRASE}
+
+
+
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p { YOUR_PASSPHRASE }
+
+
+
You can stop/start docker:
+
+
docker stop pactus-testnet
+docker start pactus-testnet
+
+
+
Or check the logs:
+
+
docker logs pactus-testnet --tail 1000 -f
+
+
+
+
+
By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network.
+Thank you for your participation!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/user-guides/run-pactus-gui/code-certificate-warning.png b/zh/user-guides/run-pactus-gui/code-certificate-warning.png
new file mode 100644
index 000000000..029a877ff
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/code-certificate-warning.png differ
diff --git a/zh/user-guides/run-pactus-gui/default-wallet.png b/zh/user-guides/run-pactus-gui/default-wallet.png
new file mode 100644
index 000000000..dee6ba6eb
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/default-wallet.png differ
diff --git a/zh/user-guides/run-pactus-gui/index.html b/zh/user-guides/run-pactus-gui/index.html
new file mode 100644
index 000000000..6049db3bd
--- /dev/null
+++ b/zh/user-guides/run-pactus-gui/index.html
@@ -0,0 +1,514 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 如何以图形模式运行帕图斯? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
如何以图形模式运行帕图斯?
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
序言
+
+
Pactus 可以在不同的模式下运行,包括命令行界面 (CLI) 和图形用户界面 (GUI)。
+本教程将指导您完成在 GUI 模式下运行 Pactus,适合初学者到高级用户。
+
+
符合条件
+
+
在继续执行以下步骤之前,请确保您具备以下条件:
+
+
+ 运行 Windows、macOS 或 Linux 的计算机。
+ 互联网连接。
+
+
+
下载
+
+
从以下链接下载 Pactus GUI 安装程序。
+下链 .
+
+
代码证书警告
+
+
Windows 和 macOS 用户可能会遇到一条警告消息,指出 Pactus 是不受信任的应用程序。
+这是因为 Pactus 没有代码签名证书 。
+
+
+
+
代码证书是验证软件发行者的身份和真实性的数字签名。然而,获得代码证书的过程复杂且昂贵,需要注册公司并
+通过认识你的客户(KYC)检查。
+
+
由于 Pactus 是一个开源且基于社区的应用程序,所以我们还没有代码证书。
+因此,您可以安全地忽略警告消息并继续安装 Pactus。
+
+
安装
+
+
要安装 Pactus GUI,只需按照安装程序提供的说明步骤进行操作即可。该过程非常简单,与在计算机上安装任何其他应用程序类似。
+
+
+
+
初始化
+
+
当您第一次运行Pactus时,将出现一个向导界面,指导您完成钱包创建和初始化过程。这个过程由几个步骤组成:
+
+
初始化模式
+
+
在第一页上,您会被询问您要如何创建钱包。选择“开始创建新钱包” 选项,然后进入下一页。
+
+
+
+
钱包助记词
+
+
下一页将显示您的钱包助记词,由12个单词组成。安全备份此助记词至关重要,因为钱包恢复需要它以防您的计算机丢失、损坏或被盗。
+
+
+
+
警告: 确保您的钱包助记词的私密性和安全性。
+如果其他人获得了您的助记词,他们就可以控制您的钱包和资金。
+
+
助记词确认
+
+
在此步骤中,系统将要求您确认助记词。
+将您在上一步中收到的12个单词输入到对话框中。
+如果助记词输入正确,您将能够进入下一页。
+
+
+
+
钱包密码
+
+
在此页面上,您将被要求为您的钱包设置密码。
+在第一个对话框中输入强密码,并在第二个对话框中再输入同样密码确认。
+该密码将用于加密您的钱包并防止未经授权的访问。
+
+
+
+
注意:选择一个强密码并妥善保管。
+如果您忘记或丢失密码,您将需要助记词才能重新访问您的钱包。
+
+
验证者数量
+
+
Pactus 区块链中的每个节点最多可以运行32个验证器,每个验证器最多可以质押1000代币。在这里,您可以定义要为节点创建多少个验证器。
+根据您想要质押的代币数量选择验证器的数量。
+
+
+
+
如果你想质押超过32,000个代币,你需要建立一个新节点。
+
+
节点信息
+
+
初始化过程的最后一页显示节点信息,例如工作目录、验证器地址、
+以及奖励地址。查看此信息并单击“关闭”以完成初始化过程。
+
+
+
+
关闭向导界面后,您的 Pactus 节点将开始运行。您现在已准备好在GUI模式下使用 Pactus。
+
+
运行 Pactus 节点
+
+
完成初始化过程后,您就可以运行 Pactus 节点了。运行 Pactus 节点允许您与网络同步,使您能够查看和管理您的钱包和
+发送交易。
+
+
网络同步
+
+
当 Pactus 节点开始运行时,它开始与网络同步。这个过程可能需要一些时间,
+因为您的节点需要下载并验证整个区块链历史记录。
+您的节点同步时请耐心等待。
+
+
+
+
默认钱包
+
+
您可以检查“默认钱包”选项来访问您的钱包信息。请注意,显示的信息在同步完成之前可能不准确。
+
+
+
+
在“默认钱包”选项中,您可以查看您的帐户详细信息,包括您的余额和
+地址信息,例如验证器和奖励地址 。
+当您的计算机充当节点,您的验证器地址是被用来网络识别。
+奖励地址是您领取参与共识算法、提出新区块后所获得的奖励
+奖励 的账户地址。
+
+
成为验证者并参与共识算法要获得奖励,你首先需要
+质押 一些代币. 下一个
+教程 ,
+我们将教导如何发送契约交易以成为验证者。
+
+
+
+
通过运行 Pactus 节点,您可以为 Pactus 区块链网络的去中心化和安全性做出贡献。
+感谢您的参与!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/user-guides/run-pactus-gui/initialize-mode.png b/zh/user-guides/run-pactus-gui/initialize-mode.png
new file mode 100644
index 000000000..757a9518c
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/initialize-mode.png differ
diff --git a/zh/user-guides/run-pactus-gui/installing.png b/zh/user-guides/run-pactus-gui/installing.png
new file mode 100644
index 000000000..9025ff728
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/installing.png differ
diff --git a/zh/user-guides/run-pactus-gui/node-information.png b/zh/user-guides/run-pactus-gui/node-information.png
new file mode 100644
index 000000000..0f9f69d90
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/node-information.png differ
diff --git a/zh/user-guides/run-pactus-gui/number-of-validators.png b/zh/user-guides/run-pactus-gui/number-of-validators.png
new file mode 100644
index 000000000..4b97ca1b4
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/number-of-validators.png differ
diff --git a/zh/user-guides/run-pactus-gui/seed-confirmation.png b/zh/user-guides/run-pactus-gui/seed-confirmation.png
new file mode 100644
index 000000000..f6a644547
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/seed-confirmation.png differ
diff --git a/zh/user-guides/run-pactus-gui/syncing-progress.png b/zh/user-guides/run-pactus-gui/syncing-progress.png
new file mode 100644
index 000000000..d11797b50
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/syncing-progress.png differ
diff --git a/zh/user-guides/run-pactus-gui/wallet-password.png b/zh/user-guides/run-pactus-gui/wallet-password.png
new file mode 100644
index 000000000..c17c3b30c
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/wallet-password.png differ
diff --git a/zh/user-guides/run-pactus-gui/wallet-seed.png b/zh/user-guides/run-pactus-gui/wallet-seed.png
new file mode 100644
index 000000000..9f000acd8
Binary files /dev/null and b/zh/user-guides/run-pactus-gui/wallet-seed.png differ
diff --git a/zh/user-guides/run-pactus-metrics/index.html b/zh/user-guides/run-pactus-metrics/index.html
new file mode 100644
index 000000000..dc3ba1c8f
--- /dev/null
+++ b/zh/user-guides/run-pactus-metrics/index.html
@@ -0,0 +1,520 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ How to run Pactus Metrics? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to run Pactus Metrics?
+
+
Preface
+
+
Pactus can be run with metrics, providing you with the ability to monitor your node.
+This tutorial will guide you through the steps to run Pactus with metrics, suitable for advanced users.
+
+
Prerequisites
+
+
Before proceeding with the steps below, ensure that you have the following:
+
+
+
+
+
+
To Configure the Pactus Node for Metrics, navigate to the Pactus directory; by default, it’s located at the following path.
+
+
/home/YourUsername/pactus
+
+
+
There’s a file named config.toml
that contains all the configurations for your node.
+There are two parameters that you should enable for metrics: the first is enable_metrics
,
+and the second is enable http
. After editing the config.toml
you should restart your node.
+The metrics now can be accessed at http://localhost:80/metrics/prometheus
(this url going to be use by prometheus).
+
+
+
+if you are running Pactus with docker image, make sure to expose :80 port.
+
+
+
+
+
+
+
+
You should run Grafana and Prometheus for gathering metrics and displaying them in charts.
+First, create a directory named prometheus-grafana
. Inside the directory,
+create a docker-compose.yml
file and paste the code below.
+
+
services :
+ prometheus :
+ image : prom/prometheus
+ container_name : prometheus
+ command :
+ - " --config.file=/etc/prometheus/prometheus.yml"
+ ports :
+ - 9090:9090
+ restart : unless-stopped
+ volumes :
+ - ./prometheus:/etc/prometheus
+ - prom_data:/prometheus
+ grafana :
+ image : grafana/grafana
+ container_name : grafana
+ ports :
+ - 3000:3000
+ restart : unless-stopped
+ environment :
+ - GF_SECURITY_ADMIN_USER=admin
+ - GF_SECURITY_ADMIN_PASSWORD=admin
+ volumes :
+ - ./grafana:/etc/grafana/provisioning/datasources
+volumes : prom_data
+
+
+
You can change the default username and password of Grafana by modifying the values of GF_SECURITY_ADMIN_USER
and GF_SECURITY_ADMIN_PASSWORD
.
+Now, save the file. Then, in the current directory (meaning you are inside the prometheus-grafana
directory),
+create another directory named grafana
. Then, go to the directory. So now you’re in the path /prometheus-grafana/grafana/
.
+In the current directory, create a file named datasource.yml
and paste the code below there.
+
+
apiVersion : 1
+
+datasources :
+ - name : Prometheus
+ type : prometheus
+ url : http://prometheus:9090
+ isDefault : true
+ access : proxy
+ editable : true
+
+
+
Then save the file and exit.
+Now, we should go up one directory level from the current directory and navigate to the /prometheus-grafana
directory.
+In the current directory, which is /prometheus-grafana
, create another directory named prometheus
,
+then go into the directory.In the prometheus directory create a file named prometheus.yml
and paste below code there.
+
+
global :
+ scrape_interval : 15s
+ scrape_timeout : 10s
+ evaluation_interval : 15s
+alerting :
+ alertmanagers :
+ - static_configs :
+ - targets : []
+ scheme : http
+ timeout : 10s
+ api_version : v1
+scrape_configs :
+ - job_name : prometheus
+ honor_timestamps : true
+ scrape_interval : 15s
+ scrape_timeout : 10s
+ metrics_path : /metrics/prometheus
+ scheme : http
+ static_configs :
+ - targets :
+ - 127.0.0.1
+
+
+
Then save the file and exit.
+
+
+
+Tip: In the last section of the code, you will see the targets section where I’ve written 127.0.0.1.
+You can change it based on your localhost IP or your website domain.
+Please be aware that your target should match with your node http port.
+The default http port of pactus node is 80.
+
+
+
+
Run Grafana and Prometheus
+
+
Go to the /prometheus-grafana
directory where the docker-compose.yml
is located and run the command below.
+
+
+
+
Congratulations! Grafana and Prometheus are now up and accessible at ports 3000
and 9090
respectively.
+
+
Import Pactus Metrics to Grafana Dashboard
+
+
As Pactus uses libp2p
for its peer-to-peer network, we should import libp2p
metrics that you can find here .
+Download one of the metrics config and then Import it into Grafana Dashboard
.
+
+
Congratulations! You did it. Now, you can perform the same operations for other configurations.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/user-guides/send-transactions-gui/bond-transaction-dialog.png b/zh/user-guides/send-transactions-gui/bond-transaction-dialog.png
new file mode 100644
index 000000000..4c06bcea4
Binary files /dev/null and b/zh/user-guides/send-transactions-gui/bond-transaction-dialog.png differ
diff --git a/zh/user-guides/send-transactions-gui/index.html b/zh/user-guides/send-transactions-gui/index.html
new file mode 100644
index 000000000..c2d605a75
--- /dev/null
+++ b/zh/user-guides/send-transactions-gui/index.html
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 如何在图形模式下发送交易? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
如何在图形模式下发送交易?
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
序言
+
+
Pactus 区块链提供了一个图形用户界面 (GUI), 带有内置钱包来创建, 签署并广播交易。
+本教程旨在逐步指导您如何使用 GUI 应用程序将交易发送到 Pactus 区块链。
+无论您是初学者还是高级用户, 本教程都适合您。
+
+
符合条件
+
+
在开始之前, 您需要运行 Pactus GUI 应用程序并确保它与网络同步。
+您可以在此教程 中学习如何运行Pactus GUI。
+
+
发送转账交易
+
+
如要发送转账交易 , 点击“交易”菜单并选择“转账”。
+这将打开一个新窗口, 您可以在其中选择您希望发送转账的
+账户 地址, 以及收款人的帐户地址和您希望发送的金额。
+
+
审核交易详情并确保其正确后, 单击“发送”按钮签署交易并将其广播到 Pactus 区块链。
+
+
+
+
需要注意的是, 交易费用 将根据您发送的金额进行计算。
+
+
发送契约交易
+
+
如要发送契约交易 , 点击“交易”菜单并选择“契约”。
+
+
点击后将出现一个新窗口, 您可以在其中选择您希望发送转账的账户地址, 以及验证器 地址和您希望发送的质押金额。
+
+
如果验证器地址尚未在 Pactus 区块链上注册,您将需要提供验证器的公钥作为第一笔质押交易。这将在 Pactus 区块链上创建及验证您的验证器。
+要获取公钥, 您可以钱包中右键单击验证者地址并选择“详细信息”。
+
+
+
+
需要注意的是, 交易费用 将根据您发送的金额进行计算。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zh/user-guides/send-transactions-gui/transfer-transaction-dialog.png b/zh/user-guides/send-transactions-gui/transfer-transaction-dialog.png
new file mode 100644
index 000000000..3dddf68a3
Binary files /dev/null and b/zh/user-guides/send-transactions-gui/transfer-transaction-dialog.png differ
diff --git a/zh/user-guides/use-wallet-cli/index.html b/zh/user-guides/use-wallet-cli/index.html
new file mode 100644
index 000000000..5d959de81
--- /dev/null
+++ b/zh/user-guides/use-wallet-cli/index.html
@@ -0,0 +1,1146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 如何在命令行模式下使用钱包? | 帕图斯区块链
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+ 资料
+
+
+ 下载
+
+
+ 博客
+
+
+
+ 资源
+
+
+
+
+
+
+ 中文
+
+
+
+
+
+
+
+ Toggle theme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
如何在命令行模式下使用钱包?
+
+
+ 该翻译已过时。您可以阅读它,但可能不准确。
+
Preface
+
+
The Pactus Blockchain provides a wallet application that allows users to interact with the Pactus blockchain
+without the need to run a node.
+This is ideal for users who do not wish to operate a node but still want to create a personal wallet to manage their funds.
+This tutorial will guide you step-by-step on how to use the wallet application.
+
+
Download
+
+
To get started, download and extract the Pactus CLI file from
+here .
+
+
+
+
Wallet commands
+
+
In this section, we will explore various wallet commands that help you create, manage,
+and recover your Pactus wallet.
+
+
Create a wallet
+
+
First, you need to create a wallet. To create a new wallet, run the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 create
+
+
+
This command creates a new wallet and store it in the ~/pactus/wallets/wallet_1
.
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 create
+
+
+
This command creates a new wallet and store it in the ~/pactus/wallets/wallet_1
.
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 create --testnet
+
+
+
This command creates a new wallet and save it in the c:\pactus\wallets\wallet_1 directory.
+This command creates a new wallet and store it in the c:\pactus\wallets\wallet_1
.
+
+
+
+
+
+
+
Don’t forget to back up your wallet seed, as it allows you to recover your wallet if you lose it.
+
+
Wallet password
+
+
You can change the wallet password by tunning this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 password
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 password
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 password
+
+
+
+
+
+
+
+
If you forget your password, you can still recover your wallet using the wallet seed.
+
+
Wallet seed
+
+
You can obtain the wallet seed by running this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 seed
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 seed
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 seed
+
+
+
+
+
+
+
+
The wallet seed is encrypted within your wallet, and
+you’ll need to enter the wallet password to access it.
+
+
Recovering Wallet
+
+
If you lose your wallet, you can recover it by running this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/recovered_wallet recover
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/recovered_wallet recover
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\recovered_wallet recover
+
+
+
+
+
+
+
+
Please note that if you lose your seed, there is no way to recover your wallet.
+
+
+
+
Address commands
+
+
In this section, we’ll cover address commands that help you manage your wallet addresses.
+
+
Creating new address
+
+
You can create a new address by running this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address new
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address new
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 address new
+
+
+
+
+
+
+
+
You can also assign a label to your address to better organize your address book.
+
+
List of addresses
+
+
To view the list of wallet addresses, use this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address all
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address all
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 address all
+
+
+
+
+
+
+
+
Get Public key
+
+
To obtain the public key for a specific address, run this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
Replace <ADDRESS>
with the address for which you want to retrieve its public key.
+
+
Get Private key
+
+
You can get the public key of your address by this command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 address pub <ADDRESS>
+
+
+
+
+
+
+
+
Replace <ADDRESS>
with the address for which you want to retrieve its private key.
+Keep your private key secure. If someone gains access to your private key,
+they will have full control over that address.
+
+
+
+
Transaction commands
+
+
In this section, we’ll cover transaction commands that help you create, sign, and
+broadcast transactions on the Pactus Blockchain.
+You’ll need to provide the password to sign the transaction.
+Please note that once a transaction is broadcasted, it cannot be reversed.
+
+
Sending Transfer transaction
+
+
To create, sign, and broadcast a
+Transfer transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
In this command, <FROM>
should be one of the addresses in your wallet as the sender address,
+and <TO>
is the receiver address.
+
+
Sending Bond transaction
+
+
To create, sign, and broadcast a
+Bond transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
In this command, <FROM>
should be one of the addresses in your wallet as the sender address,
+and <TO>
is the receiver validator address.
+
+
If the validator associated with this address does not exist yet,
+you need to provide the public key to create it:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
Replace <PUBLIC_KEY>
with the validator’s public key,
+which is the public key of the <TO>
address.
+
+
Sending Unbond transaction
+
+
To create, sign, and broadcast a
+Unbond transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <ADDRESS>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <ADDRESS>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx unbond <ADDRESS>
+
+
+
+
+
+
+
+
In this command, <ADDRESS>
is the address of the validator that you want to unbond.
+
+
Sending Withdraw transaction
+
+
To create, sign, and broadcast a
+Withdraw transaction , use the following command:
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx withdraw <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
./pactus-wallet ~/pactus/wallets/wallet_1 tx withdraw <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx withdraw <FROM> <TO> <AMOUNT>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+