## Summary Third major cleanup wave after investigating 287 remaining root files. Archived historical reports, organized documentation, removed regeneratable artifacts, and fixed critical security issue. ## Files Cleaned (119 total) - Archived: 78 files (7 WAVE reports + 71 summaries) → docs/archive/ - Archived: 7 build logs → docs/archive/build_logs/ - Organized: 10 markdown files → docs/guides/ + docs/checklists/ - Deleted: 17 test/coverage artifacts (regeneratable) - Deleted: 7 empty/obsolete files (docker override, clippy baselines) - Deleted: 3 large files (119MB - .venv, ppo_hyperopt_output.txt, backup) ## Space Recovered - Total: ~120.7 MB - Large files: 119.25 MB (.venv, ppo_hyperopt_output.txt) - Archives: 1.04 MB (summaries + build logs) - Test artifacts: 980 KB ## Security Fix (CRITICAL) - Fixed: certs/security.env removed from git tracking (contained JWT secrets) - Updated: .gitignore to prevent future tracking of sensitive cert files - Removed: 4 files from git history (security.env, production.env.template, *.serial) ## Documentation Organization - Created: docs/archive/ (wave_reports/, summaries/, build_logs/) - Created: docs/guides/ (7 detailed implementation guides) - Created: docs/checklists/ (3 operational checklists) - Retained: 30 essential .md files in root (quick refs, CLAUDE.md) ## Investigation Reports Created - MARKDOWN_ORGANIZATION_REPORT.md - TXT_FILES_INVENTORY_AND_ARCHIVAL_PLAN.md - ROOT_CONFIG_FILES_ANALYSIS_REPORT.md - DOCKER_ROOT_FILES_ANALYSIS.md - DATABASE_INITIALIZATION_AND_SETUP_ANALYSIS.md - (6 additional investigation/index files) ## Cleanup Wave Progress - Wave 1: 899 files deleted (1,071,884 lines) - Wave 2: 543 files archived/deleted (~34GB) - Wave 3: 119 files archived/deleted/organized (~121MB) - Total: 1,561 files cleaned, ~35.1GB space recovered ## Result Root directory: 287 files → ~180 files (excluding investigation reports) Clean, organized, production-ready structure maintained. Related: Second cleanup wave (previous commit)
420 lines
16 KiB
Plaintext
420 lines
16 KiB
Plaintext
Blocking waiting for file lock on build directory
|
|
Compiling libc v0.2.176
|
|
Compiling num-rational v0.4.2
|
|
Compiling flate2 v1.1.3
|
|
Compiling bigdecimal v0.4.8
|
|
Compiling pulp v0.21.5
|
|
Compiling zip v1.1.4
|
|
Compiling ndarray v0.15.6
|
|
Compiling axum-core v0.4.5
|
|
Compiling simple_asn1 v0.6.3
|
|
Compiling rusticata-macros v4.1.0
|
|
Compiling dlib v0.5.2
|
|
Compiling instant v0.1.13
|
|
Compiling maybe-rayon v0.1.1
|
|
Compiling compact_str v0.8.1
|
|
Compiling dbn v0.22.1
|
|
Compiling env_logger v0.8.4
|
|
Compiling yeslogic-fontconfig-sys v6.0.0
|
|
Compiling asn1-rs v0.6.2
|
|
Compiling compression-codecs v0.4.31
|
|
Compiling hdrhistogram v7.5.4
|
|
Compiling png v0.17.16
|
|
Compiling num v0.4.3
|
|
Compiling av1-grain v0.2.4
|
|
Compiling png v0.18.0
|
|
Compiling image v0.24.9
|
|
Compiling der-parser v9.0.0
|
|
Compiling oid-registry v0.7.1
|
|
Compiling backtrace v0.3.76
|
|
Compiling getrandom v0.3.3
|
|
Compiling signal-hook-registry v1.4.6
|
|
Compiling getrandom v0.2.16
|
|
Compiling mio v1.0.4
|
|
Compiling rand_core v0.9.3
|
|
Compiling socket2 v0.6.0
|
|
Compiling rand_core v0.6.4
|
|
Compiling rand_chacha v0.9.0
|
|
Compiling ring v0.17.14
|
|
Compiling ahash v0.8.12
|
|
Compiling crypto-common v0.1.6
|
|
Compiling rand_chacha v0.3.1
|
|
Compiling rand v0.9.2
|
|
Compiling parking_lot_core v0.9.12
|
|
Compiling digest v0.10.7
|
|
Compiling openssl-sys v0.9.109
|
|
Compiling num_cpus v1.17.0
|
|
Compiling socket2 v0.5.10
|
|
Compiling hashbrown v0.14.5
|
|
Compiling rand v0.8.5
|
|
Compiling threadpool v1.8.1
|
|
Compiling sha2 v0.10.9
|
|
Compiling hmac v0.12.1
|
|
Compiling md-5 v0.10.6
|
|
Compiling parking_lot v0.12.5
|
|
Compiling hkdf v0.12.4
|
|
Compiling rand_distr v0.5.1
|
|
Compiling uuid v1.18.1
|
|
Compiling thrift v0.17.0
|
|
Compiling signal-hook v0.3.18
|
|
Compiling tokio v1.47.1
|
|
Compiling futures-intrusive v0.5.0
|
|
Compiling prometheus v0.14.0
|
|
Compiling mio v0.8.11
|
|
Compiling cipher v0.4.4
|
|
Compiling openssl v0.10.73
|
|
Compiling signal-hook-mio v0.2.4
|
|
Compiling universal-hash v0.5.1
|
|
Compiling half v2.6.0
|
|
Compiling dashmap v6.1.0
|
|
Compiling rustls-webpki v0.103.7
|
|
Compiling crossterm v0.28.1
|
|
Compiling polyval v0.6.2
|
|
Compiling aead v0.5.2
|
|
Compiling ctr v0.9.2
|
|
Compiling ghash v0.5.1
|
|
Compiling aes v0.8.4
|
|
Compiling poly1305 v0.8.0
|
|
Compiling chacha20 v0.9.1
|
|
Compiling hostname v0.4.1
|
|
Compiling arrow-buffer v56.2.0
|
|
Compiling gemm-common v0.18.2
|
|
Compiling sha1 v0.10.6
|
|
Compiling chacha20poly1305 v0.10.1
|
|
Compiling float8 v0.3.0
|
|
Compiling rustls v0.23.32
|
|
Compiling quanta v0.12.6
|
|
Compiling arrow-buffer v55.2.0
|
|
Compiling comfy-table v7.1.2
|
|
Compiling aes-gcm v0.10.3
|
|
Compiling gemm-f32 v0.18.2
|
|
Compiling gemm-c64 v0.18.2
|
|
Compiling arrow-data v56.2.0
|
|
Compiling gemm-f64 v0.18.2
|
|
Compiling gemm-c32 v0.18.2
|
|
Compiling gemm-f16 v0.18.2
|
|
Compiling cudarc v0.17.3
|
|
Compiling rustls-webpki v0.102.8
|
|
Compiling memmap2 v0.9.8
|
|
Compiling arrow-array v56.2.0
|
|
Compiling arrow-data v55.2.0
|
|
Compiling rand_distr v0.4.3
|
|
Compiling dashmap v5.5.3
|
|
Compiling tempfile v3.23.0
|
|
Compiling native-tls v0.2.14
|
|
Compiling gemm v0.18.2
|
|
Compiling ug v0.5.0
|
|
Compiling rustls v0.22.4
|
|
Compiling fs2 v0.4.3
|
|
Compiling arrow-array v55.2.0
|
|
Compiling governor v0.6.3
|
|
Compiling nalgebra v0.32.6
|
|
Compiling lz4-sys v1.11.1+lz4-1.10.0
|
|
Compiling nalgebra v0.33.2
|
|
Compiling lz4 v1.28.1
|
|
Compiling sysinfo v0.33.1
|
|
Compiling jsonwebtoken v9.3.1
|
|
Compiling x509-parser v0.16.0
|
|
Compiling dirs-sys v0.5.0
|
|
Compiling tokio-util v0.7.16
|
|
Compiling tokio-native-tls v0.3.1
|
|
Compiling async-compression v0.4.32
|
|
Compiling backon v1.5.2
|
|
Compiling h2 v0.4.12
|
|
Compiling tokio-stream v0.1.17
|
|
Compiling tower v0.5.2
|
|
Compiling tokio-rustls v0.26.4
|
|
Compiling sqlx-core v0.8.6
|
|
Compiling combine v4.6.7
|
|
Compiling opentelemetry_sdk v0.27.1
|
|
Compiling opentelemetry_sdk v0.23.0
|
|
Compiling tower-http v0.6.6
|
|
Compiling axum v0.8.6
|
|
Compiling opentelemetry-jaeger v0.22.0
|
|
Compiling arrow-select v56.2.0
|
|
Compiling dbn v0.42.0
|
|
Compiling ug-cuda v0.5.0
|
|
Compiling float8 v0.4.2
|
|
Compiling sqlx-postgres v0.8.6
|
|
Compiling tracing-opentelemetry v0.28.0
|
|
Compiling candle-core v0.9.1 (https://github.com/huggingface/candle?rev=671de1db#671de1db)
|
|
Compiling hyper v1.7.0
|
|
Compiling redis v0.27.6
|
|
Compiling arrow-cast v56.2.0
|
|
Compiling arrow-ipc v56.2.0
|
|
Compiling arrow-ord v56.2.0
|
|
Compiling arrow-string v56.2.0
|
|
Compiling hyper-util v0.1.17
|
|
Compiling tokio-rustls v0.25.0
|
|
Compiling tungstenite v0.21.0
|
|
Compiling arrow-row v56.2.0
|
|
Compiling arrow-arith v56.2.0
|
|
Compiling arrow-csv v56.2.0
|
|
Compiling hyper-rustls v0.27.7
|
|
Compiling hyper-tls v0.6.0
|
|
Compiling hyper-timeout v0.5.2
|
|
Compiling reqwest v0.12.23
|
|
Compiling tonic v0.14.2
|
|
Compiling sqlx v0.8.6
|
|
Compiling arrow-json v56.2.0
|
|
Compiling parquet v56.2.0
|
|
Compiling tokio-tungstenite v0.21.0
|
|
Compiling statrs v0.17.1
|
|
Compiling rustify v0.6.1
|
|
Compiling tonic-prost v0.14.2
|
|
Compiling vaultrs v0.7.4
|
|
Compiling object_store v0.11.2
|
|
Compiling candle-nn v0.9.1 (https://github.com/huggingface/candle?rev=671de1db#671de1db)
|
|
Compiling arrow v56.2.0
|
|
Compiling databento v0.34.1
|
|
Compiling candle-optimisers v0.10.0-alpha.1 (https://github.com/KGrewal1/optimisers#5cbb312e)
|
|
Compiling arrow-select v55.2.0
|
|
Compiling axum v0.7.9
|
|
Compiling tonic-reflection v0.14.2
|
|
Compiling tonic-health v0.14.2
|
|
Compiling arrow-cast v55.2.0
|
|
Compiling arrow-ord v55.2.0
|
|
Compiling arrow-string v55.2.0
|
|
Compiling arrow-row v55.2.0
|
|
Compiling arrow-ipc v55.2.0
|
|
Compiling arrow-arith v55.2.0
|
|
Compiling arrow-json v55.2.0
|
|
Compiling config v1.0.0 (/home/jgrusewski/Work/foxhunt/config)
|
|
Compiling arrow-csv v55.2.0
|
|
Compiling dirs v6.0.0
|
|
Compiling arrow v55.2.0
|
|
Compiling freetype-sys v0.20.1
|
|
Compiling plotters-bitmap v0.3.7
|
|
Compiling font-kit v0.14.3
|
|
Compiling tower v0.4.13
|
|
Compiling plotters v0.3.7
|
|
Compiling h2 v0.3.27
|
|
Compiling password-hash v0.5.0
|
|
Compiling ciborium-ll v0.2.2
|
|
Compiling ciborium v0.2.2
|
|
Compiling tungstenite v0.24.0
|
|
Compiling metrics v0.23.1
|
|
Compiling parking_lot_core v0.8.6
|
|
Compiling common v1.0.0 (/home/jgrusewski/Work/foxhunt/common)
|
|
Compiling is-terminal v0.4.16
|
|
Compiling tokio-tungstenite v0.24.0
|
|
Compiling criterion v0.5.1
|
|
Compiling parking_lot v0.11.2
|
|
Compiling tokio-test v0.4.4
|
|
Compiling hyper v0.14.32
|
|
Compiling blake2 v0.10.6
|
|
Compiling dirs-sys v0.4.1
|
|
Compiling console v0.15.11
|
|
Compiling rtoolbox v0.0.3
|
|
Compiling rav1e v0.7.1
|
|
Compiling indicatif v0.17.11
|
|
Compiling rpassword v7.4.0
|
|
Compiling dirs v5.0.1
|
|
Compiling argon2 v0.5.3
|
|
Compiling trading_engine v1.0.0 (/home/jgrusewski/Work/foxhunt/trading_engine)
|
|
Compiling storage v1.0.0 (/home/jgrusewski/Work/foxhunt/storage)
|
|
Compiling hyper-tls v0.5.0
|
|
Compiling reqwest v0.11.27
|
|
Compiling adaptive-strategy v1.0.0 (/home/jgrusewski/Work/foxhunt/adaptive-strategy)
|
|
Compiling tokio-retry v0.3.0
|
|
Compiling ratatui v0.28.1
|
|
Compiling influxdb2 v0.5.2
|
|
Compiling exr v1.73.0
|
|
Compiling ravif v0.11.20
|
|
Compiling model_loader v1.0.0 (/home/jgrusewski/Work/foxhunt/model_loader)
|
|
Compiling tiff v0.10.3
|
|
Compiling crossterm v0.27.0
|
|
Compiling sysinfo v0.34.2
|
|
Compiling image v0.25.8
|
|
Compiling metrics-util v0.17.0
|
|
Compiling pbkdf2 v0.12.2
|
|
Compiling risk-data v1.0.0 (/home/jgrusewski/Work/foxhunt/risk-data)
|
|
Compiling totp-rs v5.7.0
|
|
Compiling metrics-exporter-prometheus v0.15.3
|
|
Compiling quickcheck v1.0.3
|
|
Compiling nix v0.29.0
|
|
Compiling data_acquisition_service v1.0.0 (/home/jgrusewski/Work/foxhunt/services/data_acquisition_service)
|
|
Compiling tli v1.0.0 (/home/jgrusewski/Work/foxhunt/tli)
|
|
Compiling serial_test v3.2.0
|
|
Compiling sys-info v0.9.1
|
|
Compiling stress_tests v1.0.0 (/home/jgrusewski/Work/foxhunt/services/stress_tests)
|
|
Compiling api_gateway_load_tests v0.1.0 (/home/jgrusewski/Work/foxhunt/services/api_gateway/load_tests)
|
|
Compiling qrcode v0.14.1
|
|
Compiling trading-data v0.1.0 (/home/jgrusewski/Work/foxhunt/trading-data)
|
|
Compiling integration_load_tests v0.1.0 (/home/jgrusewski/Work/foxhunt/tests/load_tests)
|
|
Compiling risk v1.0.0 (/home/jgrusewski/Work/foxhunt/risk)
|
|
Compiling data v1.0.0 (/home/jgrusewski/Work/foxhunt/data)
|
|
Compiling database v1.0.0 (/home/jgrusewski/Work/foxhunt/database)
|
|
Compiling api_gateway v1.0.0 (/home/jgrusewski/Work/foxhunt/services/api_gateway)
|
|
Compiling trading_service_load_tests v1.0.0 (/home/jgrusewski/Work/foxhunt/services/load_tests)
|
|
Compiling market-data v1.0.0 (/home/jgrusewski/Work/foxhunt/market-data)
|
|
Compiling ml-data v0.1.0 (/home/jgrusewski/Work/foxhunt/ml-data)
|
|
warning: unused imports: `CertId`, `OcspRequest`, `Oid`, `OneReq`, and `TBSRequest`
|
|
--> services/api_gateway/src/auth/mtls/revocation.rs:10:20
|
|
|
|
|
10 | common::asn1::{CertId, Oid},
|
|
| ^^^^^^ ^^^
|
|
11 | request::{OcspRequest, OneReq, TBSRequest},
|
|
| ^^^^^^^^^^^ ^^^^^^ ^^^^^^^^^^
|
|
|
|
|
= note: `#[warn(unused_imports)]` on by default
|
|
|
|
warning: unused import: `Sha256`
|
|
--> services/api_gateway/src/auth/mtls/revocation.rs:15:20
|
|
|
|
|
15 | use sha2::{Digest, Sha256};
|
|
| ^^^^^^
|
|
|
|
warning: unused import: `Digest`
|
|
--> services/api_gateway/src/auth/mtls/revocation.rs:15:12
|
|
|
|
|
15 | use sha2::{Digest, Sha256};
|
|
| ^^^^^^
|
|
|
|
Compiling ml v1.0.0 (/home/jgrusewski/Work/foxhunt/ml)
|
|
warning: method `put` is never used
|
|
--> services/api_gateway/src/auth/mtls/revocation.rs:101:14
|
|
|
|
|
81 | impl OcspCache {
|
|
| -------------- method in this implementation
|
|
...
|
|
101 | async fn put(&self, key: String, status: OcspStatus) {
|
|
| ^^^
|
|
|
|
|
= note: `#[warn(dead_code)]` on by default
|
|
|
|
Compiling trading_service v1.0.0 (/home/jgrusewski/Work/foxhunt/services/trading_service)
|
|
Compiling backtesting_service v1.0.0 (/home/jgrusewski/Work/foxhunt/services/backtesting_service)
|
|
Compiling foxhunt_e2e v0.1.0 (/home/jgrusewski/Work/foxhunt/tests/e2e)
|
|
Compiling ml_training_service v1.0.0 (/home/jgrusewski/Work/foxhunt/services/ml_training_service)
|
|
Compiling trading_agent_service v1.0.0 (/home/jgrusewski/Work/foxhunt/services/trading_agent_service)
|
|
Compiling backtesting v1.0.0 (/home/jgrusewski/Work/foxhunt/backtesting)
|
|
warning: unused imports: `Datelike` and `Timelike`
|
|
--> services/backtesting_service/src/ml_strategy_engine.rs:7:24
|
|
|
|
|
7 | use chrono::{DateTime, Datelike, Timelike, Utc};
|
|
| ^^^^^^^^ ^^^^^^^^
|
|
|
|
|
= note: `#[warn(unused_imports)]` on by default
|
|
|
|
warning: unused import: `DefaultRepositories`
|
|
--> services/backtesting_service/src/wave_comparison.rs:22:52
|
|
|
|
|
22 | use crate::repositories::{BacktestingRepositories, DefaultRepositories};
|
|
| ^^^^^^^^^^^^^^^^^^^
|
|
|
|
warning: unused import: `error`
|
|
--> services/ml_training_service/src/grpc/streaming.rs:16:22
|
|
|
|
|
16 | use tracing::{debug, error, info, warn};
|
|
| ^^^^^
|
|
|
|
|
= note: `#[warn(unused_imports)]` on by default
|
|
|
|
warning: unused imports: `FeatureExtractor` and `OHLCVBar`
|
|
--> services/ml_training_service/src/orchestrator.rs:666:40
|
|
|
|
|
666 | use ml::features::extraction::{FeatureExtractor, OHLCVBar};
|
|
| ^^^^^^^^^^^^^^^^ ^^^^^^^^
|
|
|
|
warning: field `feature_extractor` is never read
|
|
--> services/trading_agent_service/src/assets.rs:127:5
|
|
|
|
|
119 | pub struct AssetSelector {
|
|
| ------------- field in this struct
|
|
...
|
|
127 | feature_extractor: Arc<MLFeatureExtractor>,
|
|
| ^^^^^^^^^^^^^^^^^
|
|
|
|
|
= note: `#[warn(dead_code)]` on by default
|
|
|
|
warning: field `confidence` is never read
|
|
--> services/trading_agent_service/src/dynamic_stop_loss.rs:117:9
|
|
|
|
|
115 | struct RegimeRow {
|
|
| --------- field in this struct
|
|
116 | regime: Option<String>,
|
|
117 | confidence: Option<f64>,
|
|
| ^^^^^^^^^^
|
|
|
|
warning: unused variable: `lookback_periods`
|
|
--> services/backtesting_service/src/ml_strategy_engine.rs:120:30
|
|
|
|
|
120 | pub fn new(name: String, lookback_periods: usize) -> Self {
|
|
| ^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_lookback_periods`
|
|
|
|
|
= note: `#[warn(unused_variables)]` on by default
|
|
|
|
warning: field `feature_extractor` is never read
|
|
--> services/backtesting_service/src/ml_strategy_engine.rs:91:5
|
|
|
|
|
85 | pub struct MLPoweredStrategy {
|
|
| ----------------- field in this struct
|
|
...
|
|
91 | feature_extractor: Arc<UnifiedFeatureExtractor>,
|
|
| ^^^^^^^^^^^^^^^^^
|
|
|
|
|
= note: `#[warn(dead_code)]` on by default
|
|
|
|
warning: field `repositories` is never read
|
|
--> services/backtesting_service/src/wave_comparison.rs:166:5
|
|
|
|
|
164 | pub struct WaveComparisonBacktest {
|
|
| ---------------------- field in this struct
|
|
165 | /// Repository access
|
|
166 | repositories: Arc<dyn BacktestingRepositories>,
|
|
| ^^^^^^^^^^^^
|
|
|
|
Compiling integration_tests v1.0.0 (/home/jgrusewski/Work/foxhunt/services/integration_tests)
|
|
warning: type `job_tracker::ChildJob` is more private than the item `JobTracker::calculate_weighted_progress`
|
|
--> services/ml_training_service/src/job_tracker.rs:306:5
|
|
|
|
|
306 | pub fn calculate_weighted_progress(&self, child_jobs: &[ChildJob]) -> f64 {
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ method `JobTracker::calculate_weighted_progress` is reachable at visibility `pub`
|
|
|
|
|
note: but type `job_tracker::ChildJob` is only usable at visibility `pub(self)`
|
|
--> services/ml_training_service/src/job_tracker.rs:108:1
|
|
|
|
|
108 | struct ChildJob {
|
|
| ^^^^^^^^^^^^^^^
|
|
= note: `#[warn(private_interfaces)]` on by default
|
|
|
|
warning: fields `id`, `batch_id`, and `model_type` are never read
|
|
--> services/ml_training_service/src/job_tracker.rs:109:5
|
|
|
|
|
108 | struct ChildJob {
|
|
| -------- fields in this struct
|
|
109 | id: Uuid,
|
|
| ^^
|
|
110 | batch_id: Uuid,
|
|
| ^^^^^^^^
|
|
111 | model_type: String,
|
|
| ^^^^^^^^^^
|
|
|
|
|
= note: `ChildJob` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
|
|
= note: `#[warn(dead_code)]` on by default
|
|
|
|
warning: `backtesting_service` (lib) generated 5 warnings (run `cargo fix --lib -p backtesting_service` to apply 2 suggestions)
|
|
warning: `trading_agent_service` (lib) generated 2 warnings
|
|
Compiling tests v0.1.0 (/home/jgrusewski/Work/foxhunt/tests)
|
|
warning: `api_gateway` (lib) generated 4 warnings (run `cargo fix --lib -p api_gateway` to apply 2 suggestions)
|
|
error[E0433]: failed to resolve: could not find `observability` in `common`
|
|
--> services/api_gateway/src/main.rs:56:29
|
|
|
|
|
56 | if let Err(e) = common::observability::init_observability(
|
|
| ^^^^^^^^^^^^^ could not find `observability` in `common`
|
|
|
|
warning: unused imports: `layer::SubscriberExt` and `util::SubscriberInitExt`
|
|
--> services/api_gateway/src/main.rs:11:26
|
|
|
|
|
11 | use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
|
|
| ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= note: `#[warn(unused_imports)]` on by default
|
|
|
|
For more information about this error, try `rustc --explain E0433`.
|
|
warning: `api_gateway` (bin "api_gateway") generated 1 warning
|
|
error: could not compile `api_gateway` (bin "api_gateway") due to 1 previous error; 1 warning emitted
|
|
warning: build failed, waiting for other jobs to finish...
|
|
warning: `ml_training_service` (lib) generated 4 warnings (run `cargo fix --lib -p ml_training_service` to apply 2 suggestions)
|