#![allow(unused)]
fn main() {
//! # Fundamentals Lesson 1
use crate::constants::ALICE;
use frame_support::parameter_types;
use xcm::latest::prelude::*;

// Relay A Topography:
//                   ┌───────────┐
//                   │  Relay A  │
//                   │  Polkadot │
//                   └─────┬─────┘
//                         │
//              ┌──────────┴──────────┐
//              │                     │
//        ┌─────┴─────┐         ┌─────┴──────┐
//        │ AssetHub  │         │  Moonbeam  │
//        │  Id 1000  │         │  Id 2004   │
//        └─────┬─────┘         └──────┬─────┘
//              │                      │
//       ┌──────┴──────┐               ├───────────┐
//       │             │               │           │
// ┌─────┴─────┐ ┌─────┴──────┐ ┌──────┴────┐ ┌────┴───────┐
// │   Alice   │ │  Pallet    │ │    Bob    │ │  Pallet    │
// │ AcctKey32 │ │  Assets    │ │ AcctKey20 │ │   EVM      │
// │           │ │            │ │           │ │            │
// │ 0x11111...│ │ Pallet #50 │ │ 0x22222...│ │ Pallet #51 │
// └───────────┘ └─────┬──────┘ └───────────┘ └─────┬──────┘
//                     │                            │
//               ┌─────┴─────┐               ┌──────┴─────┐
//               │   Asset   │               │   Smart    │
//               │   USDT    │               │ Contract   │
//               │           │               │            │
//               │  Id 1984  │               │ 0x55555... │
//               └───────────┘               └────────────┘

/// All these locations are relative to the Polkadot Relay Chain.
pub mod relative_to_polkadot_relay {
	use super::*;

	parameter_types! {
		// The Polkadot parachain A with id 1000.
		pub PolkadotPara1000: Location = todo!();
		// The Polkadot parachain B with id 2004.
		pub PolkadotPara2004: Location = todo!();
		// The Polkadot relay chain.
		pub PolkadotRelay: Location = todo!();
		// A 32 byte account on para 1000 with all bytes equal to 1 (Alice).
		pub AliceBytes: [u8; 32] = ALICE.into();
		pub PolkadotPara1000Alice: Location = todo!();
		// The location of the `Assets` pallet on the relay chain.
		pub PolkadotRelayBalancesPallet: Location = todo!();
		// The asset with index `1984` of the Assets pallet on polkadot parachain with id 1000.
		pub PolkadotPara1000Asset1984: Location = todo!();
		// The Kusama parachain with id 1000.
		pub KusamaPara1000: Location = todo!();
	}
}

/// All these locations are relative to a Polkadot parachain with id 1000.
pub mod relative_to_polkadot_para_1000 {
	use super::*;

	parameter_types! {
		// The Polkadot parachain with id 1000.
		pub PolkadotPara1000: Location = todo!();
		// The Polkadot parachain with id 2004.
		pub PolkadotPara2004: Location = todo!();
		// The Polkadot relay chain.
		pub PolkadotRelay: Location = todo!();
		// A 32 byte account on para 1000.
		pub AliceBytes: [u8; 32] = todo!();
		pub PolkadotPara1000Alice: Location = todo!();
		// The location of the `Balances` pallet on the relay chain.
		pub PolkadotRelayBalancesPallet: Location = todo!();
		// The asset with index `1984` of the Assets pallet on the Polkadot parachain with id 1000.
		pub PolkadotPara1000Asset1984: Location = todo!();
		// The Kusama parachain with id 1000.
		pub KusamaPara1000: Location = todo!();
	}
}

/// All these locations are relative to an EVM Smart Contract on Parachain B, secured by Polkadot.
pub mod relative_to_polkadot_para_2000_sc {
	use super::*;

	parameter_types! {
		// TODO
	}
}

// Relay B Topography:
//                ┌───────────┐
//                │  Relay B  │
//                │  Kusama   │
//                └─────┬─────┘
//                      │
//       ┌──────────────┼──────────────┐
//       │              │              │
// ┌─────┴─────┐  ┌─────┴─────┐  ┌─────┴─────┐
// │ AssetHub  │  │  User 1   │  │           │
// │  Id 1000  │  │ AcctKey32 │  │ Plurality │
// └─────┬─────┘  │           │  │           │
//       │        │ 0x11111...│  │           │
// ┌─────┴──────┐ └───────────┘  └───────────┘
// │  Pallet    │
// │    NFT     │
// │            │
// │ Pallet #52 │
// └─────┬──────┘
//       │
// ┌─────┴─────┐
// │    NFT    │
// │  Kitties  │
// │           │
// │  Id 1984  │
// └───────────┘

/// All these locations are relative to the Kusama Relay Chain.
pub mod relative_to_kusama_relay {
	use super::*;

	parameter_types! {
		// TODO
	}
}

/// All these locations are relative to a Kusama parachain with id 1000.
pub mod relative_to_kusama_para_1000 {
	use super::*;

	parameter_types! {
		// TODO
	}
}

// Absolute Topography
//                    ┌ ─ ─ ─ ─ ─┐
//                      Absolute
//                      Location
//                    └ ─ ─ ┬ ─ ─┘
//                          │
//      ┌─────────────┬─────┴─────┬────────────┐
//      │             │           │            │
// ┌────┴─────┐ ┌─────┴────┐ ┌────┴─────┐ ┌────┴─────┐
// │ Relay A  │ │ Relay B  │ │          │ │          │
// │ Polkadot │ │ Kusama   │ │ Bitcoin  │ │ Ethereum │
// └────┬─────┘ └─────┬────┘ └────┬─────┘ └─────┬────┘
//      │             │           │             │
//     ...           ...         ...           ...

/// All these locations are absolute.
/// Absolute locations have no parents and always start with the `GlobalConsensus` junction.
pub mod absolute {
	use super::*;

	parameter_types! {
		// The Polkadot parachain with id 1000.
		pub PolkadotPara1000: Location = todo!();
		// The Polkadot parachain with id 2004.
		pub PolkadotPara2004: Location = todo!();
		// The Polkadot relay chain.
		pub PolkadotRelay: Location = todo!();
		// A 32 byte account on para 1000.
		pub AliceBytes: [u8; 32] = ALICE.into();
		pub PolkadotPara1000Alice: Location = todo!();
		// The location of the `Balances` pallet on the relay chain.
		pub PolkadotRelayBalancesPallet: Location = todo!();
		// The asset with index `1984` of the Assets pallet on the Polkadot parachain with id 1000.
		pub PolkadotPara1000Asset1984: Location = todo!();
		// The Kusama parachain with id 1000.
		pub KusamaPara1000: Location = todo!();
	}
}

pub mod manipulation {
	use super::*;
	use sp_runtime::AccountId32;

	// Extract the account id from a Location, if it is the last junction in the Location.
	pub fn extract_last_account_id(location: Location) -> Option<AccountId32> {
		todo!("{:?}", location)
	}

	// From the perspective of a parachain, check if another location is a sibling parachain, and
	// return the id.
	pub fn check_sibling_parachains(maybe_sibling: Location) -> Option<u32> {
		todo!("{:?}", maybe_sibling)
	}

	// Append `who` to the current `origin`.
	pub fn descend_origin(origin: &mut Location, who: Location) -> Result<(), XcmError> {
		todo!("{:?} {:?}", origin, who)
	}
}
}
#![allow(unused)]
fn main() {
//! # Fundamentals Lesson 1
use crate::constants::ALICE;
use frame_support::parameter_types;
use xcm::latest::prelude::*;

// Relay A Topography:
//                   ┌───────────┐
//                   │  Relay A  │
//                   │  Polkadot │
//                   └─────┬─────┘
//                         │
//              ┌──────────┴──────────┐
//              │                     │
//        ┌─────┴─────┐         ┌─────┴──────┐
//        │ AssetHub  │         │  Moonbeam  │
//        │  Id 1000  │         │  Id 2004   │
//        └─────┬─────┘         └──────┬─────┘
//              │                      │
//       ┌──────┴──────┐               ├───────────┐
//       │             │               │           │
// ┌─────┴─────┐ ┌─────┴──────┐ ┌──────┴────┐ ┌────┴───────┐
// │   Alice   │ │  Pallet    │ │    Bob    │ │  Pallet    │
// │ AcctKey32 │ │  Assets    │ │ AcctKey20 │ │   EVM      │
// │           │ │            │ │           │ │            │
// │ 0x11111...│ │ Pallet #50 │ │ 0x22222...│ │ Pallet #51 │
// └───────────┘ └─────┬──────┘ └───────────┘ └─────┬──────┘
//                     │                            │
//               ┌─────┴─────┐               ┌──────┴─────┐
//               │   Asset   │               │   Smart    │
//               │   USDT    │               │ Contract   │
//               │           │               │            │
//               │  Id 1984  │               │ 0x55555... │
//               └───────────┘               └────────────┘

/// All these locations are relative to the Polkadot Relay Chain.
pub mod relative_to_polkadot_relay {
	use super::*;

	parameter_types! {
		// The Polkadot parachain A with id 1000.
		pub PolkadotPara1000: Location = Parachain(1000).into();
		// The Polkadot parachain B with id 2004.
		pub PolkadotPara2004: Location = Parachain(2004).into();
		// The Polkadot relay chain.
		pub PolkadotRelay: Location = Here.into();
		// A 32 byte account on para 1000 with all bytes equal to 1 (Alice).
		pub AliceBytes: [u8; 32] = ALICE.into();
		pub PolkadotPara1000Alice: Location = Location::new(0, [Parachain(1000), AliceBytes::get().into()]);
		// The location of the `Assets` pallet on the relay chain.
		pub PolkadotPara1000AssetsPallet: Location = [Parachain(1000), PalletInstance(50)].into();
		// The asset with index `1984` of the Assets pallet on polkadot parachain with id 1000.
		pub PolkadotPara1000Asset1984: Location = (Parachain(1000), PalletInstance(50), GeneralIndex(1984)).into();
		// The Kusama parachain with id 1000.
		pub KusamaPara1000: Location = (Parent, GlobalConsensus(Kusama), Parachain(1000)).into();
	}
}

/// All these locations are relative to a Polkadot parachain with id 1000.
pub mod relative_to_polkadot_para_1000 {
	use super::*;

	parameter_types! {
		// The Polkadot parachain with id 1000.
		pub PolkadotPara1000: Location = Here.into();
		// The Polkadot parachain with id 2004.
		pub PolkadotPara2004: Location = (Parent, Parachain(2004)).into();
		// The Polkadot relay chain.
		pub PolkadotRelay: Location = Parent.into();
		// A 32 byte account on para 1000.
		pub AliceBytes: [u8; 32] = ALICE.into();
		pub PolkadotPara1000Alice: Location = Location::new(0, [AliceBytes::get().into()]);
		// The location of the `Balances` pallet on the relay chain.
		pub PolkadotPara1000AssetsPallet: Location = (PalletInstance(50)).into();
		// The asset with index `1984` of the Assets pallet on the Polkadot parachain with id 1000.
		pub PolkadotPara1000Asset1984: Location = (PalletInstance(50), GeneralIndex(1984)).into();
		// The Kusama parachain with id 1000.
		pub KusamaPara1000: Location = (Parent, Parent, GlobalConsensus(Kusama), Parachain(1000)).into();
	}
}

/// All these locations are relative to an EVM Smart Contract on Parachain B, secured by Polkadot.
pub mod relative_to_polkadot_para_2000_sc {
	use super::*;

	parameter_types! {
		// TODO
	}
}

// Relay B Topography:
//                ┌───────────┐
//                │  Relay B  │
//                │  Kusama   │
//                └─────┬─────┘
//                      │
//       ┌──────────────┼──────────────┐
//       │              │              │
// ┌─────┴─────┐  ┌─────┴─────┐  ┌─────┴─────┐
// │ AssetHub  │  │  User 1   │  │           │
// │  Id 1000  │  │ AcctKey32 │  │ Plurality │
// └─────┬─────┘  │           │  │           │
//       │        │ 0x11111...│  │           │
// ┌─────┴──────┐ └───────────┘  └───────────┘
// │  Pallet    │
// │    NFT     │
// │            │
// │ Pallet #52 │
// └─────┬──────┘
//       │
// ┌─────┴─────┐
// │    NFT    │
// │  Kitties  │
// │           │
// │  Id 1984  │
// └───────────┘

/// All these locations are relative to the Kusama Relay Chain.
pub mod relative_to_kusama_relay {
	use super::*;

	parameter_types! {
		// TODO
	}
}

/// All these locations are relative to a Kusama parachain with id 1000.
pub mod relative_to_kusama_para_1000 {
	use super::*;

	parameter_types! {
		// TODO
	}
}

// Absolute Topography
//                    ┌ ─ ─ ─ ─ ─┐
//                      Absolute
//                      Location
//                    └ ─ ─ ┬ ─ ─┘
//                          │
//      ┌─────────────┬─────┴─────┬────────────┐
//      │             │           │            │
// ┌────┴─────┐ ┌─────┴────┐ ┌────┴─────┐ ┌────┴─────┐
// │ Relay A  │ │ Relay B  │ │          │ │          │
// │ Polkadot │ │ Kusama   │ │ Bitcoin  │ │ Ethereum │
// └────┬─────┘ └─────┬────┘ └────┬─────┘ └─────┬────┘
//      │             │           │             │
//     ...           ...         ...           ...

/// All these locations are absolute.
/// Absolute locations have no parents and always start with the `GlobalConsensus` junction.
pub mod absolute {
	use super::*;

	parameter_types! {
		// The Polkadot parachain with id 1000.
		pub PolkadotPara1000: Location = [GlobalConsensus(Polkadot), Parachain(1000)].into();
		// The Polkadot parachain with id 2004.
		pub PolkadotPara2004: Location = [GlobalConsensus(Polkadot), Parachain(2004)].into();
		// The Polkadot relay chain.
		pub PolkadotRelay: Location = [GlobalConsensus(Polkadot)].into();
		// A 32 byte account on para 1000.
		pub AliceBytes: [u8; 32] = ALICE.into();
		pub PolkadotPara1000Alice: Location = [GlobalConsensus(Polkadot), Parachain(1000), AliceBytes::get().into()].into();
		// The location of the `Balances` pallet on the relay chain.
		pub PolkadotPara1000AssetsPallet: Location = [GlobalConsensus(Polkadot), Parachain(1000), PalletInstance(50)].into();
		// The asset with index `1984` of the Assets pallet on the Polkadot parachain with id 1000.
		pub PolkadotPara1000Asset1984: Location = [GlobalConsensus(Polkadot), Parachain(1000), PalletInstance(50), GeneralIndex(1984)].into();
		// The Kusama parachain with id 1000.
		pub KusamaPara1000: Location = [GlobalConsensus(Kusama), Parachain(1000)].into();
	}
}

pub mod manipulation {
	use super::*;
	use sp_runtime::AccountId32;

	// Extract the account id from a Location, if it is the last junction in the Location.
	pub fn extract_last_account_id(location: Location) -> Option<AccountId32> {
		match location.last() {
			Some(Junction::AccountId32 { id, .. }) => Some((*id).into()),
			_ => None,
		}
	}

	// From the perspective of a parachain, check if another location is a sibling parachain, and
	// return the id.
	pub fn check_sibling_parachains(maybe_sibling: Location) -> Option<u32> {
		match maybe_sibling.unpack() {
			(1, [Parachain(id)]) => Some(*id),
			_ => None,
		}
	}

	// Append `who` to the current `origin`.
	pub fn descend_origin(origin: &mut Location, who: Location) -> Result<(), XcmError> {
		(*origin).append_with(who).map_err(|_| XcmError::LocationFull)
	}
}
}
diff --git a/fundamentals/src/location.rs b/fundamentals/src/location.rs
index 8b13789..b5ebea9 100644
--- a/fundamentals/src/location.rs
+++ b/fundamentals/src/location.rs
@@ -1 +1,193 @@
+//! # Fundamentals Lesson 1
+use crate::constants::ALICE;
+use frame_support::parameter_types;
+use xcm::latest::prelude::*;
 
+// Relay A Topography:
+//                   ┌───────────┐
+//                   │  Relay A  │
+//                   │  Polkadot │
+//                   └─────┬─────┘
+//                         │
+//              ┌──────────┴──────────┐
+//              │                     │
+//        ┌─────┴─────┐         ┌─────┴──────┐
+//        │ AssetHub  │         │  Moonbeam  │
+//        │  Id 1000  │         │  Id 2004   │
+//        └─────┬─────┘         └──────┬─────┘
+//              │                      │
+//       ┌──────┴──────┐               ├───────────┐
+//       │             │               │           │
+// ┌─────┴─────┐ ┌─────┴──────┐ ┌──────┴────┐ ┌────┴───────┐
+// │   Alice   │ │  Pallet    │ │    Bob    │ │  Pallet    │
+// │ AcctKey32 │ │  Assets    │ │ AcctKey20 │ │   EVM      │
+// │           │ │            │ │           │ │            │
+// │ 0x11111...│ │ Pallet #50 │ │ 0x22222...│ │ Pallet #51 │
+// └───────────┘ └─────┬──────┘ └───────────┘ └─────┬──────┘
+//                     │                            │
+//               ┌─────┴─────┐               ┌──────┴─────┐
+//               │   Asset   │               │   Smart    │
+//               │   USDT    │               │ Contract   │
+//               │           │               │            │
+//               │  Id 1984  │               │ 0x55555... │
+//               └───────────┘               └────────────┘
+
+/// All these locations are relative to the Polkadot Relay Chain.
+pub mod relative_to_polkadot_relay {
+	use super::*;
+
+	parameter_types! {
+		// The Polkadot parachain A with id 1000.
+		pub PolkadotPara1000: Location = todo!();
+		// The Polkadot parachain B with id 2004.
+		pub PolkadotPara2004: Location = todo!();
+		// The Polkadot relay chain.
+		pub PolkadotRelay: Location = todo!();
+		// A 32 byte account on para 1000 with all bytes equal to 1 (Alice).
+		pub AliceBytes: [u8; 32] = ALICE.into();
+		pub PolkadotPara1000Alice: Location = todo!();
+		// The location of the `Assets` pallet on the relay chain.
+		pub PolkadotRelayBalancesPallet: Location = todo!();
+		// The asset with index `1984` of the Assets pallet on polkadot parachain with id 1000.
+		pub PolkadotPara1000Asset1984: Location = todo!();
+		// The Kusama parachain with id 1000.
+		pub KusamaPara1000: Location = todo!();
+	}
+}
+
+/// All these locations are relative to a Polkadot parachain with id 1000.
+pub mod relative_to_polkadot_para_1000 {
+	use super::*;
+
+	parameter_types! {
+		// The Polkadot parachain with id 1000.
+		pub PolkadotPara1000: Location = todo!();
+		// The Polkadot parachain with id 2004.
+		pub PolkadotPara2004: Location = todo!();
+		// The Polkadot relay chain.
+		pub PolkadotRelay: Location = todo!();
+		// A 32 byte account on para 1000.
+		pub AliceBytes: [u8; 32] = todo!();
+		pub PolkadotPara1000Alice: Location = todo!();
+		// The location of the `Balances` pallet on the relay chain.
+		pub PolkadotRelayBalancesPallet: Location = todo!();
+		// The asset with index `1984` of the Assets pallet on the Polkadot parachain with id 1000.
+		pub PolkadotPara1000Asset1984: Location = todo!();
+		// The Kusama parachain with id 1000.
+		pub KusamaPara1000: Location = todo!();
+	}
+}
+
+/// All these locations are relative to an EVM Smart Contract on Parachain B, secured by Polkadot.
+pub mod relative_to_polkadot_para_2000_sc {
+	use super::*;
+
+	parameter_types! {
+		// TODO
+	}
+}
+
+// Relay B Topography:
+//                ┌───────────┐
+//                │  Relay B  │
+//                │  Kusama   │
+//                └─────┬─────┘
+//                      │
+//       ┌──────────────┼──────────────┐
+//       │              │              │
+// ┌─────┴─────┐  ┌─────┴─────┐  ┌─────┴─────┐
+// │ AssetHub  │  │  User 1   │  │           │
+// │  Id 1000  │  │ AcctKey32 │  │ Plurality │
+// └─────┬─────┘  │           │  │           │
+//       │        │ 0x11111...│  │           │
+// ┌─────┴──────┐ └───────────┘  └───────────┘
+// │  Pallet    │
+// │    NFT     │
+// │            │
+// │ Pallet #52 │
+// └─────┬──────┘
+//       │
+// ┌─────┴─────┐
+// │    NFT    │
+// │  Kitties  │
+// │           │
+// │  Id 1984  │
+// └───────────┘
+
+/// All these locations are relative to the Kusama Relay Chain.
+pub mod relative_to_kusama_relay {
+	use super::*;
+
+	parameter_types! {
+		// TODO
+	}
+}
+
+/// All these locations are relative to a Kusama parachain with id 1000.
+pub mod relative_to_kusama_para_1000 {
+	use super::*;
+
+	parameter_types! {
+		// TODO
+	}
+}
+
+// Absolute Topography
+//                    ┌ ─ ─ ─ ─ ─┐
+//                      Absolute
+//                      Location
+//                    └ ─ ─ ┬ ─ ─┘
+//                          │
+//      ┌─────────────┬─────┴─────┬────────────┐
+//      │             │           │            │
+// ┌────┴─────┐ ┌─────┴────┐ ┌────┴─────┐ ┌────┴─────┐
+// │ Relay A  │ │ Relay B  │ │          │ │          │
+// │ Polkadot │ │ Kusama   │ │ Bitcoin  │ │ Ethereum │
+// └────┬─────┘ └─────┬────┘ └────┬─────┘ └─────┬────┘
+//      │             │           │             │
+//     ...           ...         ...           ...
+
+/// All these locations are absolute.
+/// Absolute locations have no parents and always start with the `GlobalConsensus` junction.
+pub mod absolute {
+	use super::*;
+
+	parameter_types! {
+		// The Polkadot parachain with id 1000.
+		pub PolkadotPara1000: Location = todo!();
+		// The Polkadot parachain with id 2004.
+		pub PolkadotPara2004: Location = todo!();
+		// The Polkadot relay chain.
+		pub PolkadotRelay: Location = todo!();
+		// A 32 byte account on para 1000.
+		pub AliceBytes: [u8; 32] = ALICE.into();
+		pub PolkadotPara1000Alice: Location = todo!();
+		// The location of the `Balances` pallet on the relay chain.
+		pub PolkadotRelayBalancesPallet: Location = todo!();
+		// The asset with index `1984` of the Assets pallet on the Polkadot parachain with id 1000.
+		pub PolkadotPara1000Asset1984: Location = todo!();
+		// The Kusama parachain with id 1000.
+		pub KusamaPara1000: Location = todo!();
+	}
+}
+
+pub mod manipulation {
+	use super::*;
+	use sp_runtime::AccountId32;
+
+	// Extract the account id from a Location, if it is the last junction in the Location.
+	pub fn extract_last_account_id(location: Location) -> Option<AccountId32> {
+		todo!("{:?}", location)
+	}
+
+	// From the perspective of a parachain, check if another location is a sibling parachain, and
+	// return the id.
+	pub fn check_sibling_parachains(maybe_sibling: Location) -> Option<u32> {
+		todo!("{:?}", maybe_sibling)
+	}
+
+	// Append `who` to the current `origin`.
+	pub fn descend_origin(origin: &mut Location, who: Location) -> Result<(), XcmError> {
+		todo!("{:?} {:?}", origin, who)
+	}
+}
diff --git a/fundamentals/src/location.rs b/fundamentals/src/location.rs
index b5ebea9..a7f912f 100644
--- a/fundamentals/src/location.rs
+++ b/fundamentals/src/location.rs
@@ -38,20 +38,20 @@ pub mod relative_to_polkadot_relay {
 
 	parameter_types! {
 		// The Polkadot parachain A with id 1000.
-		pub PolkadotPara1000: Location = todo!();
+		pub PolkadotPara1000: Location = Parachain(1000).into();
 		// The Polkadot parachain B with id 2004.
-		pub PolkadotPara2004: Location = todo!();
+		pub PolkadotPara2004: Location = Parachain(2004).into();
 		// The Polkadot relay chain.
-		pub PolkadotRelay: Location = todo!();
+		pub PolkadotRelay: Location = Here.into();
 		// A 32 byte account on para 1000 with all bytes equal to 1 (Alice).
 		pub AliceBytes: [u8; 32] = ALICE.into();
-		pub PolkadotPara1000Alice: Location = todo!();
+		pub PolkadotPara1000Alice: Location = Location::new(0, [Parachain(1000), AliceBytes::get().into()]);
 		// The location of the `Assets` pallet on the relay chain.
-		pub PolkadotRelayBalancesPallet: Location = todo!();
+		pub PolkadotPara1000AssetsPallet: Location = [Parachain(1000), PalletInstance(50)].into();
 		// The asset with index `1984` of the Assets pallet on polkadot parachain with id 1000.
-		pub PolkadotPara1000Asset1984: Location = todo!();
+		pub PolkadotPara1000Asset1984: Location = (Parachain(1000), PalletInstance(50), GeneralIndex(1984)).into();
 		// The Kusama parachain with id 1000.
-		pub KusamaPara1000: Location = todo!();
+		pub KusamaPara1000: Location = (Parent, GlobalConsensus(Kusama), Parachain(1000)).into();
 	}
 }
 
@@ -61,20 +61,20 @@ pub mod relative_to_polkadot_para_1000 {
 
 	parameter_types! {
 		// The Polkadot parachain with id 1000.
-		pub PolkadotPara1000: Location = todo!();
+		pub PolkadotPara1000: Location = Here.into();
 		// The Polkadot parachain with id 2004.
-		pub PolkadotPara2004: Location = todo!();
+		pub PolkadotPara2004: Location = (Parent, Parachain(2004)).into();
 		// The Polkadot relay chain.
-		pub PolkadotRelay: Location = todo!();
+		pub PolkadotRelay: Location = Parent.into();
 		// A 32 byte account on para 1000.
-		pub AliceBytes: [u8; 32] = todo!();
-		pub PolkadotPara1000Alice: Location = todo!();
+		pub AliceBytes: [u8; 32] = ALICE.into();
+		pub PolkadotPara1000Alice: Location = Location::new(0, [AliceBytes::get().into()]);
 		// The location of the `Balances` pallet on the relay chain.
-		pub PolkadotRelayBalancesPallet: Location = todo!();
+		pub PolkadotPara1000AssetsPallet: Location = (PalletInstance(50)).into();
 		// The asset with index `1984` of the Assets pallet on the Polkadot parachain with id 1000.
-		pub PolkadotPara1000Asset1984: Location = todo!();
+		pub PolkadotPara1000Asset1984: Location = (PalletInstance(50), GeneralIndex(1984)).into();
 		// The Kusama parachain with id 1000.
-		pub KusamaPara1000: Location = todo!();
+		pub KusamaPara1000: Location = (Parent, Parent, GlobalConsensus(Kusama), Parachain(1000)).into();
 	}
 }
 
@@ -154,20 +154,20 @@ pub mod absolute {
 
 	parameter_types! {
 		// The Polkadot parachain with id 1000.
-		pub PolkadotPara1000: Location = todo!();
+		pub PolkadotPara1000: Location = [GlobalConsensus(Polkadot), Parachain(1000)].into();
 		// The Polkadot parachain with id 2004.
-		pub PolkadotPara2004: Location = todo!();
+		pub PolkadotPara2004: Location = [GlobalConsensus(Polkadot), Parachain(2004)].into();
 		// The Polkadot relay chain.
-		pub PolkadotRelay: Location = todo!();
+		pub PolkadotRelay: Location = [GlobalConsensus(Polkadot)].into();
 		// A 32 byte account on para 1000.
 		pub AliceBytes: [u8; 32] = ALICE.into();
-		pub PolkadotPara1000Alice: Location = todo!();
+		pub PolkadotPara1000Alice: Location = [GlobalConsensus(Polkadot), Parachain(1000), AliceBytes::get().into()].into();
 		// The location of the `Balances` pallet on the relay chain.
-		pub PolkadotRelayBalancesPallet: Location = todo!();
+		pub PolkadotPara1000AssetsPallet: Location = [GlobalConsensus(Polkadot), Parachain(1000), PalletInstance(50)].into();
 		// The asset with index `1984` of the Assets pallet on the Polkadot parachain with id 1000.
-		pub PolkadotPara1000Asset1984: Location = todo!();
+		pub PolkadotPara1000Asset1984: Location = [GlobalConsensus(Polkadot), Parachain(1000), PalletInstance(50), GeneralIndex(1984)].into();
 		// The Kusama parachain with id 1000.
-		pub KusamaPara1000: Location = todo!();
+		pub KusamaPara1000: Location = [GlobalConsensus(Kusama), Parachain(1000)].into();
 	}
 }
 
@@ -177,17 +177,23 @@ pub mod manipulation {
 
 	// Extract the account id from a Location, if it is the last junction in the Location.
 	pub fn extract_last_account_id(location: Location) -> Option<AccountId32> {
-		todo!("{:?}", location)
+		match location.last() {
+			Some(Junction::AccountId32 { id, .. }) => Some((*id).into()),
+			_ => None,
+		}
 	}
 
 	// From the perspective of a parachain, check if another location is a sibling parachain, and
 	// return the id.
 	pub fn check_sibling_parachains(maybe_sibling: Location) -> Option<u32> {
-		todo!("{:?}", maybe_sibling)
+		match maybe_sibling.unpack() {
+			(1, [Parachain(id)]) => Some(*id),
+			_ => None,
+		}
 	}
 
 	// Append `who` to the current `origin`.
 	pub fn descend_origin(origin: &mut Location, who: Location) -> Result<(), XcmError> {
-		todo!("{:?} {:?}", origin, who)
+		(*origin).append_with(who).map_err(|_| XcmError::LocationFull)
 	}
 }