text:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

using ManagedNativeWifi.Common;
using static ManagedNativeWifi.Win32.NativeMethod;
using Base = ManagedNativeWifi.Win32.BaseMethod;

namespace ManagedNativeWifi
{
	/// <summary>
	/// A managed implementation of Native Wifi API
	/// </summary>
	public class NativeWifi
	{
		#region Enumerate interfaces

		/// <summary>
		/// Enumerates wireless interface information.
		/// </summary>
		/// <returns>Wireless interface information</returns>
		public static IEnumerable<InterfaceInfo> EnumerateInterfaces()
		{
			return EnumerateInterfaces(null);
		}

		internal static IEnumerable<InterfaceInfo> EnumerateInterfaces(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			return Base.GetInterfaceInfoList(container.Content.Handle)
				.Select(x => new InterfaceInfo(x));
		}

		/// <summary>
		/// Enumerates wireless interface and related connection information.
		/// </summary>
		/// <returns>Wireless interface and related connection information</returns>
		public static IEnumerable<InterfaceConnectionInfo> EnumerateInterfaceConnections()
		{
			return EnumerateInterfaceConnections(null);
		}

		internal static IEnumerable<InterfaceConnectionInfo> EnumerateInterfaceConnections(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			foreach (var interfaceInfo in Base.GetInterfaceInfoList(container.Content.Handle))
			{
				var connection = Base.GetConnectionAttributes(container.Content.Handle, interfaceInfo.InterfaceGuid);

				var isConnected = (interfaceInfo.isState == WLAN_INTERFACE_STATE.wlan_interface_state_connected);
				var isRadioOn = isConnected ||
					EnumerateInterfaceRadioSets(container.Content, interfaceInfo.InterfaceGuid).Any(x => x.On.GetValueOrDefault());

				yield return new InterfaceConnectionInfo(
					interfaceInfo,
					connectionMode: ConnectionModeConverter.Convert(connection.wlanConnectionMode),
					isRadioOn: isRadioOn,
					isConnected: isConnected,
					profileName: connection.strProfileName);
			}
		}

		#endregion

		#region Scan networks

		/// <summary>
		/// Asynchronously requests wireless interfaces to scan wireless LANs.
		/// </summary>
		/// <param name="timeout">Timeout duration</param>
		/// <returns>Interface IDs that successfully scanned</returns>
		public static Task<IEnumerable<Guid>> ScanNetworksAsync(TimeSpan timeout)
		{
			return ScanNetworksAsync(null, timeout, CancellationToken.None);
		}

		/// <summary>
		/// Asynchronously requests wireless interfaces to scan wireless LANs.
		/// </summary>
		/// <param name="timeout">Timeout duration</param>
		/// <param name="cancellationToken">Cancellation token</param>
		/// <returns>Interface IDs that successfully scanned</returns>
		public static Task<IEnumerable<Guid>> ScanNetworksAsync(TimeSpan timeout, CancellationToken cancellationToken)
		{
			return ScanNetworksAsync(null, timeout, cancellationToken);
		}

		internal static async Task<IEnumerable<Guid>> ScanNetworksAsync(Base.WlanNotificationClient client, TimeSpan timeout, CancellationToken cancellationToken)
		{
			if (timeout <= TimeSpan.Zero)
				throw new ArgumentOutOfRangeException(nameof(timeout), "The timeout duration must be positive.");

			using var container = new DisposableContainer<Base.WlanNotificationClient>(client);

			var interfaceIds = Base.GetInterfaceInfoList(container.Content.Handle)
				.Select(x => x.InterfaceGuid)
				.ToArray();

			var tcs = new TaskCompletionSource<bool>();
			var counter = new ScanCounter(() => Task.Run(() => tcs.TrySetResult(true)), interfaceIds);

			container.Content.NotificationReceived += (sender, data) =>
			{
				switch ((WLAN_NOTIFICATION_ACM)data.NotificationCode)
				{
					case WLAN_NOTIFICATION_ACM.wlan_notification_acm_scan_complete:
						counter.SetSuccess(data.InterfaceGuid);
						break;
					case WLAN_NOTIFICATION_ACM.wlan_notification_acm_scan_fail:
						counter.SetFailure(data.InterfaceGuid);
						break;
				}
			};

			foreach (var interfaceId in interfaceIds)
			{
				var result = Base.Scan(container.Content.Handle, interfaceId);
				if (!result)
					counter.SetFailure(interfaceId);
			}

			using (cancellationToken.Register(() => tcs.TrySetCanceled()))
			{
				var scanTask = tcs.Task;
				await Task.WhenAny(scanTask, Task.Delay(timeout, cancellationToken));

				return counter.Results;
			}
		}

		private class ScanCounter
		{
			private readonly Action _complete;
			private readonly List<Guid> _targets = new List<Guid>();
			private readonly List<Guid> _results = new List<Guid>();

			public IEnumerable<Guid> Results => _results.ToArray();

			public ScanCounter(Action complete, IEnumerable<Guid> targets)
			{
				this._complete = complete;
				this._targets.AddRange(targets);
			}

			private readonly object _lock = new object();

			public void SetSuccess(Guid value)
			{
				lock (_lock)
				{
					_targets.Remove(value);
					_results.Add(value);

					CheckTargets();
				}
			}

			public void SetFailure(Guid value)
			{
				lock (_lock)
				{
					_targets.Remove(value);

					CheckTargets();
				}
			}

			private void CheckTargets()
			{
				if (_targets.Count > 0)
					return;

				_complete.Invoke();
			}
		}

		#endregion

		#region Enumerate networks

		/// <summary>
		/// Enumerates SSIDs of available wireless LANs.
		/// </summary>
		/// <returns>SSIDs</returns>
		public static IEnumerable<NetworkIdentifier> EnumerateAvailableNetworkSsids()
		{
			return EnumerateAvailableNetworkSsids(null);
		}

		internal static IEnumerable<NetworkIdentifier> EnumerateAvailableNetworkSsids(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			foreach (var interfaceInfo in Base.GetInterfaceInfoList(container.Content.Handle))
			{
				foreach (var availableNetwork in Base.GetAvailableNetworkList(container.Content.Handle, interfaceInfo.InterfaceGuid))
					yield return new NetworkIdentifier(availableNetwork.dot11Ssid);
			}
		}

		/// <summary>
		/// Enumerates SSIDs of connected wireless LANs.
		/// </summary>
		/// <returns>SSIDs</returns>
		public static IEnumerable<NetworkIdentifier> EnumerateConnectedNetworkSsids()
		{
			return EnumerateConnectedNetworkSsids(null);
		}

		internal static IEnumerable<NetworkIdentifier> EnumerateConnectedNetworkSsids(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			foreach (var interfaceInfo in Base.GetInterfaceInfoList(container.Content.Handle))
			{
				var connection = Base.GetConnectionAttributes(container.Content.Handle, interfaceInfo.InterfaceGuid);
				if (connection.isState != WLAN_INTERFACE_STATE.wlan_interface_state_connected)
					continue;

				var association = connection.wlanAssociationAttributes;

				yield return new NetworkIdentifier(association.dot11Ssid);
			}
		}

		/// <summary>
		/// Enumerates wireless LAN information on available networks.
		/// </summary>
		/// <returns>Wireless LAN information on available networks</returns>
		/// <remarks>
		/// If multiple profiles are associated with a same network, there will be multiple entries with
		/// the same SSID.
		/// </remarks>
		public static IEnumerable<AvailableNetworkPack> EnumerateAvailableNetworks()
		{
			return EnumerateAvailableNetworks(null);
		}

		internal static IEnumerable<AvailableNetworkPack> EnumerateAvailableNetworks(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			foreach (var interfaceInfo in EnumerateInterfaces(container.Content))
			{
				foreach (var availableNetwork in Base.GetAvailableNetworkList(container.Content.Handle, interfaceInfo.Id))
				{
					if (!BssTypeConverter.TryConvert(availableNetwork.dot11BssType, out BssType bssType))
						continue;

					if (!AuthenticationAlgorithmConverter.TryConvert(availableNetwork.dot11DefaultAuthAlgorithm, out AuthenticationAlgorithm authenticationAlgorithm))
						continue;

					if (!CipherAlgorithmConverter.TryConvert(availableNetwork.dot11DefaultCipherAlgorithm, out CipherAlgorithm cipherAlgorithm))
						continue;

					yield return new AvailableNetworkPack(
						interfaceInfo: interfaceInfo,
						ssid: new NetworkIdentifier(availableNetwork.dot11Ssid),
						bssType: bssType,
						signalQuality: (int)availableNetwork.wlanSignalQuality,
						isSecurityEnabled: availableNetwork.bSecurityEnabled,
						profileName: availableNetwork.strProfileName,
						authenticationAlgorithm: authenticationAlgorithm,
						cipherAlgorithm: cipherAlgorithm);
				}
			}
		}

		/// <summary>
		/// Enumerates wireless LAN information on available networks and group of associated BSS networks.
		/// </summary>
		/// <returns>Wireless LAN information on available networks and group of associated BSS networks</returns>
		/// <remarks>
		/// If multiple profiles are associated with a same network, there will be multiple entries with
		/// the same SSID.
		/// </remarks>
		public static IEnumerable<AvailableNetworkGroupPack> EnumerateAvailableNetworkGroups()
		{
			return EnumerateAvailableNetworkGroups(null);
		}

		internal static IEnumerable<AvailableNetworkGroupPack> EnumerateAvailableNetworkGroups(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			foreach (var interfaceInfo in EnumerateInterfaces(container.Content))
			{
				foreach (var availableNetworkGroup in EnumerateAvailableNetworkGroups(container.Content, interfaceInfo))
					yield return availableNetworkGroup;
			}
		}

		private static IEnumerable<AvailableNetworkGroupPack> EnumerateAvailableNetworkGroups(Base.WlanClient client, InterfaceInfo interfaceInfo)
		{
			foreach (var availableNetwork in Base.GetAvailableNetworkList(client.Handle, interfaceInfo.Id))
			{
				if (!BssTypeConverter.TryConvert(availableNetwork.dot11BssType, out BssType bssType))
					continue;

				if (!AuthenticationAlgorithmConverter.TryConvert(availableNetwork.dot11DefaultAuthAlgorithm, out AuthenticationAlgorithm authenticationAlgorithm))
					continue;

				if (!CipherAlgorithmConverter.TryConvert(availableNetwork.dot11DefaultCipherAlgorithm, out CipherAlgorithm cipherAlgorithm))
					continue;

				var bssNetworks = Base.GetNetworkBssEntryList(client.Handle, interfaceInfo.Id,
					availableNetwork.dot11Ssid, availableNetwork.dot11BssType, availableNetwork.bSecurityEnabled)
					.Select(x => TryConvertBssNetwork(interfaceInfo, x, out BssNetworkPack bssNetwork) ? bssNetwork : null)
					.Where(x => x is not null);

				yield return new AvailableNetworkGroupPack(
					interfaceInfo: interfaceInfo,
					ssid: new NetworkIdentifier(availableNetwork.dot11Ssid),
					bssType: bssType,
					signalQuality: (int)availableNetwork.wlanSignalQuality,
					isSecurityEnabled: availableNetwork.bSecurityEnabled,
					profileName: availableNetwork.strProfileName,
					authenticationAlgorithm: authenticationAlgorithm,
					cipherAlgorithm: cipherAlgorithm,
					bssNetworks: bssNetworks);
			}
		}

		/// <summary>
		/// Enumerates wireless LAN information on BSS networks.
		/// </summary>
		/// <returns>Wireless LAN information on BSS networks</returns>
		public static IEnumerable<BssNetworkPack> EnumerateBssNetworks()
		{
			return EnumerateBssNetworks(null);
		}

		internal static IEnumerable<BssNetworkPack> EnumerateBssNetworks(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			foreach (var interfaceInfo in EnumerateInterfaces(container.Content))
			{
				foreach (var networkBssEntry in Base.GetNetworkBssEntryList(container.Content.Handle, interfaceInfo.Id))
				{
					if (TryConvertBssNetwork(interfaceInfo, networkBssEntry, out BssNetworkPack bssNetwork))
						yield return bssNetwork;
				}
			}
		}

		private static bool TryConvertBssNetwork(InterfaceInfo interfaceInfo, WLAN_BSS_ENTRY bssEntry, out BssNetworkPack bssNetwork)
		{
			bssNetwork = null;

			if (!BssTypeConverter.TryConvert(bssEntry.dot11BssType, out BssType bssType))
				return false;

			if (!TryDetectBandChannel(bssEntry.ulChCenterFrequency, out float band, out int channel))
				return false;

			bssNetwork = new BssNetworkPack(
				interfaceInfo: interfaceInfo,
				ssid: new NetworkIdentifier(bssEntry.dot11Ssid),
				bssType: bssType,
				bssid: new NetworkIdentifier(bssEntry.dot11Bssid),
				phyType: PhyTypeConverter.Convert(bssEntry.dot11BssPhyType),
				signalStrength: bssEntry.lRssi,
				linkQuality: (int)bssEntry.uLinkQuality,
				frequency: (int)bssEntry.ulChCenterFrequency,
				band: band,
				channel: channel);
			return true;
		}

		#endregion

		#region Enumerate profiles

		/// <summary>
		/// Enumerates wireless profile names in preference order.
		/// </summary>
		/// <returns>Wireless profile names</returns>
		public static IEnumerable<string> EnumerateProfileNames()
		{
			return EnumerateProfileNames(null);
		}

		internal static IEnumerable<string> EnumerateProfileNames(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			foreach (var interfaceInfo in Base.GetInterfaceInfoList(container.Content.Handle))
			{
				foreach (var profileInfo in Base.GetProfileInfoList(container.Content.Handle, interfaceInfo.InterfaceGuid))
					yield return profileInfo.strProfileName;
			}
		}

		/// <summary>
		/// Enumerates wireless profile information in preference order.
		/// </summary>
		/// <returns>Wireless profile information</returns>
		public static IEnumerable<ProfilePack> EnumerateProfiles()
		{
			return EnumerateProfiles(null);
		}

		internal static IEnumerable<ProfilePack> EnumerateProfiles(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			foreach (var interfaceInfo in EnumerateInterfaces(container.Content))
			{
				int position = 0;

				foreach (var profileInfo in Base.GetProfileInfoList(container.Content.Handle, interfaceInfo.Id))
				{
					var profileXml = Base.GetProfile(container.Content.Handle, interfaceInfo.Id, profileInfo.strProfileName, out uint profileTypeFlag);
					if (string.IsNullOrWhiteSpace(profileXml))
						continue;

					if (!ProfileTypeConverter.TryConvert(profileTypeFlag, out ProfileType profileType))
						continue;

					yield return new ProfilePack(
						name: profileInfo.strProfileName,
						interfaceInfo: interfaceInfo,
						profileType: profileType,
						profileXml: profileXml,
						position: position++);
				}
			}
		}

		/// <summary>
		/// Enumerates wireless profile and related radio information in preference order.
		/// </summary>
		/// <returns>Wireless profile and related radio information</returns>
		public static IEnumerable<ProfileRadioPack> EnumerateProfileRadios()
		{
			return EnumerateProfileRadios(null);
		}

		internal static IEnumerable<ProfileRadioPack> EnumerateProfileRadios(Base.WlanClient client)
		{
			using var container = new DisposableContainer<Base.WlanClient>(client);

			foreach (var interfaceConnectionInfo in EnumerateInterfaceConnections(container.Content))
			{
				var availableNetworkGroups = EnumerateAvailableNetworkGroups(container.Content, interfaceConnectionInfo)
					.Where(x => !string.IsNullOrWhiteSpace(x.ProfileName))
					.ToArray();

				int position = 0;

				foreach (var profileInfo in Base.GetProfileInfoList(container.Content.Handle, interfaceConnectionInfo.Id))
				{
					var profileXml = Base.GetProfile(container.Content.Handle, interfaceConnectionInfo.Id, profileInfo.strProfileName, out uint profileTypeFlag);
					if (string.IsNullOrWhiteSpace(profileXml))
						continue;

					if (!ProfileTypeConverter.TryConvert(profileTypeFlag, out ProfileType profileType))
						continue;

					var availableNetworkGroup = availableNetworkGroups.FirstOrDefault(x => string.Equals(x.ProfileName, profileInfo.strProfileName, StringComparison.Ordinal));

					yield return new ProfileRadioPack(
						name: profileInfo.strProfileName,
						interfaceInfo: interfaceConnectionInfo,
						profileType: profileType,
						profileXml: profileXml,
						position: position++,
						phyType: (availableNetworkGroup?.PhyType ?? default),
						signalQuality: (availableNetworkGroup?.SignalQuality ?? 0),
						linkQuality: (availableNetworkGroup?.LinkQuality ?? 0),
						frequency: (availableNetworkGroup?.Frequency ?? 0),
						band: (availableNetworkGroup?.Band ?? 0),
						channel: (availableNetworkGroup?.Channel ?? 0));
				}
			}
		}

		#endregion

		#region Set/Rename/Delete profile

		/// <summary>
		/// Sets (adds or overwrites) the content of a specified wireless profile.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="profileType">Profile type</param>
		/// <param name="profileXml">Profile XML</param>
		/// <param name="profileSecurity">Security descriptor for all-user profile</param>
		/// <param name="overwrite">Whether to overwrite an existing profile</param>
		/// <returns>True if successfully set. False if failed.</returns>
		/// <remarks>
		/// If the content of the profile XML is not valid, a Win32Exception will be thrown.
		/// In such case, check the reason code in the message and see
		/// https://docs.microsoft.com/en-us/windows/win32/nativewifi/wlan-reason-code
		/// https://technet.microsoft.com/en-us/library/3ed3d027-5ae8-4cb0-ade5-0a7c446cd4f7#BKMK_AppndxE
		/// </remarks>
		public static bool SetProfile(Guid interfaceId, ProfileType profileType, string profileXml, string profileSecurity, bool overwrite)
		{
			return SetProfile(null, interfaceId, profileType, profileXml, profileSecurity, overwrite);
		}

		internal static bool SetProfile(Base.WlanClient client, Guid interfaceId, ProfileType profileType, string profileXml, string profileSecurity, bool overwrite)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));
			if (string.IsNullOrWhiteSpace(profileXml))
				throw new ArgumentNullException(nameof(profileXml));

			using var container = new DisposableContainer<Base.WlanClient>(client);

			var profileTypeFlag = ProfileTypeConverter.ConvertBack(profileType);

			return Base.SetProfile(container.Content.Handle, interfaceId, profileTypeFlag, profileXml, profileSecurity, overwrite);
		}

		/// <summary>
		/// Sets (add or overwirte) the user data (credentials) for a specified wireless profile.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="profileName">Profile name</param>
		/// <param name="eapXmlType">EAP XML type</param>
		/// <param name="userDataXml">User data XML</param>
		/// <returns>True if successfully set. False if failed.</returns>
		/// <remarks>
		/// In some cases, this function may return true but fail.
		/// This was observed when setting EapXmlType.AllUsers, but the certificate
		/// referenced in the EAP XML was installed in the users' store.
		/// </remarks>
		public static bool SetProfileEapXmlUserData(Guid interfaceId, string profileName, EapXmlType eapXmlType, string userDataXml)
		{
			return SetProfileEapXmlUserData(null, interfaceId, profileName, eapXmlType, userDataXml);
		}

		internal static bool SetProfileEapXmlUserData(Base.WlanClient client, Guid interfaceId, string profileName, EapXmlType eapXmlType, string userDataXml)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException(nameof(interfaceId));

			if (string.IsNullOrWhiteSpace(userDataXml))
				throw new ArgumentNullException(nameof(userDataXml));

			using var container = new DisposableContainer<Base.WlanClient>(client);

			var eapXmlTypeFlag = EapXmlTypeConverter.ConvertBack(eapXmlType);

			return Base.SetProfileEapXmlUserData(container.Content.Handle, interfaceId, profileName, eapXmlTypeFlag, userDataXml);
		}

		/// <summary>
		/// Sets the position of a specified wireless profile in preference order.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="profileName">Profile name</param>
		/// <param name="position">Position (starting at 0)</param>
		/// <returns>True if successfully set. False if failed.</returns>
		public static bool SetProfilePosition(Guid interfaceId, string profileName, int position)
		{
			return SetProfilePosition(null, interfaceId, profileName, position);
		}

		internal static bool SetProfilePosition(Base.WlanClient client, Guid interfaceId, string profileName, int position)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));
			if (string.IsNullOrWhiteSpace(profileName))
				throw new ArgumentNullException(nameof(profileName));
			if (position < 0)
				throw new ArgumentOutOfRangeException(nameof(position), "The position must not be negative.");

			using var container = new DisposableContainer<Base.WlanClient>(client);

			return Base.SetProfilePosition(container.Content.Handle, interfaceId, profileName, (uint)position);
		}

		/// <summary>
		/// Renames a specified wireless profile.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="oldProfileName">Old profile name</param>
		/// <param name="newProfileName">New profile name</param>
		/// <returns>True if successfully renamed. False if failed.</returns>
		public static bool RenameProfile(Guid interfaceId, string oldProfileName, string newProfileName)
		{
			return RenameProfile(null, interfaceId, oldProfileName, newProfileName);
		}

		internal static bool RenameProfile(Base.WlanClient client, Guid interfaceId, string oldProfileName, string newProfileName)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));
			if (string.IsNullOrWhiteSpace(oldProfileName))
				throw new ArgumentNullException(nameof(oldProfileName));
			if (string.IsNullOrWhiteSpace(newProfileName))
				throw new ArgumentNullException(nameof(newProfileName));

			using var container = new DisposableContainer<Base.WlanClient>(client);

			return Base.RenameProfile(container.Content.Handle, interfaceId, oldProfileName, newProfileName);
		}

		/// <summary>
		/// Deletes a specified wireless profile.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="profileName">Profile name</param>
		/// <returns>True if successfully deleted. False if failed.</returns>
		public static bool DeleteProfile(Guid interfaceId, string profileName)
		{
			return DeleteProfile(null, interfaceId, profileName);
		}

		internal static bool DeleteProfile(Base.WlanClient client, Guid interfaceId, string profileName)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));
			if (string.IsNullOrWhiteSpace(profileName))
				throw new ArgumentNullException(nameof(profileName));

			using var container = new DisposableContainer<Base.WlanClient>(client);

			return Base.DeleteProfile(container.Content.Handle, interfaceId, profileName);
		}

		#endregion

		#region Connect/Disconnect

		/// <summary>
		/// Attempts to connect to the wireless LAN associated to a specified wireless profile.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="profileName">Profile name</param>
		/// <param name="bssType">BSS network type</param>
		/// <param name="bssid">BSSID of the network</param>
		/// <returns>True if successfully requested the connection. False if failed.</returns>
		public static bool ConnectNetwork(Guid interfaceId, string profileName, BssType bssType, PhysicalAddress bssid = null)
		{
			return ConnectNetwork(null, interfaceId, profileName, bssType, bssid);
		}

		internal static bool ConnectNetwork(Base.WlanClient client, Guid interfaceId, string profileName, BssType bssType, PhysicalAddress bssid = null)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));
			if (string.IsNullOrWhiteSpace(profileName))
				throw new ArgumentNullException(nameof(profileName));

			using var container = new DisposableContainer<Base.WlanClient>(client);

			if (bssid is not null)
			{
				var dot11MacAddress = new DOT11_MAC_ADDRESS { ucDot11MacAddress = bssid.GetAddressBytes() };
				return Base.Connect(container.Content.Handle, interfaceId, profileName, BssTypeConverter.ConvertBack(bssType), dot11MacAddress);
			}
			else
			{
				return Base.Connect(container.Content.Handle, interfaceId, profileName, BssTypeConverter.ConvertBack(bssType));
			}
		}

		/// <summary>
		/// Asynchronously attempts to connect to the wireless LAN associated to a specified wireless profile.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="profileName">Profile name</param>
		/// <param name="bssType">BSS network type</param>
		/// <param name="timeout">Timeout duration</param>
		/// <returns>True if successfully connected. False if failed or timed out.</returns>
		public static Task<bool> ConnectNetworkAsync(Guid interfaceId, string profileName, BssType bssType, TimeSpan timeout)
		{
			return ConnectNetworkAsync(null, interfaceId, profileName, bssType, null, timeout, CancellationToken.None);
		}

		/// <summary>
		/// Asynchronously attempts to connect to the wireless LAN associated to a specified wireless profile.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="profileName">Profile name</param>
		/// <param name="bssType">BSS network type</param>
		/// <param name="timeout">Timeout duration</param>
		/// <param name="cancellationToken">Cancellation token</param>
		/// <returns>True if successfully connected. False if failed or timed out.</returns>
		public static Task<bool> ConnectNetworkAsync(Guid interfaceId, string profileName, BssType bssType, TimeSpan timeout, CancellationToken cancellationToken)
		{
			return ConnectNetworkAsync(null, interfaceId, profileName, bssType, null, timeout, cancellationToken);
		}

		/// <summary>
		/// Asynchronously attempts to connect to the wireless LAN associated to a specified wireless profile.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="profileName">Profile name</param>
		/// <param name="bssType">BSS network type</param>
		/// <param name="bssid">BSSID of the network</param>
		/// <param name="timeout">Timeout duration</param>
		/// <param name="cancellationToken">Cancellation token</param>
		/// <returns>True if successfully connected. False if failed or timed out.</returns>
		public static Task<bool> ConnectNetworkAsync(Guid interfaceId, string profileName, BssType bssType, PhysicalAddress bssid, TimeSpan timeout, CancellationToken cancellationToken)
		{
			return ConnectNetworkAsync(null, interfaceId, profileName, bssType, bssid, timeout, cancellationToken);
		}

		internal static async Task<bool> ConnectNetworkAsync(Base.WlanNotificationClient client, Guid interfaceId, string profileName, BssType bssType, PhysicalAddress bssid, TimeSpan timeout, CancellationToken cancellationToken)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));
			if (string.IsNullOrWhiteSpace(profileName))
				throw new ArgumentNullException(nameof(profileName));
			if (timeout <= TimeSpan.Zero)
				throw new ArgumentOutOfRangeException(nameof(timeout), "The timeout duration must be positive.");

			using var container = new DisposableContainer<Base.WlanNotificationClient>(client);

			var tcs = new TaskCompletionSource<bool>();

			container.Content.NotificationReceived += (sender, data) =>
			{
				if (data.InterfaceGuid != interfaceId)
					return;

				switch ((WLAN_NOTIFICATION_ACM)data.NotificationCode)
				{
					case WLAN_NOTIFICATION_ACM.wlan_notification_acm_connection_complete:
					case WLAN_NOTIFICATION_ACM.wlan_notification_acm_connection_attempt_fail:
						break;
					default:
						return;
				}

				var connectionNotificationData = Marshal.PtrToStructure<WLAN_CONNECTION_NOTIFICATION_DATA>(data.pData);
				if (connectionNotificationData.strProfileName != profileName)
					return;

				switch ((WLAN_NOTIFICATION_ACM)data.NotificationCode)
				{
					case WLAN_NOTIFICATION_ACM.wlan_notification_acm_connection_complete:
						bool isSuccess = (connectionNotificationData.wlanReasonCode == WLAN_REASON_CODE_SUCCESS);
						Task.Run(() => tcs.TrySetResult(isSuccess));
						break;
					case WLAN_NOTIFICATION_ACM.wlan_notification_acm_connection_attempt_fail:
						// This notification will not always mean that a connection has failed.
						// A connection consists of one or more connection attempts and this notification
						// may be received zero or more times before the connection completes.
						Task.Run(() => tcs.TrySetResult(false));
						break;
				}
			};

			bool result;
			if (bssid is not null)
			{
				var dot11MacAddress = new DOT11_MAC_ADDRESS { ucDot11MacAddress = bssid.GetAddressBytes() };
				result = Base.Connect(container.Content.Handle, interfaceId, profileName, BssTypeConverter.ConvertBack(bssType), dot11MacAddress);
			}
			else
			{
				result = Base.Connect(container.Content.Handle, interfaceId, profileName, BssTypeConverter.ConvertBack(bssType));
			}
			if (!result)
				tcs.SetResult(false);

			using (cancellationToken.Register(() => tcs.TrySetCanceled()))
			{
				var connectTask = tcs.Task;
				var completedTask = await Task.WhenAny(connectTask, Task.Delay(timeout, cancellationToken));

				return (completedTask == connectTask) && connectTask.IsCompleted && connectTask.Result;
			}
		}

		/// <summary>
		/// Disconnects from the wireless LAN associated to a specified wireless interface.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <returns>True if successfully requested the disconnection. False if failed.</returns>
		public static bool DisconnectNetwork(Guid interfaceId)
		{
			return DisconnectNetwork(null, interfaceId);
		}

		internal static bool DisconnectNetwork(Base.WlanClient client, Guid interfaceId)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));

			using var container = new DisposableContainer<Base.WlanClient>(client);

			return Base.Disconnect(container.Content.Handle, interfaceId);
		}

		/// <summary>
		/// Asynchronously disconnects from the wireless LAN associated to a specified wireless interface.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="timeout">Timeout duration</param>
		/// <returns>True if successfully disconnected. False if failed or timed out.</returns>
		public static Task<bool> DisconnectNetworkAsync(Guid interfaceId, TimeSpan timeout)
		{
			return DisconnectNetworkAsync(null, interfaceId, timeout, CancellationToken.None);
		}

		/// <summary>
		/// Asynchronously disconnects from the wireless LAN associated to a specified wireless interface.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <param name="timeout">Timeout duration</param>
		/// <param name="cancellationToken">Cancellation token</param>
		/// <returns>True if successfully disconnected. False if failed or timed out.</returns>
		public static Task<bool> DisconnectNetworkAsync(Guid interfaceId, TimeSpan timeout, CancellationToken cancellationToken)
		{
			return DisconnectNetworkAsync(null, interfaceId, timeout, cancellationToken);
		}

		internal static async Task<bool> DisconnectNetworkAsync(Base.WlanNotificationClient client, Guid interfaceId, TimeSpan timeout, CancellationToken cancellationToken)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));
			if (timeout <= TimeSpan.Zero)
				throw new ArgumentOutOfRangeException(nameof(timeout), "The timeout duration must be positive.");

			using var container = new DisposableContainer<Base.WlanNotificationClient>(client);

			var tcs = new TaskCompletionSource<bool>();

			container.Content.NotificationReceived += (sender, data) =>
			{
				if (data.InterfaceGuid != interfaceId)
					return;

				switch ((WLAN_NOTIFICATION_ACM)data.NotificationCode)
				{
					case WLAN_NOTIFICATION_ACM.wlan_notification_acm_disconnected:
						Task.Run(() => tcs.TrySetResult(true));
						break;
				}
			};

			var result = Base.Disconnect(container.Content.Handle, interfaceId);
			if (!result)
				tcs.SetResult(false);

			using (cancellationToken.Register(() => tcs.TrySetCanceled()))
			{
				var disconnectTask = tcs.Task;
				var completedTask = await Task.WhenAny(disconnectTask, Task.Delay(timeout, cancellationToken));

				return (completedTask == disconnectTask) && disconnectTask.IsCompleted && disconnectTask.Result;
			}
		}

		#endregion

		#region Turn on/off

		/// <summary>
		/// Gets wireless interface radio information of a specified wireless interface.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <returns>Wireless interface radio information if succeeded. Null if failed.</returns>
		public static RadioInfo GetInterfaceRadio(Guid interfaceId)
		{
			return GetInterfaceRadio(null, interfaceId);
		}

		internal static RadioInfo GetInterfaceRadio(Base.WlanClient client, Guid interfaceId)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));

			using var container = new DisposableContainer<Base.WlanClient>(client);

			var radioSets = EnumerateInterfaceRadioSets(container.Content, interfaceId).ToArray();
			if (!radioSets.Any())
				return null;

			return new RadioInfo(
				id: interfaceId,
				radioSets: radioSets);
		}

		private static IEnumerable<RadioSet> EnumerateInterfaceRadioSets(Base.WlanClient client, Guid interfaceId)
		{
			var capability = Base.GetInterfaceCapability(client.Handle, interfaceId);
			var states = Base.GetPhyRadioStates(client.Handle, interfaceId); // The underlying collection is array.

			if ((capability.interfaceType == WLAN_INTERFACE_TYPE.wlan_interface_type_invalid) ||
				(capability.dwNumberOfSupportedPhys != states.Count()) ||
				(capability.dot11PhyTypes?.Any() is not true)) // This value may be null.
				return Enumerable.Empty<RadioSet>();

			return Enumerable.Zip(
				capability.dot11PhyTypes,
				states.OrderBy(x => x.dwPhyIndex),
				(x, y) => new RadioSet(
					type: PhyTypeConverter.Convert(x),
					hardwareOn: ConvertToNullableBoolean(y.dot11HardwareRadioState),
					softwareOn: ConvertToNullableBoolean(y.dot11SoftwareRadioState)));

			static bool? ConvertToNullableBoolean(DOT11_RADIO_STATE source)
			{
				return source switch
				{
					DOT11_RADIO_STATE.dot11_radio_state_on => true,
					DOT11_RADIO_STATE.dot11_radio_state_off => false,
					_ => (bool?)null,
				};
			}
		}

		/// <summary>
		/// Turns on the radio of a specified wireless interface (software radio state only).
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <returns>True if successfully changed radio state. False if failed.</returns>
		/// <exception cref="UnauthorizedAccessException">
		/// If the user is not logged on as a member of Administrators group.
		/// </exception>
		public static bool TurnOnInterfaceRadio(Guid interfaceId)
		{
			return TurnInterfaceRadio(null, interfaceId, DOT11_RADIO_STATE.dot11_radio_state_on);
		}

		/// <summary>
		/// Turns off the radio of a specified wireless interface (software radio state only).
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <returns>True if successfully changed radio state. False if failed.</returns>
		/// <exception cref="UnauthorizedAccessException">
		/// If the user is not logged on as a member of Administrators group.
		/// </exception>
		public static bool TurnOffInterfaceRadio(Guid interfaceId)
		{
			return TurnInterfaceRadio(null, interfaceId, DOT11_RADIO_STATE.dot11_radio_state_off);
		}

		internal static bool TurnInterfaceRadio(Base.WlanClient client, Guid interfaceId, DOT11_RADIO_STATE radioState)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));

			using var container = new DisposableContainer<Base.WlanClient>(client);

			var phyRadioState = new WLAN_PHY_RADIO_STATE { dot11SoftwareRadioState = radioState, };

			return Base.SetPhyRadioState(container.Content.Handle, interfaceId, phyRadioState);
		}

		#endregion

		#region Auto config

		/// <summary>
		/// Checks if automatic configuration of a specified wireless interface is enabled.
		/// </summary>
		/// <param name="interfaceId">Interface ID</param>
		/// <returns>True if enabled. False if disabled or failed to check.</returns>
		public static bool IsInterfaceAutoConfig(Guid interfaceId)
		{
			return IsInterfaceAutoConfig(null, interfaceId);
		}

		internal static bool IsInterfaceAutoConfig(Base.WlanClient client, Guid interfaceId)
		{
			if (interfaceId == Guid.Empty)
				throw new ArgumentException("The specified interface ID is invalid.", nameof(interfaceId));

			using var container = new DisposableContainer<Base.WlanClient>(client);

			return Base.IsAutoConfig(container.Content.Handle, interfaceId).GetValueOrDefault();
		}

		#endregion

		#region Helper

		/// <summary>
		/// Attempts to detect frequency band and channel from center frequency.
		/// </summary>
		/// <param name="frequency">Center frequency (KHz)</param>
		/// <param name="band">Frequency band (GHz)</param>
		/// <param name="channel">Channel</param>
		/// <returns>True if successfully detected. False if failed.</returns>
		/// <remarks>
		/// This method is marked as internal for unit test.
		/// As for 5GHz, this method may produce a channel number which is not actually in use.
		/// Some channel numbers of 5GHz overlap those of 3.6GHz. In such cases, refer frequency band
		/// to distinguish them.
		/// </remarks>
		internal static bool TryDetectBandChannel(uint frequency, out float band, out int channel)
		{
			band = 0;
			channel = 0;

			if (frequency is (>= 2_412_000 and <= 2_484_000))
			{
				// 2.4GHz
				band = 2.4F;

				if (frequency < 2_484_000)
				{
					var gap = frequency / 1_000M - 2_412M; // MHz
					var factor = gap / 5M;
					if (factor - Math.Floor(factor) == 0)
						channel = (int)factor + 1;
				}
				else
				{
					channel = 14;
				}
			}
			else if (frequency is (>= 3_657_500 and <= 3_692_500))
			{
				// 3.6GHz
				band = 3.6F;

				var gap = frequency / 1_000M - 3_655M; // MHz
				if (gap % 2.5M == 0)
				{
					var factor = gap / 5M;
					channel = (int)Math.Floor(factor) + 131;
				}
			}
			else if (frequency is (>= 5_170_000 and <= 5_825_000))
			{
				// 5GHz
				band = 5.0F;

				var gap = frequency / 1_000M - 5_170M; // MHz
				var factor = gap / 5M;
				if (factor - Math.Floor(factor) == 0)
					channel = (int)factor + 34;
			}

			return (0 < channel);
		}

		#endregion
	}
}


Round Table Conference speech delivered by Mahatma Gandhi on November 11, 1931.
It will be after all and at best a paper solution. But immediately you withdraw that wedge, the domestic ties, the domestic affection, the knowledge of common birth – do you suppose that all these will count for nothing? Were Hindus and Mussalmans and Sikhs always at war with one another when there was no British rule, when there was no English face seen there? We have chapter and verse given to us by Hindu historians and by Mussalman historians to say that we were living in comparative peace even then. And Hindus and Mussalmans in the villages are not even today quarrelling. In those days they were not known to quarrel at all. The late Maulana Muhammad Ali often used to tell me, and he was himself a bit of an historian. He said : 'If God' – 'Allah' as he called out – gives me life, I propose to write the history of Mussalman rule in India; and then I will show , through that documents that British people have preserved, that was not so vile as he has been painted by the British historian; that the Mogul rule was not so bad as it has been shown to us in British history; and so on. And so have Hindu historians written. This quarrel is not old; this quarrel is coeval with this acute shame. I dare to say, it is coeval with the British Advent, and immediately this relationship, the unfortunate, artificial, unnatural relationship between Great Britain and India is transformed into a natural relationship, when it becomes, if it dose become, a voluntary partnership to be given up, to be dissolved at the will of either party, when it becomes that you will find that Hindus, Mussalmans, Sikhs, Europeans, Anglo-Indians, Christians, Untouchable, will all live together as one man. I do not intend to say much tonight about the Princes, but I should be wronging them and should be wronging the Congress if I did not register my claim, not with the Round Table Conference but with the Princes. It is open to the Princes to give their terms on which they will join the Federation. I have appealed to them to make the path easy for those who inhabit the other part of India, and therefore, I can only make these suggestions for their favourable consideration, for their earnest consideration. I think that if they accepted, no matter what they are, but some fundamental rights as the common property of all India, and if they accepted that position and allowed those rights to be tested by the Court, which will be again of their own creation, and if they introduced elements – only elements – of representation on behalf of their subject, I think that they would have gone a long way to conciliate their subjects. They would have gone a long way to show to the world and to show to the whole of India that they are also fired with a democratic spirit, that they do not want to remain undiluted autocrats, but that they want to become constitutional monarch even as King George of Great Britain is. An Autonomous Frontier Province : Let India get what she is entitled to and what she can really take, but whatever she gets, and whenever she gets it, let the Frontier Province get complete autonomy today. That Frontier will then be a standing demonstration to the whole of India, and therefore, the whole vote of the Congress will be given in favour of the Frontier Province getting provincial Autonomy tomorrow. Prime Minister, If you can possibly get your Cabinet to endorse the proposition that from tomorrow the Frontier Province becomes a full-fledged autonomous province, I shall then have a proper footing amongst the Frontier tribes and convince them to my assistance when those over the border cast an evil eye on India. Thanks : Last of all, my last is pleasant task for me. This is perhaps the last time that I shall be sitting with you at negotiations. It is not that I want that. I want to sit at the same table with you in your closets and to negotiate and to plead with you and to go down on bended knees before I take the final lead and final plunge. But whether I have the good fortune to continue to tender my co-operation or not does not depend upon me. It largely depends upon you. It depends upon so many circumstances over which neither you nor we may have any control whatsoever. Then, let me perform this pleasant task of giving my thanks to all form Their Majesties down to the poorest men in the East End where I have taken up my habitation. In that settlement, which represent the poor people of the East End of London, I have become one of them. They have accepted me as a member, and as a favoured member of their family. It will be one of the richest treasures that I shall carry with me. Here, too, I have found nothing but courtesy and nothing but a genuine affection from all with whom I have come in touch. I have come in touch with so many Englishmen. It has been a priceless privilege to me, They have listened to what must have often appeared to them to be unpleasant, although it was true. Although I have often been obliged to say these things to them they have never shown the slightest impatience or irritation. It is impossible for me to forget these things. No matter what befalls me, no matter what the fortunes may be of this Round Table Conference, one thing I shall certainly carry with me, that is, that from high to low I have found nothing but the utmost courtesy and that utmost affection. I consider that it was well worth my paying this visit to England in order to find this human affection. It has enhanced it has deepened my irrepressible faith in human nature that although English men and English women have been fed upon lies that I see so often disfiguring your Press, that although in Lancashire, the Lancashire people had perhaps some reason for becoming irritated against me, I found no irritation and no resentment even in the operatives. The operatives, men and women, hugged me. They treated me as one of their own. I shall never forget that. I am carrying with me thousands upon thousands of English friendship. I do not know them but I read that affection in their eyes as early in the morning I walk through your streets. All this hospitality, all this kindness will never be effaced from my memory, no matter what befalls my unhappy land. I thank you for your forbearance.


text:
King Krule Shares "Czech One" Video And World Tour Dates
Watch the Frank Lebon-directed visuals now.
King Krule released his first new music since 2013 overnight. "Czech One" is a low-key, woozy reintroduction from the U.K. musician, whose Six Feet Beneath the Moon was released four years ago. Early Wednesday morning a Frank Lebon-directed video for the song was revealed alongside a lengthy set of tour dates.
Lebon captures Archy Marshall sporting an eyepatch and staring out of the window of an airplane. The contemplative visuals are lit in a deep blue with Marshall's thougts interrupted only by a love interest. "Czech One" will be available as the a-side to a limited edition 7" coming out September 13 on XL Recordings / True Panther Sounds. The B-Side is titled "Dum Surfer."
King Krule tours from October, taking in shows in north America and Europe. The full list of dates can be found below. For further details head to kingkrule.co.uk/live
10/21 - Washington, DC - Black Cat
10/22 - Philadelphia, PA - Union Transfer
10/24 - Brooklyn, NY - Warsaw
10/26 - Boston, MA - Paradise
10/28 - Montreal, CAN - Corona Theatre
10/29 - Toronto, CAN - Danforth Music Hall
10/30 - Chicago, IL - Metro
10/31 - Minneapolis, MN - Fine Line Music Cafe
11/3 - Seattle, WA - The Showbox
11/4 - Portland, OR - Wonder Ballroom
11/5 - Vancouver, CAN - Vogue Theatre
11/7 - San Francisco, CA - The Fillmore
11/8 - Los Angeles, CA - Teragram Ballroom
11/9 - Los Angeles, CA - El Rey Theatre
11/20 - Bristol, UK - Marble Factory
11/21 - London, UK - Koko
11/23 - Leeds, UK - Belgrave Music Hall
11/26 - Paris, France - Casino De Paris
11/28 - Milan, Italy - Magazzini Generali
11/29 - Lyon, France - L'Epicerie Moderne
11/30 - Zurich, Switzerland - Rote Fabrik
12/1 - Cologne, Germany - Burgerhaus Stollwerck
12/3 - Hamburg, Germany - Uebel & Gefahrlich
12/4 - Berlin, Germany - Astra
12/5 - Copenhagen, Denmark - Vega
12/8 - Stockholm, Sweden - Vasateatern
12/10 - Amsterdam, Holland - Melkweg
12/11 - Antwerp, Belgium - De Roma
12/13 - Dublin, Ireland - Academy
12/14 - Manchester, UK - Academy 2
12/15 - Glasgow, UK - SWG3
Hip-Hop, Rock

redpajama_set_name: RedPajamaCommonCrawl


"One people, one nation, one destiny" – a quote that best describes the purpose of the West Indies cricket team, taken from the documentary film, Fire in Babylon. If ever there was a movie that represents the plight and triumph of a sports team, this is it. Legends from the West Indies cricket team of the '70s and '80s give a personal insight into the vicious rivalries with England and Australia, the rise of cultural pride and the glory of Caribbean-style cricket.
Expect a hard-hitting (literally) look at the journey players such as Viv Richards, Colin Croft and Clive Lloyd took to prove that the Caribbean boys were more than just a laughing stock (something England definitely found out the hard way). The use of a pumping reggae soundtrack to accompany the interviews links in with the Rastafarian teachings about 'Babylon' — the negative system holding down the people of the African Diaspora. The fight against colonial oppression, using the power of cricket, is also an underlining theme that runs throughout the movie.
Out in Cinemas from May 20th.


text:
Resilience Tool
Annual Gathering 2022
WGS Dialogues
COVID-19 & GOVERNMENT
Gov2071 Workshops
Gov2071
Tech Radar
GovTech Prize
Best Minister Award
Global Universities Challenge
Edge of Government
World Data Visualization Prize
A to Z Most Viewed Most Recent
Years: All
Theme: All
Economy & Society
Future & Progress
Governance & Resilience
Theme In Focus
No media items to show
Worsening Conflict Environment Most Significant Threat to Africa's Prosperity
Africa's quest for lasting and sustainable prosperity was dealt a massive blow by the Covid crisis of 2020. The African Development Bank estimates that the continent's economy contracted by 2.1 percent last year, a sharp contrast from 3 percent growth envisioned pre-Covid, and that roughly 30 million Africans were thrown into extreme poverty. The Bank projects a strong rebound in 2021 to 3.4 percent growth, but still reckons an additional 40 million Africans could fall into poverty.
Universities Post COVID-19: Quo Vadis?
While many universities used technology as a stopgap measure to continue the delivery of education during the pandemic, few are reassessing what long-term measures are necessary to make their institutions more resilient in the face of future crises
Energy Storm: head-winds for most and tail-winds for few!
The oil & gas (O&G) sector has been hit by a perfect storm. It has witnessed a steep fall in commodity prices, a drastic reduction in demand and, to add to its woes, a growing negative public perception, especially in Western countries, against the use of fossil fuels.
What have governments learnt from the Great Recession?
Wounds leave scars and the Great Recession is no exception. It was the longest and deepest global economic crisis since the Great Depression of the 1930s. It is now just over a decade since the Great Recession began in the US, officially lasting from December 2007 to June 2009. During this period, much of Europe also fell into recession, while China and India both saw a slowdown in economic growth.
How to build societies to be inclusive of ageing populations
On an individual level, the ageing process can be a cause of pain and despair that forces many people to radically alter how they live.  The same is also true for countries. Increasingly, they are having to cope with populations in which the old outnumber the young.
Supervolcanoes are real, and governments are not prepared
An erupting volcano is one of the most awe-inspiring and fear-inducing forces on our planet. Our continuing fascination with the eruption of Mount Vesuvius in 79AD that destroyed the ancient Italian city of Pompeii, shows the grip that volcanoes have on the human psyche. They leave humans feeling helpless and vulnerable to their immense destructive power.
Elon Musk: AI will be like being visited by super-intelligent aliens
Artificial intelligence will be both an aid and a threat to humanity, according to tech and space entrepreneur Elon Musk, who says that in the near future having a discussion with an artificial intelligent machine would be like "being visited by super-intelligent aliens".
This is the subject Elon Musk says young people need to study to be successful in the future
What advice would billionaire entrepreneur Elon Musk give to young people who want to be successful? Simple: study physics.  The SpaceX and Tesla co-founder was speaking at the World Government Summit in Dubai.
Will governments ever fully accept bitcoin?
There is no shortage of hype and speculation surrounding the value of bitcoin. The virtual currency is either the next big thing or simply the latest in a long line of tech bubbles soon to burst, depending on your point of view.
Money for nothing: the world's biggest universal income experiment
How will people earn a living when machines do everything? Human work that has long been threatened – and in some cases already taken over – includes assembly line and low-skilled manual labour. But middle-class careers such as journalism, marketing, law and even medicine may be going the same way. So it is no surprise that there has been a rise in interest in the idea that everyone should be paid a basic living, whether or not they work.
Just how secure is bitcoin?
Bitcoin has enjoyed a startling rise in value since it first appeared in 2009. Then it was valued at $0.5cents. It hit a high of just above $18,000 per coin in December 2017, but it is highly volatile and fell by more than $4,000 in one week.
Where to find the world's cleanest air
The demand for cleaner air is being forced up national agendas as a spate of scientific studies warn that pollution could become a global health risk comparable with smoking and obesity.
A beacon of urban renewal: how post-industrial Dundee transformed itself
Creativity and culture have always contributed enormously to the evolution of our societies, but in recent years there has been a growing realisation of the value of the arts as an economic driver.
An Artificial Intelligence Has Officially Been Granted Residency
Tokyo, Japan may have just become the first city to officially grant residence to an artificial intelligence (AI). The intelligence's name is Shibuya Mirai and exists only as a chatbot on the popular Line messaging app. Mirai, which translates to 'future' from Japanese, joins Hanson Robotic's "Sophia" as pioneering AI gaining statuses previously reserved for living, biological entities. The Kingdom of Saudi Arabia granted Sophia citizenship last month.
Why do People Believe Fake News?
The disinformation epidemic sweeping the world these days reflects the (economic) logic of supply and demand.
Access to family planning cut child poverty
Children born after the introduction of family planning programs in the US from 1964 through 1973 had household incomes 2.8 percent higher than those born before, researchers report.
Politics in schools? Yes, if we want children to be active citizens
The rights of children have come under the spotlight in South Africa recently. Corporal punishment, which has been banned in the country's schools since 1996, is now also illegal in the home.
The UK's Biggest Solar Farm Could Be Built Sans Government Help
Developers have submitted a proposal for the largest solar farm in the U.K., and they plan to build it without the help of government subsidies. The 900-acre site would provide enough power for about 110,000 homes and could be online as soon as 2020.
Americans are working longer but aren't as healthy
Americans born in 1960 will be able to start collecting their full Social Security retirement check at the age of 67—two years later than their parents—because of a change in the federal retirement age enacted in 1983.
Finland's brain drain: what happens to small countries when the talent leaves?
Young Finnish professionals are attracted to major European capitals. They move to Stockholm, Berlin and Amsterdam, as well as farther away. The sun shines in Dubai; the world's top organisations and institutes are in New York and Washington. The occupations of these migrants are manifold: bankers, graphic designers, computer engineers, photographers and researchers, to name only a few.
Survey reveals young people more likely to support universal basic income, but it's not a left-right thing
Preliminary analysis of a European-wide survey has found young people are more in favour of introducing a universal income than their older peers. Support for such a scheme also varies considerably across Europe, with Russians the most supportive and many Scandinavians the least.
US health care system: A patchwork that no one likes
Almost all parties agree that the health care system in the U.S., which is responsible for about 17 percent of our GDP, is badly broken. Soaring costs, low quality, insurance reimbursements and co-payments confusing even to experts, and an ever-growing gap between rich and poor are just some of the problems.
Colombia: how universities can help to build lasting peace
After more than 50 years of conflict, the recent peace agreement in Colombia marks a historic ceasefire between the government and rebel groups. It also poses great challenges, as the various parts of Colombian society learn to adjust.
European Nation Set to Be 100% Renewable in Two Years
All over the world, countries are minimizing their reliance on fossil fuels. In Scotland, authorities have confirmed that by 2020, all electricity will come from renewable sources.
Cities are gaining power in global politics – can the UN keep up?
Over the past two years, urban issues – from sustainability in the built environment, to inequality in cities – have become an international priority. Cities, in turn, are taking on a more important role in global politics; the growth of city diplomacy has forged hundreds of city networks and thousands of transnational initiatives.
Historical poverty reductions: more than a story about 'free-market capitalism'
The share of people living in extreme poverty around the world has fallen continuously over the last two centuries.
Designing suburbs to cut car use closes gaps in health and wealth
Having to own multiple cars comes at a cost to the finances and health of residents in the sprawling outer suburbs
Are emerging economies deindustrializing too quickly?
The patterns of structural transformation in developing countries are different to those of advanced, post-industrial economies. Specifically, emerging economies have been deindustrializing more quickly.
This is a hearing app that can screen people in rural areas
Hearing loss is a major contributor to the global burden of disease, affecting over 360 million people, but the greatest burden of hearing loss is in developing world regions such as sub-Saharan Africa, South-east Asia, and the Asia Pacific – home to more than 80% of people with hearing loss.
Our eyes are drawn to meaning, not shiny objects
Our visual attention homes in on the parts of a scene that have meaning, not those that "stick out" most, new research suggests.
Outdated regulations halt Uber in its tracks, but innovation must prevail
When regulations are out of date, or can be circumvented by new technologies or new ways of doing things, new entrants can disrupt incumbents by innovating outside of the reach of regulators.
Scientists Have a Plan to Stop Climate Change — Dim the Sun
Researchers are using computer modeling to test the effects of solar geoengineering on rates of coral bleaching. The practice could reduce or eliminate the rate of climate change but the side effects are still unknown.
Machine Learning Is Making it Difficult to Tell Humans and Computers Apart
"For common sense to be effective it needs to be amenable to answer a variety of hypotheticals — a faculty that we call imagination."
Singapore Will Stop Adding New Cars to Its Roads in 2018
Singapore will stop issuing new vehicle permits starting February of 2018. The government points to limited space available in the city-state as the reason for the halt in vehicle growth.
Youth engagement with politics can help them progress later in life
Social action and engagement may help marginalized teens in their careers later in life, particularly if teachers help them discuss and engage with social issues, new research suggests.
Mexico City has 79 governments responding to two massive earthquakes – the results are patchy, at best
Governing Greater Mexico City – the largest and most populated city in North America – is a great challenge. Its 22m inhabitants are spread out unevenly over an area roughly ten times larger than New York City. It is governed by one federal, two state and 76 municipal governments, each with overlapping responsibilities.
Are we hardwired to pick up crying babies?
Newborn babies have a remarkable amount of power. Though there are few things they can do for themselves, they can manipulate the world around them by summoning help with a simple wail. Caregivers, especially parents, are particularly sensitive to infants' cries, which we'd expect because caregivers have an interest in looking after their babies' needs – they want them to survive.
Could we soon have a host of habitable alien worlds?
Researchers from NASA's Goddard Institute have proposed a new way of looking at the habitability of exoplanets. Instead of relying on the usual one-dimensional approach, they considered observing a candidate planet using three dimensions.
Daydreaming is a sign you're intelligent and creative
Daydreaming may indicate intelligence and creativity, according to new research.
The Next Most Powerful Supercomputer in the U.S. Is Almost Complete
At the Oak Ridge National Labs, experts are building what's expected to be the most powerful supercomputer in the world — or at least, in the U.S. Built together with IBM and powered by NVIDIA, the Summit supercomputer will be operational in 2018.
Deepest sleep may be vital for visual learning
Certain visual learning takes hold in the brain during sleep, new research suggests.
China Has Shut Down Up to 40% of Its Factories in an Unprecedented Stand Against Pollution
China has begun to severely crack down on factories that have been flouting their emissions regulations. The country has shut down 40 percent of its factories to battle the immense pollution levels in the nation.
China bans foreign waste – but what will happen to the world's recycling?
The dominant position that China holds in global manufacturing means that for many years China has also been the largest global importer of many types of recyclable materials. Last year, Chinese manufacturers imported 7.3m metric tonnes of waste plastics from developed countries including the UK, the EU, the US and Japan.
Magnetic Particles Could Lead to an Entirely New Form of Data Storage
New research has shown that an exotic kind of magnetic behavior discovered just a few years ago holds great promise as a way of storing data — one that could overcome fundamental limits that might otherwise be signaling the end of "Moore's Law," which describes the ongoing improvements in computation and data storage over recent decades.
How your commute time could be cut by 90%
After you sit down, the doors close silently and the pod slides into a large, round metal tube. Suddenly, you become aware of a sensation of movement, as if you're in an elevator travelling forward or an aircraft that's just taking off. It's not unpleasant.
Is mindfulness made up?
When Siddhartha Gautama spoke these words around 1500 years ago, it's fair to assume he wasn't really thinking ahead. But the man who most of us know better as Buddha was talking about a technique which has since become wildly popular around the world.
Why we need to develop the world's cyber resilience
Thousands of computer terminals throughout the National Health Service went blank for a moment before displaying a simple note, "Your files have been encrypted".
This is why ash could be critical to securing your next phone upgrade
When the last mine in the small town of Cinovic in the Czech Republic closed in 1993, not only did the workers lose their jobs, the region lost an major economic lifeline.
A wind farm the size of India could power the world
Wind power swept into the headlines recently when Germany's wind turbines created so much electricity that customers were effectively paid to use it
France is experimenting with a radically different approach to education
It used to be said that a French education minister could open the national curriculum - the programme d'enseignement obligatoire - and know exactly what every pupil in the country was learning that day.
Why aren't young people engaged with governments?
Today's young adults have grown up online, connected in ways that their older counterparts are unlikely to ever fully understand. In the developed world in particular, the so-called "digital natives" have had access to an effectively limitless source of news, information and entertainment their entire lives.
How not to smother progress
Autonomous delivery robots could soon be a common sight in the US. Walnut Creek and Redwood City are both allowing companies to pilot the robots on their sidewalks. The states of Florida, Virginia, Idaho and Wisconsin have all passed a state laws that permit the use of unmanned delivery robots on sidewalks and in crosswalks. But one city, San Francisco is bucking the trend.
How to ensure that biotechnology is used for the good of humankind
We are living in an age where scientific advances seem almost miraculous. Living organisms can be modified for our own purpose. Biotechnology can edit DNA, opening the door to possibilities as enormous as changing the course of human disease or ending world hunger.
Could an AI ever replace a judge in court?
Xiaofa stands in Beijing No 1 Intermediate People's Court, offering legal advice and helping the public get to grips with legal terminology. She knows the answer to more than 40,000 litigation questions and can deal with 30,000 legal issues. Xiaofa is a robot.
How bad is Bitcoin crime?
As its value has skyrocketed, cryptocurrency Bitcoin has emerged from tech nerd obscurity to become a topic of mainstream conversation.
How do we ensure the happiness of the next generation through education?
Young people are struggling with the pressures of life and between 10%-20% of them are likely to experience mental health problems as a result. Half of all mental illnesses begin by the age of 14, and three-quarters by mid-20s, according to a World Health Organization report.
This app is providing digital therapy to fight depression
The biggest problem with our addiction to smart devices is that we cannot avoid using them. One consequence of that is that our ability to pay attention, connect with others and remember things is decreasing as the amount of time we spend online increases, says Professor Saki Santorelli, former head of the University of Massachusetts's Center for Mindfulness
Sharing the climate burden that falls on small island nations
Climate change is very much a product of wealthy industrialised nations - but the worst impact of more frequent and more extreme weather events will be felt far from their shores and borders.
Funding the future: is university education worth the investment?
Raising $30 million in just three months is a fundraising effort any charity would be proud of.  Brown University, one of the leading Ivy League universities in the US, did just that after announcing that it wanted to end student loans and offer scholarships instead.
Climate change is forcing millions of people from their homes
A report by the Environmental Justice Foundation (EJF) says an average of 21.7 million people have been forced from their homes by extreme weather-related events every year since 2008. That equates to 41 people every minute.
Three ways tech can help deliver the SDGs
The forces driving the Fourth Industrial Revolution – mobile devices, artificial intelligence, data analysis and young people's love of tech – can also help deliver the United Nations' Sustainable Development Goals by 2030.
How small ideas can provide global solutions
Small ideas might be more effective than grand policy plans when it comes to creating new jobs and delivering the United Nations Sustainable Development Goals. This was the view of experts discussing ways to implement the SDGs at the 2018 World Government Summit in Dubai.
The scientific link between happiness and food
Comfort eating – the notion that certain foods will cheer us up when we are unhappy or make us better when we are ill – is familiar the world over. Popular favorites that stock our fridges and cupboards range from chicken soup to boiled eggs, and from chocolate to sweet desserts.
What needs to be done to protect the world's oceans?
The oceans of the world are awash with thousands – and perhaps millions – of tonnes of plastics. This pollution poisons marine life, disrupts breeding and is harmful to the ocean's natural rhythms, on which the earth is hugely dependent.
These books will help you understand the future
As the fourth industrial revolution gathers pace, we find ourselves living in an age where the latest innovations are consigned to the history books more quickly than ever. Take the iPod for example. It's just 17 years since it revolutionised the way we listen to music, but Apple's breakthrough is now close to being obsolete as digital streaming services replace music stored on devices.
Why happiness has to start at the top
For years government involvement in citizen's happiness has been largely limited to the extent it correlates with wealth: increasing GDP is often seen as the main factor determining contentment.
AI can solve problems – when will it tell us which ones need solving most?
Artificial intelligence still often seems like a far-distant, science-fiction like dream that will be delivered at some uncertain point in the future.  Yet organizations and governments are already using AI in ways many of us do not fully appreciate or understand. Some of these may seem relatively benign, such as social media platforms that use facial recognition to connect you to friends or shopping sites that look at your past purchases to make recommendations.
Why we can't rely on corporations to save us from climate change
While businesses have been principal agents in increasing greenhouse gas emissions, they are also seen by many as crucial to tackling climate change. However, research shows how corporations' ambitious pro-climate proposals are systematically degraded by criticism from shareholders, media, governments, other corporations and managers.
The more air pollution, the more mental distress
The higher the level of particulates in the air, a new study shows, the greater the indications of psychological distress.
Who owns the water on Mars and the resources in Space?
A new gold rush is set to take place beyond earth's atmosphere as commercial adventurers seek to strip asteroids of their rare minerals and precious metals.
How AI is transforming governments
The workplace transformation being shaped by developing technologies such as artificial intelligence will apply to governments as much to the private sector.
Humans Are the "Dominant Cause" of Global Warming, According to the Latest U.S. Government Study
The largest government report on climate science clearly indicates that human activity has contributed to climate change and higher global temperatures. The national climate assessment has been prepared by experts from 13 institutions.
Could the Facebook data scandal change the way we regulate tech firms?
Are we witnessing a fundamental shift in power between the world's tech giants and governments? It may well be that when we look back at the evolution of companies such as Facebook, Google and Twitter, 2018 stands out as a turning point. The tech sector, often characterized as the new 'Wild West', unburdened by regulation and largely left to police itself, finds itself under unprecedented scrutiny. And the scandal surrounding Facebook and the Cambridge Analytica data breach could end up hastening moves to rein in the industry.
What are 5 Steps to Happier Citizens
A few years ago, the idea that government was responsible for the "happiness" of its citizens would elicit raised eyebrows. Happiness, after all, was too delicate a topic to arise from the dispassionate halls of government bureaucracies.
Why do driverless cars crash?
Long predicted by science fiction visionaries including Philip K Dick and Isaac Asimov, autonomous vehicles are finally becoming a reality. Their arrival is only possible thanks to computers, which can crunch massive amounts of data quickly, and the internet, which allows that information to be transferred from data centre to moving car faster than human thought.
Elon Musk on why the world needs a universal basic income
High-tech mechanisation will make it necessary for states to provide citizens with a basic income to ease social inequality, according to serial tech entrepreneur Elon Musk. During a live session at the World Government Summit in Dubai in February 2017, SpaceX founder and Tesla CEO Musk said that the knock-on effects of robots and artificial intelligence taking away employment was something policy makers should watch.
Quick and cost-effective new weapons are needed to fight malaria
Malaria – a life-threatening disease that blights the lives of million in mostly developing economies – affected 216 million people in 91 countries in 2016, killing 445,000. The illness, caused by parasites spread by infected female Anopheles mosquitoes, most frequently occurs in countries with poor infrastructure, sparse health facilities and far-flung communities.
Here are this year's top emerging technologies
As tech innovation continues to race ahead, we hear more and more about the growth of artificial intelligence and automation, and the different world they will create – with everything from driverless cars to deliveries by drone. But behind the headlines and the hype, what will this year bring us in terms of new useable tech? What will really change, and what promises to make a genuine difference?
Terrorism in the worst affected countries is on the decline
While headlines around the world might suggest that the risk of terrorism is forever on the rise, the reality is that fewer people are dying in terror-related incidents.
What's so controversial about referendums?
Anyone in any doubt about the disruptive power of the referendum need only look to Europe's recent experience. Just over a year after the UK voted to leave the European Union at the end of a hard fought and controversial referendum, Spain was dealing with the fallout from its own bitterly contested vote.
What will AI mean for small cities?
The extent to which a person's job is impacted by new technology may depend on the size of the town or city they live in. While past studies considered how tech innovations such as deep machine learning and automation will affect different job types and skills, a Massachusetts Institute of Technology's report is the first to look at how automation will vary for different population centres.
Your sense of smell changes throughout the day
Smell sensitivity varies over the course of a day, new research suggests. The pattern, according to the data collected by studying 37 teens, tracks with the body's internal day-night cycle, or circadian rhythm.
AI-Assisted Detection Identifies Colon Cancer Automatically and in Real-Time
Advances in medical research are growing side-by-side the development of artificial intelligence. Cancer diagnostic tests are now employing AI to be more effective in spotting the growth of tumors, and a new study shows how effective these could be.
Financial literacy is a public policy problem
The global financial crisis showed us how rapidly financial contagion can spread - one person's debt is another person's asset, so when the debt is written off so is the asset. However, there has been little improvement in financial literacy in the wake of the financial crisis, the lack of which was one of the underlying causes.
Food security looks very different depending on where you are sitting
In 1974, the World Food Conference declared that: "Every man, woman and child has the inalienable right to be free from hunger and malnutrition in order to develop their physical and mental faculties." The conference set as its goal the eradication of hunger, food insecurity and malnutrition within a decade.
Cities have woken up to the fact that a vibrant cultural offering makes people want to live there, and the numbers back this up. New York is home to nearly 14,000 arts-related businesses employing nearly 300,000 people and generating revenues of $230 billion each year. London's creative industry sector is worth £35 billon and employs around 800,000 people.
Wise Happiness
What makes a good life? Three answers stand out – happiness and pleasure (feeling good), meaning and purpose (doing good) and wisdom and virtue (being good). Positive Psychology, the science of well-being, has so far focussed mostly on happiness. A number of pioneering nations like the UAE, Bhutan and, to a lesser extent, the UK are beginning to promote happiness as a public policy objective.
This is the future of passports
Every day, millions of people use data generated by their bodies – their voices, faces, irises and fingerprints – to gain access to offices, secure government sites and financial services. But biometric data has the power to produce even more sweeping changes: digital identities could soon be used to allow us to cross national borders without needing paper passports – documents that can be tampered with, forged, lost or simply taken away.
Get the official App
Your email address is already subscribed
Kindly fill all the required information
PO Box 212000, Dubai,
+971 800 WGS (947)
info@worldgovernmentsummit.org
Copyright © 2019 World Government Summit.


Art Club presents to students of all abilities the unique opportunity to cultivate an interest in art. While our art students who attend art club often sketch and paint over these sessions, it is open to all and gives students the chance to visit different museums, galleries and exhibitions. It is not only enjoyable but also educational.
This month our students have taken to reading and exploring works of the Renaissance period, having visited exhibitions at the Ashmolean Museum.


text:
Austin police: 'No known threats' on Inauguration Day but a safety plan is still in place
Million-dollar ghost: Haunted house for sale in Florida
by: Newsfix Web Staff
PUNTA GORDA, FL – For most people, the thought of of sharing a home with a ghost is not exactly appealing … But one Florida couple is hoping their supernatural roomie will be a selling point for the unique home they say is haunted.
"I hear my wife walk down the stairs, and i call out her name and she says yes from a different part of the house," homeowner Vander Wynn says. "There's some weird things like that you really can't explain."
The beautiful Victorian mansion has a tragic past, involving a 14-year-old girl named Mary Leah, who, according to Wynn, was killed when kerosene spilled on her and she caught fire.
Luckily for prospective buyers, despite her painful demise, it sounds like the teen ghost is more like Casper , than that freaky girl from the ring.
"She's really not scary she just makes noise," Natalie Wynn explains. "Sometimes I've told her, 'You need to be quiet.'"
If you're not spooked by the supernatural, this gorgeous home and its resident ghost could be yours for a cool $1.59 million — that is, if the current owners don't manage to convince their ghostly companion to make the move to their new home.
"We're just gonna leave the door open and the car open, and if she wants to come she can," Vander Wynn jokes.
More CW39 Stories
Dallas skyline turns amber to remember those lost to COVID-19
DALLAS (KDAF) - The Dallas skyline lit up in amber in honor of those who passed away from COVID-19.
This taking place at the same time as President-elect Joe Biden and Vice President-elect Kamala Harris paid tribute in a ceremony in the nation's capitol.
by Jacqulyn Powell, Will DuPree, Russell Falcon / Jan 20, 2021
AUSTIN (KXAN) — As the possibility of unrest looms over the Joe Biden's inauguration in Washington, D.C., the Austin Police Department has its own plan to address any incidents that may happen on Wednesday.
"We have a robust plan in place to ensure the safety of the citizens of Austin," Assistant Chief Joseph Chacon said in a briefing Tuesday. "What I can tell you is we have no known threats to our area."
Mother arrested after horrific videos showing 1-year-old being abused, burned, tortured posted on Facebook
Rapper The Game accused of impregnating 15-year-old
Reward increased for information concerning double homicide


text:
The Bible tells the story of two wealthy ranchers who lived long ago in the Middle East. Abram and his nephew, Lot, drifted from place to place, looking for a good spot to settle down. By the time they reached the plain of Jordan, they had a problem. "But the land couldn't support both of them; they had too many possessions…Abram said to Lot…Look around. Isn't there plenty of land out there? Let's separate. If you go left, I'll go right; if you go right, I'll go left" (Genesis 13:6,8,9 The Message).
This was a fair proposal. It showed Abram's unselfishness. He was getting to be an old man. Lot should have given Abram first choice. But he didn't. When he saw the entire well-watered plain of Jordan spread out before him, he got greedy. He chose the whole thing. The Bible says, "He pitched his tent near Sodom" (verse 12). Bad choice. Sodom was the worst place he could have chosen to raise a family. It was notorious for its crime and immorality. The Bible says there were not even ten decent people living there. Later on, when Sodom was finally destroyed, Lot's wife and most of his family died, along with everyone else there. Lot barely escaped with two of his daughters.
Better than what we see
Abram chose a different city, "…the city which has foundations, whose architect and builder is God" (Hebrews 11:10 NASB). Abram's eyes were focused, not on this world's fame and fortune, but on things of eternal value. No wonder his name is listed among the great in God's hall of fame in Hebrews 11. The Bible tells about the faithful, "But they were looking for a better place, a heavenly homeland. That is why God is not ashamed to be called their God, for he has prepared a heavenly city for them" (Hebrews 11:16 NLT).
God has a place in his heavenly home for you, and anyone else who really wants to live there. The Bible calls it a "better country." Better than any place on earth. Are you looking for that city?
Samantha Saunders2018-11-14T00:30:00-05:00January 21st, 2021|


The first trailer is online for The Way of the Gun-director Christopher McQuarrie's Jack Reacher, starring Tom Cruise. Unfortunately, it's lost in translation unless you happen to speak Russian. Basically, the guy in the hospital bed is narrating how badass Jack Recaher is; Cruise himself confirms it later on with no translation necessary.
An adaptation of the Lee Child novel, One Shot, Jack Reacher is the title character, an ex-military investigator who uses his imposing physical size (6'5", 250lbs) and service experience to track down a sniper. Jack Reacher also stars Rosamund Pike, Robert Duvall, Richard Jenkins and David Oyelowo, along with Werner Herzog as the villain. The film is scheduled to open on December 21st, 2012. Hit the jump to see the trailer.


you are here // Nor-Cal Vans » Nor-Cal Vans Blog » Ford Transit Connect » 2014 Transit Connect Adaptive Van- Crash Tested!
Nor-Cal Vans, in conjunction with the Mobility Alliance, has successfully crash-tested the new 2014 Transit Connect with the Nor-Cal Vans Adaptive Van conversion.
Developed by commercial wheelchair van providers in The Mobility Alliance, in conjunction with Ford Motor Company, the Nor-Cal Vans Transit Connect Adaptive Van offers a new ADA compliant rear entry option to the market that is economical and practical. The vehicle features an ADA compliant lowered floor and an innovative new rear-entry ramp. The NCV Transit Connect Adaptive Van seats up to five adults and one wheelchair user and has the ability to quickly adapt to accommodate multiple combinations of people and cargo. When the vehicle is not being used for the transportation of a wheelchair passenger, the ramp conveniently stores flat, creating a trunk-like floor for easy loading of luggage or cargo.
Ford's redesigned 2014 Transit Connect has already earned a five-star Overall Vehicle Score from the National Highway Traffic Safety Administration, the government's highest possible overall rating. This is due in part to its body structure, which is built with light ultra-high strength Boron steel.
Nor-Cal Vans estimates that the NCV Transit Connect Adaptive Van will be on the road Summer 2014.
Interested in seeing footage of the crash test? See our video here.
Nor-Cal Vans is located in Chico, CA. They specialize in accessible van conversions of Ford products. They are a Ford Pool Account as well as Ford Qualified Vehicle Modifier (QVM). Their products are available through Ford dealers and approved Mobility Dealers nationwide.


text:
'Scending 'Sota: rock climbing's rise in the land of 10,000 lakes
From Olympic athletes to industry titans, almost 2,000 miles away from epicenters like Yosemite, a little-known community is crushing walls.
Jack Rodgers
Ethan Anderson demonstrates a winter climb of the "Slicksides" boulder problem on Tuesday, Dec. 4 at Interstate State Park. Interstate is where Anderson first learned to outdoor climb three years ago.
by Samir Ferdowsi
Minnesota is flat.
Peaks are mounds and valleys are riverbeds. Yet, in a place where skyscrapers in downtown reach as high as one can get, one sport has gripped the population with an unconditional allure: rock climbing.
Brought here in the late 1980s by a vagabond crew of Minnesotans, rock climbing has stuck. Originally, one could only access limited outdoor ascents in Taylors Falls and Red Wing. Indoor climbers only had a single rope atop a brick wall inside a Roseville outdoors retailer. Now, with a young generation crushing in a new style, the sport's landscape is putting on a new face.
"Most people have never heard of Minnesota," said Olympic-bound climber and University of Minnesota graduate Kyra Condie. "Some people say they've heard of it, but don't know where it is, to which I answer, 'It's right in the middle, at the very top.' But I always make sure to say I'm from here."
Minnesota has erupted into an unrecognized, yet world-class hub for those in the pursuit of going up.
First pitch: Minnesota's base
Minnesotans have infiltrated the climbing universe — whether the world knows it or not.
With 14 major gyms, about 1,700 outdoor routes and Olympic-bound talent knotted together, the state is on track to reckon with the western U.S.
"To me, Minnesota climbing culture is like a giant, unknown underground community," said world champion and Minnesota-based climber Alex Johnson, who coaches in the Twin Cities. "It's like we're here, you don't need to know about it — but we're going to keep crushing."
Johnson began her climbing journey in St. Paul, where she made a 20-minute drive to climb at least four times a week in 1997. Now, she's a professional athlete for The North Face and was the first American to ever win a Bouldering World Cup title on U.S. soil.
'Scending everywhere from California to Thailand, the Minnesotan holds firm that the state has climbing at its core.
"We've had badass climbers come out of Minnesota," Johnson said. "But globally and nationally, it's like an underground, probably because people think there's no rock climbing."
While Johnson has made an international name for North Star State climbing, one climber has stayed local to spark these flames internally: the godfather of Minnesota climbing, Jeff Engel.
"Minnesotan climbers really are passionate about what we have here and make great strides to take care of it," Engel said in an email to the Minnesota Daily.
Engel crafted countless routes, some of which are only accessible by raft — in a true Minnesotan fashion — allowing widespread access to Minnesotan cliffs, such as original routes in Sandstone, Minnesota.
What used to be the edge of nowhere now hosts full-fledged climbing festivals that have grown substantially in participation and popularity each year.
"Everything in Minnesota is such an outdoor community and climbing has just become a part of that," said Angie Jacobsen, 2018 festival participant and featured climber in "Jeff's World," a feature film on Engel's home turf. "Climbing is almost a natural progression."
While going back to college, Jacobsen entered the world of heights like most climbers from the state — first climbing indoors, then finding a crew before heading to outdoor crags after a year of practicing indoors.
"Once you become aware of it and are an outdoors person, which so many people in Minnesota are, it's a natural draw," Jacobsen said.
However, the transitional trailblazers are quickly losing ground.
Pitch two: the crux
Minnesota's climbing community is faced with a friction-inducing dilemma, pitting old traditions against inevitable progress. The problem? An exponential increase of indoor gyms.
Minnesota's gym boom over recent years has put a new generation on route to indoor-only climbing — something the "OG's" say they're not inclined to accept. The Olympics will see climbing as a featured event for the first time ever come Tokyo 2020, and the state has adopted this new era of indoor climbing with immediate speed.
"I have seen both an influx in private equity dollars and eyes from people who have no care for the outdoors or climbing's heritage — it's culturally shifted," said Nic Oklobzija, who authored the "Minnesota Bouldering Guidebook" and works as a national level five route setter for USA Climbing — about as prestigious of a position one can have behind the scenes. "This is probably the first year in my life where people are heavily identifying as 'gym climbers.'"
Starting as both a belayer and a hold maker, Oklobzija says he could count the number of gym climbers since 2004 solely on his hands.
Now, he sees an erosion in the sport that is only curable by respecting the past and getting people back outside.
"I would quit climbing if I had to be climbing inside all the time," Oklobzija said. "I've always seen it as training."
While many in a past generation would agree with Oklobzija, gyms are sprouting up around the state.
Last year, the Minneapolis Bouldering Project brought a nationwide gym chain to the Twin Cities. University of Minnesota grads created a climbing co-op in 2011. In 2013, climbers saw the rise of the Midwest Climbing Academy and a private climbing gym, "The A," open in the Marcy-Holmes neighborhood. Altogether, Minnesota has seen 14 major gyms stake a claim in less than 15 years — a major feat for a Midwestern state, many climbers say.
International climbing equipment companies have strapped into the Minnesota wave as well, propelling the industry forward by forging the chromatic holds and walls.
Nicros, Everlast, Escape and Kumiki climb companies call the state home. In addition, Organic Climbing, the premiere, vibrant bouldering equipment producer, opened its doors just off the University of Minnesota's campus.
"When I started six years ago, I looked at moving out of state," said Escape Climbing founder Ryan Angelo. "This is one of the top five cities in the country to own a climbing brand."
These manufacturers are pumping out essentials at a rapid rate, reflecting the influx of climbers worldwide and in-state.
The University itself is no exception to the trend, having seen the Recreation and Wellness Center open its doors to a professional-grade climbing facility in 2013.
"We are really here to serve students, but that doesn't mean we're here to serve subpar climbing walls," said University climbing instructor Bryan Karban, who also runs the University's outdoor program, Center for Outdoor Adventure.
Stating benefits from mental health to increased social interaction, Karban said the escape of heading to the Rec's wall, in some ways, is unmatched.
"The thing I see with students that makes climbing here so great is that the fundamental experience is the same, it might just be doing it at a different level," Karban said. "It provides that spectrum of experience and excitement that you can have from day one to day 600."
In the 2012-13 school year, the year before the RecWell was built, the University saw 359 climbing passes sold from September to May, and had an average of 25 people per day come to climb, Karban said.
Last year, the gym sold more than 1,200 memberships and averaged 102 climbers per day— totaling more than 25,500 participants over the course of the fiscal year, he said.
These numbers have been constantly increasing since the wall's debut, according to RecWell data.
Despite climbing at private gyms for the majority of her training, Condie, a Shoreview native, made appearances at the Rec. On the shortlist of Team USA Climbers for Tokyo 2020, Condie's journey started in one St. Paul gym, Vertical Endeavors, a location responsible for lighting the gym-craze fuse.
"When I was 11 years old, I was not only the youngest person climbing in the steep bouldering cave … but also one of the only girls," Condie said. "Back then, to be really 'in' the MN culture, you had to really be dedicated to climbing. And when I say dedicated, I mean it. These were people who could be found driving three-and-a-half hours back and forth to find boulders up North every weekend, scoping Google Earth in search of new potential on weeknights."
Nate Postma, founder of the St. Paul-based super gym Vertical Endeavors and former 3M engineer, laid the steadfast mold to the state's ascension empire in 1992.
Towering on the outskirts of downtown St. Paul, Postma's original gym pumped out international climbing legends like Alex Johnson, Kyra Condie and Noah Ridge. The business has five locations in Minnesota and one in Glendale Heights, Illinois.
"After seeing what was going on in the industry — and not being able to climb all winter — more and more people were picking up the sport, and I realized we were here in Minnesota … with no gym at all," Postma said. "I just thought to myself, 'Wow, wouldn't it be great if we had an indoor place where all our problems could be solved?'"
From an access standpoint, they were.
"I remember standing on my sidewalk thinking about if I should really do this, with the costs and everything," Postma said. "But we went for it, and then the phone didn't stop ringing. It was awesome."
Pitch three: topping out
Visions of a coherent community are on the horizon.
While tension hangs with older generations, the sport's newest members in the state are not as indoor-inclined as they may seem. Programs at the University and other gyms across the state are focusing on shifting back to the indoor-to-gym mentality.
"You have the traditional people — who we'll probably turn into — but then you have us hooligans," said University climb team captain Jacob Hammer. "We bring creativity and energy to everything we do — bringing that to climbing is really fun."
Hammer, who is helping launch new training programs with the COA, said the hope is to get everyone back in fresh air.
"The goal is to not have two separate communities, that's where I see it going," Hammer said.
Many say to those in the youngest stages of their passion that positive mentality transcends.
"Climbing people are the nicest ever, they always want to help out," said 9-year-old Ian Smith during Boulderfest North 2018, the first national climbing competition to be held in Minnesota.
Fourteen-year-old Zoë Nutsforle agrees the outlook for Minnesota climbing isn't too bleak.
"I just want to keep trying and get better, and everybody is rooting for you no matter what — that's so nice."
Five-year-old competitor Jack Miller has a positive attitude, too.
"I always want to come back and do more and make new friends," he said, his arms barely long enough to reach between holds.
The steadfast love for rock climbing is only transitioning: from young to old, mentor to first time on a crash pad, Minnesotan climbers are hauling the addiction of altitude to levels unthinkable in a state hidden in the northern forests.
The community is rapturous, and it's going nowhere, but up.


text:
The White Lion is a pub in Covent Garden, London, on the corner of James Street and Floral Street.

There has been a pub called the White Lion on the site since at least 1839, and the current pub was rebuilt in 1888, as can be seen under the rampant lion at the top of the building.

The White Lion Group, a radical political group in the 1820s and 1830s, with members including Dr Watson, and John Gale Jones, was named after the pub, as that had been their first meeting place.

The White Lion was once used just by market traders and local people, but is now used mainly by tourists, office workers and opera goers.

The pub is part of the Nicholson's pub chain.

References

External links

Covent Garden
Pubs in the City of Westminster

redpajama_set_name: RedPajamaWikipedia