Skip to content

Commit cc1e653

Browse files
committed
_
1 parent 0f58e70 commit cc1e653

File tree

12 files changed

+110
-101
lines changed

12 files changed

+110
-101
lines changed

.cargo/config.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
[profile.rust]
2-
codegen-backend = "cranelift"
3-
41
[target.x86_64-unknown-linux-gnu]
2+
# Re-enabled mold after disabling cranelift (cranelift was the issue, not mold)
53
rustflags = [
64
"-C",
75
"link-arg=-fuse-ld=mold",

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "libs/nautilus_trader"]
2+
path = libs/nautilus_trader
3+
url = https://github.com/nautechsystems/nautilus_trader.git

Cargo.lock

Lines changed: 0 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
# cargo-features = ["codegen-backend"] # disabled due to aws-lc-rs incompatibility
2+
13
[workspace]
24
members = ["discretionary_engine", "discretionary_engine_*"]
5+
exclude = ["libs"]
36
resolver = "3"
47

58
default-members = ["discretionary_engine"]
@@ -29,3 +32,6 @@ v_utils = { version = "2.15.9", features = ["full"] }
2932
[patch.crates-io]
3033
v_utils = { path = "../v_utils/v_utils" }
3134
v_utils_macros = { path = "../v_utils/v_utils_macros" }
35+
36+
[profile.dev]
37+
# codegen-backend = "cranelift" # disabled due to aws-lc-rs incompatibility

discretionary_engine/Cargo.toml

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
cargo-features = ["codegen-backend"]
2-
31
[package]
42
name = "discretionary_engine"
53
version = "1.0.0"
@@ -31,10 +29,8 @@ futures-util = "0.3.31"
3129
hex = "^0.4.3"
3230
hmac = "^0.12.1"
3331
jiff = { workspace = true }
34-
#nautilus-bybit = { path = "/home/v/g/nautilus_trader/crates/adapters/bybit", default-features = false } #DEPRECATE
35-
#nautilus-model = { path = "/home/v/g/nautilus_trader/crates/model" } #DEPRECATE
36-
nautilus-bybit = { git = "https://github.com/nautechsystems/nautilus_trader", default-features = false }
37-
nautilus-model = { git = "https://github.com/nautechsystems/nautilus_trader" }
32+
nautilus-bybit = { path = "../libs/nautilus_trader/crates/adapters/bybit", default-features = false }
33+
nautilus-model = { path = "../libs/nautilus_trader/crates/model" }
3834
rand = { version = "0.9.2", features = ["small_rng"] }
3935
reqwest = { version = "0.12.24", features = ["json", "blocking"] }
4036
secrecy = { workspace = true }
@@ -65,6 +61,3 @@ lazy_static = "1.5.0"
6561

6662
[lints]
6763
workspace = true
68-
69-
[profile.dev]
70-
codegen-backend = "cranelift" #ga: comment out

discretionary_engine/src/adjust_pos.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ use std::sync::Arc;
22

33
use color_eyre::eyre::{Context, Result, bail};
44
use nautilus_bybit::{
5-
common::{
6-
credential::Credential,
7-
enums::{BybitEnvironment, BybitProductType},
8-
},
5+
common::enums::{BybitEnvironment, BybitProductType},
96
http::query::{BybitInstrumentsInfoParamsBuilder, BybitTickersParamsBuilder},
107
};
118
use nautilus_model::identifiers::InstrumentId;
@@ -188,10 +185,11 @@ pub(crate) async fn main(args: AdjustPosArgs, live_settings: Arc<LiveSettings>,
188185
if args.duration.is_some() {
189186
log!("Using WebSocket chase-limit execution with duration: {:?}", args.duration);
190187

191-
// Create credential for WebSocket (clone exchange_name since it was moved)
188+
// Get API credentials for WebSocket
192189
let config = live_settings.config()?;
193190
let exchange_config = config.get_exchange(exchange_name)?;
194-
let credential = Credential::new(exchange_config.api_pubkey.clone(), exchange_config.api_secret.expose_secret().to_string());
191+
let api_key = exchange_config.api_pubkey.clone();
192+
let api_secret = exchange_config.api_secret.expose_secret().to_string();
195193

196194
// Determine environment
197195
let environment = if testnet { BybitEnvironment::Testnet } else { BybitEnvironment::Mainnet };
@@ -200,9 +198,11 @@ pub(crate) async fn main(args: AdjustPosArgs, live_settings: Arc<LiveSettings>,
200198
// Format: "SYMBOL.VENUE" e.g., "BTCUSDT.BYBIT"
201199
let instrument_id = InstrumentId::from(format!("{}.BYBIT", symbol).as_str());
202200

203-
let filled_qty = crate::ws_chase_limit::execute_ws_chase_limit(&raw_client, credential, environment, &symbol, instrument_id, side, quantity, qty_step, tick_size, args.duration)
204-
.await
205-
.context("WebSocket chase-limit execution failed")?;
201+
let filled_qty = crate::ws_chase_limit::execute_ws_chase_limit(
202+
&raw_client, api_key, api_secret, environment, &symbol, instrument_id, side, quantity, qty_step, tick_size, args.duration,
203+
)
204+
.await
205+
.context("WebSocket chase-limit execution failed")?;
206206

207207
let filled_notional = filled_qty * current_price;
208208
println!("✅ Chase-limit execution completed!");

discretionary_engine/src/nuke.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ use std::sync::Arc;
22

33
use color_eyre::eyre::{Context, Result, bail};
44
use nautilus_bybit::{
5-
common::{
6-
credential::Credential,
7-
enums::{BybitEnvironment, BybitPositionSide, BybitProductType},
8-
},
5+
common::enums::{BybitEnvironment, BybitPositionSide, BybitProductType},
96
http::query::BybitPositionListParamsBuilder,
107
};
118
use nautilus_model::identifiers::InstrumentId;
@@ -89,10 +86,11 @@ pub(crate) async fn main(args: NukeArgs, live_settings: Arc<LiveSettings>, testn
8986
let qty_step: f64 = instrument.lot_size_filter.qty_step.parse().context("Failed to parse qtyStep")?;
9087
let tick_size: f64 = instrument.price_filter.tick_size.parse().context("Failed to parse tickSize")?;
9188

92-
// Create credential for WebSocket
89+
// Get API credentials for WebSocket
9390
let config = live_settings.config()?;
9491
let exchange_config = config.get_exchange(exchange_name)?;
95-
let credential = Credential::new(exchange_config.api_pubkey.clone(), exchange_config.api_secret.expose_secret().to_string());
92+
let api_key = exchange_config.api_pubkey.clone();
93+
let api_secret = exchange_config.api_secret.expose_secret().to_string();
9694

9795
// Determine environment
9896
let environment = if testnet { BybitEnvironment::Testnet } else { BybitEnvironment::Mainnet };
@@ -102,7 +100,7 @@ pub(crate) async fn main(args: NukeArgs, live_settings: Arc<LiveSettings>, testn
102100

103101
// Execute using WebSocket chase-limit
104102
let filled_qty = crate::ws_chase_limit::execute_ws_chase_limit(
105-
&_raw_client, credential, environment, &symbol, instrument_id, order_side, position_size, qty_step, tick_size, args.duration,
103+
&_raw_client, api_key, api_secret, environment, &symbol, instrument_id, order_side, position_size, qty_step, tick_size, args.duration,
106104
)
107105
.await
108106
.context("WebSocket chase-limit execution failed")?;

discretionary_engine/src/protocols/sar.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -199,29 +199,29 @@ mod tests {
199199
orders.push((i, maybe_order.map(|o| o.unsafe_stop_market().price)));
200200
}
201201

202-
let snapshot = snapshot_fonts::snapshot_plot_orders(&recorded_indicator_values, &orders);
203-
204-
insta::assert_snapshot!(snapshot, @r###"
205-
▆▄▃▁ 107.00
206-
▂▃████▆▄▁
207-
▂▅██████████▇▃▁
208-
▃▆███████████████▇ ▂▄
209-
███████████████████▂▅███
210-
▁▅█████████████████████████
211-
▂▅▂ ▃▆ ▇▄▂ ▅███████████████████████████
212-
███▆▂▁ ▃▄▅ ▅███▇▃▁ ███▆▃ ▄█████████████████████████████
213-
▃▂▁ ▆██████▄ ▅▆▆▆███▇███████ ▃▆▆██████ ▂▇██████████████████████████████
214-
▁▂▃▄▅████▅▄▂ ▇█████████████████████████ ▃▇█████████ ▄████████████████████████████████
215-
█████████████▆▆██████████████████████████ ▂▇█████████████████████████████████████████████
216-
█████████████████████████████████████████▁▆███████████████████████████████████████████████97.46
217-
──────────────────────────────────────────────────────────────────────────────────────────
218-
▂▄▆██ 105.66
219-
▄▅██████ ▂▄▅▇
220-
▁▄▆████████ █████
221-
▁▄▇███████████ █████
222-
▂▄▄ ▂▅██████████████ █████
223-
▄▅▅▆▇ ▂▅████ ▃▅████████████████ █████
224-
█████ ▁▄▇██████ ██████████████████ █████97.46
225-
"###);
202+
let snapshot = snapshot_fonts::snapshot_plot_orders(&recorded_indicator_values, &orders, false);
203+
204+
insta::assert_snapshot!(snapshot, @r"
205+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰫟󻤝󷰕󴟩󱮝󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥107.00
206+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰨟󴌑󵝙󿿽󿿽󿿽󿿽󻾪󶨌󱪐󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥
207+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󳘱󹈙󾱡󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿉󼲓󵶑󰷕󰧥󰧥󰧥󰧥󰧥󰧥
208+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󴿉󼃽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󽪕󰧥󰧥󰨟󴌾󸌱
209+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰩠󾱍󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󳰙󹐐󾵜󿿽󿿽
210+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧱󱘯󸸾󿴌󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽
211+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󳜭󹊹󲵕󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󵒵󺹉󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󼧙󷰕󳠩󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰩭󹀷󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽
212+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰪃󿿽󿿽󿿽󻦢󴓎󱹼󰧥󰧥󰧥󰧥󰧥󰧥󰨱󵓟󷸜󸲆󰧥󹦝󿿽󿿽󾭂󽰍󵹍󱽷󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󿿽󿿽󿿽󻚿󵉳󰧥󰧥󰧥󰧥󰧥󷈽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽
213+
󰧥󰧥󰧥󰧥󰨹󵱶󳷭󱪐󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰪃󺗉󿿽󿿽󿿽󿿽󿿽󿽹󷶗󰧥󰧥󹢡󺡡󻬕󼁂󿿽󿿽󿿽󽂽󿿽󿿽󿿽󿿽󿿽󿿽󿿜󰧥󰧥󰧥󰧥󰧥󰨨󴰷󺡥󺱺󿿽󿿽󿿽󿿽󿿯󿅉󰧥󰧥󳨡󽖩󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽
214+
󱒹󴏹󵎹󷨝󹬀󿿽󿿽󿿥󾠹󹾅󶥡󲹑󰧥󰧥󰪷󽣅󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿱󿐖󿰍󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󰧥󰧥󰧥󰧥󵼅󽓙󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿼃󰩆󶦺󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽
215+
󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󾤦󻜛󺶡󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󰧥󰧥󴄅󼣝󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿵󿠥󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽
216+
󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󰫡󺝥󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽97.46
217+
──────────────────────────────────────────────────────────────────────────────────────────
218+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󴏹󸈻󻼺󿌾󿼃󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥105.66
219+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧻󶝩󺑱󿀽󿿽󿿽󿿽󿿽󿼃󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󲮚󶞝󹫆󼜋
220+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰨀󲓌󷙹󼄽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿼃󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󾕩󿿽󿿽󿿽󿿽
221+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰫡󶮶󼜟󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿼃󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󿿽󿿽󿿽󿿽󿿽
222+
󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰨜󴁉󷼌󸈘󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󳐹󹶍󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿼃󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󿿽󿿽󿿽󿿽󿿽
223+
󶥡󸣡󹒱󺹉󼌴󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󳰙󹯧󾱡󿿽󿿽󿿽󰧥󰧥󰧥󰧥󰧥󰨹󵳝󺎱󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿼃󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󿿽󿿽󿿽󿿽󿿽
224+
󿿽󿿽󿿽󿿽󿼃󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰫡󷔱󽚥󿿽󿿽󿿽󿿽󿿽󿿽󰧥󰧥󰧥󰧥󰧥󰫟󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿿽󿼃󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󰧥󿿽󿿽󿿽󿿽󿿽97.46
225+
");
226226
}
227227
}

0 commit comments

Comments
 (0)