[INFO] fetching crate nash-mpc 1.2.3... [INFO] checking nash-mpc-1.2.3 against master#8007b506ac5da629f223b755f5a5391edd5f6d01 for pr-88041 [INFO] extracting crate nash-mpc 1.2.3 into /workspace/builds/worker-50/source [INFO] validating manifest of crates.io crate nash-mpc 1.2.3 on toolchain 8007b506ac5da629f223b755f5a5391edd5f6d01 [INFO] running `Command { std: "/workspace/cargo-home/bin/cargo" "+8007b506ac5da629f223b755f5a5391edd5f6d01" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] started tweaking crates.io crate nash-mpc 1.2.3 [INFO] finished tweaking crates.io crate nash-mpc 1.2.3 [INFO] tweaked toml for crates.io crate nash-mpc 1.2.3 written to /workspace/builds/worker-50/source/Cargo.toml [INFO] running `Command { std: "/workspace/cargo-home/bin/cargo" "+8007b506ac5da629f223b755f5a5391edd5f6d01" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update", kill_on_drop: false }` [INFO] [stderr] Blocking waiting for file lock on package cache [INFO] running `Command { std: "/workspace/cargo-home/bin/cargo" "+8007b506ac5da629f223b755f5a5391edd5f6d01" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Blocking waiting for file lock on package cache [INFO] [stderr] Blocking waiting for file lock on package cache [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-50/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-50/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:34b6a614d2c27851fe6cbf88fbd1137609cefab8b10d0615aaeb6fd47975d74e" "/opt/rustwide/cargo-home/bin/cargo" "+8007b506ac5da629f223b755f5a5391edd5f6d01" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] bc36d9ef976901e98b2297b3845e5b7e77b5fd287c544a6ed98ff979d9be005f [INFO] running `Command { std: "docker" "start" "-a" "bc36d9ef976901e98b2297b3845e5b7e77b5fd287c544a6ed98ff979d9be005f", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "bc36d9ef976901e98b2297b3845e5b7e77b5fd287c544a6ed98ff979d9be005f", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "bc36d9ef976901e98b2297b3845e5b7e77b5fd287c544a6ed98ff979d9be005f", kill_on_drop: false }` [INFO] [stdout] bc36d9ef976901e98b2297b3845e5b7e77b5fd287c544a6ed98ff979d9be005f [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-50/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-50/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" "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:34b6a614d2c27851fe6cbf88fbd1137609cefab8b10d0615aaeb6fd47975d74e" "/opt/rustwide/cargo-home/bin/cargo" "+8007b506ac5da629f223b755f5a5391edd5f6d01" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 3f3241346ee3b4e7fc7aad6f758ca3fb271dd2f7e1aa1b67de57dc35c75e38fa [INFO] running `Command { std: "docker" "start" "-a" "3f3241346ee3b4e7fc7aad6f758ca3fb271dd2f7e1aa1b67de57dc35c75e38fa", kill_on_drop: false }` [INFO] [stderr] Blocking waiting for file lock on package cache [INFO] [stderr] Compiling libc v0.2.99 [INFO] [stderr] Checking cfg-if v1.0.0 [INFO] [stderr] Compiling autocfg v1.0.1 [INFO] [stderr] Compiling unicode-xid v0.2.2 [INFO] [stderr] Compiling syn v1.0.74 [INFO] [stderr] Compiling getrandom v0.1.16 [INFO] [stderr] Compiling ryu v1.0.5 [INFO] [stderr] Checking subtle v2.4.1 [INFO] [stderr] Compiling semver v1.0.4 [INFO] [stderr] Checking wyz v0.2.0 [INFO] [stderr] Checking itoa v0.4.7 [INFO] [stderr] Checking radium v0.3.0 [INFO] [stderr] Checking const-oid v0.4.5 [INFO] [stderr] Checking either v1.6.1 [INFO] [stderr] Compiling memchr v2.4.0 [INFO] [stderr] Checking zeroize v1.4.1 [INFO] [stderr] Checking ppv-lite86 v0.2.10 [INFO] [stderr] Compiling crossbeam-queue v0.3.2 [INFO] [stderr] Checking plotters-backend v0.3.2 [INFO] [stderr] Checking regex-automata v0.1.10 [INFO] [stderr] Checking regex-syntax v0.6.25 [INFO] [stderr] Checking bitflags v1.3.1 [INFO] [stderr] Checking half v1.7.1 [INFO] [stderr] Checking oorandom v11.1.3 [INFO] [stderr] Checking generic-array v0.14.4 [INFO] [stderr] Checking crossbeam-utils v0.8.5 [INFO] [stderr] Compiling proc-macro2 v1.0.28 [INFO] [stderr] Checking clap v2.33.3 [INFO] [stderr] Checking der v0.1.0 [INFO] [stderr] Checking itertools v0.10.1 [INFO] [stderr] Checking bitvec v0.18.5 [INFO] [stderr] Checking digest v0.9.0 [INFO] [stderr] Checking crypto-mac v0.10.1 [INFO] [stderr] Checking block-buffer v0.9.0 [INFO] [stderr] Compiling quote v1.0.9 [INFO] [stderr] Checking plotters-svg v0.3.1 [INFO] [stderr] Compiling num-traits v0.2.14 [INFO] [stderr] Compiling memoffset v0.6.4 [INFO] [stderr] Compiling rayon v1.5.1 [INFO] [stderr] Compiling num-integer v0.1.44 [INFO] [stderr] Checking crossbeam-channel v0.5.1 [INFO] [stderr] Checking pkcs8 v0.3.3 [INFO] [stderr] Checking hmac v0.10.1 [INFO] [stderr] Checking sha2 v0.9.5 [INFO] [stderr] Checking crossbeam-epoch v0.9.5 [INFO] [stderr] Compiling rustc_version v0.4.0 [INFO] [stderr] Checking csv-core v0.1.10 [INFO] [stderr] Checking num_cpus v1.13.0 [INFO] [stderr] Checking getrandom v0.2.3 [INFO] [stderr] Checking time v0.1.43 [INFO] [stderr] Checking atty v0.2.14 [INFO] [stderr] Checking crossbeam-deque v0.8.1 [INFO] [stderr] Checking rand_core v0.5.1 [INFO] [stderr] Checking rayon-core v1.9.1 [INFO] [stderr] Compiling cast v0.2.7 [INFO] [stderr] Checking signature v1.2.2 [INFO] [stderr] Checking rand_chacha v0.2.2 [INFO] [stderr] Checking rand v0.7.3 [INFO] [stderr] Checking regex v1.5.4 [INFO] [stderr] Checking plotters v0.3.1 [INFO] [stderr] Checking criterion-plot v0.4.4 [INFO] [stderr] Checking chrono v0.4.19 [INFO] [stderr] Checking ff v0.8.0 [INFO] [stderr] Checking group v0.8.0 [INFO] [stderr] Checking elliptic-curve v0.8.5 [INFO] [stderr] Checking ecdsa v0.10.2 [INFO] [stderr] Checking p256 v0.7.3 [INFO] [stderr] Checking k256 v0.7.3 [INFO] [stderr] Compiling serde_derive v1.0.127 [INFO] [stderr] Checking serde v1.0.127 [INFO] [stderr] Checking serde_json v1.0.66 [INFO] [stderr] Checking bstr v0.2.16 [INFO] [stderr] Checking serde_cbor v0.11.1 [INFO] [stderr] Checking bincode v1.3.3 [INFO] [stderr] Checking csv v1.1.6 [INFO] [stderr] Checking rust-gmp-serde v0.5.0 [INFO] [stderr] Checking tinytemplate v1.2.1 [INFO] [stderr] Checking criterion v0.3.5 [INFO] [stderr] Checking rust-bigint v1.1.0 [INFO] [stderr] Checking paillier-common v0.1.1 [INFO] [stderr] Checking nash-mpc v1.2.3 (/opt/rustwide/workdir) [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_k1_rust.rs:839:26 [INFO] [stdout] | [INFO] [stdout] 837 | let g = Secp256k1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256k1Point`, which does not implement the `Copy` trait [INFO] [stdout] 838 | let i: Secp256k1Scalar = ECScalar::from(&BigInt::from(3)).unwrap(); [INFO] [stdout] 839 | assert_eq!(((g + g).unwrap() + g).unwrap().ge, (g * i).unwrap().ge); [INFO] [stdout] | -----^- [INFO] [stdout] | | | [INFO] [stdout] | | value used here after move [INFO] [stdout] | `g` moved due to usage in operator [INFO] [stdout] | [INFO] [stdout] note: calling this operator moves the left-hand side [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_k1_rust.rs:839:40 [INFO] [stdout] | [INFO] [stdout] 837 | let g = Secp256k1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256k1Point`, which does not implement the `Copy` trait [INFO] [stdout] 838 | let i: Secp256k1Scalar = ECScalar::from(&BigInt::from(3)).unwrap(); [INFO] [stdout] 839 | assert_eq!(((g + g).unwrap() + g).unwrap().ge, (g * i).unwrap().ge); [INFO] [stdout] | - ^ value used here after move [INFO] [stdout] | | [INFO] [stdout] | value moved here [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_k1_rust.rs:839:57 [INFO] [stdout] | [INFO] [stdout] 837 | let g = Secp256k1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256k1Point`, which does not implement the `Copy` trait [INFO] [stdout] 838 | let i: Secp256k1Scalar = ECScalar::from(&BigInt::from(3)).unwrap(); [INFO] [stdout] 839 | assert_eq!(((g + g).unwrap() + g).unwrap().ge, (g * i).unwrap().ge); [INFO] [stdout] | - ^ value used here after move [INFO] [stdout] | | [INFO] [stdout] | value moved here [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_k1_rust.rs:841:14 [INFO] [stdout] | [INFO] [stdout] 837 | let g = Secp256k1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256k1Point`, which does not implement the `Copy` trait [INFO] [stdout] 838 | let i: Secp256k1Scalar = ECScalar::from(&BigInt::from(3)).unwrap(); [INFO] [stdout] 839 | assert_eq!(((g + g).unwrap() + g).unwrap().ge, (g * i).unwrap().ge); [INFO] [stdout] | ------- `g` moved due to usage in operator [INFO] [stdout] 840 | assert_eq!( [INFO] [stdout] 841 | (g + g).unwrap().ge, [INFO] [stdout] | ^ value used here after move [INFO] [stdout] | [INFO] [stdout] note: calling this operator moves the left-hand side [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_k1_rust.rs:841:18 [INFO] [stdout] | [INFO] [stdout] 837 | let g = Secp256k1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256k1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 841 | (g + g).unwrap().ge, [INFO] [stdout] | -----^- [INFO] [stdout] | | | [INFO] [stdout] | | value used here after move [INFO] [stdout] | `g` moved due to usage in operator [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_k1_rust.rs:842:16 [INFO] [stdout] | [INFO] [stdout] 837 | let g = Secp256k1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256k1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 841 | (g + g).unwrap().ge, [INFO] [stdout] | - value moved here [INFO] [stdout] 842 | (((g + g).unwrap() - g).unwrap() + g).unwrap().ge [INFO] [stdout] | ^ value used here after move [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_k1_rust.rs:842:20 [INFO] [stdout] | [INFO] [stdout] 837 | let g = Secp256k1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256k1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 842 | (((g + g).unwrap() - g).unwrap() + g).unwrap().ge [INFO] [stdout] | -----^- [INFO] [stdout] | | | [INFO] [stdout] | | value used here after move [INFO] [stdout] | `g` moved due to usage in operator [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_k1_rust.rs:842:34 [INFO] [stdout] | [INFO] [stdout] 837 | let g = Secp256k1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256k1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 842 | (((g + g).unwrap() - g).unwrap() + g).unwrap().ge [INFO] [stdout] | - ^ value used here after move [INFO] [stdout] | | [INFO] [stdout] | value moved here [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_k1_rust.rs:842:48 [INFO] [stdout] | [INFO] [stdout] 837 | let g = Secp256k1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256k1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 842 | (((g + g).unwrap() - g).unwrap() + g).unwrap().ge [INFO] [stdout] | - ^ value used here after move [INFO] [stdout] | | [INFO] [stdout] | value moved here [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_r1.rs:845:26 [INFO] [stdout] | [INFO] [stdout] 843 | let g = Secp256r1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256r1Point`, which does not implement the `Copy` trait [INFO] [stdout] 844 | let i: Secp256r1Scalar = ECScalar::from(&BigInt::from(3)).unwrap(); [INFO] [stdout] 845 | assert_eq!(((g + g).unwrap() + g).unwrap().ge, (g * i).unwrap().ge); [INFO] [stdout] | -----^- [INFO] [stdout] | | | [INFO] [stdout] | | value used here after move [INFO] [stdout] | `g` moved due to usage in operator [INFO] [stdout] | [INFO] [stdout] note: calling this operator moves the left-hand side [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_r1.rs:845:40 [INFO] [stdout] | [INFO] [stdout] 843 | let g = Secp256r1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256r1Point`, which does not implement the `Copy` trait [INFO] [stdout] 844 | let i: Secp256r1Scalar = ECScalar::from(&BigInt::from(3)).unwrap(); [INFO] [stdout] 845 | assert_eq!(((g + g).unwrap() + g).unwrap().ge, (g * i).unwrap().ge); [INFO] [stdout] | - ^ value used here after move [INFO] [stdout] | | [INFO] [stdout] | value moved here [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_r1.rs:845:57 [INFO] [stdout] | [INFO] [stdout] 843 | let g = Secp256r1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256r1Point`, which does not implement the `Copy` trait [INFO] [stdout] 844 | let i: Secp256r1Scalar = ECScalar::from(&BigInt::from(3)).unwrap(); [INFO] [stdout] 845 | assert_eq!(((g + g).unwrap() + g).unwrap().ge, (g * i).unwrap().ge); [INFO] [stdout] | - ^ value used here after move [INFO] [stdout] | | [INFO] [stdout] | value moved here [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_r1.rs:847:14 [INFO] [stdout] | [INFO] [stdout] 843 | let g = Secp256r1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256r1Point`, which does not implement the `Copy` trait [INFO] [stdout] 844 | let i: Secp256r1Scalar = ECScalar::from(&BigInt::from(3)).unwrap(); [INFO] [stdout] 845 | assert_eq!(((g + g).unwrap() + g).unwrap().ge, (g * i).unwrap().ge); [INFO] [stdout] | ------- `g` moved due to usage in operator [INFO] [stdout] 846 | assert_eq!( [INFO] [stdout] 847 | (g + g).unwrap().ge, [INFO] [stdout] | ^ value used here after move [INFO] [stdout] | [INFO] [stdout] note: calling this operator moves the left-hand side [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_r1.rs:847:18 [INFO] [stdout] | [INFO] [stdout] 843 | let g = Secp256r1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256r1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 847 | (g + g).unwrap().ge, [INFO] [stdout] | -----^- [INFO] [stdout] | | | [INFO] [stdout] | | value used here after move [INFO] [stdout] | `g` moved due to usage in operator [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_r1.rs:848:16 [INFO] [stdout] | [INFO] [stdout] 843 | let g = Secp256r1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256r1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 847 | (g + g).unwrap().ge, [INFO] [stdout] | - value moved here [INFO] [stdout] 848 | (((g + g).unwrap() - g).unwrap() + g).unwrap().ge [INFO] [stdout] | ^ value used here after move [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_r1.rs:848:20 [INFO] [stdout] | [INFO] [stdout] 843 | let g = Secp256r1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256r1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 848 | (((g + g).unwrap() - g).unwrap() + g).unwrap().ge [INFO] [stdout] | -----^- [INFO] [stdout] | | | [INFO] [stdout] | | value used here after move [INFO] [stdout] | `g` moved due to usage in operator [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_r1.rs:848:34 [INFO] [stdout] | [INFO] [stdout] 843 | let g = Secp256r1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256r1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 848 | (((g + g).unwrap() - g).unwrap() + g).unwrap().ge [INFO] [stdout] | - ^ value used here after move [INFO] [stdout] | | [INFO] [stdout] | value moved here [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error[E0382]: use of moved value: `g` [INFO] [stdout] --> src/curves/secp256_r1.rs:848:48 [INFO] [stdout] | [INFO] [stdout] 843 | let g = Secp256r1Point::generator(); [INFO] [stdout] | - move occurs because `g` has type `Secp256r1Point`, which does not implement the `Copy` trait [INFO] [stdout] ... [INFO] [stdout] 848 | (((g + g).unwrap() - g).unwrap() + g).unwrap().ge [INFO] [stdout] | - ^ value used here after move [INFO] [stdout] | | [INFO] [stdout] | value moved here [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error: aborting due to 18 previous errors [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] For more information about this error, try `rustc --explain E0382`. [INFO] [stdout] [INFO] [stderr] error: could not compile `nash-mpc` due to 19 previous errors [INFO] running `Command { std: "docker" "inspect" "3f3241346ee3b4e7fc7aad6f758ca3fb271dd2f7e1aa1b67de57dc35c75e38fa", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "3f3241346ee3b4e7fc7aad6f758ca3fb271dd2f7e1aa1b67de57dc35c75e38fa", kill_on_drop: false }` [INFO] [stdout] 3f3241346ee3b4e7fc7aad6f758ca3fb271dd2f7e1aa1b67de57dc35c75e38fa