[INFO] fetching crate dimensional_analyser 0.1.0... [INFO] testing dimensional_analyser-0.1.0 against try#311784882baa42a9638298cb325fa01a062c9d0f+cargoflags=-Zbuild-dir-new-layout for pr-149852 [INFO] extracting crate dimensional_analyser 0.1.0 into /workspace/builds/worker-4-tc2/source [INFO] started tweaking crates.io crate dimensional_analyser 0.1.0 [INFO] finished tweaking crates.io crate dimensional_analyser 0.1.0 [INFO] tweaked toml for crates.io crate dimensional_analyser 0.1.0 written to /workspace/builds/worker-4-tc2/source/Cargo.toml [INFO] validating manifest of crates.io crate dimensional_analyser 0.1.0 on toolchain 311784882baa42a9638298cb325fa01a062c9d0f [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+311784882baa42a9638298cb325fa01a062c9d0f" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate crates.io crate dimensional_analyser 0.1.0 already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+311784882baa42a9638298cb325fa01a062c9d0f" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:94a0c148923f5b2b52a63ef0eeb1882ad339ab61bce784c8077cbe41c61feb6c" "/opt/rustwide/cargo-home/bin/cargo" "+311784882baa42a9638298cb325fa01a062c9d0f" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 2b2ede13bf18d23636676c85979d8ab5627613b8d0fd1c6ecc0dc3947c221b53 [INFO] running `Command { std: "docker" "start" "-a" "2b2ede13bf18d23636676c85979d8ab5627613b8d0fd1c6ecc0dc3947c221b53", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "2b2ede13bf18d23636676c85979d8ab5627613b8d0fd1c6ecc0dc3947c221b53", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "2b2ede13bf18d23636676c85979d8ab5627613b8d0fd1c6ecc0dc3947c221b53", kill_on_drop: false }` [INFO] [stdout] 2b2ede13bf18d23636676c85979d8ab5627613b8d0fd1c6ecc0dc3947c221b53 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:94a0c148923f5b2b52a63ef0eeb1882ad339ab61bce784c8077cbe41c61feb6c" "/opt/rustwide/cargo-home/bin/cargo" "+311784882baa42a9638298cb325fa01a062c9d0f" "build" "--frozen" "--message-format=json" "-Zbuild-dir-new-layout", kill_on_drop: false }` [INFO] [stdout] 44daae34fe9ee25a73642764595a8b61557399252a8a139c1760bb3899ecdafa [INFO] running `Command { std: "docker" "start" "-a" "44daae34fe9ee25a73642764595a8b61557399252a8a139c1760bb3899ecdafa", kill_on_drop: false }` [INFO] [stderr] Compiling dimensional_analyser v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: unused import: `dimension` [INFO] [stdout] --> src/dimension.rs:394:13 [INFO] [stdout] | [INFO] [stdout] 394 | use crate::{dimension}; [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.17s [INFO] running `Command { std: "docker" "inspect" "44daae34fe9ee25a73642764595a8b61557399252a8a139c1760bb3899ecdafa", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "44daae34fe9ee25a73642764595a8b61557399252a8a139c1760bb3899ecdafa", kill_on_drop: false }` [INFO] [stdout] 44daae34fe9ee25a73642764595a8b61557399252a8a139c1760bb3899ecdafa [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:94a0c148923f5b2b52a63ef0eeb1882ad339ab61bce784c8077cbe41c61feb6c" "/opt/rustwide/cargo-home/bin/cargo" "+311784882baa42a9638298cb325fa01a062c9d0f" "test" "--frozen" "--no-run" "--message-format=json" "-Zbuild-dir-new-layout", kill_on_drop: false }` [INFO] [stdout] 05aa682b79451ee4baff0b176ba9567567a54a4ae9f8988a0c7b98137ece058b [INFO] running `Command { std: "docker" "start" "-a" "05aa682b79451ee4baff0b176ba9567567a54a4ae9f8988a0c7b98137ece058b", kill_on_drop: false }` [INFO] [stdout] warning: unused import: `dimension` [INFO] [stdout] --> src/dimension.rs:394:13 [INFO] [stdout] | [INFO] [stdout] 394 | use crate::{dimension}; [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Compiling dimensional_analyser v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: unused import: `dimension` [INFO] [stdout] --> src/dimension.rs:394:13 [INFO] [stdout] | [INFO] [stdout] 394 | use crate::{dimension}; [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused imports: `DERIVED_CHARGE`, `ELEMENTARY_CHARGE`, and `PLANK_CHARGE` [INFO] [stdout] --> src/dimensions/natural_units.rs:34:119 [INFO] [stdout] | [INFO] [stdout] 34 | ...Analysable}, dimensions::natural_units::{DERIVED_CHARGE, ELEMENTARY_CHARGE, PLANK_CHARGE, base_units::BASE_UNITS}}}; [INFO] [stdout] | ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `exponents` [INFO] [stdout] --> src/dimensions/le_systeme_international_d_unites.rs:71:13 [INFO] [stdout] | [INFO] [stdout] 71 | let exponents = BASE_UNITS.get().coherent_system7().expect("The SI system should be coherent"); [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `exponents` [INFO] [stdout] --> src/dimensions/drunk_mathematician_units.rs:46:13 [INFO] [stdout] | [INFO] [stdout] 46 | ... let exponents = BASE_UNITS.get().coherent_system3().expect("The drunk mathematician unit system shouldn't be coherent but oh w... [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `exponents` [INFO] [stdout] --> src/dimensions/centimeter_gram_second_units.rs:34:13 [INFO] [stdout] | [INFO] [stdout] 34 | let exponents = BASE_UNITS.get().coherent_system3().expect("The CGS system should be coherent"); [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `exponents` [INFO] [stdout] --> src/dimensions/the_seven_c_s.rs:34:13 [INFO] [stdout] | [INFO] [stdout] 34 | let exponents = BASE_UNITS.get().coherent_system7().expect("The seven c's system should be coherent"); [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `exponents` [INFO] [stdout] --> src/dimensions/natural_units.rs:37:13 [INFO] [stdout] | [INFO] [stdout] 37 | let exponents = BASE_UNITS.get().coherent_system5().expect("The natural units system should be coherent"); [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `exponents` [INFO] [stdout] --> src/dimensions/hamburger_units.rs:38:13 [INFO] [stdout] | [INFO] [stdout] 38 | let exponents = BASE_UNITS.get().coherent_system7().expect("The hamburger unit system should be coherent"); [INFO] [stdout] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 1.33s [INFO] running `Command { std: "docker" "inspect" "05aa682b79451ee4baff0b176ba9567567a54a4ae9f8988a0c7b98137ece058b", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "05aa682b79451ee4baff0b176ba9567567a54a4ae9f8988a0c7b98137ece058b", kill_on_drop: false }` [INFO] [stdout] 05aa682b79451ee4baff0b176ba9567567a54a4ae9f8988a0c7b98137ece058b [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:94a0c148923f5b2b52a63ef0eeb1882ad339ab61bce784c8077cbe41c61feb6c" "/opt/rustwide/cargo-home/bin/cargo" "+311784882baa42a9638298cb325fa01a062c9d0f" "test" "--frozen" "-Zbuild-dir-new-layout", kill_on_drop: false }` [INFO] [stdout] 2b1a005e4ebdda8509bde1878c69fe2a1ee1f7b2bc4d8cdcf5e235dd3b990d3b [INFO] running `Command { std: "docker" "start" "-a" "2b1a005e4ebdda8509bde1878c69fe2a1ee1f7b2bc4d8cdcf5e235dd3b990d3b", kill_on_drop: false }` [INFO] [stderr] warning: unused import: `dimension` [INFO] [stderr] --> src/dimension.rs:394:13 [INFO] [stderr] | [INFO] [stderr] 394 | use crate::{dimension}; [INFO] [stderr] | ^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stderr] [INFO] [stderr] warning: `dimensional_analyser` (lib) generated 1 warning (run `cargo fix --lib -p dimensional_analyser` to apply 1 suggestion) [INFO] [stderr] warning: unused imports: `DERIVED_CHARGE`, `ELEMENTARY_CHARGE`, and `PLANK_CHARGE` [INFO] [stderr] --> src/dimensions/natural_units.rs:34:119 [INFO] [stderr] | [INFO] [stderr] 34 | ...Analysable}, dimensions::natural_units::{DERIVED_CHARGE, ELEMENTARY_CHARGE, PLANK_CHARGE, base_units::BASE_UNITS}}}; [INFO] [stderr] | ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: unused variable: `exponents` [INFO] [stderr] --> src/dimensions/le_systeme_international_d_unites.rs:71:13 [INFO] [stderr] | [INFO] [stderr] 71 | let exponents = BASE_UNITS.get().coherent_system7().expect("The SI system should be coherent"); [INFO] [stderr] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stderr] | [INFO] [stderr] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stderr] [INFO] [stderr] warning: unused variable: `exponents` [INFO] [stderr] --> src/dimensions/drunk_mathematician_units.rs:46:13 [INFO] [stderr] | [INFO] [stderr] 46 | ... let exponents = BASE_UNITS.get().coherent_system3().expect("The drunk mathematician unit system shouldn't be coherent but oh w... [INFO] [stderr] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stderr] [INFO] [stderr] warning: unused variable: `exponents` [INFO] [stderr] --> src/dimensions/centimeter_gram_second_units.rs:34:13 [INFO] [stderr] | [INFO] [stderr] 34 | let exponents = BASE_UNITS.get().coherent_system3().expect("The CGS system should be coherent"); [INFO] [stderr] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stderr] [INFO] [stderr] warning: unused variable: `exponents` [INFO] [stderr] --> src/dimensions/the_seven_c_s.rs:34:13 [INFO] [stderr] | [INFO] [stderr] 34 | let exponents = BASE_UNITS.get().coherent_system7().expect("The seven c's system should be coherent"); [INFO] [stderr] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stderr] [INFO] [stderr] warning: unused variable: `exponents` [INFO] [stderr] --> src/dimensions/natural_units.rs:37:13 [INFO] [stderr] | [INFO] [stderr] 37 | let exponents = BASE_UNITS.get().coherent_system5().expect("The natural units system should be coherent"); [INFO] [stderr] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stderr] [INFO] [stderr] warning: unused variable: `exponents` [INFO] [stderr] --> src/dimensions/hamburger_units.rs:38:13 [INFO] [stderr] | [INFO] [stderr] 38 | let exponents = BASE_UNITS.get().coherent_system7().expect("The hamburger unit system should be coherent"); [INFO] [stderr] | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_exponents` [INFO] [stderr] [INFO] [stderr] warning: `dimensional_analyser` (lib test) generated 8 warnings (1 duplicate) (run `cargo fix --lib -p dimensional_analyser --tests` to apply 7 suggestions) [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.05s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/build/dimensional_analyser/ea99e381c73f7c85/deps/dimensional_analyser-ea99e381c73f7c85) [INFO] [stdout] [INFO] [stdout] running 31 tests [INFO] [stdout] test bareiss_eliminator::tests::dimensional_analysis_example ... ok [INFO] [stdout] test bareiss_eliminator::tests::non_rectangle_input ... ok [INFO] [stdout] test bareiss_eliminator::tests::identity_matrix ... ok [INFO] [stdout] test bareiss_eliminator::tests::power_symmetry ... ok [INFO] [stdout] test bareiss_eliminator::tests::overdetermined_but_consistent ... ok [INFO] [stdout] test bareiss_eliminator::tests::underdetermined_system ... ok [INFO] [stdout] test bareiss_eliminator::tests::zero_matrix ... ok [INFO] [stdout] test dimension::tests::kilograms_and_grams ... ok [INFO] [stdout] test dimension::tests::meters_per_second_squared_comma_meters_per_second_per_second_and_meters_per_second_seconds ... ok [INFO] [stdout] test dimensions::le_systeme_international_d_unites::tests::coherency_of_system ... ok [INFO] [stdout] test dimensions::hamburger_units::tests::coherency_of_system ... ok [INFO] [stdout] test dimensions::natural_units::tests::coherency_of_system ... ok [INFO] [stdout] test bareiss_eliminator::tests::simple_equations ... ok [INFO] [stdout] test bareiss_eliminator::tests::simple_unsolvable_equation_system ... ok [INFO] [stdout] test bareiss_eliminator::tests::three_variables ... ok [INFO] [stdout] test dimensions::the_seven_c_s::tests::coherency_of_system ... ok [INFO] [stdout] test quantity::tests::another_contrived_example ... ok [INFO] [stdout] test quantity::tests::complex_equalty_example ... ok [INFO] [stdout] test quantity::tests::curseder_units_optic_fiber_example ... ok [INFO] [stdout] test quantity::tests::conversion_with_different_multipliers ... ok [INFO] [stdout] test quantity::tests::incompatible_addition_example ... ok [INFO] [stdout] test quantity::tests::test_add ... ok [INFO] [stdout] test quantity::tests::unordered_but_equal ... ok [INFO] [stdout] test quantity::tests::unordered_but_identical ... ok [INFO] [stdout] test quantity::tests::bomb_explosion_radius_example ... ok [INFO] [stdout] test quantity::tests::bomb_explosion_radius_example_as_dimensional_analysis ... ok [INFO] [stdout] test dimensions::centimeter_gram_second_units::tests::coherency_of_system ... ok [INFO] [stdout] test dimensions::drunk_mathematician_units::tests::coherency_of_system ... ok [INFO] [stdout] test bareiss_eliminator::tests::not_power_symmetric ... ok [INFO] [stdout] test quantity::tests::unordered_scalar_multiples ... ok [INFO] [stdout] test quantity::tests::unordered_power_proyections ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 31 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s [INFO] [stdout] [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/debug/build/dimensional_analyser/0106fcd8b39312a2/deps/dimensional_analyser-0106fcd8b39312a2) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests dimensional_analyser [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stdout] test src/quantity.rs - quantity::Quantity::get_equality_with (line 121) ... ok [INFO] [stdout] test src/quantity.rs - quantity::Quantity::convert_to (line 100) ... ok [INFO] [stdout] test src/lib.rs - (line 6) ... ok [INFO] [stdout] test src/quantity.rs - quantity::Quantity (line 70) ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stdout] all doctests ran in 0.56s; merged doctests compilation took 0.54s [INFO] running `Command { std: "docker" "inspect" "2b1a005e4ebdda8509bde1878c69fe2a1ee1f7b2bc4d8cdcf5e235dd3b990d3b", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "2b1a005e4ebdda8509bde1878c69fe2a1ee1f7b2bc4d8cdcf5e235dd3b990d3b", kill_on_drop: false }` [INFO] [stdout] 2b1a005e4ebdda8509bde1878c69fe2a1ee1f7b2bc4d8cdcf5e235dd3b990d3b