// Copyright 2013 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.

#ifndef SERVICES_NETWORK_PUBLIC_MOJOM_URL_LOADER_MOJOM_BLINK_H_
#define SERVICES_NETWORK_PUBLIC_MOJOM_URL_LOADER_MOJOM_BLINK_H_

#include <stdint.h>

#include <limits>
#include <type_traits>
#include <utility>

#include "base/callback.h"
#include "base/macros.h"
#include "base/optional.h"

#include "mojo/public/cpp/bindings/mojo_buildflags.h"
#if BUILDFLAG(MOJO_TRACE_ENABLED)
#include "base/trace_event/trace_event.h"
#endif
#include "mojo/public/cpp/bindings/clone_traits.h"
#include "mojo/public/cpp/bindings/equals_traits.h"
#include "mojo/public/cpp/bindings/lib/serialization.h"
#include "mojo/public/cpp/bindings/struct_ptr.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "mojo/public/cpp/bindings/union_traits.h"
#include "services/network/public/mojom/url_loader.mojom-shared.h"
#include "services/network/public/mojom/url_loader.mojom-blink-forward.h"
#include "mojo/public/mojom/base/big_buffer.mojom-blink.h"
#include "mojo/public/mojom/base/file.mojom-blink.h"
#include "mojo/public/mojom/base/file_path.mojom-blink.h"
#include "mojo/public/mojom/base/time.mojom-blink.h"
#include "mojo/public/mojom/base/unguessable_token.mojom-blink.h"
#include "services/network/public/mojom/cors.mojom-blink.h"
#include "services/network/public/mojom/chunked_data_pipe_getter.mojom-blink.h"
#include "services/network/public/mojom/data_pipe_getter.mojom-blink.h"
#include "services/network/public/mojom/fetch_api.mojom-blink.h"
#include "services/network/public/mojom/http_request_headers.mojom-blink.h"
#include "services/network/public/mojom/network_param.mojom-blink.h"
#include "url/mojom/origin.mojom-blink.h"
#include "url/mojom/url.mojom-blink.h"

#include "mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h"
#include "mojo/public/cpp/bindings/lib/wtf_hash_util.h"
#include "third_party/blink/renderer/platform/wtf/hash_functions.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"

#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
#include "mojo/public/cpp/bindings/associated_interface_request.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"


#include "mojo/public/cpp/bindings/lib/native_enum_serialization.h"
#include "mojo/public/cpp/bindings/lib/native_struct_serialization.h"
#include "third_party/blink/renderer/platform/network/encoded_form_data.h"
#include "third_party/blink/public/platform/web_common.h"

#ifdef KYTHE_IS_RUNNING
#pragma kythe_inline_metadata "Metadata comment"
#endif


namespace WTF {
struct network_mojom_internal_RequestPriority_DataHashFn {
  static unsigned GetHash(const ::network::mojom::RequestPriority& value) {
    using utype = std::underlying_type<::network::mojom::RequestPriority>::type;
    return DefaultHash<utype>::Hash().GetHash(static_cast<utype>(value));
  }
  static bool Equal(const ::network::mojom::RequestPriority& left, const ::network::mojom::RequestPriority& right) {
    return left == right;
  }
  static const bool safe_to_compare_to_empty_or_deleted = true;
};

template <>
struct HashTraits<::network::mojom::RequestPriority>
    : public GenericHashTraits<::network::mojom::RequestPriority> {
  static_assert(true,
                "-1000000 is a reserved enum value");
  static_assert(true,
                "-1000001 is a reserved enum value");
  static const bool hasIsEmptyValueFunction = true;
  static bool IsEmptyValue(const ::network::mojom::RequestPriority& value) {
    return value == static_cast<::network::mojom::RequestPriority>(-1000000);
  }
  static void ConstructDeletedValue(::network::mojom::RequestPriority& slot, bool) {
    slot = static_cast<::network::mojom::RequestPriority>(-1000001);
  }
  static bool IsDeletedValue(const ::network::mojom::RequestPriority& value) {
    return value == static_cast<::network::mojom::RequestPriority>(-1000001);
  }
};
}  // namespace WTF


namespace WTF {
struct network_mojom_internal_URLRequestReferrerPolicy_DataHashFn {
  static unsigned GetHash(const ::network::mojom::URLRequestReferrerPolicy& value) {
    using utype = std::underlying_type<::network::mojom::URLRequestReferrerPolicy>::type;
    return DefaultHash<utype>::Hash().GetHash(static_cast<utype>(value));
  }
  static bool Equal(const ::network::mojom::URLRequestReferrerPolicy& left, const ::network::mojom::URLRequestReferrerPolicy& right) {
    return left == right;
  }
  static const bool safe_to_compare_to_empty_or_deleted = true;
};

template <>
struct HashTraits<::network::mojom::URLRequestReferrerPolicy>
    : public GenericHashTraits<::network::mojom::URLRequestReferrerPolicy> {
  static_assert(true,
                "-1000000 is a reserved enum value");
  static_assert(true,
                "-1000001 is a reserved enum value");
  static const bool hasIsEmptyValueFunction = true;
  static bool IsEmptyValue(const ::network::mojom::URLRequestReferrerPolicy& value) {
    return value == static_cast<::network::mojom::URLRequestReferrerPolicy>(-1000000);
  }
  static void ConstructDeletedValue(::network::mojom::URLRequestReferrerPolicy& slot, bool) {
    slot = static_cast<::network::mojom::URLRequestReferrerPolicy>(-1000001);
  }
  static bool IsDeletedValue(const ::network::mojom::URLRequestReferrerPolicy& value) {
    return value == static_cast<::network::mojom::URLRequestReferrerPolicy>(-1000001);
  }
};
}  // namespace WTF


namespace WTF {
struct network_mojom_internal_DataElementType_DataHashFn {
  static unsigned GetHash(const ::network::mojom::DataElementType& value) {
    using utype = std::underlying_type<::network::mojom::DataElementType>::type;
    return DefaultHash<utype>::Hash().GetHash(static_cast<utype>(value));
  }
  static bool Equal(const ::network::mojom::DataElementType& left, const ::network::mojom::DataElementType& right) {
    return left == right;
  }
  static const bool safe_to_compare_to_empty_or_deleted = true;
};

template <>
struct HashTraits<::network::mojom::DataElementType>
    : public GenericHashTraits<::network::mojom::DataElementType> {
  static_assert(true,
                "-1000000 is a reserved enum value");
  static_assert(true,
                "-1000001 is a reserved enum value");
  static const bool hasIsEmptyValueFunction = true;
  static bool IsEmptyValue(const ::network::mojom::DataElementType& value) {
    return value == static_cast<::network::mojom::DataElementType>(-1000000);
  }
  static void ConstructDeletedValue(::network::mojom::DataElementType& slot, bool) {
    slot = static_cast<::network::mojom::DataElementType>(-1000001);
  }
  static bool IsDeletedValue(const ::network::mojom::DataElementType& value) {
    return value == static_cast<::network::mojom::DataElementType>(-1000001);
  }
};
}  // namespace WTF


namespace network {
namespace mojom {
namespace blink {

class URLLoaderProxy;

template <typename ImplRefTraits>
class URLLoaderStub;

class URLLoaderRequestValidator;


// @generated_from: network.mojom.URLLoader
class BLINK_PLATFORM_EXPORT URLLoader
    : public URLLoaderInterfaceBase {
 public:
  static const char Name_[];
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasSyncMethods_ = false;

  using Base_ = URLLoaderInterfaceBase;
  using Proxy_ = URLLoaderProxy;

  template <typename ImplRefTraits>
  using Stub_ = URLLoaderStub<ImplRefTraits>;

  using RequestValidator_ = URLLoaderRequestValidator;
  using ResponseValidator_ = mojo::PassThroughFilter;
  enum MethodMinVersions : uint32_t {
    kFollowRedirectMinVersion = 0,
    kProceedWithResponseMinVersion = 0,
    kSetPriorityMinVersion = 0,
    kPauseReadingBodyFromNetMinVersion = 0,
    kResumeReadingBodyFromNetMinVersion = 0,
  };
  
// @generated_from: network.mojom.URLLoader.kClientDisconnectReason
  static constexpr uint32_t kClientDisconnectReason = 1U;
  virtual ~URLLoader() {}

  
// @generated_from: network.mojom.URLLoader.FollowRedirect
  virtual void FollowRedirect(const WTF::Vector<WTF::String>& removed_headers, const ::blink::HTTPHeaderMap& modified_headers, const base::Optional<::blink::KURL>& new_url) = 0;

  
// @generated_from: network.mojom.URLLoader.ProceedWithResponse
  virtual void ProceedWithResponse() = 0;

  
// @generated_from: network.mojom.URLLoader.SetPriority
  virtual void SetPriority(RequestPriority priority, int32_t intra_priority_value) = 0;

  
// @generated_from: network.mojom.URLLoader.PauseReadingBodyFromNet
  virtual void PauseReadingBodyFromNet() = 0;

  
// @generated_from: network.mojom.URLLoader.ResumeReadingBodyFromNet
  virtual void ResumeReadingBodyFromNet() = 0;
};

class URLLoaderClientProxy;

template <typename ImplRefTraits>
class URLLoaderClientStub;

class URLLoaderClientRequestValidator;
class URLLoaderClientResponseValidator;


// @generated_from: network.mojom.URLLoaderClient
class BLINK_PLATFORM_EXPORT URLLoaderClient
    : public URLLoaderClientInterfaceBase {
 public:
  static const char Name_[];
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasSyncMethods_ = false;

  using Base_ = URLLoaderClientInterfaceBase;
  using Proxy_ = URLLoaderClientProxy;

  template <typename ImplRefTraits>
  using Stub_ = URLLoaderClientStub<ImplRefTraits>;

  using RequestValidator_ = URLLoaderClientRequestValidator;
  using ResponseValidator_ = URLLoaderClientResponseValidator;
  enum MethodMinVersions : uint32_t {
    kOnReceiveResponseMinVersion = 0,
    kOnReceiveRedirectMinVersion = 0,
    kOnUploadProgressMinVersion = 0,
    kOnReceiveCachedMetadataMinVersion = 0,
    kOnTransferSizeUpdatedMinVersion = 0,
    kOnStartLoadingResponseBodyMinVersion = 0,
    kOnCompleteMinVersion = 0,
  };
  virtual ~URLLoaderClient() {}

  
// @generated_from: network.mojom.URLLoaderClient.OnReceiveResponse
  virtual void OnReceiveResponse(URLResponseHeadPtr head) = 0;

  
// @generated_from: network.mojom.URLLoaderClient.OnReceiveRedirect
  virtual void OnReceiveRedirect(URLRequestRedirectInfoPtr redirect_info, URLResponseHeadPtr head) = 0;


  using OnUploadProgressCallback = base::OnceCallback<void()>;
  
// @generated_from: network.mojom.URLLoaderClient.OnUploadProgress
  virtual void OnUploadProgress(int64_t current_position, int64_t total_size, OnUploadProgressCallback callback) = 0;

  
// @generated_from: network.mojom.URLLoaderClient.OnReceiveCachedMetadata
  virtual void OnReceiveCachedMetadata(mojo_base::BigBuffer data) = 0;

  
// @generated_from: network.mojom.URLLoaderClient.OnTransferSizeUpdated
  virtual void OnTransferSizeUpdated(int32_t transfer_size_diff) = 0;

  
// @generated_from: network.mojom.URLLoaderClient.OnStartLoadingResponseBody
  virtual void OnStartLoadingResponseBody(mojo::ScopedDataPipeConsumerHandle body) = 0;

  
// @generated_from: network.mojom.URLLoaderClient.OnComplete
  virtual void OnComplete(URLLoaderCompletionStatusPtr status) = 0;
};

class BLINK_PLATFORM_EXPORT URLLoaderProxy
    : public URLLoader {
 public:
  using InterfaceType = URLLoader;

  explicit URLLoaderProxy(mojo::MessageReceiverWithResponder* receiver);
  void FollowRedirect(const WTF::Vector<WTF::String>& removed_headers, const ::blink::HTTPHeaderMap& modified_headers, const base::Optional<::blink::KURL>& new_url) final;
  void ProceedWithResponse() final;
  void SetPriority(RequestPriority priority, int32_t intra_priority_value) final;
  void PauseReadingBodyFromNet() final;
  void ResumeReadingBodyFromNet() final;

 private:
  mojo::MessageReceiverWithResponder* receiver_;
};

class BLINK_PLATFORM_EXPORT URLLoaderClientProxy
    : public URLLoaderClient {
 public:
  using InterfaceType = URLLoaderClient;

  explicit URLLoaderClientProxy(mojo::MessageReceiverWithResponder* receiver);
  void OnReceiveResponse(URLResponseHeadPtr head) final;
  void OnReceiveRedirect(URLRequestRedirectInfoPtr redirect_info, URLResponseHeadPtr head) final;
  void OnUploadProgress(int64_t current_position, int64_t total_size, OnUploadProgressCallback callback) final;
  void OnReceiveCachedMetadata(mojo_base::BigBuffer data) final;
  void OnTransferSizeUpdated(int32_t transfer_size_diff) final;
  void OnStartLoadingResponseBody(mojo::ScopedDataPipeConsumerHandle body) final;
  void OnComplete(URLLoaderCompletionStatusPtr status) final;

 private:
  mojo::MessageReceiverWithResponder* receiver_;
};
class BLINK_PLATFORM_EXPORT URLLoaderStubDispatch {
 public:
  static bool Accept(URLLoader* impl, mojo::Message* message);
  static bool AcceptWithResponder(
      URLLoader* impl,
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
};

template <typename ImplRefTraits =
              mojo::RawPtrImplRefTraits<URLLoader>>
class URLLoaderStub
    : public mojo::MessageReceiverWithResponderStatus {
 public:
  using ImplPointerType = typename ImplRefTraits::PointerType;

  URLLoaderStub() {}
  ~URLLoaderStub() override {}

  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
  ImplPointerType& sink() { return sink_; }

  bool Accept(mojo::Message* message) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return URLLoaderStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

  bool AcceptWithResponder(
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return URLLoaderStubDispatch::AcceptWithResponder(
        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
  }

 private:
  ImplPointerType sink_;
};
class BLINK_PLATFORM_EXPORT URLLoaderClientStubDispatch {
 public:
  static bool Accept(URLLoaderClient* impl, mojo::Message* message);
  static bool AcceptWithResponder(
      URLLoaderClient* impl,
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
};

template <typename ImplRefTraits =
              mojo::RawPtrImplRefTraits<URLLoaderClient>>
class URLLoaderClientStub
    : public mojo::MessageReceiverWithResponderStatus {
 public:
  using ImplPointerType = typename ImplRefTraits::PointerType;

  URLLoaderClientStub() {}
  ~URLLoaderClientStub() override {}

  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
  ImplPointerType& sink() { return sink_; }

  bool Accept(mojo::Message* message) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return URLLoaderClientStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

  bool AcceptWithResponder(
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return URLLoaderClientStubDispatch::AcceptWithResponder(
        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
  }

 private:
  ImplPointerType sink_;
};
class BLINK_PLATFORM_EXPORT URLLoaderRequestValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};
class BLINK_PLATFORM_EXPORT URLLoaderClientRequestValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};
class BLINK_PLATFORM_EXPORT URLLoaderClientResponseValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};



















// @generated_from: network.mojom.URLRequest
class BLINK_PLATFORM_EXPORT URLRequest {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<URLRequest, T>::value>;
  using DataView = URLRequestDataView;
  using Data_ = internal::URLRequest_Data;

  template <typename... Args>
  static URLRequestPtr New(Args&&... args) {
    return URLRequestPtr(
        base::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static URLRequestPtr From(const U& u) {
    return mojo::TypeConverter<URLRequestPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, URLRequest>::Convert(*this);
  }


  URLRequest();

  URLRequest(
      const WTF::String& method,
      const ::blink::KURL& url,
      const ::blink::KURL& site_for_cookies,
      const scoped_refptr<const ::blink::SecurityOrigin>& top_frame_origin,
      bool attach_same_site_cookies,
      bool update_first_party_url_on_redirect,
      const scoped_refptr<const ::blink::SecurityOrigin>& request_initiator,
      const ::blink::KURL& referrer,
      URLRequestReferrerPolicy referrer_policy,
      bool is_prerendering,
      const ::blink::HTTPHeaderMap& headers,
      const ::blink::HTTPHeaderMap& cors_exempt_headers,
      int32_t load_flags,
      bool allow_credentials,
      int32_t plugin_child_id,
      int32_t resource_type,
      RequestPriority priority,
      const base::Optional<base::UnguessableToken>& appcache_host_id,
      bool should_reset_appcache,
      bool is_external_request,
      ::network::mojom::blink::CorsPreflightPolicy cors_preflight_policy,
      bool originated_from_service_worker,
      bool skip_service_worker,
      bool corb_detachable,
      bool corb_excluded,
      ::network::mojom::blink::RequestMode mode,
      ::network::mojom::blink::CredentialsMode credentials_mode,
      ::network::mojom::blink::RedirectMode redirect_mode,
      const WTF::String& fetch_integrity,
      int32_t fetch_request_context_type,
      URLRequestBodyPtr request_body,
      bool keepalive,
      bool has_user_gesture,
      bool enable_load_timing,
      bool enable_upload_progress,
      bool do_not_prompt_for_login,
      int32_t render_frame_id,
      bool is_main_frame,
      int32_t transition_type,
      bool allow_download,
      bool report_raw_headers,
      int32_t previews_state,
      bool initiated_in_secure_context,
      bool upgrade_if_insecure,
      bool is_revalidating,
      bool should_also_use_factory_bound_origin_for_cors,
      const base::Optional<base::UnguessableToken>& throttling_profile_id,
      const ::blink::HTTPHeaderMap& custom_proxy_pre_cache_headers,
      const ::blink::HTTPHeaderMap& custom_proxy_post_cache_headers,
      const base::Optional<base::UnguessableToken>& fetch_window_id,
      const WTF::String& devtools_request_id);

  ~URLRequest();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = URLRequestPtr>
  URLRequestPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, URLRequest::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename UserType>
  static WTF::Vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        URLRequest::DataView, WTF::Vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        URLRequest::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::URLRequest_UnserializedMessageContext<
            UserType, URLRequest::DataView>>(0, 0, std::move(input)));
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    return mojo::internal::DeserializeImpl<URLRequest::DataView>(
        data, data_num_bytes, std::vector<mojo::ScopedHandle>(), output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(const WTF::Vector<uint8_t>& input,
                          UserType* output) {
    return URLRequest::Deserialize(
        input.size() == 0 ? nullptr : &input.front(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::URLRequest_UnserializedMessageContext<
            UserType, URLRequest::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<URLRequest::DataView>(
        input.payload(), input.payload_num_bytes(),
        std::move(*input.mutable_handles()), output, Validate);
  }

  
// @generated_from: network.mojom.URLRequest.method
  WTF::String method;
  
// @generated_from: network.mojom.URLRequest.url
  ::blink::KURL url;
  
// @generated_from: network.mojom.URLRequest.site_for_cookies
  ::blink::KURL site_for_cookies;
  
// @generated_from: network.mojom.URLRequest.top_frame_origin
  scoped_refptr<const ::blink::SecurityOrigin> top_frame_origin;
  
// @generated_from: network.mojom.URLRequest.attach_same_site_cookies
  bool attach_same_site_cookies;
  
// @generated_from: network.mojom.URLRequest.update_first_party_url_on_redirect
  bool update_first_party_url_on_redirect;
  
// @generated_from: network.mojom.URLRequest.request_initiator
  scoped_refptr<const ::blink::SecurityOrigin> request_initiator;
  
// @generated_from: network.mojom.URLRequest.referrer
  ::blink::KURL referrer;
  
// @generated_from: network.mojom.URLRequest.referrer_policy
  URLRequestReferrerPolicy referrer_policy;
  
// @generated_from: network.mojom.URLRequest.is_prerendering
  bool is_prerendering;
  
// @generated_from: network.mojom.URLRequest.headers
  ::blink::HTTPHeaderMap headers;
  
// @generated_from: network.mojom.URLRequest.cors_exempt_headers
  ::blink::HTTPHeaderMap cors_exempt_headers;
  
// @generated_from: network.mojom.URLRequest.load_flags
  int32_t load_flags;
  
// @generated_from: network.mojom.URLRequest.allow_credentials
  bool allow_credentials;
  
// @generated_from: network.mojom.URLRequest.plugin_child_id
  int32_t plugin_child_id;
  
// @generated_from: network.mojom.URLRequest.resource_type
  int32_t resource_type;
  
// @generated_from: network.mojom.URLRequest.priority
  RequestPriority priority;
  
// @generated_from: network.mojom.URLRequest.appcache_host_id
  base::Optional<base::UnguessableToken> appcache_host_id;
  
// @generated_from: network.mojom.URLRequest.should_reset_appcache
  bool should_reset_appcache;
  
// @generated_from: network.mojom.URLRequest.is_external_request
  bool is_external_request;
  
// @generated_from: network.mojom.URLRequest.cors_preflight_policy
  ::network::mojom::blink::CorsPreflightPolicy cors_preflight_policy;
  
// @generated_from: network.mojom.URLRequest.originated_from_service_worker
  bool originated_from_service_worker;
  
// @generated_from: network.mojom.URLRequest.skip_service_worker
  bool skip_service_worker;
  
// @generated_from: network.mojom.URLRequest.corb_detachable
  bool corb_detachable;
  
// @generated_from: network.mojom.URLRequest.corb_excluded
  bool corb_excluded;
  
// @generated_from: network.mojom.URLRequest.mode
  ::network::mojom::blink::RequestMode mode;
  
// @generated_from: network.mojom.URLRequest.credentials_mode
  ::network::mojom::blink::CredentialsMode credentials_mode;
  
// @generated_from: network.mojom.URLRequest.redirect_mode
  ::network::mojom::blink::RedirectMode redirect_mode;
  
// @generated_from: network.mojom.URLRequest.fetch_integrity
  WTF::String fetch_integrity;
  
// @generated_from: network.mojom.URLRequest.fetch_request_context_type
  int32_t fetch_request_context_type;
  
// @generated_from: network.mojom.URLRequest.request_body
  URLRequestBodyPtr request_body;
  
// @generated_from: network.mojom.URLRequest.keepalive
  bool keepalive;
  
// @generated_from: network.mojom.URLRequest.has_user_gesture
  bool has_user_gesture;
  
// @generated_from: network.mojom.URLRequest.enable_load_timing
  bool enable_load_timing;
  
// @generated_from: network.mojom.URLRequest.enable_upload_progress
  bool enable_upload_progress;
  
// @generated_from: network.mojom.URLRequest.do_not_prompt_for_login
  bool do_not_prompt_for_login;
  
// @generated_from: network.mojom.URLRequest.render_frame_id
  int32_t render_frame_id;
  
// @generated_from: network.mojom.URLRequest.is_main_frame
  bool is_main_frame;
  
// @generated_from: network.mojom.URLRequest.transition_type
  int32_t transition_type;
  
// @generated_from: network.mojom.URLRequest.allow_download
  bool allow_download;
  
// @generated_from: network.mojom.URLRequest.report_raw_headers
  bool report_raw_headers;
  
// @generated_from: network.mojom.URLRequest.previews_state
  int32_t previews_state;
  
// @generated_from: network.mojom.URLRequest.initiated_in_secure_context
  bool initiated_in_secure_context;
  
// @generated_from: network.mojom.URLRequest.upgrade_if_insecure
  bool upgrade_if_insecure;
  
// @generated_from: network.mojom.URLRequest.is_revalidating
  bool is_revalidating;
  
// @generated_from: network.mojom.URLRequest.should_also_use_factory_bound_origin_for_cors
  bool should_also_use_factory_bound_origin_for_cors;
  
// @generated_from: network.mojom.URLRequest.throttling_profile_id
  base::Optional<base::UnguessableToken> throttling_profile_id;
  
// @generated_from: network.mojom.URLRequest.custom_proxy_pre_cache_headers
  ::blink::HTTPHeaderMap custom_proxy_pre_cache_headers;
  
// @generated_from: network.mojom.URLRequest.custom_proxy_post_cache_headers
  ::blink::HTTPHeaderMap custom_proxy_post_cache_headers;
  
// @generated_from: network.mojom.URLRequest.fetch_window_id
  base::Optional<base::UnguessableToken> fetch_window_id;
  
// @generated_from: network.mojom.URLRequest.devtools_request_id
  WTF::String devtools_request_id;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
  DISALLOW_COPY_AND_ASSIGN(URLRequest);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, URLRequest::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, URLRequest::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, URLRequest::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, URLRequest::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}





// @generated_from: network.mojom.URLRequestBody
class BLINK_PLATFORM_EXPORT URLRequestBody {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<URLRequestBody, T>::value>;
  using DataView = URLRequestBodyDataView;
  using Data_ = internal::URLRequestBody_Data;

  template <typename... Args>
  static URLRequestBodyPtr New(Args&&... args) {
    return URLRequestBodyPtr(
        base::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static URLRequestBodyPtr From(const U& u) {
    return mojo::TypeConverter<URLRequestBodyPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, URLRequestBody>::Convert(*this);
  }


  URLRequestBody();

  URLRequestBody(
      WTF::Vector<::blink::FormDataElement> elements,
      uint64_t identifier,
      bool contains_sensitive_info);

  ~URLRequestBody();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = URLRequestBodyPtr>
  URLRequestBodyPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, URLRequestBody::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename UserType>
  static WTF::Vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        URLRequestBody::DataView, WTF::Vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        URLRequestBody::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::URLRequestBody_UnserializedMessageContext<
            UserType, URLRequestBody::DataView>>(0, 0, std::move(input)));
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    return mojo::internal::DeserializeImpl<URLRequestBody::DataView>(
        data, data_num_bytes, std::vector<mojo::ScopedHandle>(), output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(const WTF::Vector<uint8_t>& input,
                          UserType* output) {
    return URLRequestBody::Deserialize(
        input.size() == 0 ? nullptr : &input.front(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::URLRequestBody_UnserializedMessageContext<
            UserType, URLRequestBody::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<URLRequestBody::DataView>(
        input.payload(), input.payload_num_bytes(),
        std::move(*input.mutable_handles()), output, Validate);
  }

  
// @generated_from: network.mojom.URLRequestBody.elements
  WTF::Vector<::blink::FormDataElement> elements;
  
// @generated_from: network.mojom.URLRequestBody.identifier
  uint64_t identifier;
  
// @generated_from: network.mojom.URLRequestBody.contains_sensitive_info
  bool contains_sensitive_info;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
  DISALLOW_COPY_AND_ASSIGN(URLRequestBody);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, URLRequestBody::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, URLRequestBody::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, URLRequestBody::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, URLRequestBody::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}





// @generated_from: network.mojom.DataElement
class BLINK_PLATFORM_EXPORT DataElement {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<DataElement, T>::value>;
  using DataView = DataElementDataView;
  using Data_ = internal::DataElement_Data;

  template <typename... Args>
  static DataElementPtr New(Args&&... args) {
    return DataElementPtr(
        base::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static DataElementPtr From(const U& u) {
    return mojo::TypeConverter<DataElementPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, DataElement>::Convert(*this);
  }


  DataElement();

  DataElement(
      DataElementType type,
      const WTF::Vector<uint8_t>& buf,
      const base::FilePath& path,
      base::File file,
      const WTF::String& blob_uuid,
      ::network::mojom::blink::DataPipeGetterPtrInfo data_pipe_getter,
      ::network::mojom::blink::ChunkedDataPipeGetterPtrInfo chunked_data_pipe_getter,
      uint64_t offset,
      uint64_t length,
      base::Time expected_modification_time);

  ~DataElement();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = DataElementPtr>
  DataElementPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, DataElement::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename UserType>
  static WTF::Vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        DataElement::DataView, WTF::Vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        DataElement::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::DataElement_UnserializedMessageContext<
            UserType, DataElement::DataView>>(0, 0, std::move(input)));
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    return mojo::internal::DeserializeImpl<DataElement::DataView>(
        data, data_num_bytes, std::vector<mojo::ScopedHandle>(), output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(const WTF::Vector<uint8_t>& input,
                          UserType* output) {
    return DataElement::Deserialize(
        input.size() == 0 ? nullptr : &input.front(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::DataElement_UnserializedMessageContext<
            UserType, DataElement::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<DataElement::DataView>(
        input.payload(), input.payload_num_bytes(),
        std::move(*input.mutable_handles()), output, Validate);
  }

  
// @generated_from: network.mojom.DataElement.type
  DataElementType type;
  
// @generated_from: network.mojom.DataElement.buf
  WTF::Vector<uint8_t> buf;
  
// @generated_from: network.mojom.DataElement.path
  base::FilePath path;
  
// @generated_from: network.mojom.DataElement.file
  base::File file;
  
// @generated_from: network.mojom.DataElement.blob_uuid
  WTF::String blob_uuid;
  
// @generated_from: network.mojom.DataElement.data_pipe_getter
  ::network::mojom::blink::DataPipeGetterPtrInfo data_pipe_getter;
  
// @generated_from: network.mojom.DataElement.chunked_data_pipe_getter
  ::network::mojom::blink::ChunkedDataPipeGetterPtrInfo chunked_data_pipe_getter;
  
// @generated_from: network.mojom.DataElement.offset
  uint64_t offset;
  
// @generated_from: network.mojom.DataElement.length
  uint64_t length;
  
// @generated_from: network.mojom.DataElement.expected_modification_time
  base::Time expected_modification_time;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
  DISALLOW_COPY_AND_ASSIGN(DataElement);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, DataElement::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, DataElement::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, DataElement::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, DataElement::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}





// @generated_from: network.mojom.URLLoaderClientEndpoints
class BLINK_PLATFORM_EXPORT URLLoaderClientEndpoints {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<URLLoaderClientEndpoints, T>::value>;
  using DataView = URLLoaderClientEndpointsDataView;
  using Data_ = internal::URLLoaderClientEndpoints_Data;

  template <typename... Args>
  static URLLoaderClientEndpointsPtr New(Args&&... args) {
    return URLLoaderClientEndpointsPtr(
        base::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static URLLoaderClientEndpointsPtr From(const U& u) {
    return mojo::TypeConverter<URLLoaderClientEndpointsPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, URLLoaderClientEndpoints>::Convert(*this);
  }


  URLLoaderClientEndpoints();

  URLLoaderClientEndpoints(
      URLLoaderPtrInfo url_loader,
      URLLoaderClientRequest url_loader_client);

  ~URLLoaderClientEndpoints();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = URLLoaderClientEndpointsPtr>
  URLLoaderClientEndpointsPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, URLLoaderClientEndpoints::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename UserType>
  static WTF::Vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        URLLoaderClientEndpoints::DataView, WTF::Vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        URLLoaderClientEndpoints::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::URLLoaderClientEndpoints_UnserializedMessageContext<
            UserType, URLLoaderClientEndpoints::DataView>>(0, 0, std::move(input)));
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    return mojo::internal::DeserializeImpl<URLLoaderClientEndpoints::DataView>(
        data, data_num_bytes, std::vector<mojo::ScopedHandle>(), output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(const WTF::Vector<uint8_t>& input,
                          UserType* output) {
    return URLLoaderClientEndpoints::Deserialize(
        input.size() == 0 ? nullptr : &input.front(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::URLLoaderClientEndpoints_UnserializedMessageContext<
            UserType, URLLoaderClientEndpoints::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<URLLoaderClientEndpoints::DataView>(
        input.payload(), input.payload_num_bytes(),
        std::move(*input.mutable_handles()), output, Validate);
  }

  
// @generated_from: network.mojom.URLLoaderClientEndpoints.url_loader
  URLLoaderPtrInfo url_loader;
  
// @generated_from: network.mojom.URLLoaderClientEndpoints.url_loader_client
  URLLoaderClientRequest url_loader_client;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
  DISALLOW_COPY_AND_ASSIGN(URLLoaderClientEndpoints);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, URLLoaderClientEndpoints::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, URLLoaderClientEndpoints::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, URLLoaderClientEndpoints::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, URLLoaderClientEndpoints::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}

template <typename StructPtrType>
URLRequestPtr URLRequest::Clone() const {
  return New(
      mojo::Clone(method),
      mojo::Clone(url),
      mojo::Clone(site_for_cookies),
      mojo::Clone(top_frame_origin),
      mojo::Clone(attach_same_site_cookies),
      mojo::Clone(update_first_party_url_on_redirect),
      mojo::Clone(request_initiator),
      mojo::Clone(referrer),
      mojo::Clone(referrer_policy),
      mojo::Clone(is_prerendering),
      mojo::Clone(headers),
      mojo::Clone(cors_exempt_headers),
      mojo::Clone(load_flags),
      mojo::Clone(allow_credentials),
      mojo::Clone(plugin_child_id),
      mojo::Clone(resource_type),
      mojo::Clone(priority),
      mojo::Clone(appcache_host_id),
      mojo::Clone(should_reset_appcache),
      mojo::Clone(is_external_request),
      mojo::Clone(cors_preflight_policy),
      mojo::Clone(originated_from_service_worker),
      mojo::Clone(skip_service_worker),
      mojo::Clone(corb_detachable),
      mojo::Clone(corb_excluded),
      mojo::Clone(mode),
      mojo::Clone(credentials_mode),
      mojo::Clone(redirect_mode),
      mojo::Clone(fetch_integrity),
      mojo::Clone(fetch_request_context_type),
      mojo::Clone(request_body),
      mojo::Clone(keepalive),
      mojo::Clone(has_user_gesture),
      mojo::Clone(enable_load_timing),
      mojo::Clone(enable_upload_progress),
      mojo::Clone(do_not_prompt_for_login),
      mojo::Clone(render_frame_id),
      mojo::Clone(is_main_frame),
      mojo::Clone(transition_type),
      mojo::Clone(allow_download),
      mojo::Clone(report_raw_headers),
      mojo::Clone(previews_state),
      mojo::Clone(initiated_in_secure_context),
      mojo::Clone(upgrade_if_insecure),
      mojo::Clone(is_revalidating),
      mojo::Clone(should_also_use_factory_bound_origin_for_cors),
      mojo::Clone(throttling_profile_id),
      mojo::Clone(custom_proxy_pre_cache_headers),
      mojo::Clone(custom_proxy_post_cache_headers),
      mojo::Clone(fetch_window_id),
      mojo::Clone(devtools_request_id)
  );
}

template <typename T, URLRequest::EnableIfSame<T>*>
bool URLRequest::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->method, other_struct.method))
    return false;
  if (!mojo::Equals(this->url, other_struct.url))
    return false;
  if (!mojo::Equals(this->site_for_cookies, other_struct.site_for_cookies))
    return false;
  if (!mojo::Equals(this->top_frame_origin, other_struct.top_frame_origin))
    return false;
  if (!mojo::Equals(this->attach_same_site_cookies, other_struct.attach_same_site_cookies))
    return false;
  if (!mojo::Equals(this->update_first_party_url_on_redirect, other_struct.update_first_party_url_on_redirect))
    return false;
  if (!mojo::Equals(this->request_initiator, other_struct.request_initiator))
    return false;
  if (!mojo::Equals(this->referrer, other_struct.referrer))
    return false;
  if (!mojo::Equals(this->referrer_policy, other_struct.referrer_policy))
    return false;
  if (!mojo::Equals(this->is_prerendering, other_struct.is_prerendering))
    return false;
  if (!mojo::Equals(this->headers, other_struct.headers))
    return false;
  if (!mojo::Equals(this->cors_exempt_headers, other_struct.cors_exempt_headers))
    return false;
  if (!mojo::Equals(this->load_flags, other_struct.load_flags))
    return false;
  if (!mojo::Equals(this->allow_credentials, other_struct.allow_credentials))
    return false;
  if (!mojo::Equals(this->plugin_child_id, other_struct.plugin_child_id))
    return false;
  if (!mojo::Equals(this->resource_type, other_struct.resource_type))
    return false;
  if (!mojo::Equals(this->priority, other_struct.priority))
    return false;
  if (!mojo::Equals(this->appcache_host_id, other_struct.appcache_host_id))
    return false;
  if (!mojo::Equals(this->should_reset_appcache, other_struct.should_reset_appcache))
    return false;
  if (!mojo::Equals(this->is_external_request, other_struct.is_external_request))
    return false;
  if (!mojo::Equals(this->cors_preflight_policy, other_struct.cors_preflight_policy))
    return false;
  if (!mojo::Equals(this->originated_from_service_worker, other_struct.originated_from_service_worker))
    return false;
  if (!mojo::Equals(this->skip_service_worker, other_struct.skip_service_worker))
    return false;
  if (!mojo::Equals(this->corb_detachable, other_struct.corb_detachable))
    return false;
  if (!mojo::Equals(this->corb_excluded, other_struct.corb_excluded))
    return false;
  if (!mojo::Equals(this->mode, other_struct.mode))
    return false;
  if (!mojo::Equals(this->credentials_mode, other_struct.credentials_mode))
    return false;
  if (!mojo::Equals(this->redirect_mode, other_struct.redirect_mode))
    return false;
  if (!mojo::Equals(this->fetch_integrity, other_struct.fetch_integrity))
    return false;
  if (!mojo::Equals(this->fetch_request_context_type, other_struct.fetch_request_context_type))
    return false;
  if (!mojo::Equals(this->request_body, other_struct.request_body))
    return false;
  if (!mojo::Equals(this->keepalive, other_struct.keepalive))
    return false;
  if (!mojo::Equals(this->has_user_gesture, other_struct.has_user_gesture))
    return false;
  if (!mojo::Equals(this->enable_load_timing, other_struct.enable_load_timing))
    return false;
  if (!mojo::Equals(this->enable_upload_progress, other_struct.enable_upload_progress))
    return false;
  if (!mojo::Equals(this->do_not_prompt_for_login, other_struct.do_not_prompt_for_login))
    return false;
  if (!mojo::Equals(this->render_frame_id, other_struct.render_frame_id))
    return false;
  if (!mojo::Equals(this->is_main_frame, other_struct.is_main_frame))
    return false;
  if (!mojo::Equals(this->transition_type, other_struct.transition_type))
    return false;
  if (!mojo::Equals(this->allow_download, other_struct.allow_download))
    return false;
  if (!mojo::Equals(this->report_raw_headers, other_struct.report_raw_headers))
    return false;
  if (!mojo::Equals(this->previews_state, other_struct.previews_state))
    return false;
  if (!mojo::Equals(this->initiated_in_secure_context, other_struct.initiated_in_secure_context))
    return false;
  if (!mojo::Equals(this->upgrade_if_insecure, other_struct.upgrade_if_insecure))
    return false;
  if (!mojo::Equals(this->is_revalidating, other_struct.is_revalidating))
    return false;
  if (!mojo::Equals(this->should_also_use_factory_bound_origin_for_cors, other_struct.should_also_use_factory_bound_origin_for_cors))
    return false;
  if (!mojo::Equals(this->throttling_profile_id, other_struct.throttling_profile_id))
    return false;
  if (!mojo::Equals(this->custom_proxy_pre_cache_headers, other_struct.custom_proxy_pre_cache_headers))
    return false;
  if (!mojo::Equals(this->custom_proxy_post_cache_headers, other_struct.custom_proxy_post_cache_headers))
    return false;
  if (!mojo::Equals(this->fetch_window_id, other_struct.fetch_window_id))
    return false;
  if (!mojo::Equals(this->devtools_request_id, other_struct.devtools_request_id))
    return false;
  return true;
}

template <typename T, URLRequest::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.method < rhs.method)
    return true;
  if (rhs.method < lhs.method)
    return false;
  if (lhs.url < rhs.url)
    return true;
  if (rhs.url < lhs.url)
    return false;
  if (lhs.site_for_cookies < rhs.site_for_cookies)
    return true;
  if (rhs.site_for_cookies < lhs.site_for_cookies)
    return false;
  if (lhs.top_frame_origin < rhs.top_frame_origin)
    return true;
  if (rhs.top_frame_origin < lhs.top_frame_origin)
    return false;
  if (lhs.attach_same_site_cookies < rhs.attach_same_site_cookies)
    return true;
  if (rhs.attach_same_site_cookies < lhs.attach_same_site_cookies)
    return false;
  if (lhs.update_first_party_url_on_redirect < rhs.update_first_party_url_on_redirect)
    return true;
  if (rhs.update_first_party_url_on_redirect < lhs.update_first_party_url_on_redirect)
    return false;
  if (lhs.request_initiator < rhs.request_initiator)
    return true;
  if (rhs.request_initiator < lhs.request_initiator)
    return false;
  if (lhs.referrer < rhs.referrer)
    return true;
  if (rhs.referrer < lhs.referrer)
    return false;
  if (lhs.referrer_policy < rhs.referrer_policy)
    return true;
  if (rhs.referrer_policy < lhs.referrer_policy)
    return false;
  if (lhs.is_prerendering < rhs.is_prerendering)
    return true;
  if (rhs.is_prerendering < lhs.is_prerendering)
    return false;
  if (lhs.headers < rhs.headers)
    return true;
  if (rhs.headers < lhs.headers)
    return false;
  if (lhs.cors_exempt_headers < rhs.cors_exempt_headers)
    return true;
  if (rhs.cors_exempt_headers < lhs.cors_exempt_headers)
    return false;
  if (lhs.load_flags < rhs.load_flags)
    return true;
  if (rhs.load_flags < lhs.load_flags)
    return false;
  if (lhs.allow_credentials < rhs.allow_credentials)
    return true;
  if (rhs.allow_credentials < lhs.allow_credentials)
    return false;
  if (lhs.plugin_child_id < rhs.plugin_child_id)
    return true;
  if (rhs.plugin_child_id < lhs.plugin_child_id)
    return false;
  if (lhs.resource_type < rhs.resource_type)
    return true;
  if (rhs.resource_type < lhs.resource_type)
    return false;
  if (lhs.priority < rhs.priority)
    return true;
  if (rhs.priority < lhs.priority)
    return false;
  if (lhs.appcache_host_id < rhs.appcache_host_id)
    return true;
  if (rhs.appcache_host_id < lhs.appcache_host_id)
    return false;
  if (lhs.should_reset_appcache < rhs.should_reset_appcache)
    return true;
  if (rhs.should_reset_appcache < lhs.should_reset_appcache)
    return false;
  if (lhs.is_external_request < rhs.is_external_request)
    return true;
  if (rhs.is_external_request < lhs.is_external_request)
    return false;
  if (lhs.cors_preflight_policy < rhs.cors_preflight_policy)
    return true;
  if (rhs.cors_preflight_policy < lhs.cors_preflight_policy)
    return false;
  if (lhs.originated_from_service_worker < rhs.originated_from_service_worker)
    return true;
  if (rhs.originated_from_service_worker < lhs.originated_from_service_worker)
    return false;
  if (lhs.skip_service_worker < rhs.skip_service_worker)
    return true;
  if (rhs.skip_service_worker < lhs.skip_service_worker)
    return false;
  if (lhs.corb_detachable < rhs.corb_detachable)
    return true;
  if (rhs.corb_detachable < lhs.corb_detachable)
    return false;
  if (lhs.corb_excluded < rhs.corb_excluded)
    return true;
  if (rhs.corb_excluded < lhs.corb_excluded)
    return false;
  if (lhs.mode < rhs.mode)
    return true;
  if (rhs.mode < lhs.mode)
    return false;
  if (lhs.credentials_mode < rhs.credentials_mode)
    return true;
  if (rhs.credentials_mode < lhs.credentials_mode)
    return false;
  if (lhs.redirect_mode < rhs.redirect_mode)
    return true;
  if (rhs.redirect_mode < lhs.redirect_mode)
    return false;
  if (lhs.fetch_integrity < rhs.fetch_integrity)
    return true;
  if (rhs.fetch_integrity < lhs.fetch_integrity)
    return false;
  if (lhs.fetch_request_context_type < rhs.fetch_request_context_type)
    return true;
  if (rhs.fetch_request_context_type < lhs.fetch_request_context_type)
    return false;
  if (lhs.request_body < rhs.request_body)
    return true;
  if (rhs.request_body < lhs.request_body)
    return false;
  if (lhs.keepalive < rhs.keepalive)
    return true;
  if (rhs.keepalive < lhs.keepalive)
    return false;
  if (lhs.has_user_gesture < rhs.has_user_gesture)
    return true;
  if (rhs.has_user_gesture < lhs.has_user_gesture)
    return false;
  if (lhs.enable_load_timing < rhs.enable_load_timing)
    return true;
  if (rhs.enable_load_timing < lhs.enable_load_timing)
    return false;
  if (lhs.enable_upload_progress < rhs.enable_upload_progress)
    return true;
  if (rhs.enable_upload_progress < lhs.enable_upload_progress)
    return false;
  if (lhs.do_not_prompt_for_login < rhs.do_not_prompt_for_login)
    return true;
  if (rhs.do_not_prompt_for_login < lhs.do_not_prompt_for_login)
    return false;
  if (lhs.render_frame_id < rhs.render_frame_id)
    return true;
  if (rhs.render_frame_id < lhs.render_frame_id)
    return false;
  if (lhs.is_main_frame < rhs.is_main_frame)
    return true;
  if (rhs.is_main_frame < lhs.is_main_frame)
    return false;
  if (lhs.transition_type < rhs.transition_type)
    return true;
  if (rhs.transition_type < lhs.transition_type)
    return false;
  if (lhs.allow_download < rhs.allow_download)
    return true;
  if (rhs.allow_download < lhs.allow_download)
    return false;
  if (lhs.report_raw_headers < rhs.report_raw_headers)
    return true;
  if (rhs.report_raw_headers < lhs.report_raw_headers)
    return false;
  if (lhs.previews_state < rhs.previews_state)
    return true;
  if (rhs.previews_state < lhs.previews_state)
    return false;
  if (lhs.initiated_in_secure_context < rhs.initiated_in_secure_context)
    return true;
  if (rhs.initiated_in_secure_context < lhs.initiated_in_secure_context)
    return false;
  if (lhs.upgrade_if_insecure < rhs.upgrade_if_insecure)
    return true;
  if (rhs.upgrade_if_insecure < lhs.upgrade_if_insecure)
    return false;
  if (lhs.is_revalidating < rhs.is_revalidating)
    return true;
  if (rhs.is_revalidating < lhs.is_revalidating)
    return false;
  if (lhs.should_also_use_factory_bound_origin_for_cors < rhs.should_also_use_factory_bound_origin_for_cors)
    return true;
  if (rhs.should_also_use_factory_bound_origin_for_cors < lhs.should_also_use_factory_bound_origin_for_cors)
    return false;
  if (lhs.throttling_profile_id < rhs.throttling_profile_id)
    return true;
  if (rhs.throttling_profile_id < lhs.throttling_profile_id)
    return false;
  if (lhs.custom_proxy_pre_cache_headers < rhs.custom_proxy_pre_cache_headers)
    return true;
  if (rhs.custom_proxy_pre_cache_headers < lhs.custom_proxy_pre_cache_headers)
    return false;
  if (lhs.custom_proxy_post_cache_headers < rhs.custom_proxy_post_cache_headers)
    return true;
  if (rhs.custom_proxy_post_cache_headers < lhs.custom_proxy_post_cache_headers)
    return false;
  if (lhs.fetch_window_id < rhs.fetch_window_id)
    return true;
  if (rhs.fetch_window_id < lhs.fetch_window_id)
    return false;
  if (lhs.devtools_request_id < rhs.devtools_request_id)
    return true;
  if (rhs.devtools_request_id < lhs.devtools_request_id)
    return false;
  return false;
}
template <typename StructPtrType>
URLRequestBodyPtr URLRequestBody::Clone() const {
  return New(
      mojo::Clone(elements),
      mojo::Clone(identifier),
      mojo::Clone(contains_sensitive_info)
  );
}

template <typename T, URLRequestBody::EnableIfSame<T>*>
bool URLRequestBody::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->elements, other_struct.elements))
    return false;
  if (!mojo::Equals(this->identifier, other_struct.identifier))
    return false;
  if (!mojo::Equals(this->contains_sensitive_info, other_struct.contains_sensitive_info))
    return false;
  return true;
}

template <typename T, URLRequestBody::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.elements < rhs.elements)
    return true;
  if (rhs.elements < lhs.elements)
    return false;
  if (lhs.identifier < rhs.identifier)
    return true;
  if (rhs.identifier < lhs.identifier)
    return false;
  if (lhs.contains_sensitive_info < rhs.contains_sensitive_info)
    return true;
  if (rhs.contains_sensitive_info < lhs.contains_sensitive_info)
    return false;
  return false;
}
template <typename StructPtrType>
DataElementPtr DataElement::Clone() const {
  return New(
      mojo::Clone(type),
      mojo::Clone(buf),
      mojo::Clone(path),
      mojo::Clone(file),
      mojo::Clone(blob_uuid),
      mojo::Clone(data_pipe_getter),
      mojo::Clone(chunked_data_pipe_getter),
      mojo::Clone(offset),
      mojo::Clone(length),
      mojo::Clone(expected_modification_time)
  );
}

template <typename T, DataElement::EnableIfSame<T>*>
bool DataElement::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->type, other_struct.type))
    return false;
  if (!mojo::Equals(this->buf, other_struct.buf))
    return false;
  if (!mojo::Equals(this->path, other_struct.path))
    return false;
  if (!mojo::Equals(this->file, other_struct.file))
    return false;
  if (!mojo::Equals(this->blob_uuid, other_struct.blob_uuid))
    return false;
  if (!mojo::Equals(this->data_pipe_getter, other_struct.data_pipe_getter))
    return false;
  if (!mojo::Equals(this->chunked_data_pipe_getter, other_struct.chunked_data_pipe_getter))
    return false;
  if (!mojo::Equals(this->offset, other_struct.offset))
    return false;
  if (!mojo::Equals(this->length, other_struct.length))
    return false;
  if (!mojo::Equals(this->expected_modification_time, other_struct.expected_modification_time))
    return false;
  return true;
}

template <typename T, DataElement::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.type < rhs.type)
    return true;
  if (rhs.type < lhs.type)
    return false;
  if (lhs.buf < rhs.buf)
    return true;
  if (rhs.buf < lhs.buf)
    return false;
  if (lhs.path < rhs.path)
    return true;
  if (rhs.path < lhs.path)
    return false;
  if (lhs.file < rhs.file)
    return true;
  if (rhs.file < lhs.file)
    return false;
  if (lhs.blob_uuid < rhs.blob_uuid)
    return true;
  if (rhs.blob_uuid < lhs.blob_uuid)
    return false;
  if (lhs.data_pipe_getter < rhs.data_pipe_getter)
    return true;
  if (rhs.data_pipe_getter < lhs.data_pipe_getter)
    return false;
  if (lhs.chunked_data_pipe_getter < rhs.chunked_data_pipe_getter)
    return true;
  if (rhs.chunked_data_pipe_getter < lhs.chunked_data_pipe_getter)
    return false;
  if (lhs.offset < rhs.offset)
    return true;
  if (rhs.offset < lhs.offset)
    return false;
  if (lhs.length < rhs.length)
    return true;
  if (rhs.length < lhs.length)
    return false;
  if (lhs.expected_modification_time < rhs.expected_modification_time)
    return true;
  if (rhs.expected_modification_time < lhs.expected_modification_time)
    return false;
  return false;
}
template <typename StructPtrType>
URLLoaderClientEndpointsPtr URLLoaderClientEndpoints::Clone() const {
  return New(
      mojo::Clone(url_loader),
      mojo::Clone(url_loader_client)
  );
}

template <typename T, URLLoaderClientEndpoints::EnableIfSame<T>*>
bool URLLoaderClientEndpoints::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->url_loader, other_struct.url_loader))
    return false;
  if (!mojo::Equals(this->url_loader_client, other_struct.url_loader_client))
    return false;
  return true;
}

template <typename T, URLLoaderClientEndpoints::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.url_loader < rhs.url_loader)
    return true;
  if (rhs.url_loader < lhs.url_loader)
    return false;
  if (lhs.url_loader_client < rhs.url_loader_client)
    return true;
  if (rhs.url_loader_client < lhs.url_loader_client)
    return false;
  return false;
}


}  // namespace blink
}  // namespace mojom
}  // namespace network

namespace mojo {


template <>
struct BLINK_PLATFORM_EXPORT StructTraits<::network::mojom::blink::URLRequest::DataView,
                                         ::network::mojom::blink::URLRequestPtr> {
  static bool IsNull(const ::network::mojom::blink::URLRequestPtr& input) { return !input; }
  static void SetToNull(::network::mojom::blink::URLRequestPtr* output) { output->reset(); }

  static const decltype(::network::mojom::blink::URLRequest::method)& method(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->method;
  }

  static const decltype(::network::mojom::blink::URLRequest::url)& url(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->url;
  }

  static const decltype(::network::mojom::blink::URLRequest::site_for_cookies)& site_for_cookies(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->site_for_cookies;
  }

  static const decltype(::network::mojom::blink::URLRequest::top_frame_origin)& top_frame_origin(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->top_frame_origin;
  }

  static decltype(::network::mojom::blink::URLRequest::attach_same_site_cookies) attach_same_site_cookies(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->attach_same_site_cookies;
  }

  static decltype(::network::mojom::blink::URLRequest::update_first_party_url_on_redirect) update_first_party_url_on_redirect(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->update_first_party_url_on_redirect;
  }

  static const decltype(::network::mojom::blink::URLRequest::request_initiator)& request_initiator(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->request_initiator;
  }

  static const decltype(::network::mojom::blink::URLRequest::referrer)& referrer(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->referrer;
  }

  static decltype(::network::mojom::blink::URLRequest::referrer_policy) referrer_policy(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->referrer_policy;
  }

  static decltype(::network::mojom::blink::URLRequest::is_prerendering) is_prerendering(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->is_prerendering;
  }

  static const decltype(::network::mojom::blink::URLRequest::headers)& headers(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->headers;
  }

  static const decltype(::network::mojom::blink::URLRequest::cors_exempt_headers)& cors_exempt_headers(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->cors_exempt_headers;
  }

  static decltype(::network::mojom::blink::URLRequest::load_flags) load_flags(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->load_flags;
  }

  static decltype(::network::mojom::blink::URLRequest::allow_credentials) allow_credentials(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->allow_credentials;
  }

  static decltype(::network::mojom::blink::URLRequest::plugin_child_id) plugin_child_id(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->plugin_child_id;
  }

  static decltype(::network::mojom::blink::URLRequest::resource_type) resource_type(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->resource_type;
  }

  static decltype(::network::mojom::blink::URLRequest::priority) priority(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->priority;
  }

  static const decltype(::network::mojom::blink::URLRequest::appcache_host_id)& appcache_host_id(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->appcache_host_id;
  }

  static decltype(::network::mojom::blink::URLRequest::should_reset_appcache) should_reset_appcache(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->should_reset_appcache;
  }

  static decltype(::network::mojom::blink::URLRequest::is_external_request) is_external_request(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->is_external_request;
  }

  static decltype(::network::mojom::blink::URLRequest::cors_preflight_policy) cors_preflight_policy(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->cors_preflight_policy;
  }

  static decltype(::network::mojom::blink::URLRequest::originated_from_service_worker) originated_from_service_worker(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->originated_from_service_worker;
  }

  static decltype(::network::mojom::blink::URLRequest::skip_service_worker) skip_service_worker(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->skip_service_worker;
  }

  static decltype(::network::mojom::blink::URLRequest::corb_detachable) corb_detachable(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->corb_detachable;
  }

  static decltype(::network::mojom::blink::URLRequest::corb_excluded) corb_excluded(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->corb_excluded;
  }

  static decltype(::network::mojom::blink::URLRequest::mode) mode(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->mode;
  }

  static decltype(::network::mojom::blink::URLRequest::credentials_mode) credentials_mode(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->credentials_mode;
  }

  static decltype(::network::mojom::blink::URLRequest::redirect_mode) redirect_mode(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->redirect_mode;
  }

  static const decltype(::network::mojom::blink::URLRequest::fetch_integrity)& fetch_integrity(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->fetch_integrity;
  }

  static decltype(::network::mojom::blink::URLRequest::fetch_request_context_type) fetch_request_context_type(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->fetch_request_context_type;
  }

  static  decltype(::network::mojom::blink::URLRequest::request_body)& request_body(
       ::network::mojom::blink::URLRequestPtr& input) {
    return input->request_body;
  }

  static decltype(::network::mojom::blink::URLRequest::keepalive) keepalive(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->keepalive;
  }

  static decltype(::network::mojom::blink::URLRequest::has_user_gesture) has_user_gesture(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->has_user_gesture;
  }

  static decltype(::network::mojom::blink::URLRequest::enable_load_timing) enable_load_timing(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->enable_load_timing;
  }

  static decltype(::network::mojom::blink::URLRequest::enable_upload_progress) enable_upload_progress(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->enable_upload_progress;
  }

  static decltype(::network::mojom::blink::URLRequest::do_not_prompt_for_login) do_not_prompt_for_login(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->do_not_prompt_for_login;
  }

  static decltype(::network::mojom::blink::URLRequest::render_frame_id) render_frame_id(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->render_frame_id;
  }

  static decltype(::network::mojom::blink::URLRequest::is_main_frame) is_main_frame(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->is_main_frame;
  }

  static decltype(::network::mojom::blink::URLRequest::transition_type) transition_type(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->transition_type;
  }

  static decltype(::network::mojom::blink::URLRequest::allow_download) allow_download(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->allow_download;
  }

  static decltype(::network::mojom::blink::URLRequest::report_raw_headers) report_raw_headers(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->report_raw_headers;
  }

  static decltype(::network::mojom::blink::URLRequest::previews_state) previews_state(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->previews_state;
  }

  static decltype(::network::mojom::blink::URLRequest::initiated_in_secure_context) initiated_in_secure_context(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->initiated_in_secure_context;
  }

  static decltype(::network::mojom::blink::URLRequest::upgrade_if_insecure) upgrade_if_insecure(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->upgrade_if_insecure;
  }

  static decltype(::network::mojom::blink::URLRequest::is_revalidating) is_revalidating(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->is_revalidating;
  }

  static decltype(::network::mojom::blink::URLRequest::should_also_use_factory_bound_origin_for_cors) should_also_use_factory_bound_origin_for_cors(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->should_also_use_factory_bound_origin_for_cors;
  }

  static const decltype(::network::mojom::blink::URLRequest::throttling_profile_id)& throttling_profile_id(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->throttling_profile_id;
  }

  static const decltype(::network::mojom::blink::URLRequest::custom_proxy_pre_cache_headers)& custom_proxy_pre_cache_headers(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->custom_proxy_pre_cache_headers;
  }

  static const decltype(::network::mojom::blink::URLRequest::custom_proxy_post_cache_headers)& custom_proxy_post_cache_headers(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->custom_proxy_post_cache_headers;
  }

  static const decltype(::network::mojom::blink::URLRequest::fetch_window_id)& fetch_window_id(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->fetch_window_id;
  }

  static const decltype(::network::mojom::blink::URLRequest::devtools_request_id)& devtools_request_id(
      const ::network::mojom::blink::URLRequestPtr& input) {
    return input->devtools_request_id;
  }

  static bool Read(::network::mojom::blink::URLRequest::DataView input, ::network::mojom::blink::URLRequestPtr* output);
};


template <>
struct BLINK_PLATFORM_EXPORT StructTraits<::network::mojom::blink::URLRequestBody::DataView,
                                         ::network::mojom::blink::URLRequestBodyPtr> {
  static bool IsNull(const ::network::mojom::blink::URLRequestBodyPtr& input) { return !input; }
  static void SetToNull(::network::mojom::blink::URLRequestBodyPtr* output) { output->reset(); }

  static  decltype(::network::mojom::blink::URLRequestBody::elements)& elements(
       ::network::mojom::blink::URLRequestBodyPtr& input) {
    return input->elements;
  }

  static decltype(::network::mojom::blink::URLRequestBody::identifier) identifier(
      const ::network::mojom::blink::URLRequestBodyPtr& input) {
    return input->identifier;
  }

  static decltype(::network::mojom::blink::URLRequestBody::contains_sensitive_info) contains_sensitive_info(
      const ::network::mojom::blink::URLRequestBodyPtr& input) {
    return input->contains_sensitive_info;
  }

  static bool Read(::network::mojom::blink::URLRequestBody::DataView input, ::network::mojom::blink::URLRequestBodyPtr* output);
};


template <>
struct BLINK_PLATFORM_EXPORT StructTraits<::network::mojom::blink::DataElement::DataView,
                                         ::network::mojom::blink::DataElementPtr> {
  static bool IsNull(const ::network::mojom::blink::DataElementPtr& input) { return !input; }
  static void SetToNull(::network::mojom::blink::DataElementPtr* output) { output->reset(); }

  static decltype(::network::mojom::blink::DataElement::type) type(
      const ::network::mojom::blink::DataElementPtr& input) {
    return input->type;
  }

  static const decltype(::network::mojom::blink::DataElement::buf)& buf(
      const ::network::mojom::blink::DataElementPtr& input) {
    return input->buf;
  }

  static const decltype(::network::mojom::blink::DataElement::path)& path(
      const ::network::mojom::blink::DataElementPtr& input) {
    return input->path;
  }

  static  decltype(::network::mojom::blink::DataElement::file)& file(
       ::network::mojom::blink::DataElementPtr& input) {
    return input->file;
  }

  static const decltype(::network::mojom::blink::DataElement::blob_uuid)& blob_uuid(
      const ::network::mojom::blink::DataElementPtr& input) {
    return input->blob_uuid;
  }

  static  decltype(::network::mojom::blink::DataElement::data_pipe_getter)& data_pipe_getter(
       ::network::mojom::blink::DataElementPtr& input) {
    return input->data_pipe_getter;
  }

  static  decltype(::network::mojom::blink::DataElement::chunked_data_pipe_getter)& chunked_data_pipe_getter(
       ::network::mojom::blink::DataElementPtr& input) {
    return input->chunked_data_pipe_getter;
  }

  static decltype(::network::mojom::blink::DataElement::offset) offset(
      const ::network::mojom::blink::DataElementPtr& input) {
    return input->offset;
  }

  static decltype(::network::mojom::blink::DataElement::length) length(
      const ::network::mojom::blink::DataElementPtr& input) {
    return input->length;
  }

  static const decltype(::network::mojom::blink::DataElement::expected_modification_time)& expected_modification_time(
      const ::network::mojom::blink::DataElementPtr& input) {
    return input->expected_modification_time;
  }

  static bool Read(::network::mojom::blink::DataElement::DataView input, ::network::mojom::blink::DataElementPtr* output);
};


template <>
struct BLINK_PLATFORM_EXPORT StructTraits<::network::mojom::blink::URLLoaderClientEndpoints::DataView,
                                         ::network::mojom::blink::URLLoaderClientEndpointsPtr> {
  static bool IsNull(const ::network::mojom::blink::URLLoaderClientEndpointsPtr& input) { return !input; }
  static void SetToNull(::network::mojom::blink::URLLoaderClientEndpointsPtr* output) { output->reset(); }

  static  decltype(::network::mojom::blink::URLLoaderClientEndpoints::url_loader)& url_loader(
       ::network::mojom::blink::URLLoaderClientEndpointsPtr& input) {
    return input->url_loader;
  }

  static  decltype(::network::mojom::blink::URLLoaderClientEndpoints::url_loader_client)& url_loader_client(
       ::network::mojom::blink::URLLoaderClientEndpointsPtr& input) {
    return input->url_loader_client;
  }

  static bool Read(::network::mojom::blink::URLLoaderClientEndpoints::DataView input, ::network::mojom::blink::URLLoaderClientEndpointsPtr* output);
};

}  // namespace mojo

#endif  // SERVICES_NETWORK_PUBLIC_MOJOM_URL_LOADER_MOJOM_BLINK_H_
/* Metadata comment
eyJtZXRhIjogW3siZW5kIjogNzQxNSwgImJlZ2luIjogNzQwNiwgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3Jw
dXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2Ui
OiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMTG9hZGVyIn19LCB7ImVu
ZCI6IDgyNjcsICJiZWdpbiI6IDgyNDQsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMi
LCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVt
Lmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNp
Z25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTExvYWRlci5rQ2xpZW50RGlzY29ubmVjdFJlYXNv
biJ9fSwgeyJlbmQiOiA4MzkyLCAiYmVnaW4iOiA4Mzc4LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2Uv
Z2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6
ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJt
b2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxMb2FkZXIuRm9sbG93UmVkaXJl
Y3QifX0sIHsiZW5kIjogODY0MywgImJlZ2luIjogODYyNCwgImVkZ2UiOiAiJS9reXRoZS9lZGdl
L2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMi
OiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAi
bW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMTG9hZGVyLlByb2NlZWRXaXRo
UmVzcG9uc2UifX0sIHsiZW5kIjogODczNywgImJlZ2luIjogODcyNiwgImVkZ2UiOiAiJS9reXRo
ZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJj
b3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3Vh
Z2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMTG9hZGVyLlNldFBy
aW9yaXR5In19LCB7ImVuZCI6IDg5MDksICJiZWdpbiI6IDg4ODYsICJlZGdlIjogIiUva3l0aGUv
ZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29y
cHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdl
IjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTExvYWRlci5QYXVzZVJl
YWRpbmdCb2R5RnJvbU5ldCJ9fSwgeyJlbmQiOiA5MDI5LCAiYmVnaW4iOiA5MDA1LCAiZWRnZSI6
ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5h
bWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIs
ICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxMb2Fk
ZXIuUmVzdW1lUmVhZGluZ0JvZHlGcm9tTmV0In19LCB7ImVuZCI6IDkzMDYsICJiZWdpbiI6IDky
OTEsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVm
aW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hy
b21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1v
am9tLlVSTExvYWRlckNsaWVudCJ9fSwgeyJlbmQiOiAxMDI5MiwgImJlZ2luIjogMTAyNzUsICJl
ZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIs
ICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0v
c3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVS
TExvYWRlckNsaWVudC5PblJlY2VpdmVSZXNwb25zZSJ9fSwgeyJlbmQiOiAxMDQyNywgImJlZ2lu
IjogMTA0MTAsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNo
b3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5j
b20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3
b3JrLm1vam9tLlVSTExvYWRlckNsaWVudC5PblJlY2VpdmVSZWRpcmVjdCJ9fSwgeyJlbmQiOiAx
MDY2NSwgImJlZ2luIjogMTA2NDksICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAi
dHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdv
b2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25h
dHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTExvYWRlckNsaWVudC5PblVwbG9hZFByb2dyZXNzIn19
LCB7ImVuZCI6IDEwODY4LCAiYmVnaW4iOiAxMDg0NSwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dl
bmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAi
Y2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9q
b20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMTG9hZGVyQ2xpZW50Lk9uUmVjZWl2
ZUNhY2hlZE1ldGFkYXRhIn19LCB7ImVuZCI6IDExMDEzLCAiYmVnaW4iOiAxMDk5MiwgImVkZ2Ui
OiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZu
YW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMi
LCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMTG9h
ZGVyQ2xpZW50Lk9uVHJhbnNmZXJTaXplVXBkYXRlZCJ9fSwgeyJlbmQiOiAxMTE2OSwgImJlZ2lu
IjogMTExNDMsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNo
b3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5j
b20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3
b3JrLm1vam9tLlVSTExvYWRlckNsaWVudC5PblN0YXJ0TG9hZGluZ1Jlc3BvbnNlQm9keSJ9fSwg
eyJlbmQiOiAxMTMwNiwgImJlZ2luIjogMTEyOTYsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5l
cmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNo
cm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9t
IiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTExvYWRlckNsaWVudC5PbkNvbXBsZXRl
In19LCB7ImVuZCI6IDE1OTIzLCAiYmVnaW4iOiAxNTkxMywgImVkZ2UiOiAiJS9reXRoZS9lZGdl
L2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMi
OiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAi
bW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMUmVxdWVzdCJ9fSwgeyJlbmQi
OiAyMTQ3MSwgImJlZ2luIjogMjE0NjUsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMi
LCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVt
Lmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNp
Z25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QubWV0aG9kIn19LCB7ImVuZCI6IDIx
NTQ0LCAiYmVnaW4iOiAyMTU0MSwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0
eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29v
Z2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0
dXJlIjogIm5ldHdvcmsubW9qb20uVVJMUmVxdWVzdC51cmwifX0sIHsiZW5kIjogMjE2NDMsICJi
ZWdpbiI6IDIxNjI3LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAi
YW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3Vy
Y2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAi
bmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LnNpdGVfZm9yX2Nvb2tpZXMifX0sIHsiZW5kIjogMjE3
NzMsICJiZWdpbiI6IDIxNzU3LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5
cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29n
bGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1
cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LnRvcF9mcmFtZV9vcmlnaW4ifX0sIHsiZW5k
IjogMjE4NzksICJiZWdpbiI6IDIxODU1LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVz
IiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1
bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJz
aWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LmF0dGFjaF9zYW1lX3NpdGVfY29v
a2llcyJ9fSwgeyJlbmQiOiAyMjAwNSwgImJlZ2luIjogMjE5NzEsICJlZGdlIjogIiUva3l0aGUv
ZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29y
cHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdl
IjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QudXBkYXRl
X2ZpcnN0X3BhcnR5X3VybF9vbl9yZWRpcmVjdCJ9fSwgeyJlbmQiOiAyMjEzNywgImJlZ2luIjog
MjIxMjAsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3Jf
ZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20v
Y2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3Jr
Lm1vam9tLlVSTFJlcXVlc3QucmVxdWVzdF9pbml0aWF0b3IifX0sIHsiZW5kIjogMjIyMjAsICJi
ZWdpbiI6IDIyMjEyLCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAi
YW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3Vy
Y2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAi
bmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LnJlZmVycmVyIn19LCB7ImVuZCI6IDIyMzI4LCAiYmVn
aW4iOiAyMjMxMywgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFu
Y2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNl
LmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5l
dHdvcmsubW9qb20uVVJMUmVxdWVzdC5yZWZlcnJlcl9wb2xpY3kifX0sIHsiZW5kIjogMjI0MTYs
ICJiZWdpbiI6IDIyNDAxLCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUi
OiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVz
b3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUi
OiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LmlzX3ByZXJlbmRlcmluZyJ9fSwgeyJlbmQiOiAy
MjUwNiwgImJlZ2luIjogMjI0OTksICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAi
dHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdv
b2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25h
dHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QuaGVhZGVycyJ9fSwgeyJlbmQiOiAyMjYy
MCwgImJlZ2luIjogMjI2MDEsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlw
ZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2ds
ZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVy
ZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QuY29yc19leGVtcHRfaGVhZGVycyJ9fSwgeyJl
bmQiOiAyMjcwMSwgImJlZ2luIjogMjI2OTEsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0
ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9t
aXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwg
InNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QubG9hZF9mbGFncyJ9fSwgeyJl
bmQiOiAyMjc5MywgImJlZ2luIjogMjI3NzYsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0
ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9t
aXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwg
InNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QuYWxsb3dfY3JlZGVudGlhbHMi
fX0sIHsiZW5kIjogMjI4ODQsICJiZWdpbiI6IDIyODY5LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2Uv
Z2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6
ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJt
b2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LnBsdWdpbl9jaGls
ZF9pZCJ9fSwgeyJlbmQiOiAyMjk3MSwgImJlZ2luIjogMjI5NTgsICJlZGdlIjogIiUva3l0aGUv
ZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29y
cHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdl
IjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QucmVzb3Vy
Y2VfdHlwZSJ9fSwgeyJlbmQiOiAyMzA1NiwgImJlZ2luIjogMjMwNDgsICJlZGdlIjogIiUva3l0
aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsi
Y29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1
YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QucHJp
b3JpdHkifX0sIHsiZW5kIjogMjMxODAsICJiZWdpbiI6IDIzMTY0LCAiZWRnZSI6ICIlL2t5dGhl
L2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNv
cnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFn
ZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LmFwcGNh
Y2hlX2hvc3RfaWQifX0sIHsiZW5kIjogMjMyODAsICJiZWdpbiI6IDIzMjU5LCAiZWRnZSI6ICIl
L2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUi
OiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJs
YW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0
LnNob3VsZF9yZXNldF9hcHBjYWNoZSJ9fSwgeyJlbmQiOiAyMzM3NiwgImJlZ2luIjogMjMzNTcs
ICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5l
cyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21p
dW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9t
LlVSTFJlcXVlc3QuaXNfZXh0ZXJuYWxfcmVxdWVzdCJ9fSwgeyJlbmQiOiAyMzUxNiwgImJlZ2lu
IjogMjM0OTUsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNo
b3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5j
b20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3
b3JrLm1vam9tLlVSTFJlcXVlc3QuY29yc19wcmVmbGlnaHRfcG9saWN5In19LCB7ImVuZCI6IDIz
NjM0LCAiYmVnaW4iOiAyMzYwNCwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0
eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29v
Z2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0
dXJlIjogIm5ldHdvcmsubW9qb20uVVJMUmVxdWVzdC5vcmlnaW5hdGVkX2Zyb21fc2VydmljZV93
b3JrZXIifX0sIHsiZW5kIjogMjM3MzAsICJiZWdpbiI6IDIzNzExLCAiZWRnZSI6ICIlL2t5dGhl
L2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNv
cnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFn
ZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LnNraXBf
c2VydmljZV93b3JrZXIifX0sIHsiZW5kIjogMjM4MTgsICJiZWdpbiI6IDIzODAzLCAiZWRnZSI6
ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5h
bWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIs
ICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1
ZXN0LmNvcmJfZGV0YWNoYWJsZSJ9fSwgeyJlbmQiOiAyMzkwMiwgImJlZ2luIjogMjM4ODksICJl
ZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIs
ICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0v
c3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVS
TFJlcXVlc3QuY29yYl9leGNsdWRlZCJ9fSwgeyJlbmQiOiAyNDAwMCwgImJlZ2luIjogMjM5OTYs
ICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5l
cyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21p
dW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9t
LlVSTFJlcXVlc3QubW9kZSJ9fSwgeyJlbmQiOiAyNDEyNiwgImJlZ2luIjogMjQxMTAsICJlZGdl
IjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2
bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3Jj
IiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJl
cXVlc3QuY3JlZGVudGlhbHNfbW9kZSJ9fSwgeyJlbmQiOiAyNDI0MywgImJlZ2luIjogMjQyMzAs
ICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5l
cyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21p
dW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9t
LlVSTFJlcXVlc3QucmVkaXJlY3RfbW9kZSJ9fSwgeyJlbmQiOiAyNDMzOCwgImJlZ2luIjogMjQz
MjMsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVm
aW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hy
b21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1v
am9tLlVSTFJlcXVlc3QuZmV0Y2hfaW50ZWdyaXR5In19LCB7ImVuZCI6IDI0NDUxLCAiYmVnaW4i
OiAyNDQyNSwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hv
cl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNv
bS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdv
cmsubW9qb20uVVJMUmVxdWVzdC5mZXRjaF9yZXF1ZXN0X2NvbnRleHRfdHlwZSJ9fSwgeyJlbmQi
OiAyNDU0NiwgImJlZ2luIjogMjQ1MzQsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMi
LCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVt
Lmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNp
Z25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QucmVxdWVzdF9ib2R5In19LCB7ImVu
ZCI6IDI0NjIyLCAiYmVnaW4iOiAyNDYxMywgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRl
cyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21p
dW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAi
c2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMUmVxdWVzdC5rZWVwYWxpdmUifX0sIHsiZW5k
IjogMjQ3MTIsICJiZWdpbiI6IDI0Njk2LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVz
IiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1
bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJz
aWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0Lmhhc191c2VyX2dlc3R1cmUifX0s
IHsiZW5kIjogMjQ4MDYsICJiZWdpbiI6IDI0Nzg4LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2Vu
ZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJj
aHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pv
bSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LmVuYWJsZV9sb2FkX3Rp
bWluZyJ9fSwgeyJlbmQiOiAyNDkwOCwgImJlZ2luIjogMjQ4ODYsICJlZGdlIjogIiUva3l0aGUv
ZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29y
cHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdl
IjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QuZW5hYmxl
X3VwbG9hZF9wcm9ncmVzcyJ9fSwgeyJlbmQiOiAyNTAxMiwgImJlZ2luIjogMjQ5ODksICJlZGdl
IjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2
bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3Jj
IiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJl
cXVlc3QuZG9fbm90X3Byb21wdF9mb3JfbG9naW4ifX0sIHsiZW5kIjogMjUxMDMsICJiZWdpbiI6
IDI1MDg4LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9y
X2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29t
L2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29y
ay5tb2pvbS5VUkxSZXF1ZXN0LnJlbmRlcl9mcmFtZV9pZCJ9fSwgeyJlbmQiOiAyNTE4NywgImJl
Z2luIjogMjUxNzQsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJh
bmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJj
ZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJu
ZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QuaXNfbWFpbl9mcmFtZSJ9fSwgeyJlbmQiOiAyNTI3OCwg
ImJlZ2luIjogMjUyNjMsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6
ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNv
dXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6
ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QudHJhbnNpdGlvbl90eXBlIn19LCB7ImVuZCI6IDI1
MzY0LCAiYmVnaW4iOiAyNTM1MCwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0
eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29v
Z2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0
dXJlIjogIm5ldHdvcmsubW9qb20uVVJMUmVxdWVzdC5hbGxvd19kb3dubG9hZCJ9fSwgeyJlbmQi
OiAyNTQ1OCwgImJlZ2luIjogMjU0NDAsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMi
LCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVt
Lmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNp
Z25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QucmVwb3J0X3Jhd19oZWFkZXJzIn19
LCB7ImVuZCI6IDI1NTQ3LCAiYmVnaW4iOiAyNTUzMywgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dl
bmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAi
Y2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9q
b20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMUmVxdWVzdC5wcmV2aWV3c19zdGF0
ZSJ9fSwgeyJlbmQiOiAyNTY1OSwgImJlZ2luIjogMjU2MzIsICJlZGdlIjogIiUva3l0aGUvZWRn
ZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVz
IjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjog
Im1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3QuaW5pdGlhdGVk
X2luX3NlY3VyZV9jb250ZXh0In19LCB7ImVuZCI6IDI1NzU1LCAiYmVnaW4iOiAyNTczNiwgImVk
Z2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwg
InZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9z
cmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJM
UmVxdWVzdC51cGdyYWRlX2lmX2luc2VjdXJlIn19LCB7ImVuZCI6IDI1ODQzLCAiYmVnaW4iOiAy
NTgyOCwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9k
ZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9j
aHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsu
bW9qb20uVVJMUmVxdWVzdC5pc19yZXZhbGlkYXRpbmcifX0sIHsiZW5kIjogMjU5OTEsICJiZWdp
biI6IDI1OTQ2LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5j
aG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2Uu
Y29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0
d29yay5tb2pvbS5VUkxSZXF1ZXN0LnNob3VsZF9hbHNvX3VzZV9mYWN0b3J5X2JvdW5kX29yaWdp
bl9mb3JfY29ycyJ9fSwgeyJlbmQiOiAyNjEyNSwgImJlZ2luIjogMjYxMDQsICJlZGdlIjogIiUv
a3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6
IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxh
bmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3Qu
dGhyb3R0bGluZ19wcm9maWxlX2lkIn19LCB7ImVuZCI6IDI2MjYxLCAiYmVnaW4iOiAyNjIzMSwg
ImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVz
IiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1
bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20u
VVJMUmVxdWVzdC5jdXN0b21fcHJveHlfcHJlX2NhY2hlX2hlYWRlcnMifX0sIHsiZW5kIjogMjYz
OTksICJiZWdpbiI6IDI2MzY4LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5
cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29n
bGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1
cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LmN1c3RvbV9wcm94eV9wb3N0X2NhY2hlX2hl
YWRlcnMifX0sIHsiZW5kIjogMjY1MjEsICJiZWdpbiI6IDI2NTA2LCAiZWRnZSI6ICIlL2t5dGhl
L2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNv
cnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFn
ZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1ZXN0LmZldGNo
X3dpbmRvd19pZCJ9fSwgeyJlbmQiOiAyNjYyNCwgImJlZ2luIjogMjY2MDUsICJlZGdlIjogIiUv
a3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6
IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxh
bmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVSTFJlcXVlc3Qu
ZGV2dG9vbHNfcmVxdWVzdF9pZCJ9fSwgeyJlbmQiOiAyNzYwNSwgImJlZ2luIjogMjc1OTEsICJl
ZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIs
ICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0v
c3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlVS
TFJlcXVlc3RCb2R5In19LCB7ImVuZCI6IDMxMjM4LCAiYmVnaW4iOiAzMTIzMCwgImVkZ2UiOiAi
JS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1l
IjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAi
bGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMUmVxdWVz
dEJvZHkuZWxlbWVudHMifX0sIHsiZW5kIjogMzEzMjQsICJiZWdpbiI6IDMxMzE0LCAiZWRnZSI6
ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5h
bWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIs
ICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5VUkxSZXF1
ZXN0Qm9keS5pZGVudGlmaWVyIn19LCB7ImVuZCI6IDMxNDMyLCAiYmVnaW4iOiAzMTQwOSwgImVk
Z2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwg
InZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9z
cmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJM
UmVxdWVzdEJvZHkuY29udGFpbnNfc2Vuc2l0aXZlX2luZm8ifX0sIHsiZW5kIjogMzI0MjcsICJi
ZWdpbiI6IDMyNDE2LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAi
YW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3Vy
Y2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAi
bmV0d29yay5tb2pvbS5EYXRhRWxlbWVudCJ9fSwgeyJlbmQiOiAzNjI0NCwgImJlZ2luIjogMzYy
MjksICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVm
aW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hy
b21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1v
am9tLkRhdGFFbGVtZW50LnR5cGUifX0sIHsiZW5kIjogMzYzMzAsICJiZWdpbiI6IDM2MzI3LCAi
ZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMi
LCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVt
L3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5E
YXRhRWxlbWVudC5idWYifX0sIHsiZW5kIjogMzY0MDcsICJiZWdpbiI6IDM2NDAzLCAiZWRnZSI6
ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5h
bWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIs
ICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5EYXRhRWxl
bWVudC5wYXRoIn19LCB7ImVuZCI6IDM2NDc1LCAiYmVnaW4iOiAzNjQ3MSwgImVkZ2UiOiAiJS9r
eXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjog
eyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFu
Z3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uRGF0YUVsZW1lbnQu
ZmlsZSJ9fSwgeyJlbmQiOiAzNjU2NCwgImJlZ2luIjogMzY1NTUsICJlZGdlIjogIiUva3l0aGUv
ZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29y
cHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdl
IjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLkRhdGFFbGVtZW50LmJsb2Jf
dXVpZCJ9fSwgeyJlbmQiOiAzNjY5NywgImJlZ2luIjogMzY2ODEsICJlZGdlIjogIiUva3l0aGUv
ZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29y
cHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdl
IjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLkRhdGFFbGVtZW50LmRhdGFf
cGlwZV9nZXR0ZXIifX0sIHsiZW5kIjogMzY4NTMsICJiZWdpbiI6IDM2ODI5LCAiZWRnZSI6ICIl
L2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUi
OiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJs
YW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5EYXRhRWxlbWVu
dC5jaHVua2VkX2RhdGFfcGlwZV9nZXR0ZXIifX0sIHsiZW5kIjogMzY5MjgsICJiZWdpbiI6IDM2
OTIyLCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2Rl
ZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2No
cm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5t
b2pvbS5EYXRhRWxlbWVudC5vZmZzZXQifX0sIHsiZW5kIjogMzcwMDMsICJiZWdpbiI6IDM2OTk3
LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmlu
ZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9t
aXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pv
bS5EYXRhRWxlbWVudC5sZW5ndGgifX0sIHsiZW5kIjogMzcxMjAsICJiZWdpbiI6IDM3MDk0LCAi
ZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMi
LCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVt
L3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pvbS5E
YXRhRWxlbWVudC5leHBlY3RlZF9tb2RpZmljYXRpb25fdGltZSJ9fSwgeyJlbmQiOiAzODEyNiwg
ImJlZ2luIjogMzgxMDIsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6
ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNv
dXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6
ICJuZXR3b3JrLm1vam9tLlVSTExvYWRlckNsaWVudEVuZHBvaW50cyJ9fSwgeyJlbmQiOiA0MTk0
OCwgImJlZ2luIjogNDE5MzgsICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlw
ZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2ds
ZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVy
ZSI6ICJuZXR3b3JrLm1vam9tLlVSTExvYWRlckNsaWVudEVuZHBvaW50cy51cmxfbG9hZGVyIn19
LCB7ImVuZCI6IDQyMDcyLCAiYmVnaW4iOiA0MjA1NSwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dl
bmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAi
Y2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9q
b20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uVVJMTG9hZGVyQ2xpZW50RW5kcG9pbnRz
LnVybF9sb2FkZXJfY2xpZW50In19XSwgInR5cGUiOiAia3l0aGUwIn0=
*/