text:
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "third_party/blink/public/platform/web_url_loader.h"

#include <stdint.h>

#include <algorithm>
#include <memory>
#include <string>
#include <utility>
#include <vector>

#include "base/bind.h"
#include "base/callback.h"
#include "base/check_op.h"
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/files/file_path.h"
#include "base/notreached.h"
#include "base/sequence_checker.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/synchronization/waitable_event.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "net/base/features.h"
#include "net/base/filename_util.h"
#include "net/base/host_port_pair.h"
#include "net/base/ip_endpoint.h"
#include "net/base/load_flags.h"
#include "net/base/net_errors.h"
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
#include "net/cert/cert_status_flags.h"
#include "net/cert/ct_sct_to_string.h"
#include "net/cert/x509_certificate.h"
#include "net/cert/x509_util.h"
#include "net/cookies/parsed_cookie.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_response_headers.h"
#include "net/ssl/ssl_cipher_suite_names.h"
#include "net/ssl/ssl_connection_status_flags.h"
#include "net/ssl/ssl_info.h"
#include "services/network/public/cpp/http_raw_request_response_info.h"
#include "services/network/public/cpp/ip_address_space_util.h"
#include "services/network/public/cpp/is_potentially_trustworthy.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/mojom/fetch_api.mojom-shared.h"
#include "services/network/public/mojom/ip_address_space.mojom-shared.h"
#include "services/network/public/mojom/trust_tokens.mojom-shared.h"
#include "services/network/public/mojom/url_loader.mojom.h"
#include "services/network/public/mojom/url_response_head.mojom.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/common/loader/mime_sniffing_throttle.h"
#include "third_party/blink/public/common/loader/referrer_utils.h"
#include "third_party/blink/public/common/loader/resource_type_util.h"
#include "third_party/blink/public/common/mime_util/mime_util.h"
#include "third_party/blink/public/common/security/security_style.h"
#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
#include "third_party/blink/public/mojom/blob/blob.mojom.h"
#include "third_party/blink/public/mojom/blob/blob_registry.mojom.h"
#include "third_party/blink/public/mojom/frame/frame.mojom.h"
#include "third_party/blink/public/platform/file_path_conversion.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h"
#include "third_party/blink/public/platform/resource_request_blocked_reason.h"
#include "third_party/blink/public/platform/url_conversion.h"
#include "third_party/blink/public/platform/web_back_forward_cache_loader_helper.h"
#include "third_party/blink/public/platform/web_blob_info.h"
#include "third_party/blink/public/platform/web_request_peer.h"
#include "third_party/blink/public/platform/web_resource_request_sender.h"
#include "third_party/blink/public/platform/web_security_origin.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/public/platform/web_url_error.h"
#include "third_party/blink/public/platform/web_url_loader_client.h"
#include "third_party/blink/public/platform/web_url_request.h"
#include "third_party/blink/public/platform/web_url_request_extra_data.h"
#include "third_party/blink/public/platform/web_url_response.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/public/web/web_security_policy.h"
#include "third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_response.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/boringssl/src/include/openssl/ssl.h"
#include "url/origin.h"

using base::Time;
using base::TimeTicks;
using blink::scheduler::WebResourceLoadingTaskRunnerHandle;

namespace blink {

// Utilities -------------------------------------------------------------------

namespace {

// Converts timing data from |load_timing| to the mojo type.
network::mojom::LoadTimingInfo ToMojoLoadTiming(
    const net::LoadTimingInfo& load_timing) {
  DCHECK(!load_timing.request_start.is_null());

  return network::mojom::LoadTimingInfo(
      load_timing.socket_reused, load_timing.socket_log_id,
      load_timing.request_start_time, load_timing.request_start,
      load_timing.proxy_resolve_start, load_timing.proxy_resolve_end,
      load_timing.connect_timing, load_timing.send_start, load_timing.send_end,
      load_timing.receive_headers_start, load_timing.receive_headers_end,
      load_timing.receive_non_informational_headers_start,
      load_timing.first_early_hints_time, load_timing.push_start,
      load_timing.push_end, load_timing.service_worker_start_time,
      load_timing.service_worker_ready_time,
      load_timing.service_worker_fetch_start,
      load_timing.service_worker_respond_with_settled);
}

// This is complementary to ConvertNetPriorityToWebKitPriority, defined in
// service_worker_context_client.cc.
// TODO(yhirano): Move this to blink/platform/loader.
net::RequestPriority ConvertWebKitPriorityToNetPriority(
    const WebURLRequest::Priority& priority) {
  switch (priority) {
    case WebURLRequest::Priority::kVeryHigh:
      return net::HIGHEST;

    case WebURLRequest::Priority::kHigh:
      return net::MEDIUM;

    case WebURLRequest::Priority::kMedium:
      return net::LOW;

    case WebURLRequest::Priority::kLow:
      return net::LOWEST;

    case WebURLRequest::Priority::kVeryLow:
      return net::IDLE;

    case WebURLRequest::Priority::kUnresolved:
    default:
      NOTREACHED();
      return net::LOW;
  }
}

// TODO(crbug.com/862940): Use KURL here.
void SetSecurityStyleAndDetails(const GURL& url,
                                const network::mojom::URLResponseHead& head,
                                WebURLResponse* response,
                                bool report_security_info) {
  if (!report_security_info) {
    response->SetSecurityStyle(SecurityStyle::kUnknown);
    return;
  }
  if (!url.SchemeIsCryptographic()) {
    // Some origins are considered secure even though they're not cryptographic,
    // so treat them as secure in the UI.
    if (network::IsUrlPotentiallyTrustworthy(url))
      response->SetSecurityStyle(SecurityStyle::kSecure);
    else
      response->SetSecurityStyle(SecurityStyle::kInsecure);
    return;
  }

  // The resource loader does not provide a guarantee that requests always have
  // security info (such as a certificate) attached. Use SecurityStyleUnknown
  // in this case where there isn't enough information to be useful.
  if (!head.ssl_info.has_value()) {
    response->SetSecurityStyle(SecurityStyle::kUnknown);
    return;
  }

  const net::SSLInfo& ssl_info = *head.ssl_info;
  if (net::IsCertStatusError(head.cert_status)) {
    response->SetSecurityStyle(SecurityStyle::kInsecure);
  } else {
    response->SetSecurityStyle(SecurityStyle::kSecure);
  }

  if (!ssl_info.cert) {
    NOTREACHED();
    response->SetSecurityStyle(SecurityStyle::kUnknown);
    return;
  }

  response->SetSSLInfo(ssl_info);
}

bool IsBannedCrossSiteAuth(
    network::ResourceRequest* resource_request,
    WebURLRequestExtraData* passed_url_request_extra_data) {
  auto& request_url = resource_request->url;
  auto& first_party = resource_request->site_for_cookies;

  bool allow_cross_origin_auth_prompt = false;
  if (passed_url_request_extra_data) {
    WebURLRequestExtraData* url_request_extra_data =
        static_cast<WebURLRequestExtraData*>(passed_url_request_extra_data);
    allow_cross_origin_auth_prompt =
        url_request_extra_data->allow_cross_origin_auth_prompt();
  }

  if (first_party.IsFirstPartyWithSchemefulMode(
          request_url, /*compute_schemefully=*/false)) {
    // If the first party is secure but the subresource is not, this is
    // mixed-content. Do not allow the image.
    if (!allow_cross_origin_auth_prompt &&
        network::IsUrlPotentiallyTrustworthy(first_party.RepresentativeUrl()) &&
        !network::IsUrlPotentiallyTrustworthy(request_url)) {
      return true;
    }
    return false;
  }

  return !allow_cross_origin_auth_prompt;
}

}  // namespace

// This inner class exists since the WebURLLoader may be deleted while inside a
// call to WebURLLoaderClient. Refcounting is to keep the context from
// being deleted if it may have work to do after calling into the client.
class WebURLLoader::Context : public WebRequestPeer {
 public:
  Context(WebURLLoader* loader,
          const WebVector<WebString>& cors_exempt_header_list,
          base::WaitableEvent* terminate_sync_load_event,
          std::unique_ptr<WebResourceLoadingTaskRunnerHandle>
              freezable_task_runner_handle,
          std::unique_ptr<WebResourceLoadingTaskRunnerHandle>
              unfreezable_task_runner_handle,
          scoped_refptr<network::SharedURLLoaderFactory> factory,
          mojo::PendingRemote<mojom::KeepAliveHandle> keep_alive_handle,
          WebBackForwardCacheLoaderHelper back_forward_cache_loader_helper);

  int request_id() const { return request_id_; }
  WebURLLoaderClient* client() const { return client_; }
  void set_client(WebURLLoaderClient* client) { client_ = client; }

  // Returns a task runner that might be unfreezable.
  // TODO(https://crbug.com/1137682): Rename this to GetTaskRunner instead once
  // we migrate all usage of the freezable task runner to use the (maybe)
  // unfreezable task runner.
  scoped_refptr<base::SingleThreadTaskRunner> GetMaybeUnfreezableTaskRunner();

  void Cancel();
  void Freeze(WebLoaderFreezeMode mode);
  void DidChangePriority(WebURLRequest::Priority new_priority,
                         int intra_priority_value);
  void Start(std::unique_ptr<network::ResourceRequest> request,
             scoped_refptr<WebURLRequestExtraData> url_request_extra_data,
             bool pass_response_pipe_to_client,
             bool no_mime_sniffing,
             base::TimeDelta timeout_interval,
             SyncLoadResponse* sync_load_response,
             std::unique_ptr<ResourceLoadInfoNotifierWrapper>
                 resource_load_info_notifier_wrapper);

  // WebRequestPeer overrides:
  void OnUploadProgress(uint64_t position, uint64_t size) override;
  bool OnReceivedRedirect(const net::RedirectInfo& redirect_info,
                          network::mojom::URLResponseHeadPtr head,
                          std::vector<std::string>* removed_headers) override;
  void OnReceivedResponse(
      network::mojom::URLResponseHeadPtr head,
      base::TimeTicks response_arrival_at_renderer) override;
  void OnStartLoadingResponseBody(
      mojo::ScopedDataPipeConsumerHandle body) override;
  void OnTransferSizeUpdated(int transfer_size_diff) override;
  void OnReceivedCachedMetadata(mojo_base::BigBuffer data) override;
  void OnCompletedRequest(
      const network::URLLoaderCompletionStatus& status) override;

  void SetResourceRequestSenderForTesting(  // IN-TEST
      std::unique_ptr<WebResourceRequestSender> resource_request_sender);

 private:
  ~Context() override;

  // Called when the body data stream is detached from the reader side.
  void CancelBodyStreaming();

  void OnBodyAvailable(MojoResult, const mojo::HandleSignalsState&);
  void OnBodyHasBeenRead(uint32_t read_bytes);

  static net::NetworkTrafficAnnotationTag GetTrafficAnnotationTag(
      network::ResourceRequest* request);

  WebURLLoader* loader_;

  KURL url_;
  // This is set in Start() and is used by SetSecurityStyleAndDetails() to
  // determine if security details should be added to the request for DevTools.
  //
  // Additionally, if there is a redirect, WillFollowRedirect() will update this
  // for the new request. InspectorNetworkAgent will have the chance to attach a
  // DevTools request id to that new request, and it will propagate here.
  bool has_devtools_request_id_;

  WebURLLoaderClient* client_;
  std::unique_ptr<WebResourceLoadingTaskRunnerHandle>
      freezable_task_runner_handle_;
  std::unique_ptr<WebResourceLoadingTaskRunnerHandle>
      unfreezable_task_runner_handle_;
  // TODO(https://crbug.com/1137682): Remove |freezable_task_runner_|, migrating
  // the current usage to use |unfreezable_task_runner_| instead. Also, rename
  // |unfreezable_task_runner_| to |maybe_unfreezable_task_runner_| here and
  // elsewhere, because it's only unfreezable if the kLoadingTasksUnfreezable
  // flag is on, so the name might be misleading (or if we've removed the
  // |freezable_task_runner_|, just rename this to |task_runner_| and note that
  // the task runner might or might not be unfreezable, depending on flags).
  scoped_refptr<base::SingleThreadTaskRunner> freezable_task_runner_;
  scoped_refptr<base::SingleThreadTaskRunner> unfreezable_task_runner_;
  mojo::PendingRemote<mojom::KeepAliveHandle> keep_alive_handle_;
  WebLoaderFreezeMode freeze_mode_ = WebLoaderFreezeMode::kNone;
  const WebVector<WebString> cors_exempt_header_list_;
  base::WaitableEvent* terminate_sync_load_event_;

  int request_id_;
  bool in_two_phase_read_ = false;
  bool is_in_on_body_available_ = false;

  absl::optional<network::URLLoaderCompletionStatus> completion_status_;

  std::unique_ptr<WebResourceRequestSender> resource_request_sender_;

  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;

  WebBackForwardCacheLoaderHelper back_forward_cache_loader_helper_;
};

// WebURLLoader::Context -------------------------------------------------------

WebURLLoader::Context::Context(
    WebURLLoader* loader,
    const WebVector<WebString>& cors_exempt_header_list,
    base::WaitableEvent* terminate_sync_load_event,
    std::unique_ptr<WebResourceLoadingTaskRunnerHandle>
        freezable_task_runner_handle,
    std::unique_ptr<WebResourceLoadingTaskRunnerHandle>
        unfreezable_task_runner_handle,
    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
    mojo::PendingRemote<mojom::KeepAliveHandle> keep_alive_handle,
    WebBackForwardCacheLoaderHelper back_forward_cache_loader_helper)
    : loader_(loader),
      has_devtools_request_id_(false),
      client_(nullptr),
      freezable_task_runner_handle_(std::move(freezable_task_runner_handle)),
      unfreezable_task_runner_handle_(
          std::move(unfreezable_task_runner_handle)),
      freezable_task_runner_(freezable_task_runner_handle_->GetTaskRunner()),
      unfreezable_task_runner_(
          unfreezable_task_runner_handle_->GetTaskRunner()),
      keep_alive_handle_(std::move(keep_alive_handle)),
      cors_exempt_header_list_(cors_exempt_header_list),
      terminate_sync_load_event_(terminate_sync_load_event),
      request_id_(-1),
      resource_request_sender_(std::make_unique<WebResourceRequestSender>()),
      url_loader_factory_(std::move(url_loader_factory)),
      back_forward_cache_loader_helper_(back_forward_cache_loader_helper) {
  DCHECK(url_loader_factory_);
}

scoped_refptr<base::SingleThreadTaskRunner>
WebURLLoader::Context::GetMaybeUnfreezableTaskRunner() {
  return unfreezable_task_runner_;
}

void WebURLLoader::Context::Cancel() {
  TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoader::Context::Cancel", this,
                         TRACE_EVENT_FLAG_FLOW_IN);
  if (request_id_ != -1) {
    // TODO(https://crbug.com/1137682): Change this to use
    // |unfreezable_task_runner_| instead?
    resource_request_sender_->Cancel(freezable_task_runner_);
    request_id_ = -1;
  }

  // Do not make any further calls to the client.
  client_ = nullptr;
  loader_ = nullptr;
}

void WebURLLoader::Context::Freeze(WebLoaderFreezeMode mode) {
  if (request_id_ != -1)
    resource_request_sender_->Freeze(mode);
  freeze_mode_ = mode;
}

void WebURLLoader::Context::DidChangePriority(
    WebURLRequest::Priority new_priority,
    int intra_priority_value) {
  if (request_id_ != -1) {
    net::RequestPriority net_priority =
        ConvertWebKitPriorityToNetPriority(new_priority);
    resource_request_sender_->DidChangePriority(net_priority,
                                                intra_priority_value);
    // TODO(https://crbug.com/1137682): Change this to
    // call |unfreezable_task_runner_handle_|?
    freezable_task_runner_handle_->DidChangeRequestPriority(net_priority);
  }
}

void WebURLLoader::Context::Start(
    std::unique_ptr<network::ResourceRequest> request,
    scoped_refptr<WebURLRequestExtraData> passed_url_request_extra_data,
    bool pass_response_pipe_to_client,
    bool no_mime_sniffing,
    base::TimeDelta timeout_interval,
    SyncLoadResponse* sync_load_response,
    std::unique_ptr<ResourceLoadInfoNotifierWrapper>
        resource_load_info_notifier_wrapper) {
  DCHECK_EQ(request_id_, -1);

  // Notify Blink's scheduler with the initial resource fetch priority.
  // TODO(https://crbug.com/1137682): Change this to
  // call |unfreezable_task_runner_handle_|?
  freezable_task_runner_handle_->DidChangeRequestPriority(request->priority);

  url_ = KURL(request->url);
  has_devtools_request_id_ = request->devtools_request_id.has_value();

  // TODO(horo): Check credentials flag is unset when credentials mode is omit.
  //             Check credentials flag is set when credentials mode is include.

  const network::mojom::RequestDestination request_destination =
      request->destination;

  // TODO(yhirano): Move the logic below to blink/platform/loader.
  if (!request->is_favicon &&
      request_destination == network::mojom::RequestDestination::kImage &&
      IsBannedCrossSiteAuth(request.get(),
                            passed_url_request_extra_data.get())) {
    // Prevent third-party image content from prompting for login, as this
    // is often a scam to extract credentials for another domain from the
    // user. Only block image loads, as the attack applies largely to the
    // "src" property of the <img> tag. It is common for web properties to
    // allow untrusted values for <img src>; this is considered a fair thing
    // for an HTML sanitizer to do. Conversely, any HTML sanitizer that didn't
    // filter sources for <script>, <link>, <embed>, <object>, <iframe> tags
    // would be considered vulnerable in and of itself.
    request->do_not_prompt_for_login = true;
    request->load_flags |= net::LOAD_DO_NOT_USE_EMBEDDED_IDENTITY;
  }

  scoped_refptr<WebURLRequestExtraData> empty_url_request_extra_data;
  WebURLRequestExtraData* url_request_extra_data;
  if (passed_url_request_extra_data) {
    url_request_extra_data = static_cast<WebURLRequestExtraData*>(
        passed_url_request_extra_data.get());
  } else {
    empty_url_request_extra_data =
        base::MakeRefCounted<WebURLRequestExtraData>();
    url_request_extra_data = empty_url_request_extra_data.get();
  }
  url_request_extra_data->CopyToResourceRequest(request.get());

  if (request->load_flags & net::LOAD_PREFETCH)
    request->corb_detachable = true;

  auto throttles =
      url_request_extra_data->TakeURLLoaderThrottles().ReleaseVector();
  // The frame request blocker is only for a frame's subresources.
  if (url_request_extra_data->frame_request_blocker() &&
      !IsRequestDestinationFrame(request_destination)) {
    auto throttle = url_request_extra_data->frame_request_blocker()
                        ->GetThrottleIfRequestsBlocked();
    if (throttle)
      throttles.push_back(std::move(throttle));
  }

  // TODO(falken): WebURLLoader should be able to get the top frame origin via
  // some plumbing such as through ResourceLoader -> FetchContext -> LocalFrame
  // -> RenderHostImpl instead of needing WebURLRequestExtraData.
  Platform::Current()->AppendVariationsThrottles(
      url_request_extra_data->top_frame_origin(), &throttles);

  uint32_t loader_options = network::mojom::kURLLoadOptionNone;
  if (!no_mime_sniffing) {
    loader_options |= network::mojom::kURLLoadOptionSniffMimeType;
    throttles.push_back(std::make_unique<MimeSniffingThrottle>(
        GetMaybeUnfreezableTaskRunner()));
  }

  if (sync_load_response) {
    DCHECK_EQ(freeze_mode_, WebLoaderFreezeMode::kNone);

    loader_options |= network::mojom::kURLLoadOptionSynchronous;
    request->load_flags |= net::LOAD_IGNORE_LIMITS;

    mojo::PendingRemote<mojom::BlobRegistry> download_to_blob_registry;
    if (pass_response_pipe_to_client) {
      Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
          download_to_blob_registry.InitWithNewPipeAndPassReceiver());
    }
    net::NetworkTrafficAnnotationTag tag =
        GetTrafficAnnotationTag(request.get());
    resource_request_sender_->SendSync(
        std::move(request), tag, loader_options, sync_load_response,
        url_loader_factory_, std::move(throttles), timeout_interval,
        cors_exempt_header_list_, terminate_sync_load_event_,
        std::move(download_to_blob_registry), base::WrapRefCounted(this),
        std::move(resource_load_info_notifier_wrapper));
    return;
  }

  TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoader::Context::Start", this,
                         TRACE_EVENT_FLAG_FLOW_OUT);
  net::NetworkTrafficAnnotationTag tag = GetTrafficAnnotationTag(request.get());
  request_id_ = resource_request_sender_->SendAsync(
      std::move(request), GetMaybeUnfreezableTaskRunner(), tag, loader_options,
      cors_exempt_header_list_, base::WrapRefCounted(this), url_loader_factory_,
      std::move(throttles), std::move(resource_load_info_notifier_wrapper),
      back_forward_cache_loader_helper_);

  if (freeze_mode_ != WebLoaderFreezeMode::kNone) {
    resource_request_sender_->Freeze(WebLoaderFreezeMode::kStrict);
  }
}

void WebURLLoader::Context::OnUploadProgress(uint64_t position, uint64_t size) {
  if (client_)
    client_->DidSendData(position, size);
}

bool WebURLLoader::Context::OnReceivedRedirect(
    const net::RedirectInfo& redirect_info,
    network::mojom::URLResponseHeadPtr head,
    std::vector<std::string>* removed_headers) {
  if (!client_)
    return false;

  TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoader::Context::OnReceivedRedirect",
                         this,
                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);

  WebURLResponse response;
  PopulateURLResponse(url_, *head, &response, has_devtools_request_id_,
                      request_id_);

  url_ = KURL(redirect_info.new_url);
  return client_->WillFollowRedirect(
      url_, redirect_info.new_site_for_cookies,
      WebString::FromUTF8(redirect_info.new_referrer),
      ReferrerUtils::NetToMojoReferrerPolicy(redirect_info.new_referrer_policy),
      WebString::FromUTF8(redirect_info.new_method), response,
      has_devtools_request_id_, removed_headers,
      redirect_info.insecure_scheme_was_upgraded);
}

void WebURLLoader::Context::OnReceivedResponse(
    network::mojom::URLResponseHeadPtr head,
    base::TimeTicks response_arrival_at_renderer) {
  if (!client_)
    return;

  TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoader::Context::OnReceivedResponse",
                         this,
                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);

  // These headers must be stripped off before entering into the renderer
  // (see also https://crbug.com/1019732).
  DCHECK(!head->headers || !head->headers->HasHeader("set-cookie"));
  DCHECK(!head->headers || !head->headers->HasHeader("set-cookie2"));
  DCHECK(!head->headers || !head->headers->HasHeader("clear-site-data"));

  WebURLResponse response;
  PopulateURLResponse(url_, *head, &response, has_devtools_request_id_,
                      request_id_);
  response.SetArrivalTimeAtRenderer(response_arrival_at_renderer);

  client_->DidReceiveResponse(response);

  // DidReceiveResponse() may have triggered a cancel, causing the |client_| to
  // go away.
  if (!client_)
    return;
}

void WebURLLoader::Context::OnStartLoadingResponseBody(
    mojo::ScopedDataPipeConsumerHandle body) {
  if (client_)
    client_->DidStartLoadingResponseBody(std::move(body));

  TRACE_EVENT_WITH_FLOW0(
      "loading", "WebURLLoader::Context::OnStartLoadingResponseBody", this,
      TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
}

void WebURLLoader::Context::OnTransferSizeUpdated(int transfer_size_diff) {
  client_->DidReceiveTransferSizeUpdate(transfer_size_diff);
}

void WebURLLoader::Context::OnReceivedCachedMetadata(
    mojo_base::BigBuffer data) {
  if (!client_)
    return;
  TRACE_EVENT_WITH_FLOW1(
      "loading", "WebURLLoader::Context::OnReceivedCachedMetadata", this,
      TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "length",
      data.size());
  client_->DidReceiveCachedMetadata(std::move(data));
}

void WebURLLoader::Context::OnCompletedRequest(
    const network::URLLoaderCompletionStatus& status) {
  int64_t total_transfer_size = status.encoded_data_length;
  int64_t encoded_body_size = status.encoded_body_length;

  if (client_) {
    TRACE_EVENT_WITH_FLOW0("loading",
                           "WebURLLoader::Context::OnCompletedRequest", this,
                           TRACE_EVENT_FLAG_FLOW_IN);

    if (status.error_code != net::OK) {
      client_->DidFail(PopulateURLError(status, url_), status.completion_time,
                       total_transfer_size, encoded_body_size,
                       status.decoded_body_length);
    } else {
      client_->DidFinishLoading(status.completion_time, total_transfer_size,
                                encoded_body_size, status.decoded_body_length,
                                status.should_report_corb_blocking,
                                status.pervasive_payload_requested);
    }
  }
}

WebURLLoader::Context::~Context() {
  // We must be already cancelled at this point.
  DCHECK_LT(request_id_, 0);
}

void WebURLLoader::Context::CancelBodyStreaming() {
  scoped_refptr<Context> protect(this);

  if (client_) {
    // TODO(yhirano): Set |stale_copy_in_cache| appropriately if possible.
    client_->DidFail(WebURLError(net::ERR_ABORTED, url_),
                     base::TimeTicks::Now(),
                     WebURLLoaderClient::kUnknownEncodedDataLength, 0, 0);
  }

  // Notify the browser process that the request is canceled.
  Cancel();
}

// WebURLLoader ----------------------------------------------------------------

WebURLLoader::WebURLLoader(
    const WebVector<WebString>& cors_exempt_header_list,
    base::WaitableEvent* terminate_sync_load_event,
    std::unique_ptr<WebResourceLoadingTaskRunnerHandle>
        freezable_task_runner_handle,
    std::unique_ptr<WebResourceLoadingTaskRunnerHandle>
        unfreezable_task_runner_handle,
    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
    mojo::PendingRemote<mojom::KeepAliveHandle> keep_alive_handle,
    WebBackForwardCacheLoaderHelper back_forward_cache_loader_helper)
    : context_(new Context(this,
                           cors_exempt_header_list,
                           terminate_sync_load_event,
                           std::move(freezable_task_runner_handle),
                           std::move(unfreezable_task_runner_handle),
                           std::move(url_loader_factory),
                           std::move(keep_alive_handle),
                           back_forward_cache_loader_helper)) {}

WebURLLoader::WebURLLoader() = default;

WebURLLoader::~WebURLLoader() {
  Cancel();
}

void WebURLLoader::PopulateURLResponse(
    const WebURL& url,
    const network::mojom::URLResponseHead& head,
    WebURLResponse* response,
    bool report_security_info,
    int request_id) {
  response->SetCurrentRequestUrl(url);
  response->SetResponseTime(head.response_time);
  response->SetMimeType(WebString::FromUTF8(head.mime_type));
  response->SetTextEncodingName(WebString::FromUTF8(head.charset));
  response->SetExpectedContentLength(head.content_length);
  response->SetHasMajorCertificateErrors(
      net::IsCertStatusError(head.cert_status));
  response->SetIsLegacyTLSVersion(head.is_legacy_tls_version);
  response->SetHasRangeRequested(head.has_range_requested);
  response->SetTimingAllowPassed(head.timing_allow_passed);
  response->SetWasCached(!head.load_timing.request_start_time.is_null() &&
                         head.response_time <
                             head.load_timing.request_start_time);
  response->SetConnectionID(head.load_timing.socket_log_id);
  response->SetConnectionReused(head.load_timing.socket_reused);
  response->SetWasFetchedViaSPDY(head.was_fetched_via_spdy);
  response->SetWasFetchedViaServiceWorker(head.was_fetched_via_service_worker);
  response->SetServiceWorkerResponseSource(head.service_worker_response_source);
  response->SetType(head.response_type);
  response->SetPadding(head.padding);
  WebVector<KURL> url_list_via_service_worker(
      head.url_list_via_service_worker.size());
  std::transform(head.url_list_via_service_worker.begin(),
                 head.url_list_via_service_worker.end(),
                 url_list_via_service_worker.begin(),
                 [](const GURL& h) { return KURL(h); });
  response->SetUrlListViaServiceWorker(url_list_via_service_worker);
  response->SetCacheStorageCacheName(
      head.service_worker_response_source ==
              network::mojom::FetchResponseSource::kCacheStorage
          ? WebString::FromUTF8(head.cache_storage_cache_name)
          : WebString());

  WebVector<WebString> dns_aliases(head.dns_aliases.size());
  std::transform(head.dns_aliases.begin(), head.dns_aliases.end(),
                 dns_aliases.begin(),
                 [](const std::string& h) { return WebString::FromASCII(h); });
  response->SetDnsAliases(dns_aliases);
  response->SetRemoteIPEndpoint(head.remote_endpoint);
  response->SetAddressSpace(head.response_address_space);
  response->SetClientAddressSpace(head.client_address_space);

  WebVector<WebString> cors_exposed_header_names(
      head.cors_exposed_header_names.size());
  std::transform(head.cors_exposed_header_names.begin(),
                 head.cors_exposed_header_names.end(),
                 cors_exposed_header_names.begin(),
                 [](const std::string& h) { return WebString::FromLatin1(h); });
  response->SetCorsExposedHeaderNames(cors_exposed_header_names);
  response->SetDidServiceWorkerNavigationPreload(
      head.did_service_worker_navigation_preload);
  response->SetIsValidated(head.is_validated);
  response->SetEncodedDataLength(head.encoded_data_length);
  response->SetEncodedBodyLength(head.encoded_body_length);
  response->SetWasAlpnNegotiated(head.was_alpn_negotiated);
  response->SetAlpnNegotiatedProtocol(
      WebString::FromUTF8(head.alpn_negotiated_protocol));
  response->SetHasAuthorizationCoveredByWildcardOnPreflight(
      head.has_authorization_covered_by_wildcard_on_preflight);
  response->SetWasAlternateProtocolAvailable(
      head.was_alternate_protocol_available);
  response->SetConnectionInfo(head.connection_info);
  response->SetAsyncRevalidationRequested(head.async_revalidation_requested);
  response->SetNetworkAccessed(head.network_accessed);
  response->SetRequestId(request_id);
  response->SetIsSignedExchangeInnerResponse(
      head.is_signed_exchange_inner_response);
  response->SetWasInPrefetchCache(head.was_in_prefetch_cache);
  response->SetWasCookieInRequest(head.was_cookie_in_request);
  response->SetRecursivePrefetchToken(head.recursive_prefetch_token);
  response->SetWebBundleURL(KURL(head.web_bundle_url));

  SetSecurityStyleAndDetails(GURL(KURL(url)), head, response,
                             report_security_info);

  // If there's no received headers end time, don't set load timing.  This is
  // the case for non-HTTP requests, requests that don't go over the wire, and
  // certain error cases.
  if (!head.load_timing.receive_headers_end.is_null()) {
    response->SetLoadTiming(ToMojoLoadTiming(head.load_timing));
  }

  response->SetEmittedExtraInfo(head.emitted_extra_info);

  response->SetAuthChallengeInfo(head.auth_challenge_info);
  response->SetRequestIncludeCredentials(head.request_include_credentials);

  const net::HttpResponseHeaders* headers = head.headers.get();
  if (!headers)
    return;

  WebURLResponse::HTTPVersion version = WebURLResponse::kHTTPVersionUnknown;
  if (headers->GetHttpVersion() == net::HttpVersion(0, 9))
    version = WebURLResponse::kHTTPVersion_0_9;
  else if (headers->GetHttpVersion() == net::HttpVersion(1, 0))
    version = WebURLResponse::kHTTPVersion_1_0;
  else if (headers->GetHttpVersion() == net::HttpVersion(1, 1))
    version = WebURLResponse::kHTTPVersion_1_1;
  else if (headers->GetHttpVersion() == net::HttpVersion(2, 0))
    version = WebURLResponse::kHTTPVersion_2_0;
  response->SetHttpVersion(version);
  response->SetHttpStatusCode(headers->response_code());
  response->SetHttpStatusText(WebString::FromLatin1(headers->GetStatusText()));

  // Build up the header map.
  size_t iter = 0;
  std::string name;
  std::string value;
  while (headers->EnumerateHeaderLines(&iter, &name, &value)) {
    response->AddHttpHeaderField(WebString::FromLatin1(name),
                                 WebString::FromLatin1(value));
  }

  response->SetHasPartitionedCookie(head.has_partitioned_cookie);
}

// static
WebURLError WebURLLoader::PopulateURLError(
    const network::URLLoaderCompletionStatus& status,
    const WebURL& url) {
  DCHECK_NE(net::OK, status.error_code);
  const WebURLError::HasCopyInCache has_copy_in_cache =
      status.exists_in_cache ? WebURLError::HasCopyInCache::kTrue
                             : WebURLError::HasCopyInCache::kFalse;
  if (status.cors_error_status)
    return WebURLError(*status.cors_error_status, has_copy_in_cache, url);
  if (status.blocked_by_response_reason) {
    DCHECK_EQ(net::ERR_BLOCKED_BY_RESPONSE, status.error_code);
    return WebURLError(*status.blocked_by_response_reason,
                       status.resolve_error_info, has_copy_in_cache, url);
  }

  if (status.trust_token_operation_status !=
      network::mojom::TrustTokenOperationStatus::kOk) {
    DCHECK(status.error_code ==
               net::ERR_TRUST_TOKEN_OPERATION_SUCCESS_WITHOUT_SENDING_REQUEST ||
           status.error_code == net::ERR_TRUST_TOKEN_OPERATION_FAILED)
        << "Unexpected error code on Trust Token operation failure (or cache "
           "hit): "
        << status.error_code;

    return WebURLError(status.error_code, status.trust_token_operation_status,
                       url);
  }

  return WebURLError(status.error_code, status.extended_error_code,
                     status.resolve_error_info, has_copy_in_cache,
                     WebURLError::IsWebSecurityViolation::kFalse, url,
                     status.should_collapse_initiator
                         ? WebURLError::ShouldCollapseInitiator::kTrue
                         : WebURLError::ShouldCollapseInitiator::kFalse);
}

void WebURLLoader::LoadSynchronously(
    std::unique_ptr<network::ResourceRequest> request,
    scoped_refptr<WebURLRequestExtraData> url_request_extra_data,
    bool pass_response_pipe_to_client,
    bool no_mime_sniffing,
    base::TimeDelta timeout_interval,
    WebURLLoaderClient* client,
    WebURLResponse& response,
    absl::optional<WebURLError>& error,
    WebData& data,
    int64_t& encoded_data_length,
    int64_t& encoded_body_length,
    WebBlobInfo& downloaded_blob,
    std::unique_ptr<ResourceLoadInfoNotifierWrapper>
        resource_load_info_notifier_wrapper) {
  if (!context_)
    return;

  TRACE_EVENT0("loading", "WebURLLoader::loadSynchronously");
  SyncLoadResponse sync_load_response;

  DCHECK(!context_->client());
  context_->set_client(client);

  const bool has_devtools_request_id = request->devtools_request_id.has_value();
  context_->Start(std::move(request), std::move(url_request_extra_data),
                  pass_response_pipe_to_client, no_mime_sniffing,
                  timeout_interval, &sync_load_response,
                  std::move(resource_load_info_notifier_wrapper));

  const KURL final_url(sync_load_response.url);

  // TODO(tc): For file loads, we may want to include a more descriptive
  // status code or status text.
  const int error_code = sync_load_response.error_code;
  if (error_code != net::OK) {
    if (sync_load_response.cors_error) {
      error = WebURLError(*sync_load_response.cors_error,
                          WebURLError::HasCopyInCache::kFalse, final_url);
    } else {
      // SyncResourceHandler returns ERR_ABORTED for CORS redirect errors,
      // so we treat the error as a web security violation.
      const WebURLError::IsWebSecurityViolation is_web_security_violation =
          error_code == net::ERR_ABORTED
              ? WebURLError::IsWebSecurityViolation::kTrue
              : WebURLError::IsWebSecurityViolation::kFalse;
      error = WebURLError(error_code, sync_load_response.extended_error_code,
                          sync_load_response.resolve_error_info,
                          WebURLError::HasCopyInCache::kFalse,
                          is_web_security_violation, final_url,
                          sync_load_response.should_collapse_initiator
                              ? WebURLError::ShouldCollapseInitiator::kTrue
                              : WebURLError::ShouldCollapseInitiator::kFalse);
    }
    return;
  }

  PopulateURLResponse(final_url, *sync_load_response.head, &response,
                      has_devtools_request_id, context_->request_id());
  encoded_data_length = sync_load_response.head->encoded_data_length;
  encoded_body_length = sync_load_response.head->encoded_body_length;
  if (sync_load_response.downloaded_blob) {
    downloaded_blob = WebBlobInfo(
        WebString::FromLatin1(sync_load_response.downloaded_blob->uuid),
        WebString::FromLatin1(sync_load_response.downloaded_blob->content_type),
        sync_load_response.downloaded_blob->size,
        std::move(sync_load_response.downloaded_blob->blob));
  }

  data.Assign(sync_load_response.data);
}

void WebURLLoader::LoadAsynchronously(
    std::unique_ptr<network::ResourceRequest> request,
    scoped_refptr<WebURLRequestExtraData> url_request_extra_data,
    bool no_mime_sniffing,
    std::unique_ptr<ResourceLoadInfoNotifierWrapper>
        resource_load_info_notifier_wrapper,
    WebURLLoaderClient* client) {
  if (!context_)
    return;

  TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoader::loadAsynchronously", this,
                         TRACE_EVENT_FLAG_FLOW_OUT);
  DCHECK(!context_->client());

  context_->set_client(client);
  context_->Start(std::move(request), std::move(url_request_extra_data),
                  /*pass_response_pipe_to_client=*/false, no_mime_sniffing,
                  base::TimeDelta(), nullptr,
                  std::move(resource_load_info_notifier_wrapper));
}

void WebURLLoader::Cancel() {
  if (context_)
    context_->Cancel();
}

void WebURLLoader::Freeze(WebLoaderFreezeMode mode) {
  if (context_)
    context_->Freeze(mode);
}

void WebURLLoader::DidChangePriority(WebURLRequest::Priority new_priority,
                                     int intra_priority_value) {
  if (context_)
    context_->DidChangePriority(new_priority, intra_priority_value);
}

scoped_refptr<base::SingleThreadTaskRunner>
WebURLLoader::GetTaskRunnerForBodyLoader() {
  if (!context_)
    return nullptr;
  return context_->GetMaybeUnfreezableTaskRunner();
}

void WebURLLoader::SetResourceRequestSenderForTesting(
    std::unique_ptr<WebResourceRequestSender> resource_request_sender) {
  context_->SetResourceRequestSenderForTesting(  // IN-TEST
      std::move(resource_request_sender));
}

// static
// We have this function at the bottom of this file because it confuses
// syntax highliting.
// TODO(kinuko): Deprecate this, we basically need to know the destination
// and if it's for favicon or not.
net::NetworkTrafficAnnotationTag WebURLLoader::Context::GetTrafficAnnotationTag(
    network::ResourceRequest* request) {
  if (request->is_favicon) {
    return net::DefineNetworkTrafficAnnotation("favicon_loader", R"(
      semantics {
        sender: "Blink Resource Loader"
        description:
          "Chrome sends a request to download favicon for a URL."
        trigger:
          "Navigating to a URL."
        data: "None."
        destination: WEBSITE
      }
      policy {
        cookies_allowed: YES
        cookies_store: "user"
        setting: "These requests cannot be disabled in settings."
        policy_exception_justification:
          "Not implemented."
      })");
  }
  switch (request->destination) {
    case network::mojom::RequestDestination::kDocument:
    case network::mojom::RequestDestination::kIframe:
    case network::mojom::RequestDestination::kFrame:
    case network::mojom::RequestDestination::kFencedframe:
      NOTREACHED();
      [[fallthrough]];

    case network::mojom::RequestDestination::kEmpty:
    case network::mojom::RequestDestination::kAudio:
    case network::mojom::RequestDestination::kAudioWorklet:
    case network::mojom::RequestDestination::kFont:
    case network::mojom::RequestDestination::kImage:
    case network::mojom::RequestDestination::kManifest:
    case network::mojom::RequestDestination::kPaintWorklet:
    case network::mojom::RequestDestination::kReport:
    case network::mojom::RequestDestination::kScript:
    case network::mojom::RequestDestination::kServiceWorker:
    case network::mojom::RequestDestination::kSharedWorker:
    case network::mojom::RequestDestination::kStyle:
    case network::mojom::RequestDestination::kTrack:
    case network::mojom::RequestDestination::kVideo:
    case network::mojom::RequestDestination::kWebBundle:
    case network::mojom::RequestDestination::kWorker:
    case network::mojom::RequestDestination::kXslt:
      return net::DefineNetworkTrafficAnnotation("blink_resource_loader", R"(
      semantics {
        sender: "Blink Resource Loader"
        description:
          "Blink-initiated request, which includes all resources for "
          "normal page loads, chrome URLs, and downloads."
        trigger:
          "The user navigates to a URL or downloads a file. Also when a "
          "webpage, ServiceWorker, or chrome:// uses any network communication."
        data: "Anything the initiator wants to send."
        destination: OTHER
      }
      policy {
        cookies_allowed: YES
        cookies_store: "user"
        setting: "These requests cannot be disabled in settings."
        policy_exception_justification:
          "Not implemented. Without these requests, Chrome will be unable "
          "to load any webpage."
      })");

    case network::mojom::RequestDestination::kEmbed:
    case network::mojom::RequestDestination::kObject:
      return net::DefineNetworkTrafficAnnotation(
          "blink_extension_resource_loader", R"(
        semantics {
          sender: "Blink Resource Loader"
          description:
            "Blink-initiated request for resources required for NaCl instances "
            "tagged with <embed> or <object>, or installed extensions."
          trigger:
            "An extension or NaCl instance may initiate a request at any time, "
            "even in the background."
          data: "Anything the initiator wants to send."
          destination: OTHER
        }
        policy {
          cookies_allowed: YES
          cookies_store: "user"
          setting:
            "These requests cannot be disabled in settings, but they are "
            "sent only if user installs extensions."
          chrome_policy {
            ExtensionInstallBlocklist {
              ExtensionInstallBlocklist: {
                entries: '*'
              }
            }
          }
        })");
  }

  return net::NetworkTrafficAnnotationTag::NotReached();
}

void WebURLLoader::Context::SetResourceRequestSenderForTesting(
    std::unique_ptr<blink::WebResourceRequestSender> resource_request_sender) {
  resource_request_sender_ = std::move(resource_request_sender);
}

}  // namespace blink

redpajama_set_name: RedPajamaGithub


text:
Investment appraisal
Capital budgeting – Island venture In this week's exercise, an organisation must decide what asset will be most useful, a promenade or a restaurant. Every investment has its cost and by using capital budgeting you will be able to assess which decision will yield the best results. Organisations must consider all of their investment options and the impact that these have on the rest of the company. Opportunity costs are an important part of this and must be considered when decisions are being made. What happens when an organisation decides to purchase one machine over another? What is the opportunity cost of this decision? To prepare for this Exercise: Reflect on how capital budgeting can help an organisation to make long-term investment decisions. What consequences might an organisation face if it does not use capital budgeting? Review the four main methods used to evaluate investment opportunities Think about the disadvantages and advantages of internal rate of return (IRR) and the other three methods, and how these could affect results. Think about the importance of BEP, the margin of safety, and how an organisation's variable and fixed costs play a role in this. Consider the following scenario: You have just inherited a small island in the Bahamas. The island is near a favourite fishing location, and you are considering two alternative investments. First, you could construct a boat landing that provides grounds for camping. You estimate that the landing will require a £1,000 investment today and that it is expected to generate cash flows of £1,000 per year, forever. Alternatively, you could invest £10,000 today and build a restaurant and 'beer garden', which you believe will then generate cash flows of £4,000 per year, forever. You cannot undertake both businesses on the island (they are mutually exclusive), and since both rely on tourists, you believe that the riskiness of each venture is identical (you may assume this to be the case and that the associated required return is 20%). A quick calculation shows that the IRR of the first alternative is 100% and that the IRR of the second alternative is 40%. Hence, according to the IRR criterion, the first option is preferable. In approximately 750 – 1,000 words, address the following: Do you agree with the assessment? Provide alternative capital budgeting evaluations of the two projects and discuss which method is the most reliable. Also discuss what other factors should be taken into consideration. Be sure to articulate the strengths and weaknesses of each technique. Base your answer upon your reading, further research and your own experiences. Please remember to correctly cite all references. Harvard UK referencing must be used.

redpajama_set_name: RedPajamaCommonCrawl


text:
Home / Relief as fire victims receive national documents
Relief as fire victims receive national documents
2020-09-01 Eveline de Klerk
WALVIS BAY - Some residents of Twaloloka at Walvis Bay, who lost their national documents during the devastating fire in July were issued with national documents yesterday by the ministry of home affairs. The ministry's regional head of civil registration, Temba Nghitaunapo, and his team facilitated the process at the temporary settlement called Otweya. About 154 families were resettled at Otweya following the devastating fire, which claimed a toddler. The team verified and handed over 39 identity documents and 68 birth certificates as well as one marriage certificate to residents just before lunchtime yesterday. "A lot of people could not also collect their documents as they are at work, however, arrangements will be made for them to get their documents," Nghitaunapo said. He added that they also experience some challenges in terms of information provided by some residents as it does not correlate with that on the system. "Unfortunately, we cannot take fingerprints at this stage due to Covid-19 but we are working on that as well. We are also working with the various state hospitals in Swakopmund and Walvis Bay to get the date of birth of some children and parents from their registries as some could not remember these vital details," he added. Nghitaunapo said that they are also aware of some residents in Otweya that are undocumented, saying that it is vital to know when and where they came from in order for the ministry to assist them with documents. "You do not necessarily need to go back to your country of birth to get police clearance needed to get national documents but should simply work through your embassy in this regard," he said. Twaifanwa Paulus, who is one of the residents, said she is relieved to be able to obtain her family's documents. "It is one less problem to worry about, hence we are grateful that the government could facilitate the process for us," she said.
– edeklerk@nepc.com.na
Tags: Erongo


Washable silk comforter is now available online! Crafted of 100% organic mulberry silk, our fluffy silk filled comforters are extraordinarily breathable and light, just like sleeping on the cloud. The updated design with blocks that cover the whole comforter is to fixate the silk filling so that silk floss will not move around inside the cotton shell, which ensures you a night-long comfort. Additionally, they are easily washable by hand or machine, very convenient for daily care. Anyway, you do not have to worry about deformation of your comforter after washing! It is a good sleep helper with huge health benefits and easy-to-care feature!
100% mulberry silk is always your first choice! Especially for the silk floss. Only the cocoons of Mulberry silkworm can be unraveled to make spindles of single-strand silk threads, forming long-stranded silk fiber. Our products, unless stated otherwise on the product page, are made of 100% pure and natural long fiber Mulberry silk cultivated from the best silk farms in China.
The outer shell of silk comforter with cotton, also called cotton-covered comforter, is made of cotton. We choose cotton as the cover of this washable comforter is to help to prevent comforter moving around inside your comforter cover. As we all know, cotton is less smooth than silk. This is also an advantage to take for washable comforter design.
From the picture, you can clearly see there are stitched blocks covering the whole comforter. This design is to fix the filling well onto the cotton shell. Therefore, the silk floss is efficiently prevented from moving around inside the cotton shell during washing. Otherwise, the whole silk floss inside would be tore into parts after several times washing.
They are easily washable by hand or machine, very convenient for daily care.
Next ArticleWhat Do You Know About Silk Drape?


both in print and online.
Inessa's flawless makeup was created by our very talented, Meredith Sinclair.
and we love Inessa's photos from Haley Photography!
Special thanks to The Wedding Opera for the feature!


text:
Delhi HC upholds order dismissing Vodafone's plea on IUC
New Delhi | Published: September 22, 2017 10:20:44 PM
The Delhi High Court has upheld its single judge order dismissing Vodafone's plea against the consultation process adopted by telecom regulator TRAI for fixing interconnection usage charges (IUCs) between cellular and fixed line operators.
Vodafone had moved the larger bench against the single judge's September 4 order. (Reuters)
The Delhi High Court has upheld its single judge order dismissing Vodafone's plea against the consultation process adopted by telecom regulator TRAI for fixing interconnection usage charges (IUCs) between cellular and fixed line operators. IUCs are charges paid by operators of telecommunication services on whom the call originates to operators at whose end the call terminates. The charges are currently determined in accordance with the Telecom Interconnection Usage Charges Regulations 2015.
Vodafone had moved the larger bench against the single judge's September 4 order. The single judge's verdict was upheld by a bench of Justices S Ravindra Bhat and Sunil Gaur, which said "there is no error in the single judge's findings". The single judge had found that the TRAI's inaction to accede to Vodafone's demand, or refusal to share the models demanded of it, were not in violation of the transparency mandate under section 11(4) of the TRAI Act.
"The appeal has to accordingly fail and is therefore, dismissed, without order on costs," the bench said. The plea had claimed that if the data was not shared with them, the entire consultation would be violative of the principles of natural justice in accordance with the TRAI Act and other provisions of law.
Initially, the company had moved the court earlier this year against consultation papers on IUCs floated by the Telecom Regulatory Authority of India (TRAI), in an attempt to make it reveal the cost models gathered to determine the revised rates on the grounds of transparency.


Archive with tag: 3 x 6 subway tile lowes | Fayeflam 3 X 6 Subway Tile.
collection of galleries from Home And Furniture like 3 X 6 Subway Tile. and other designs you might like Gray Ceramic Floor Tile. What Is The Best Paint For Kitchen Cabinets. Utility Sink Faucets. Bathroom Vanity Outlet. Pebble Mosaic Tile. Art Deco Cabinet Pulls. French Entry Doors.


Over the past few months I've been developing a new habit. It's not perfect, but it's been accomplishing its purposes. The habit is rest, and more specifically, it's what the Bible refers to as Sabbath. For these past few months I've been taking off on Wednesday mornings. From Tuesday evening until around noon on Wednesday, I don't produce anything. I might have to take a phone call or respond to an email every now and then, but I'm pretty much tech free. I read, I exercise, I pray, I take a walk. When Mandy is able to Sabbath with me, she sleeps in a bit, and we either do breakfast or lunch together and actually have time for healthy conversation.
I find that it's a time to regain perspective. What do I mean by that? Well, I often forget that God wants to direct my steps and take care of me. I so often believe the lie that if I don't produce, it won't happen. Rest goes to battle against that lie. I also find that it's a time for God to renew my spirit and refresh my dreams. Almost every Wednesday I come away with one or two big ideas, and the amazing thing is that I wasn't trying to produce a big idea. It just comes because my heart is at rest.
I've always heard that Sabbath rest is a gift, and I'm starting to really understand this. When Tuesday rolls around I start looking forward to my morning. As I said at the start, I haven't perfected the art of rest, but the fruit that has come from it has been so good. I'm very thankful for that!


text:
BlueSky Flat Fee
Levels of Engagement
BlueSky Planning℠
BlueSky Investing℠
BlueSky Experience
Successful Professionals
Stress-Free Retirees
BlueSky Insights
BlueSky Careers
To Roth or Not To Roth
Prior to April 15, a lot of workers will wonder whether making a prior year IRA contribution is a better tax strategy than making a prior year Roth contribution. Like most good financial planning questions, it depends. But let's start with the first question:
In 2016, married couples where at least one person is covered by a retirement account at work begin phasing out their ability to make a deductible IRA contribution at $98,000 of modified AGI, singles at $61,000. Without retirement plans at work, a deductible IRA is always possible, unless the spouse has a retirement plan at work, in which case deductible IRA contributions phase out at $184,000 of modified AGI. For Roth IRAs, full contributions are only possible for modified AGI less than $184,000 (married) or $117,000 (single), regardless of what retirement plans are offered at work.
How much can you contribute?
Up to the lesser of household earned income or $5,500 can be contributed to an IRA or Roth IRA (or combination thereof), increased by $1000 for those over 50 by the end of the year. A Traditional IRA contribution creates a below-the-line tax deduction for AGI in the year of contribution, the investments can grow tax-free until retirement distributions are made, at which point they are fully taxable as ordinary income. In contrast, a Roth contribution creates no tax advantage in the year of contribution (unless the Saver's Credit applies), but the investments can grow tax-free and be distributed tax-free in retirement.
So which is better?
With the massively simplifying assumption that your marginal income tax bracket now is identical to your marginal income tax bracket during distribution, both retirement vehicles are mathematically equivalent after all taxes are applied. So it is commonly assumed that highly-compensated workers should utilize tax-deferred accounts and younger workers whose career is expected to put them in a higher future tax bracket should utilize Roth accounts. But additionally, some thought should be paid to expectations of future tax rates, and whether you expect them to get more progressive (taxing higher incomes more, middle to low incomes less or not at all) or less progressive (more flattening of rates). With a ballooning federal debt, it is not hard to imagine that tax rates for everyone could be higher in the future. But it is also possible that tax revenue is raised through different sources other than income tax.
Hedge your bets
Although it is impossible to optimize the allocation of Roth assets vs. traditional tax-deferred assets without knowing all the variables including future tax rates, for most savers it is a good idea to aim to reach retirement with some Roth assets, some tax-deferred assets, and also some taxable savings.
Consider the pitfalls of concentrating all your retirement savings in either-or, as opposed to both. The saver who only utilized traditional IRAs and other tax-deferred investment plans could easily find themselves in a distribution phase where the required minimum distributions (after age 70.5) are so high that they remain in the highest possible tax bracket, with no way to control their reportable income, especially when combined with Social Security and other retirement income sources. Even some modest amount of Roth contributions earlier in their career could create at the very least a better gift to pass to heirs, but might also conceivably give them an opportunity to fine-tune their level of reportable income to take advantage of tax incentives.
On the other hand, the saver who only utilized Roth IRAs and other tax-free investment plans will likely pay no income tax at all in retirement, and even a modest amount of tax deduction during their working years would have cost them nothing, as small IRA withdrawals could be made in retirement without rising above exemptions and deductions.
Final thoughts about asset location
At Bluesky Wealth Advisors, we think IRAs and Roth IRAs are great places to put investments that pay out a lot of income which would otherwise be taxable, like real estate investment trusts (REITs) and bonds. Furthermore, all tax-deferred assets at all times have some (unknown) portion earmarked to repay the government, so all returns and all risks are shared with another party. More stable assets with lower expected returns are appropriate in tax-deferred vehicles, whereas assets with the highest expected returns long-term are better candidates for a Roth (where they are shared with no one), or for a taxable account (where capital gains receive favorable tax treatment, and losses are deductible).
Click the button below to answer a brief questionnaire so we can learn a little more about your needs. Once completed, you will be prompted to schedule an Introductory Call with Jen White, Director of Client Engagement.
For all other inquiries, please feel free to call or email us at hello@blueskywa.com.
2131 S. Glenburnie Road, Suite 8
New Bern, NC 28562
Map and Driving Direction
1811 Santa Rita Road, Suite 211
1735 N. 1st. Street, Suite 295
Download our complimentary brochure
Copyright © 2017 BlueSky Wealth Advisors.
NAPFA-Registered, Fee-Only Financial Advisors in New Bern, NC, Pleasanton, CA and San Jose, CA.
Privacy Notice & ADV | Legal, privacy, copyright and trademark information
Educated decisions lead to the best decisions.
Subscribe to the BlueSky blog and receive valuable financial insights written by the professionals at BlueSky.


Cinmeon Bowers (5) of Auburn in action during the 1st round of the SEC basketball tournament in Nashville, Tennessee on March 11, 2015. Final score was Auburn 74 Mississippi State 68.
Bruce Pearl, Head Coach of Auburn in action during the 3rd round of the SEC basketball tournament in Nashville, Tennessee on March 13, 2015.
I.J. Ready (15) of Mississippi State in action during the 1st round of the SEC basketball tournament in Nashville, Tennessee on March 11, 2015.
Craig Sword (32) of Mississippi State in action during the 1st round of the SEC basketball tournament in Nashville, Tennessee on March 11, 2015.
Missouri Cheerleaders in action during the 1st round of the SEC basketball tournament in Nashville, Tennessee on March 11, 2015.
Missouri Head Coach Kim Anderson in action during the 1st round of the SEC basketball tournament in Nashville, Tennessee on March 11, 2015.
Namon Wright (12) of Missouri in action during the 1st round of the SEC basketball tournament in Nashville, Tennessee on March 11, 2015.
South Carolina band in action during the 1st round of the SEC basketball tournament in Nashville, Tennessee on March 11, 2015.
Frank Martin Head Coach of South Carolina in action during the 1st round of the SEC basketball tournament in Nashville, Tennessee on March 11, 2015.
Sindarius Thornwell (0) of South Carolina in action during the 1st round of the SEC basketball tournament in Nashville, Tennessee on March 11, 2015.


text:
Q: Separable and finitely generated projective but not Frobenius? Let R be a commutative ring, and $A$ an $R$-algebra (possibly non-commutative). Then $A$ is separable if it is finitely generated (f.g.) projective as an $(A \otimes_R A^{\mathrm{op}})$-algebra. Suppose further that $A$ is f. g. projective as an $R$-module. Does this imply that $A$ is a (symmetric) Frobenius algebra?
There are lots of equivalent definitions of a Frobenius algebra. One (assuming $A$ is a f.g. projective R-module) is that there exists an $R$-linear map $\mathrm{tr}: A\to R$, such that $b(x,y) := \mathrm{tr}(ab)$ is a non-degenerate.
I know that the answer is yes when $R$ is a field. What about other rings?
I am not an expert on algebras, but this question is related to understanding obstructions for extended TQFTs, and so I am very interested in knowing anything I can about it.

A: Theorem 4.2 of On separable algebras over a commutative ring says that the answer is always yes.

redpajama_set_name: RedPajamaStackExchange


text:
Aashish Chaudhary
Aashish Chaudhary's Biography
Name: Aashish Chaudhary
Zodiac: Taurus
Marital Status: Married to Samita Bhangraj. They have a son named Agasthya.
Trivia: Model and actor Aashish Chaudhary has acted in Hindi films of various genres. Starting from action to thriller to comedy to romance, he has done it all. He was also a part of two shows on television. Tragedy struck the actor when his sister and brother-in-law were killed in the 2008 Mumbai attacks.
Biography: The actor made his debut in 1997 with a television show named 'Humko Ishq Ne Maara'. After appearing in films like 'Chalo America' and 'Love at Times Square' and another television show named 'Hum Pardesi Ho Gaye', Aashish finally got noticed in his film 'Qayamat: City Under Threat' in 2003.
Aashish was then seen in 'Shaadi Ka Laddoo', a comedy film where he played second parallel lead to Sanjay Suri. His versatility was seen when he starred in a bold film like 'Girlfriend' which dealt with the issue of lesbianism. Fans got to see him in random films like 'Fight Club- Members Only', 'Teesri Aankh: The Hidden Camera' and 'Speed', none of which were successful at the box office.
The handsome actor finally tasted success with Indra Kumar directed comedy film 'Dhamaal', in which he starred alongside Arshad Warsi, Javed Jaffrey, Ritesh Deshmukh and Sanjay Dutt. The film was a surprise success at the box office and managed to bring in good revenue. It did bring in more offers for Aashish but the films which he did were not well- received at the box office. 'Rama Rama Kya Hai Dramaaa', 'EMI', 'Paying Guests', 'Three- Love, Lies and Betrayal', 'Season's Greetings' and 'Daddy Cool'.
2008 proved to be a bad year for him on the personal front. He lost his sister and brother-in-law in the November 2008 bomb blast in the Oberoi Hotel, Mumbai.
In 2011, he was seen in 'Double Dhamaal', the sequel of his 2007 hit Dhamaal. The film, however, failed to match up to its predecessor's level and was not half as entertaining. He will next be seen in the third film of the Dhamaal series. The film, named 'Total Dhamaal', will release in 2013 and will have a huge star cast.
Mira Rajput Reveals How Shahid Kapoor Made Her Pregnancy A 'Beautiful...
Akshay Kumar's Sooryavanshi Releasing On Holi, Announcement To Be Made Soon?
Brad Pitt In 1988 Looked Like A Spitting Image Of Shiloh,...


text:
New York|A Door to a Home Brimming With Love, and Open to All
The Neediest Cases Fund
A Door to a Home Brimming With Love, and Open to All
Sandra Parker with the five grandchildren who live with her, at her home in the Bronx.CreditCreditMichelle V. Agins/The New York Times
By John Otis
Surrounded by her five grandchildren who live with her, Sandra Parker asserted her unconditional love for each one. The oldest, Akiea Brewer, 19, who identifies as transgender, interrupted to express her doubt.
Ms. Parker's reply was swift and unequivocal: "I was never mad at you for being who you are. What did I tell you? Be who you are. Don't follow and try to be who someone else is."
Ms. Parker has never been one to mince words. She believes her directness does not dilute her warmth and affection. "Sometimes I can be really harsh," Ms. Parker acknowledged. "Sometimes you just have to say what you have to say. You can't pussyfoot with kids."
An unwavering dedication to family is what led Ms. Parker, 58, to take custody of many of her grandchildren over the years, stepping up when her children could not. For example, the mother of four of Ms. Parker's grandchildren who live with her lives in Florida and is dealing with health issues.
Ms. Parker credits her ceaseless devotion to the aunt who took her in at age 48, whom Ms. Parker calls her adoptive mother.
"She was just a gem. She was precious," Ms. Parker said. "I could never ask for a better mother. She loved me as if she birthed me into the world."
Ms. Parker said she had showered her own four children with that same unrelenting affection. Her approach to motherhood was as tough as it was tender. If one of her sons was hanging out with the wrong crowd, she did not hesitate to yank him off street corners. One son's friends were so worried that his mother was bringing attention to the group that they told him he could no longer associate with them.
"I live what I live in front of the children," Ms. Parker said. "They don't see me robbing, stealing, doing all those things. They don't see those things."
Her parental role extended to several of her children's friends, whom she welcomed into her home. Even now, her door is open to all. Friends regularly drop by her Bronx apartment to chat and laugh. Children in the neighborhood greet her on the sidewalk.
Ms. Parker, a widow, moved to New York from Florida in 2012. She came for love — to be with a man she had met on vacation. They are now engaged.
Because of the values she has instilled in them, Ms. Parker said, she does not worry for her grandchildren. "I was always told children emulate what they see," she said. "If you raise them good and do the best that you can do, and they see this, then somewhere in their heart, it's going to be stored."
She has long demonstrated her willingness to care for them. That respect is returned to her, and she demands that her grandchildren offer it to their absent parents, too.
"A lot of grandparents allow their grandchildren to call them 'Mother,' but that's not who I am," she said. "I'm their grandmother. I never allowed them to call me Mother. They have a mother. I'm just taking her place right now, but she's still your mother."
Health problems, including diabetes and heart disease, prevent Ms. Parker from working. Each month, she receives $630 from Social Security, $123 in survivor benefits and $376 in federal benefits for one of her grandchildren. She also receives $771 in food stamps and $310 in cash from public assistance. Ms. Parker is responsible for paying $246 toward her $1,541 monthly rent; the bulk of it is paid by a Family Eviction Prevention Subsidy provided by New York State.
Through the Visiting Nurse Service, Ms. Parker contacted the Family Center, an affiliate of FPWA, formerly the Federation of Protestant Welfare Agencies. FPWA is one of the eight organizations supported by The New York Times Neediest Cases Fund.
A Family Center caseworker noticed that much of the family's furniture was badly worn. The caseworker applied for a grant from FPWA, and Ms. Parker was approved for a grant for $1,000 in August to buy new furniture.
"It feels more like home because I didn't have anywhere for people to sit," she said.
That home is still very close quarters, which leads to the occasional fight. But her family makes the most of it, Ms. Parker said, and has learned to navigate the different personalities in a limited space.
Ms. Parker wishes she had moments of calm and solitude. "There's never a moment," she said. "Not even when I take a shower, because somebody's knocking on the door. Oh, my Lord."
Ms. Parker said her home was brimming with love, giving her reason to anticipate an even brighter future. "I hope the children do well, finish school and my fiancé and I get married and sail away somewhere," she said.
Donations to the Neediest Cases may also be made with a check or over the phone.
A version of this article appears in print on , Section A, Page 21 of the New York edition with the headline: Raising Grandchildren in a Home That's Brimming With Love, and Open to All. Order Reprints | Today's Paper | Subscribe


text:
Enrollment Management and Marketing > Enrollment Matters > Bold Advertising Spotlights Data Science at DePaul
Bold Advertising Spotlights Data Science at DePaul
Brady Johnson / 12/5/2014 / Posted in: Graduate Admission; Institutional Research; Marketing / Twitter / Facebook /
An example of advertising on a CTA bus.
Career opportunities in data science (or big data, as it's more commonly called) are expanding seemingly as fast as the data sets on which they are based. An attention-grabbing new advertising campaign has staked DePaul's claim as the premier Chicago area education provider in the field. Created and executed in a tight timeframe, this campaign integrated the efforts of four departments within EM&M—University Marketing Communications, Strategic Marketing and Branding, Graduate Admission, and Institutional Research and Market Analytics.
Emerging as a leader in the Chicago market
DePaul's marketing push comes as the need for big data professionals increases across nearly every industry while the supply of qualified candidates lags behind. The U.S. Bureau of Labor Statistics is predicting a 24 percent increase in demand for professionals with data analytic skills over the next eight years while the McKinsey Global Institute estimates the U.S. already faces a shortage of over 1.5 million analysts and managers with the necessary abilities.
Despite the rapidly expanding market, no education or training provider has assumed a dominant role in Chicago. This presents great possibilities for DePaul.
"DePaul is in a strong position because it has the greatest depth and breadth of degree programs and certificates in data science among universities in the region," says Verna Donovan, associate vice president for Strategic Marketing and Branding. "We can do the most to serve the educational needs for those interested in the field, whether their talents are in management, technology or analysis."
Designing a comprehensive, multi-channel campaign
Developing the strategy behind the campaign was a cross-divisional effort, beginning with Graduate Admission, who convened faculty to develop a comprehensive map of DePaul's offerings and strengths across multiple colleges. Strategic Marketing and Branding, with support from Institutional Research and Market Analytics, developed an external assessment of the competitive landscape to identify opportunities on which DePaul could capitalize. Building off this intelligence, Marketing Communications developed a unique plan to create awareness about DePaul's leadership in data science and generate interest among prospective students.
"This campaign represents a different approach to advertising at DePaul," explained Gwyn Friend, associate vice president for Marketing Communications. "We promoted a cluster of programs that span several different colleges and degree types, providing a simultaneous lift to them all."
More than 65 creative executions communicated the range of DePaul's data science offerings. Ads were placed in high-impact traditional and online/digital media as the centerpiece of a multi-channel strategy that included outdoor, digital, social, mobile and online radio advertising. All ads funneled prospects to the landing page go.depaul.edu/datascience, which includes an overview of DePaul's offerings and an inquiry form. The advertising effort successfully raised awareness in the Chicago market, generating over 350 million impressions. (Click here to view a few of the other ads as displayed outdoors in the Chicago area.)
Funding for the campaign was provided by Patricia O'Donogue, interim provost at the time and current interim president, in an effort to leverage the capacity for enrollment growth and strategic distinctiveness this set of academic programs offers.
As the six-week campaign recently ended at the beginning of November, a comprehensive analysis is underway. Initial indicators show a shifting preference toward advertising on mobile and social platforms among the target audience, consistent with results from other campaigns.
Leveraging collaborations across the division
This campaign also illustrated the impact of cross-divisional collaborations in generating innovative ways to develop and market new program offerings.
"The extraordinary effort required to so quickly develop, design and deliver such a comprehensive campaign was only possible because of the highly integrated approach we've created at DePaul among the marketing, admission and research functions," remarked David Kalsbeek, senior vice president for Enrollment Management and Marketing.
View more images from the campaign below.
To learn more about the marketing of data science at DePaul, contact Verna Donovan or Gwyn Friend.


text:
vancouverites
"OUTtv" Tagged Posts
Evolution of LGBTQ2+ Television and Broadcasting in Vancouver, BC
by Inside Vancouver	in Town on November 6, 2017
Michael P Keeping with Conni Smudge
An interview with Michael P Keeping (MPK)
By Angus Praught
Michael P Keeping is an award-winning director, producer, cameraman, Foley artist, reporter and teacher in the Canadian television and film industries. He now has over forty years in the industry, but he started his career volunteering for work in film and television productions while still a teenager in Toronto.
Things to Do in Vancouver This Week...
Filming in Vancouver: Katherine Hei...
January's Vancouver Hike of the Mon...
ENTER TO WIN Four Tickets to Nation...
5 DIY events in Vancouver to embrac...
Purhar
Hardcastle
Eyton
Silent masterpiece The Passion of Joan of Arc...
Chilling Adventures of Sabrina Cast Celebrates...
Filming in Vancouver: Katherine Heigl, Sarah C...
5 DIY events in Vancouver to embrace your craf...
Explore These 8 Wellness Trends at the 2020 We...
WIN TICKETS to Les Ballets Trockadero de Monte...
Inside Vancouver is a multi-author blog, written by Vancouverites about Vancouver. Our goal is to give an insider's view of Vancouver, to provide information, stories and opinions from the locals' perspective about this great city.
Read more about Tourism Vancouver
© 2020 Tourism Vancouver. The material on this website may not be cached, distributed, reproduced, transmitted, or otherwise used without the prior permission of Tourism Vancouver.


text:
SportsBasketballCollegeTop 3
NKU's roller-coaster season on the downside in Florida tourney
By Dan Weber
Dan Weber
Dan Weber is LINK nky's sports editor-at-large. Contact him at [email protected]
Not a movie but a replay, Beechwood finds a way
Thomas More's pair of No. 1's stay perfect with doubleheader win over Tennessee Southern
State championship scouting report: Beechwood vs. Mayfield
Mayfield, Beechwood line up with – and against – one another again
Marques Warrick scored his 1,000th career point for NKU in the Norse's loss to Florida Gulf Coast. Photo provided | NKU Athletics
The feast or famine season continued for Northern Kentucky University's men's basketball team Monday at the Gulf Coast Showcase in Ft. Myers. Host Florida Gulf Coast, a former conference member with NKU in the Atlantic Sun Conference, clobbered the Norse, 82-61.
The big loss in the tourney opener, just five days after NKU's historic 64-51 win over the University of Cincinnati, drops the Norse to 2-2 after their opening 79-57 homecourt loss to Kent State.
NKU will face Texas-Arlington Tuesday afternoon in a consolation game in the Showcase.
The game didn't start all that badly for the Norse, who took an 18-12 early lead, but it was pretty much all FGCU from when NKU led 41-37 with 16:20 left as FGCU ended this one on a 45-21 run.
Not that there weren't some good things for NKU in this one. Marques Warrick dropped in 16 points to lead NKU and also joined the 1,000-Point Club, the 31st NKU player to do so and the one who did it the fastest with his 16.4 points-per-game scoring average, the ninth-best in NKU history.
Trey Robinson came off the bench to post a double-double, the first in his NKU career, with 10 points and 12 rebounds in his 24 minutes of action. Sam Vinson added 14 points with three steals while point guard Xavier Rhodes scored 10 points with three steals and two assists.
The big difference in this one was FGCU's sharp-shooting from behind the three-point line (12 of 28, .429) and at the free throw line – a remarkable 22 of 23 (.957). Zach Anderson's 20 points led five double-digit FGCU scorers.
Related: Holy Cross avenges loss to Owen County, heads to All "A" semis
The consolation game Tuesday will tip off at Hertz Arena at 1:30 p.m. ET and will be available for viewing on FloHoops and listening on ESPN 1530.
Previous articleLINK nky Daily Headlines: Nov. 22, 2022
Next articleBengals' Sam Hubbard foundation donates turkey dinners to Bellevue School District


text:
City grandee boosts GKN in bid battle
Top three shareholder rejects Melrose's offer
Robert Lea, Deirdre Hipwell
March 20 2018, 12:01am, The Times
GKN has proposed to merge its Driveline division with the US automotive group Dana
One of the biggest institutional shareholders in GKN has come out against the £8 billion hostile takeover of the aircraft and car parts maker by Melrose, after another dramatic day of counterpunches between the rival parties.
Columbia Threadneedle, which has a 3.4 per cent stake in GKN and more than £350 billion of assets under management, said it would vote against the Melrose deal and support GKN management. The fund manager is the third largest investor in GKN and the biggest shareholder to declare its position.
GKN is one of Britain's biggest and oldest manufacturers, supplying industry giants including Boeing, Airbus and Ford. It employs about 60,000 people in 30 countries and made pre-tax profit of £572 million in 2017.
The company has been defending…


text:
'use strict';

goog.provide('tachyfont.FontInfo');

/**
 * The information for a font.
 *
 * @param {?string} name The font name.
 * @param {?string} weight The font weight.
 * @param {?string=} opt_familyPath The font family path.
 * @param {?string=} opt_version The font version.
 * @param {?string=} opt_fontKit The font kit.
 * @constructor
 */
tachyfont.FontInfo =
    function(name, weight, opt_familyPath, opt_version, opt_fontKit) {

  /** @private {string} */
  this.name_ = name || '';

  /** @private {string} */
  this.weight_ = weight || '';

  /** @private {string} */
  this.familyPath_ = opt_familyPath || '';

  /** @private {string} */
  this.version_ = opt_version || '';

  /** @private {string} */
  this.fontKit_ = opt_fontKit || '';

  /** @private {string} */
  this.familyName_ = '';

  /** @private {string} */
  this.dataUrl_ = '';

  /** @private {boolean} */
  this.priority_ = false;
};

/**
 * Get the name of the TachyFont.
 *
 * @return {string} The name of the TachyFont.
 */
tachyfont.FontInfo.prototype.getName = function() {
  return this.name_;
};

/**
 * Get the weight of the TachyFont.
 *
 * @return {string} The weight of the TachyFont.
 */
tachyfont.FontInfo.prototype.getWeight = function() {
  return this.weight_;
};

/**
 * Get the font directory of the TachyFont.
 *
 * @return {string|undefined} The font directory of the TachyFont.
 */
tachyfont.FontInfo.prototype.getFamilyPath = function() {
  return this.familyPath_;
};

/**
 * Get the version of the TachyFont.
 *
 * @return {string|undefined} The version of the TachyFont.
 */
tachyfont.FontInfo.prototype.getVersion = function() {
  return this.version_;
};

/**
 * Get the font kit of the TachyFont.
 *
 * @return {string|undefined} The font kit of the TachyFont server.
 */
tachyfont.FontInfo.prototype.getFontKit = function() {
  return this.fontKit_;
};

/**
 * Get the family name of the TachyFont.
 *
 * @return {string} The family name of the TachyFont.
 */
tachyfont.FontInfo.prototype.getFamilyName = function() {
  return this.familyName_;
};

/**
 * Set the family name of the TachyFont.
 *
 * @param {string} familyName The family name of the TachyFont.
 */
tachyfont.FontInfo.prototype.setFamilyName = function(familyName) {
  this.familyName_ = familyName;
};

/**
 * Get the URL to the TachyFont.
 *
 * @return {string} The URL to the TachyFont server.
 */
tachyfont.FontInfo.prototype.getDataUrl = function() {
  return this.dataUrl_;
};

/**
 * Set the URL to the TachyFont.
 *
 * @param {string} dataUrl The URL to the TachyFont server.
 */
tachyfont.FontInfo.prototype.setDataUrl = function(dataUrl) {
  this.dataUrl_ = dataUrl;
};

/**
 * Get the priority of this font.
 *
 * @return {boolean} Whether this is a priority font.
 */
tachyfont.FontInfo.prototype.getPriority = function() {
  return this.priority_;
};

/**
 * Set the priority of this font.
 *
 * @param {?boolean} priority True if is a priority font.
 */
tachyfont.FontInfo.prototype.setPriority = function(priority) {
  this.priority_ = priority ? true : false;
};

goog.scope(function() {
goog.exportSymbol('tachyfont.FontInfo', tachyfont.FontInfo);
goog.exportProperty(tachyfont.FontInfo.prototype, 'getName',
                    tachyfont.FontInfo.prototype.getName);
goog.exportProperty(tachyfont.FontInfo.prototype, 'getWeight',
                    tachyfont.FontInfo.prototype.getWeight);
goog.exportProperty(tachyfont.FontInfo.prototype, 'getFamilyPath',
                    tachyfont.FontInfo.prototype.getFamilyPath);
goog.exportProperty(tachyfont.FontInfo.prototype, 'getVersion',
                    tachyfont.FontInfo.prototype.getVersion);
goog.exportProperty(tachyfont.FontInfo.prototype, 'getFontKit',
                    tachyfont.FontInfo.prototype.getFontKit);
goog.exportProperty(tachyfont.FontInfo.prototype, 'getFamilyName',
                    tachyfont.FontInfo.prototype.getFamilyName);
goog.exportProperty(tachyfont.FontInfo.prototype, 'setFamilyName',
                    tachyfont.FontInfo.prototype.setFamilyName);
goog.exportProperty(tachyfont.FontInfo.prototype, 'getDataUrl',
                    tachyfont.FontInfo.prototype.getDataUrl);
goog.exportProperty(tachyfont.FontInfo.prototype, 'setDataUrl',
                    tachyfont.FontInfo.prototype.setDataUrl);
goog.exportProperty(tachyfont.FontInfo.prototype, 'getPriority',
                    tachyfont.FontInfo.prototype.getPriority);
goog.exportProperty(tachyfont.FontInfo.prototype, 'setPriority',
                    tachyfont.FontInfo.prototype.setPriority);
});  // goog.scope


text:
5 Reasons to Be Optimistic About the Future of Climate Change
Clean energy and activism? We're in!
This article was contributed in support of Rainforest Alliance.
The world is heating up—and getting wetter or drier, with more frequent and intense storms and more severe drought. Every day brings more news stories about the disruption and damage wreaked by climate change. And since the international Paris Agreement for climate action was signed a year ago, the levels of carbon dioxide in the atmosphere have continued to soar, making 2016 the hottest year on record. We're already feeling the effects of climate change, and they aren't going to go away.
And now the United States, a leading signatory of the historic Paris Agreement, has elected a climate change-denying president.
Despite this grim news, we need to recognize the progress we've made and move forward with optimism. Companies, governments, NGOs, people, and communities around the world are taking significant actions to reduce greenhouse gas emissions. While the danger of weather-related catastrophes impacts and faltering political will can't be underestimated, there are encouraging signs of cooperation, collaboration, and a growing understanding of the urgency to address climate change. People are getting it. Implementation is the driving force behind this year's UN Climate Change conference (COP22) in Marrakech, Morocco—in other words, taking the actions to meet the ambitious goals of the Paris Agreement.
Let us move forward with renewed vigor, together.
Here are five reasons we can go into COP22 with optimism:
1. The Paris Agreement came into force faster than any multilateral agreement, ever
By comparison, The Kyoto Protocol took eight years to be ratified, and the United States never signed it. The Paris Agreement has seen much quicker progress. 55 countries, representing at least 55 percent of global emissions, needed to ratify the Paris climate deal for it to take effect. That's been achieved, and more—as of November 2016, 111 parties have ratified the agreement. Five signatory countries alone — China, the United States, India, Brazil, and Indonesia — represent about 46 percent of global emissions. That's significant. COP22 in Marrakech, Morocco, marks the starting point for countries to fulfill their national determined contributions (NDCs) to reduce emissions.
Read More: 'Before the Flood': 9 Things We Learned From Leonardo DiCaprio's Climate Change Film
Even if all nations meet their current pledges, it still won't be enough to get us to limit temperature increases to 1.5C, where we need to be. But all world leaders have moved to get on the same page, and that's movement in the right direction. Global cooperation at this speed is rare indeed.
2. Companies are beginning to take action against climate change
Picking up from where the governments and diplomats have left off, companies and other non-state actors are making climate change and sustainability core to their businesses. Over 400 consumer goods companies have set targets to reduce or stop outright the sourcing or producing of commodities that drive deforestation. Unilever and McDonald's, for example, have been vocal about their sustainability commitments and the need for climate action. They've pledged to try and eliminate deforestation from specific supply chains and source products from palm oil to beef to coffee more responsibly. Fast-fashion giant H&M has pledged to move to a circular supply chain—that is, only use material from recycled, renewable, or sustainable sources. Paper and personal care companies, like Domtar and Kimberly-Clarke, have holistic forest and environmental conservation programs already in place. Google has become the biggest corporate purchaser of renewable energy, with an aim to transform the tech industry. Sustainability is becoming a mainstream concern, and public pressure is shifting attitudes in boardrooms and with corporate policy makers.
3. The world is moving to clean energy
Photo Courtesy of Rainforest Alliance
Clean energy is gaining ground, showing potential to compete with fossil fuel use. Last year, 500,000 solar panels were installed every day around the world. The cost of solar and wind power is dropping incredibly fast, often without subsidies, making clean energy accessible and cheap. Meanwhile, coal use continues to decrease across the world, notably in China, the world's largest carbon emitter, against a backdrop of global economic growth. The world now has a larger capacity to generate energy from renewable sources than from fossil fuels. In the United States alone, the solar industry added 35,000 jobs in 2015 (70% more than the coal industry), and is expected to add 44,000 in 2016.
Clean energy is not yet the norm, but it's a disruptive technology going mainstream. With financing of technology transfer to poorer nations, some may leapfrog the fossil fuels-dependent stage of their economic development. The growth of clean energy is critically important—if we can't wean ourselves of hydrocarbons as the engine of global economic growth, all other strategies to reduce carbon emissions will prove insufficient.
4. Farmers are doing their part adopting climate-smart agricultural practices
There are 500 million smallholder farms globally, supporting about 2 billion people, providing the majority of food for Asia and sub-Saharan Africa. The movement to support and invest in these farmers to improve their livelihoods and achieve greater food security is growing. For example, 1.2 million farmers have adopted climate-smart agricultural practices that reduce their greenhouse gas emissions, pesticide use, and increase their yields per acre. These farmers, who are Rainforest Alliance Certified™ and follow the strict standards set by the Sustainable Agriculture Network, achieve three important things through their climate-smart farming.
Read More: 170 Countries Agree to Ban HFCs in Landmark Climate Change Agreement
First, better practices lead to more food produced on the same amount of land. This can reduce the need to convert natural forests to cropland, avoiding carbon emissions and conserving wildlife habitat.
Second, this greater productivity helps farmers generate more income establishing better livelihoods.
Third, the farmers' technical know-how improves, so farms are better poised to respond to and withstand the hazards of drought, increased temperatures, and erratic rainfall.
This is climate resilience— while difficult to quantify, it is a significant outcome of widespread investment into climate-smart agricultural practices.
5. Indigenous people are reclaiming their land rights and protecting forests
While agricultural expansion is the biggest driver of deforestation, forests are one of the best defenses against climate change. In the tropical forests from Asia Pacific to the Congo Basin to the Amazon, indigenous peoples and local communities are gaining rights to the forestland they call home, and developing sustainable forest economies. The people who live in the forest have the strongest incentive to keep it standing, and where their tenure is clearly established, use the forest to contribute to good and meaningful livelihoods without destroying it. Where local communities and indigenous people have legal or official rights have some of the lowest deforestation rates in the tropics. All told, they sequester 37.7 billion tons of carbon. That's 29 times the annual CO2 emissions of all the passenger vehicles on the planet.
Recent studies in Latin America have shown that the cost of securing land tenure for indigenous peoples is only about 1% of the total value of benefits obtained by protecting the forest. Today, nearly one-third of tropical forests are under some form of local community control, and that share is growing. Enshrining tenure has a twofold effect: it protects forests, thus mitigating climate change, and respects human rights.
The changes that must be wrought require high-level policy changes, advances in technology and infrastructure, and government action—but even small actions can help. As the world moves into the implementation phase that COP22 represents, we can do it feeling inspired and optimistic. But it's no time for complacency either. It's absolutely necessary to keep a high sense of urgency applied to our leaders, businesses, communities, and organizations to keep throwing their considerable weight behind this common goal.
Topicsclimate changeenvironmentrainforest