sig
  module Query :
    sig
      type t = {
        count : int;
        cr : string;
        cref : string;
        cx : string;
        dateRestrict : string;
        disableCnTwTranslation : string;
        exactTerms : string;
        excludeTerms : string;
        fileType : string;
        filter : string;
        gl : string;
        googleHost : string;
        highRange : string;
        hl : string;
        hq : string;
        imgColorType : string;
        imgDominantColor : string;
        imgSize : string;
        imgType : string;
        inputEncoding : string;
        language : string;
        linkSite : string;
        lowRange : string;
        orTerms : string;
        outputEncoding : string;
        relatedSite : string;
        rights : string;
        safe : string;
        searchTerms : string;
        searchType : string;
        siteSearch : string;
        siteSearchFilter : string;
        sort : string;
        startIndex : int;
        startPage : int;
        title : string;
        totalResults : int64;
      }
      val count : (GapiCustomsearchV1Model.Query.t, int) GapiLens.t
      val cr : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val cref : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val cx : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val dateRestrict : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val disableCnTwTranslation :
        (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val exactTerms : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val excludeTerms : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val fileType : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val filter : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val gl : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val googleHost : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val highRange : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val hl : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val hq : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val imgColorType : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val imgDominantColor :
        (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val imgSize : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val imgType : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val inputEncoding :
        (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val language : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val linkSite : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val lowRange : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val orTerms : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val outputEncoding :
        (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val relatedSite : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val rights : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val safe : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val searchTerms : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val searchType : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val siteSearch : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val siteSearchFilter :
        (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val sort : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val startIndex : (GapiCustomsearchV1Model.Query.t, int) GapiLens.t
      val startPage : (GapiCustomsearchV1Model.Query.t, int) GapiLens.t
      val title : (GapiCustomsearchV1Model.Query.t, string) GapiLens.t
      val totalResults : (GapiCustomsearchV1Model.Query.t, int64) GapiLens.t
      val empty : GapiCustomsearchV1Model.Query.t
      val render :
        GapiCustomsearchV1Model.Query.t -> GapiJson.json_data_model list
      val parse :
        GapiCustomsearchV1Model.Query.t ->
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Query.t
      val to_data_model :
        GapiCustomsearchV1Model.Query.t -> GapiJson.json_data_model
      val of_data_model :
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Query.t
    end
  module Context :
    sig
      module Facets :
        sig
          type t = {
            anchor : string;
            label : string;
            label_with_op : string;
          }
          val anchor :
            (GapiCustomsearchV1Model.Context.Facets.t, string) GapiLens.t
          val label :
            (GapiCustomsearchV1Model.Context.Facets.t, string) GapiLens.t
          val label_with_op :
            (GapiCustomsearchV1Model.Context.Facets.t, string) GapiLens.t
          val empty : GapiCustomsearchV1Model.Context.Facets.t
          val render :
            GapiCustomsearchV1Model.Context.Facets.t ->
            GapiJson.json_data_model list
          val parse :
            GapiCustomsearchV1Model.Context.Facets.t ->
            GapiJson.json_data_model ->
            GapiCustomsearchV1Model.Context.Facets.t
        end
      type t = {
        facets : GapiCustomsearchV1Model.Context.Facets.t list list;
        title : string;
      }
      val facets :
        (GapiCustomsearchV1Model.Context.t,
         GapiCustomsearchV1Model.Context.Facets.t list list)
        GapiLens.t
      val title : (GapiCustomsearchV1Model.Context.t, string) GapiLens.t
      val empty : GapiCustomsearchV1Model.Context.t
      val render :
        GapiCustomsearchV1Model.Context.t -> GapiJson.json_data_model list
      val parse :
        GapiCustomsearchV1Model.Context.t ->
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Context.t
      val to_data_model :
        GapiCustomsearchV1Model.Context.t -> GapiJson.json_data_model
      val of_data_model :
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Context.t
    end
  module Result :
    sig
      module Labels :
        sig
          type t = {
            displayName : string;
            label_with_op : string;
            name : string;
          }
          val displayName :
            (GapiCustomsearchV1Model.Result.Labels.t, string) GapiLens.t
          val label_with_op :
            (GapiCustomsearchV1Model.Result.Labels.t, string) GapiLens.t
          val name :
            (GapiCustomsearchV1Model.Result.Labels.t, string) GapiLens.t
          val empty : GapiCustomsearchV1Model.Result.Labels.t
          val render :
            GapiCustomsearchV1Model.Result.Labels.t ->
            GapiJson.json_data_model list
          val parse :
            GapiCustomsearchV1Model.Result.Labels.t ->
            GapiJson.json_data_model ->
            GapiCustomsearchV1Model.Result.Labels.t
        end
      module Image :
        sig
          type t = {
            byteSize : int;
            contextLink : string;
            height : int;
            thumbnailHeight : int;
            thumbnailLink : string;
            thumbnailWidth : int;
            width : int;
          }
          val byteSize :
            (GapiCustomsearchV1Model.Result.Image.t, int) GapiLens.t
          val contextLink :
            (GapiCustomsearchV1Model.Result.Image.t, string) GapiLens.t
          val height :
            (GapiCustomsearchV1Model.Result.Image.t, int) GapiLens.t
          val thumbnailHeight :
            (GapiCustomsearchV1Model.Result.Image.t, int) GapiLens.t
          val thumbnailLink :
            (GapiCustomsearchV1Model.Result.Image.t, string) GapiLens.t
          val thumbnailWidth :
            (GapiCustomsearchV1Model.Result.Image.t, int) GapiLens.t
          val width :
            (GapiCustomsearchV1Model.Result.Image.t, int) GapiLens.t
          val empty : GapiCustomsearchV1Model.Result.Image.t
          val render :
            GapiCustomsearchV1Model.Result.Image.t ->
            GapiJson.json_data_model list
          val parse :
            GapiCustomsearchV1Model.Result.Image.t ->
            GapiJson.json_data_model ->
            GapiCustomsearchV1Model.Result.Image.t
        end
      type t = {
        cacheId : string;
        displayLink : string;
        fileFormat : string;
        formattedUrl : string;
        htmlFormattedUrl : string;
        htmlSnippet : string;
        htmlTitle : string;
        image : GapiCustomsearchV1Model.Result.Image.t;
        kind : string;
        labels : GapiCustomsearchV1Model.Result.Labels.t list;
        link : string;
        mime : string;
        pagemap : (string * (string * string) list list) list;
        snippet : string;
        title : string;
      }
      val cacheId : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val displayLink : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val fileFormat : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val formattedUrl :
        (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val htmlFormattedUrl :
        (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val htmlSnippet : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val htmlTitle : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val image :
        (GapiCustomsearchV1Model.Result.t,
         GapiCustomsearchV1Model.Result.Image.t)
        GapiLens.t
      val kind : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val labels :
        (GapiCustomsearchV1Model.Result.t,
         GapiCustomsearchV1Model.Result.Labels.t list)
        GapiLens.t
      val link : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val mime : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val pagemap :
        (GapiCustomsearchV1Model.Result.t,
         (string * (string * string) list list) list)
        GapiLens.t
      val snippet : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val title : (GapiCustomsearchV1Model.Result.t, string) GapiLens.t
      val empty : GapiCustomsearchV1Model.Result.t
      val render :
        GapiCustomsearchV1Model.Result.t -> GapiJson.json_data_model list
      val parse :
        GapiCustomsearchV1Model.Result.t ->
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Result.t
      val to_data_model :
        GapiCustomsearchV1Model.Result.t -> GapiJson.json_data_model
      val of_data_model :
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Result.t
    end
  module Promotion :
    sig
      module Image :
        sig
          type t = { height : int; source : string; width : int; }
          val height :
            (GapiCustomsearchV1Model.Promotion.Image.t, int) GapiLens.t
          val source :
            (GapiCustomsearchV1Model.Promotion.Image.t, string) GapiLens.t
          val width :
            (GapiCustomsearchV1Model.Promotion.Image.t, int) GapiLens.t
          val empty : GapiCustomsearchV1Model.Promotion.Image.t
          val render :
            GapiCustomsearchV1Model.Promotion.Image.t ->
            GapiJson.json_data_model list
          val parse :
            GapiCustomsearchV1Model.Promotion.Image.t ->
            GapiJson.json_data_model ->
            GapiCustomsearchV1Model.Promotion.Image.t
        end
      module BodyLines :
        sig
          type t = {
            htmlTitle : string;
            link : string;
            title : string;
            url : string;
          }
          val htmlTitle :
            (GapiCustomsearchV1Model.Promotion.BodyLines.t, string)
            GapiLens.t
          val link :
            (GapiCustomsearchV1Model.Promotion.BodyLines.t, string)
            GapiLens.t
          val title :
            (GapiCustomsearchV1Model.Promotion.BodyLines.t, string)
            GapiLens.t
          val url :
            (GapiCustomsearchV1Model.Promotion.BodyLines.t, string)
            GapiLens.t
          val empty : GapiCustomsearchV1Model.Promotion.BodyLines.t
          val render :
            GapiCustomsearchV1Model.Promotion.BodyLines.t ->
            GapiJson.json_data_model list
          val parse :
            GapiCustomsearchV1Model.Promotion.BodyLines.t ->
            GapiJson.json_data_model ->
            GapiCustomsearchV1Model.Promotion.BodyLines.t
        end
      type t = {
        bodyLines : GapiCustomsearchV1Model.Promotion.BodyLines.t list;
        displayLink : string;
        htmlTitle : string;
        image : GapiCustomsearchV1Model.Promotion.Image.t;
        link : string;
        title : string;
      }
      val bodyLines :
        (GapiCustomsearchV1Model.Promotion.t,
         GapiCustomsearchV1Model.Promotion.BodyLines.t list)
        GapiLens.t
      val displayLink :
        (GapiCustomsearchV1Model.Promotion.t, string) GapiLens.t
      val htmlTitle :
        (GapiCustomsearchV1Model.Promotion.t, string) GapiLens.t
      val image :
        (GapiCustomsearchV1Model.Promotion.t,
         GapiCustomsearchV1Model.Promotion.Image.t)
        GapiLens.t
      val link : (GapiCustomsearchV1Model.Promotion.t, string) GapiLens.t
      val title : (GapiCustomsearchV1Model.Promotion.t, string) GapiLens.t
      val empty : GapiCustomsearchV1Model.Promotion.t
      val render :
        GapiCustomsearchV1Model.Promotion.t -> GapiJson.json_data_model list
      val parse :
        GapiCustomsearchV1Model.Promotion.t ->
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Promotion.t
      val to_data_model :
        GapiCustomsearchV1Model.Promotion.t -> GapiJson.json_data_model
      val of_data_model :
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Promotion.t
    end
  module Search :
    sig
      module Url :
        sig
          type t = { template : string; _type : string; }
          val template :
            (GapiCustomsearchV1Model.Search.Url.t, string) GapiLens.t
          val _type :
            (GapiCustomsearchV1Model.Search.Url.t, string) GapiLens.t
          val empty : GapiCustomsearchV1Model.Search.Url.t
          val render :
            GapiCustomsearchV1Model.Search.Url.t ->
            GapiJson.json_data_model list
          val parse :
            GapiCustomsearchV1Model.Search.Url.t ->
            GapiJson.json_data_model -> GapiCustomsearchV1Model.Search.Url.t
        end
      module Spelling :
        sig
          type t = { correctedQuery : string; htmlCorrectedQuery : string; }
          val correctedQuery :
            (GapiCustomsearchV1Model.Search.Spelling.t, string) GapiLens.t
          val htmlCorrectedQuery :
            (GapiCustomsearchV1Model.Search.Spelling.t, string) GapiLens.t
          val empty : GapiCustomsearchV1Model.Search.Spelling.t
          val render :
            GapiCustomsearchV1Model.Search.Spelling.t ->
            GapiJson.json_data_model list
          val parse :
            GapiCustomsearchV1Model.Search.Spelling.t ->
            GapiJson.json_data_model ->
            GapiCustomsearchV1Model.Search.Spelling.t
        end
      module SearchInformation :
        sig
          type t = {
            formattedSearchTime : string;
            formattedTotalResults : string;
            searchTime : float;
            totalResults : int64;
          }
          val formattedSearchTime :
            (GapiCustomsearchV1Model.Search.SearchInformation.t, string)
            GapiLens.t
          val formattedTotalResults :
            (GapiCustomsearchV1Model.Search.SearchInformation.t, string)
            GapiLens.t
          val searchTime :
            (GapiCustomsearchV1Model.Search.SearchInformation.t, float)
            GapiLens.t
          val totalResults :
            (GapiCustomsearchV1Model.Search.SearchInformation.t, int64)
            GapiLens.t
          val empty : GapiCustomsearchV1Model.Search.SearchInformation.t
          val render :
            GapiCustomsearchV1Model.Search.SearchInformation.t ->
            GapiJson.json_data_model list
          val parse :
            GapiCustomsearchV1Model.Search.SearchInformation.t ->
            GapiJson.json_data_model ->
            GapiCustomsearchV1Model.Search.SearchInformation.t
        end
      type t = {
        context : GapiCustomsearchV1Model.Context.t;
        items : GapiCustomsearchV1Model.Result.t list;
        kind : string;
        promotions : GapiCustomsearchV1Model.Promotion.t list;
        queries : (string * GapiCustomsearchV1Model.Query.t list) list;
        searchInformation :
          GapiCustomsearchV1Model.Search.SearchInformation.t;
        spelling : GapiCustomsearchV1Model.Search.Spelling.t;
        url : GapiCustomsearchV1Model.Search.Url.t;
      }
      val context :
        (GapiCustomsearchV1Model.Search.t, GapiCustomsearchV1Model.Context.t)
        GapiLens.t
      val items :
        (GapiCustomsearchV1Model.Search.t,
         GapiCustomsearchV1Model.Result.t list)
        GapiLens.t
      val kind : (GapiCustomsearchV1Model.Search.t, string) GapiLens.t
      val promotions :
        (GapiCustomsearchV1Model.Search.t,
         GapiCustomsearchV1Model.Promotion.t list)
        GapiLens.t
      val queries :
        (GapiCustomsearchV1Model.Search.t,
         (string * GapiCustomsearchV1Model.Query.t list) list)
        GapiLens.t
      val searchInformation :
        (GapiCustomsearchV1Model.Search.t,
         GapiCustomsearchV1Model.Search.SearchInformation.t)
        GapiLens.t
      val spelling :
        (GapiCustomsearchV1Model.Search.t,
         GapiCustomsearchV1Model.Search.Spelling.t)
        GapiLens.t
      val url :
        (GapiCustomsearchV1Model.Search.t,
         GapiCustomsearchV1Model.Search.Url.t)
        GapiLens.t
      val empty : GapiCustomsearchV1Model.Search.t
      val render :
        GapiCustomsearchV1Model.Search.t -> GapiJson.json_data_model list
      val parse :
        GapiCustomsearchV1Model.Search.t ->
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Search.t
      val to_data_model :
        GapiCustomsearchV1Model.Search.t -> GapiJson.json_data_model
      val of_data_model :
        GapiJson.json_data_model -> GapiCustomsearchV1Model.Search.t
    end
end