chore: carve out IAM module (#5269)

This commit is temporarily commenting out some code that causes some
module cycles. This code will be restored after the iam module is
released and the storage library is updated as such.

This commit will be tagged:

- v0.100.1
- iam/v0.1.0

Updates: #5270
diff --git a/go.mod b/go.mod
index cd3513c..0ed6595 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,6 @@
 go 1.11
 
 require (
-	cloud.google.com/go/storage v1.18.2
 	github.com/golang/protobuf v1.5.2
 	github.com/google/go-cmp v0.5.6
 	github.com/google/martian/v3 v3.2.1
diff --git a/go.sum b/go.sum
index 4be838d..1e8e7d9 100644
--- a/go.sum
+++ b/go.sum
@@ -43,8 +43,6 @@
 cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
 cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.18.2 h1:5NQw6tOn3eMm0oE8vTkfjau18kjL79FlMjy/CHTpmoY=
-cloud.google.com/go/storage v1.18.2/go.mod h1:AiIj7BWXyhO5gGVmYJ+S8tbkCx3yb0IMjua8Aw4naVM=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
@@ -288,7 +286,6 @@
 golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
 golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -347,7 +344,6 @@
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211210111614-af8b64212486 h1:5hpz5aRr+W1erYCL5JRhSUBJRph7l9XkNveoExlrKYk=
 golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -449,7 +445,6 @@
 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
 google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
 google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
-google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E=
 google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
 google.golang.org/api v0.63.0 h1:n2bqqK895ygnBpdPDYetfy23K7fJ22wsrZKCyfuRkkA=
 google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
@@ -516,9 +511,7 @@
 google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211016002631-37fc39342514/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
diff --git a/httpreplay/cmd/httpr/integration_test.go b/httpreplay/cmd/httpr/integration_test.go
index 0b1915d..b8aed7c 100644
--- a/httpreplay/cmd/httpr/integration_test.go
+++ b/httpreplay/cmd/httpr/integration_test.go
@@ -17,215 +17,215 @@
 
 package main_test
 
-import (
-	"context"
-	"crypto/tls"
-	"crypto/x509"
-	"errors"
-	"fmt"
-	"io/ioutil"
-	"net"
-	"net/http"
-	"net/url"
-	"os"
-	"os/exec"
-	"strings"
-	"testing"
-	"time"
+// import (
+// 	"context"
+// 	"crypto/tls"
+// 	"crypto/x509"
+// 	"errors"
+// 	"fmt"
+// 	"io/ioutil"
+// 	"net"
+// 	"net/http"
+// 	"net/url"
+// 	"os"
+// 	"os/exec"
+// 	"strings"
+// 	"testing"
+// 	"time"
 
-	"cloud.google.com/go/internal/testutil"
-	"cloud.google.com/go/storage"
-	"golang.org/x/oauth2"
-	"google.golang.org/api/option"
-)
+// 	"cloud.google.com/go/internal/testutil"
+// 	"cloud.google.com/go/storage"
+// 	"golang.org/x/oauth2"
+// 	"google.golang.org/api/option"
+// )
 
-const initial = "initial state"
+// const initial = "initial state"
 
-func TestIntegration_HTTPR(t *testing.T) {
-	if testing.Short() {
-		t.Skip("Integration tests skipped in short mode")
-	}
-	if testutil.ProjID() == "" {
-		t.Fatal("set GCLOUD_TESTS_GOLANG_PROJECT_ID and GCLOUD_TESTS_GOLANG_KEY")
-	}
-	// Get a unique temporary filename.
-	f, err := ioutil.TempFile("", "httpreplay")
-	if err != nil {
-		t.Fatal(err)
-	}
-	replayFilename := f.Name()
-	if err := f.Close(); err != nil {
-		t.Fatal(err)
-	}
-	defer os.Remove(replayFilename)
+// func TestIntegration_HTTPR(t *testing.T) {
+// 	if testing.Short() {
+// 		t.Skip("Integration tests skipped in short mode")
+// 	}
+// 	if testutil.ProjID() == "" {
+// 		t.Fatal("set GCLOUD_TESTS_GOLANG_PROJECT_ID and GCLOUD_TESTS_GOLANG_KEY")
+// 	}
+// 	// Get a unique temporary filename.
+// 	f, err := ioutil.TempFile("", "httpreplay")
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	replayFilename := f.Name()
+// 	if err := f.Close(); err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	defer os.Remove(replayFilename)
 
-	if err := exec.Command("go", "build").Run(); err != nil {
-		t.Fatalf("running 'go build': %v", err)
-	}
-	defer os.Remove("./httpr")
-	want := runRecord(t, replayFilename)
-	got := runReplay(t, replayFilename)
-	if got != want {
-		t.Fatalf("got %q, want %q", got, want)
-	}
-}
+// 	if err := exec.Command("go", "build").Run(); err != nil {
+// 		t.Fatalf("running 'go build': %v", err)
+// 	}
+// 	defer os.Remove("./httpr")
+// 	want := runRecord(t, replayFilename)
+// 	got := runReplay(t, replayFilename)
+// 	if got != want {
+// 		t.Fatalf("got %q, want %q", got, want)
+// 	}
+// }
 
-func runRecord(t *testing.T, filename string) string {
-	cmd, tr, cport, err := start("-record", filename)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer stop(t, cmd)
+// func runRecord(t *testing.T, filename string) string {
+// 	cmd, tr, cport, err := start("-record", filename)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	defer stop(t, cmd)
 
-	ctx := context.Background()
-	hc := &http.Client{
-		Transport: &oauth2.Transport{
-			Base:   tr,
-			Source: testutil.TokenSource(ctx, storage.ScopeFullControl),
-		},
-	}
-	res, err := http.Post(
-		fmt.Sprintf("http://localhost:%s/initial", cport),
-		"text/plain",
-		strings.NewReader(initial))
-	if err != nil {
-		t.Fatal(err)
-	}
-	if res.StatusCode != 200 {
-		t.Fatalf("from POST: %s", res.Status)
-	}
-	info, err := getBucketInfo(ctx, hc)
-	if err != nil {
-		t.Fatal(err)
-	}
-	return info
-}
+// 	ctx := context.Background()
+// 	hc := &http.Client{
+// 		Transport: &oauth2.Transport{
+// 			Base:   tr,
+// 			Source: testutil.TokenSource(ctx, storage.ScopeFullControl),
+// 		},
+// 	}
+// 	res, err := http.Post(
+// 		fmt.Sprintf("http://localhost:%s/initial", cport),
+// 		"text/plain",
+// 		strings.NewReader(initial))
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	if res.StatusCode != 200 {
+// 		t.Fatalf("from POST: %s", res.Status)
+// 	}
+// 	info, err := getBucketInfo(ctx, hc)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	return info
+// }
 
-func runReplay(t *testing.T, filename string) string {
-	cmd, tr, cport, err := start("-replay", filename)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer stop(t, cmd)
+// func runReplay(t *testing.T, filename string) string {
+// 	cmd, tr, cport, err := start("-replay", filename)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	defer stop(t, cmd)
 
-	hc := &http.Client{Transport: tr}
-	res, err := http.Get(fmt.Sprintf("http://localhost:%s/initial", cport))
-	if err != nil {
-		t.Fatal(err)
-	}
-	if res.StatusCode != 200 {
-		t.Fatalf("from GET: %s", res.Status)
-	}
-	bytes, err := ioutil.ReadAll(res.Body)
-	res.Body.Close()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if got, want := string(bytes), initial; got != want {
-		t.Errorf("initial: got %q, want %q", got, want)
-	}
-	info, err := getBucketInfo(context.Background(), hc)
-	if err != nil {
-		t.Fatal(err)
-	}
-	return info
-}
+// 	hc := &http.Client{Transport: tr}
+// 	res, err := http.Get(fmt.Sprintf("http://localhost:%s/initial", cport))
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	if res.StatusCode != 200 {
+// 		t.Fatalf("from GET: %s", res.Status)
+// 	}
+// 	bytes, err := ioutil.ReadAll(res.Body)
+// 	res.Body.Close()
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	if got, want := string(bytes), initial; got != want {
+// 		t.Errorf("initial: got %q, want %q", got, want)
+// 	}
+// 	info, err := getBucketInfo(context.Background(), hc)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	return info
+// }
 
-// Start the proxy binary and wait for it to come up.
-// Return a transport that talks to the proxy, as well as the control port.
-// modeFlag must be either "-record" or "-replay".
-func start(modeFlag, filename string) (*exec.Cmd, *http.Transport, string, error) {
-	pport, err := pickPort()
-	if err != nil {
-		return nil, nil, "", err
-	}
-	cport, err := pickPort()
-	if err != nil {
-		return nil, nil, "", err
-	}
-	cmd := exec.Command("./httpr", "-port", pport, "-control-port", cport, modeFlag, filename, "-debug-headers")
-	if err := cmd.Start(); err != nil {
-		return nil, nil, "", err
-	}
-	// Wait for the server to come up.
-	serverUp := false
-	for i := 0; i < 10; i++ {
-		if conn, err := net.Dial("tcp", "localhost:"+cport); err == nil {
-			conn.Close()
-			serverUp = true
-			break
-		}
-		time.Sleep(time.Second)
-	}
-	if !serverUp {
-		return nil, nil, "", errors.New("server never came up")
-	}
-	tr, err := proxyTransport(pport, cport)
-	if err != nil {
-		return nil, nil, "", err
-	}
-	return cmd, tr, cport, nil
-}
+// // Start the proxy binary and wait for it to come up.
+// // Return a transport that talks to the proxy, as well as the control port.
+// // modeFlag must be either "-record" or "-replay".
+// func start(modeFlag, filename string) (*exec.Cmd, *http.Transport, string, error) {
+// 	pport, err := pickPort()
+// 	if err != nil {
+// 		return nil, nil, "", err
+// 	}
+// 	cport, err := pickPort()
+// 	if err != nil {
+// 		return nil, nil, "", err
+// 	}
+// 	cmd := exec.Command("./httpr", "-port", pport, "-control-port", cport, modeFlag, filename, "-debug-headers")
+// 	if err := cmd.Start(); err != nil {
+// 		return nil, nil, "", err
+// 	}
+// 	// Wait for the server to come up.
+// 	serverUp := false
+// 	for i := 0; i < 10; i++ {
+// 		if conn, err := net.Dial("tcp", "localhost:"+cport); err == nil {
+// 			conn.Close()
+// 			serverUp = true
+// 			break
+// 		}
+// 		time.Sleep(time.Second)
+// 	}
+// 	if !serverUp {
+// 		return nil, nil, "", errors.New("server never came up")
+// 	}
+// 	tr, err := proxyTransport(pport, cport)
+// 	if err != nil {
+// 		return nil, nil, "", err
+// 	}
+// 	return cmd, tr, cport, nil
+// }
 
-func stop(t *testing.T, cmd *exec.Cmd) {
-	if err := cmd.Process.Signal(os.Interrupt); err != nil {
-		t.Fatal(err)
-	}
-}
+// func stop(t *testing.T, cmd *exec.Cmd) {
+// 	if err := cmd.Process.Signal(os.Interrupt); err != nil {
+// 		t.Fatal(err)
+// 	}
+// }
 
-// pickPort picks an unused port.
-func pickPort() (string, error) {
-	l, err := net.Listen("tcp", ":0")
-	if err != nil {
-		return "", err
-	}
-	addr := l.Addr().String()
-	_, port, err := net.SplitHostPort(addr)
-	if err != nil {
-		return "", err
-	}
-	l.Close()
-	return port, nil
-}
+// // pickPort picks an unused port.
+// func pickPort() (string, error) {
+// 	l, err := net.Listen("tcp", ":0")
+// 	if err != nil {
+// 		return "", err
+// 	}
+// 	addr := l.Addr().String()
+// 	_, port, err := net.SplitHostPort(addr)
+// 	if err != nil {
+// 		return "", err
+// 	}
+// 	l.Close()
+// 	return port, nil
+// }
 
-func proxyTransport(pport, cport string) (*http.Transport, error) {
-	caCert, err := getBody(fmt.Sprintf("http://localhost:%s/authority.cer", cport))
-	if err != nil {
-		return nil, err
-	}
-	caCertPool := x509.NewCertPool()
-	if !caCertPool.AppendCertsFromPEM([]byte(caCert)) {
-		return nil, errors.New("bad CA Cert")
-	}
-	return &http.Transport{
-		Proxy:           http.ProxyURL(&url.URL{Host: "localhost:" + pport}),
-		TLSClientConfig: &tls.Config{RootCAs: caCertPool},
-	}, nil
-}
+// func proxyTransport(pport, cport string) (*http.Transport, error) {
+// 	caCert, err := getBody(fmt.Sprintf("http://localhost:%s/authority.cer", cport))
+// 	if err != nil {
+// 		return nil, err
+// 	}
+// 	caCertPool := x509.NewCertPool()
+// 	if !caCertPool.AppendCertsFromPEM([]byte(caCert)) {
+// 		return nil, errors.New("bad CA Cert")
+// 	}
+// 	return &http.Transport{
+// 		Proxy:           http.ProxyURL(&url.URL{Host: "localhost:" + pport}),
+// 		TLSClientConfig: &tls.Config{RootCAs: caCertPool},
+// 	}, nil
+// }
 
-func getBucketInfo(ctx context.Context, hc *http.Client) (string, error) {
-	client, err := storage.NewClient(ctx, option.WithHTTPClient(hc))
-	if err != nil {
-		return "", err
-	}
-	defer client.Close()
-	b := client.Bucket(testutil.ProjID())
-	attrs, err := b.Attrs(ctx)
-	if err != nil {
-		return "", err
-	}
-	return fmt.Sprintf("name:%s reqpays:%v location:%s sclass:%s",
-		attrs.Name, attrs.RequesterPays, attrs.Location, attrs.StorageClass), nil
-}
+// func getBucketInfo(ctx context.Context, hc *http.Client) (string, error) {
+// 	client, err := storage.NewClient(ctx, option.WithHTTPClient(hc))
+// 	if err != nil {
+// 		return "", err
+// 	}
+// 	defer client.Close()
+// 	b := client.Bucket(testutil.ProjID())
+// 	attrs, err := b.Attrs(ctx)
+// 	if err != nil {
+// 		return "", err
+// 	}
+// 	return fmt.Sprintf("name:%s reqpays:%v location:%s sclass:%s",
+// 		attrs.Name, attrs.RequesterPays, attrs.Location, attrs.StorageClass), nil
+// }
 
-func getBody(url string) ([]byte, error) {
-	res, err := http.Get(url)
-	if err != nil {
-		return nil, err
-	}
-	if res.StatusCode != 200 {
-		return nil, fmt.Errorf("response: %s", res.Status)
-	}
-	defer res.Body.Close()
-	return ioutil.ReadAll(res.Body)
-}
+// func getBody(url string) ([]byte, error) {
+// 	res, err := http.Get(url)
+// 	if err != nil {
+// 		return nil, err
+// 	}
+// 	if res.StatusCode != 200 {
+// 		return nil, fmt.Errorf("response: %s", res.Status)
+// 	}
+// 	defer res.Body.Close()
+// 	return ioutil.ReadAll(res.Body)
+// }
diff --git a/httpreplay/httpreplay_test.go b/httpreplay/httpreplay_test.go
index 3b3252b..43e8c3f 100644
--- a/httpreplay/httpreplay_test.go
+++ b/httpreplay/httpreplay_test.go
@@ -14,411 +14,411 @@
 
 package httpreplay_test
 
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net/http"
-	"net/http/httptest"
-	"os"
-	"path/filepath"
-	"testing"
-	"time"
+// import (
+// 	"bytes"
+// 	"context"
+// 	"encoding/json"
+// 	"fmt"
+// 	"io"
+// 	"io/ioutil"
+// 	"log"
+// 	"net/http"
+// 	"net/http/httptest"
+// 	"os"
+// 	"path/filepath"
+// 	"testing"
+// 	"time"
 
-	"cloud.google.com/go/httpreplay"
-	"cloud.google.com/go/internal/testutil"
-	"cloud.google.com/go/storage"
-	"google.golang.org/api/option"
-)
+// 	"cloud.google.com/go/httpreplay"
+// 	"cloud.google.com/go/internal/testutil"
+// 	"cloud.google.com/go/storage"
+// 	"google.golang.org/api/option"
+// )
 
-const (
-	compressedFile   = "httpreplay_compressed.txt"
-	uncompressedFile = "httpreplay_uncompressed.txt"
-)
+// const (
+// 	compressedFile   = "httpreplay_compressed.txt"
+// 	uncompressedFile = "httpreplay_uncompressed.txt"
+// )
 
-func TestIntegration_RecordAndReplay(t *testing.T) {
-	httpreplay.DebugHeaders()
-	if testing.Short() {
-		t.Skip("Integration tests skipped in short mode")
-	}
-	replayFilename := tempFilename(t, "RecordAndReplay*.replay")
-	defer os.Remove(replayFilename)
-	projectID := testutil.ProjID()
-	if projectID == "" {
-		t.Skip("Need project ID. See CONTRIBUTING.md for details.")
-	}
-	ctx := context.Background()
-	cleanup, err := setup(ctx)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer cleanup()
+// func TestIntegration_RecordAndReplay(t *testing.T) {
+// 	httpreplay.DebugHeaders()
+// 	if testing.Short() {
+// 		t.Skip("Integration tests skipped in short mode")
+// 	}
+// 	replayFilename := tempFilename(t, "RecordAndReplay*.replay")
+// 	defer os.Remove(replayFilename)
+// 	projectID := testutil.ProjID()
+// 	if projectID == "" {
+// 		t.Skip("Need project ID. See CONTRIBUTING.md for details.")
+// 	}
+// 	ctx := context.Background()
+// 	cleanup, err := setup(ctx)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	defer cleanup()
 
-	// Record.
-	initial := time.Now()
-	ibytes, err := json.Marshal(initial)
-	if err != nil {
-		t.Fatal(err)
-	}
-	rec, err := httpreplay.NewRecorder(replayFilename, ibytes)
-	if err != nil {
-		t.Fatal(err)
-	}
-	hc, err := rec.Client(ctx, option.WithTokenSource(
-		testutil.TokenSource(ctx, storage.ScopeFullControl)))
-	if err != nil {
-		t.Fatal(err)
-	}
-	wanta, wantc := run(t, hc)
-	testReadCRC(t, hc, "recording")
-	if err := rec.Close(); err != nil {
-		t.Fatalf("rec.Close: %v", err)
-	}
+// 	// Record.
+// 	initial := time.Now()
+// 	ibytes, err := json.Marshal(initial)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	rec, err := httpreplay.NewRecorder(replayFilename, ibytes)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	hc, err := rec.Client(ctx, option.WithTokenSource(
+// 		testutil.TokenSource(ctx, storage.ScopeFullControl)))
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	wanta, wantc := run(t, hc)
+// 	testReadCRC(t, hc, "recording")
+// 	if err := rec.Close(); err != nil {
+// 		t.Fatalf("rec.Close: %v", err)
+// 	}
 
-	// Replay.
-	rep, err := httpreplay.NewReplayer(replayFilename)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer rep.Close()
-	hc, err = rep.Client(ctx)
-	if err != nil {
-		t.Fatal(err)
-	}
-	gota, gotc := run(t, hc)
-	testReadCRC(t, hc, "replaying")
+// 	// Replay.
+// 	rep, err := httpreplay.NewReplayer(replayFilename)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	defer rep.Close()
+// 	hc, err = rep.Client(ctx)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	gota, gotc := run(t, hc)
+// 	testReadCRC(t, hc, "replaying")
 
-	if diff := testutil.Diff(gota, wanta); diff != "" {
-		t.Error(diff)
-	}
-	if !bytes.Equal(gotc, wantc) {
-		t.Errorf("got %q, want %q", gotc, wantc)
-	}
-	var gotInitial time.Time
-	if err := json.Unmarshal(rep.Initial(), &gotInitial); err != nil {
-		t.Fatal(err)
-	}
-	if !gotInitial.Equal(initial) {
-		t.Errorf("initial: got %v, want %v", gotInitial, initial)
-	}
-}
+// 	if diff := testutil.Diff(gota, wanta); diff != "" {
+// 		t.Error(diff)
+// 	}
+// 	if !bytes.Equal(gotc, wantc) {
+// 		t.Errorf("got %q, want %q", gotc, wantc)
+// 	}
+// 	var gotInitial time.Time
+// 	if err := json.Unmarshal(rep.Initial(), &gotInitial); err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	if !gotInitial.Equal(initial) {
+// 		t.Errorf("initial: got %v, want %v", gotInitial, initial)
+// 	}
+// }
 
-func setup(ctx context.Context) (cleanup func(), err error) {
-	ts := testutil.TokenSource(ctx, storage.ScopeFullControl)
-	client, err := storage.NewClient(ctx, option.WithTokenSource(ts))
-	if err != nil {
-		return nil, err
-	}
-	bucket := testutil.ProjID()
+// func setup(ctx context.Context) (cleanup func(), err error) {
+// 	ts := testutil.TokenSource(ctx, storage.ScopeFullControl)
+// 	client, err := storage.NewClient(ctx, option.WithTokenSource(ts))
+// 	if err != nil {
+// 		return nil, err
+// 	}
+// 	bucket := testutil.ProjID()
 
-	// upload compressed object
-	f1, err := os.Open(filepath.Join("internal", "testdata", "compressed.txt"))
-	if err != nil {
-		return nil, err
-	}
-	defer f1.Close()
-	w := client.Bucket(bucket).Object(compressedFile).NewWriter(ctx)
-	w.ContentEncoding = "gzip"
-	w.ContentType = "text/plain"
-	if _, err = io.Copy(w, f1); err != nil {
-		return nil, err
-	}
-	if err := w.Close(); err != nil {
-		return nil, err
-	}
-	// upload uncompressed object
-	f2, err := os.Open(filepath.Join("internal", "testdata", "uncompressed.txt"))
-	if err != nil {
-		return nil, err
-	}
-	defer f2.Close()
-	w = client.Bucket(testutil.ProjID()).Object(uncompressedFile).NewWriter(ctx)
-	if _, err = io.Copy(w, f2); err != nil {
-		return nil, err
-	}
-	if err := w.Close(); err != nil {
-		return nil, err
-	}
-	return func() {
-		client.Bucket(bucket).Object(compressedFile).Delete(ctx)
-		client.Bucket(bucket).Object(uncompressedFile).Delete(ctx)
-		client.Close()
-	}, nil
-}
+// 	// upload compressed object
+// 	f1, err := os.Open(filepath.Join("internal", "testdata", "compressed.txt"))
+// 	if err != nil {
+// 		return nil, err
+// 	}
+// 	defer f1.Close()
+// 	w := client.Bucket(bucket).Object(compressedFile).NewWriter(ctx)
+// 	w.ContentEncoding = "gzip"
+// 	w.ContentType = "text/plain"
+// 	if _, err = io.Copy(w, f1); err != nil {
+// 		return nil, err
+// 	}
+// 	if err := w.Close(); err != nil {
+// 		return nil, err
+// 	}
+// 	// upload uncompressed object
+// 	f2, err := os.Open(filepath.Join("internal", "testdata", "uncompressed.txt"))
+// 	if err != nil {
+// 		return nil, err
+// 	}
+// 	defer f2.Close()
+// 	w = client.Bucket(testutil.ProjID()).Object(uncompressedFile).NewWriter(ctx)
+// 	if _, err = io.Copy(w, f2); err != nil {
+// 		return nil, err
+// 	}
+// 	if err := w.Close(); err != nil {
+// 		return nil, err
+// 	}
+// 	return func() {
+// 		client.Bucket(bucket).Object(compressedFile).Delete(ctx)
+// 		client.Bucket(bucket).Object(uncompressedFile).Delete(ctx)
+// 		client.Close()
+// 	}, nil
+// }
 
-// TODO(jba): test errors
+// // TODO(jba): test errors
 
-func run(t *testing.T, hc *http.Client) (*storage.BucketAttrs, []byte) {
-	ctx := context.Background()
-	client, err := storage.NewClient(ctx, option.WithHTTPClient(hc))
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer client.Close()
-	b := client.Bucket(testutil.ProjID())
-	attrs, err := b.Attrs(ctx)
-	if err != nil {
-		t.Fatal(err)
-	}
-	obj := b.Object("replay-test")
-	w := obj.NewWriter(ctx)
-	data := []byte{150, 151, 152}
-	if _, err := w.Write(data); err != nil {
-		t.Fatal(err)
-	}
-	if err := w.Close(); err != nil {
-		t.Fatal(err)
-	}
+// func run(t *testing.T, hc *http.Client) (*storage.BucketAttrs, []byte) {
+// 	ctx := context.Background()
+// 	client, err := storage.NewClient(ctx, option.WithHTTPClient(hc))
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	defer client.Close()
+// 	b := client.Bucket(testutil.ProjID())
+// 	attrs, err := b.Attrs(ctx)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	obj := b.Object("replay-test")
+// 	w := obj.NewWriter(ctx)
+// 	data := []byte{150, 151, 152}
+// 	if _, err := w.Write(data); err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	if err := w.Close(); err != nil {
+// 		t.Fatal(err)
+// 	}
 
-	r, err := obj.NewReader(ctx)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer r.Close()
-	contents, err := ioutil.ReadAll(r)
-	if err != nil {
-		t.Fatal(err)
-	}
+// 	r, err := obj.NewReader(ctx)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	defer r.Close()
+// 	contents, err := ioutil.ReadAll(r)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
 
-	return attrs, contents
-}
+// 	return attrs, contents
+// }
 
-func testReadCRC(t *testing.T, hc *http.Client, mode string) {
-	ctx := context.Background()
-	client, err := storage.NewClient(ctx, option.WithHTTPClient(hc))
-	if err != nil {
-		t.Fatalf("%s: %v", mode, err)
-	}
-	defer client.Close()
+// func testReadCRC(t *testing.T, hc *http.Client, mode string) {
+// 	ctx := context.Background()
+// 	client, err := storage.NewClient(ctx, option.WithHTTPClient(hc))
+// 	if err != nil {
+// 		t.Fatalf("%s: %v", mode, err)
+// 	}
+// 	defer client.Close()
 
-	bucket := testutil.ProjID()
-	uncompressedObj := client.Bucket(bucket).Object(uncompressedFile)
-	gzippedObj := client.Bucket(bucket).Object(compressedFile)
+// 	bucket := testutil.ProjID()
+// 	uncompressedObj := client.Bucket(bucket).Object(uncompressedFile)
+// 	gzippedObj := client.Bucket(bucket).Object(compressedFile)
 
-	for _, test := range []struct {
-		desc           string
-		obj            *storage.ObjectHandle
-		offset, length int64
-		readCompressed bool // don't decompress a gzipped file
+// 	for _, test := range []struct {
+// 		desc           string
+// 		obj            *storage.ObjectHandle
+// 		offset, length int64
+// 		readCompressed bool // don't decompress a gzipped file
 
-		wantErr bool
-		wantLen int // length of contents
-	}{
-		{
-			desc:           "uncompressed, entire file",
-			obj:            uncompressedObj,
-			offset:         0,
-			length:         -1,
-			readCompressed: false,
-			wantLen:        179,
-		},
-		{
-			desc:           "uncompressed, entire file, don't decompress",
-			obj:            uncompressedObj,
-			offset:         0,
-			length:         -1,
-			readCompressed: true,
-			wantLen:        179,
-		},
-		{
-			desc:           "uncompressed, suffix",
-			obj:            uncompressedObj,
-			offset:         9,
-			length:         -1,
-			readCompressed: false,
-			wantLen:        170,
-		},
-		{
-			desc:           "uncompressed, prefix",
-			obj:            uncompressedObj,
-			offset:         0,
-			length:         18,
-			readCompressed: false,
-			wantLen:        18,
-		},
-		{
-			// When a gzipped file is unzipped by GCS, we can't verify the checksum
-			// because it was computed against the zipped contents. There is no
-			// header that indicates that a gzipped file is being served unzipped.
-			// But our CRC check only happens if there is a Content-Length header,
-			// and that header is absent for this read.
-			desc:           "compressed, entire file, server unzips",
-			obj:            gzippedObj,
-			offset:         0,
-			length:         -1,
-			readCompressed: false,
-			wantLen:        179,
-		},
-		{
-			// When we read a gzipped file uncompressed, it's like reading a regular file:
-			// the served content and the CRC match.
-			desc:           "compressed, entire file, read compressed",
-			obj:            gzippedObj,
-			offset:         0,
-			length:         -1,
-			readCompressed: true,
-			wantLen:        128,
-		},
-		{
-			desc:           "compressed, partial, read compressed",
-			obj:            gzippedObj,
-			offset:         1,
-			length:         8,
-			readCompressed: true,
-			wantLen:        8,
-		},
-		{
-			desc:    "uncompressed, HEAD",
-			obj:     uncompressedObj,
-			offset:  0,
-			length:  0,
-			wantLen: 0,
-		},
-		{
-			desc:    "compressed, HEAD",
-			obj:     gzippedObj,
-			offset:  0,
-			length:  0,
-			wantLen: 0,
-		},
-	} {
-		obj := test.obj.ReadCompressed(test.readCompressed)
-		r, err := obj.NewRangeReader(ctx, test.offset, test.length)
-		if err != nil {
-			if test.wantErr {
-				continue
-			}
-			t.Errorf("%s: %s: %v", mode, test.desc, err)
-			continue
-		}
-		data, err := ioutil.ReadAll(r)
-		_ = r.Close()
-		if err != nil {
-			t.Errorf("%s: %s: %v", mode, test.desc, err)
-			continue
-		}
-		if got, want := len(data), test.wantLen; got != want {
-			t.Errorf("%s: %s: len: got %d, want %d", mode, test.desc, got, want)
-		}
-	}
-}
+// 		wantErr bool
+// 		wantLen int // length of contents
+// 	}{
+// 		{
+// 			desc:           "uncompressed, entire file",
+// 			obj:            uncompressedObj,
+// 			offset:         0,
+// 			length:         -1,
+// 			readCompressed: false,
+// 			wantLen:        179,
+// 		},
+// 		{
+// 			desc:           "uncompressed, entire file, don't decompress",
+// 			obj:            uncompressedObj,
+// 			offset:         0,
+// 			length:         -1,
+// 			readCompressed: true,
+// 			wantLen:        179,
+// 		},
+// 		{
+// 			desc:           "uncompressed, suffix",
+// 			obj:            uncompressedObj,
+// 			offset:         9,
+// 			length:         -1,
+// 			readCompressed: false,
+// 			wantLen:        170,
+// 		},
+// 		{
+// 			desc:           "uncompressed, prefix",
+// 			obj:            uncompressedObj,
+// 			offset:         0,
+// 			length:         18,
+// 			readCompressed: false,
+// 			wantLen:        18,
+// 		},
+// 		{
+// 			// When a gzipped file is unzipped by GCS, we can't verify the checksum
+// 			// because it was computed against the zipped contents. There is no
+// 			// header that indicates that a gzipped file is being served unzipped.
+// 			// But our CRC check only happens if there is a Content-Length header,
+// 			// and that header is absent for this read.
+// 			desc:           "compressed, entire file, server unzips",
+// 			obj:            gzippedObj,
+// 			offset:         0,
+// 			length:         -1,
+// 			readCompressed: false,
+// 			wantLen:        179,
+// 		},
+// 		{
+// 			// When we read a gzipped file uncompressed, it's like reading a regular file:
+// 			// the served content and the CRC match.
+// 			desc:           "compressed, entire file, read compressed",
+// 			obj:            gzippedObj,
+// 			offset:         0,
+// 			length:         -1,
+// 			readCompressed: true,
+// 			wantLen:        128,
+// 		},
+// 		{
+// 			desc:           "compressed, partial, read compressed",
+// 			obj:            gzippedObj,
+// 			offset:         1,
+// 			length:         8,
+// 			readCompressed: true,
+// 			wantLen:        8,
+// 		},
+// 		{
+// 			desc:    "uncompressed, HEAD",
+// 			obj:     uncompressedObj,
+// 			offset:  0,
+// 			length:  0,
+// 			wantLen: 0,
+// 		},
+// 		{
+// 			desc:    "compressed, HEAD",
+// 			obj:     gzippedObj,
+// 			offset:  0,
+// 			length:  0,
+// 			wantLen: 0,
+// 		},
+// 	} {
+// 		obj := test.obj.ReadCompressed(test.readCompressed)
+// 		r, err := obj.NewRangeReader(ctx, test.offset, test.length)
+// 		if err != nil {
+// 			if test.wantErr {
+// 				continue
+// 			}
+// 			t.Errorf("%s: %s: %v", mode, test.desc, err)
+// 			continue
+// 		}
+// 		data, err := ioutil.ReadAll(r)
+// 		_ = r.Close()
+// 		if err != nil {
+// 			t.Errorf("%s: %s: %v", mode, test.desc, err)
+// 			continue
+// 		}
+// 		if got, want := len(data), test.wantLen; got != want {
+// 			t.Errorf("%s: %s: len: got %d, want %d", mode, test.desc, got, want)
+// 		}
+// 	}
+// }
 
-func TestRemoveAndClear(t *testing.T) {
-	// Disable logging for this test, since it generates a lot.
-	log.SetOutput(ioutil.Discard)
-	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
-		fmt.Fprintln(w, "LGTM")
-	}))
-	defer srv.Close()
+// func TestRemoveAndClear(t *testing.T) {
+// 	// Disable logging for this test, since it generates a lot.
+// 	log.SetOutput(ioutil.Discard)
+// 	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
+// 		fmt.Fprintln(w, "LGTM")
+// 	}))
+// 	defer srv.Close()
 
-	replayFilename := tempFilename(t, "TestRemoveAndClear*.replay")
-	defer os.Remove(replayFilename)
+// 	replayFilename := tempFilename(t, "TestRemoveAndClear*.replay")
+// 	defer os.Remove(replayFilename)
 
-	ctx := context.Background()
-	// Record
-	rec, err := httpreplay.NewRecorder(replayFilename, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	rec.ClearHeaders("Clear")
-	rec.RemoveRequestHeaders("Rem*")
-	rec.ClearQueryParams("c")
-	rec.RemoveQueryParams("r")
-	hc, err := rec.Client(ctx, option.WithoutAuthentication())
-	if err != nil {
-		t.Fatal(err)
-	}
-	query := "k=1&r=2&c=3"
-	req, err := http.NewRequest("GET", srv.URL+"?"+query, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	headers := map[string]string{"Keep": "ok", "Clear": "secret", "Remove": "bye"}
-	for k, v := range headers {
-		req.Header.Set(k, v)
-	}
-	if _, err := hc.Do(req); err != nil {
-		t.Fatal(err)
-	}
-	if err := rec.Close(); err != nil {
-		t.Fatal(err)
-	}
+// 	ctx := context.Background()
+// 	// Record
+// 	rec, err := httpreplay.NewRecorder(replayFilename, nil)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	rec.ClearHeaders("Clear")
+// 	rec.RemoveRequestHeaders("Rem*")
+// 	rec.ClearQueryParams("c")
+// 	rec.RemoveQueryParams("r")
+// 	hc, err := rec.Client(ctx, option.WithoutAuthentication())
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	query := "k=1&r=2&c=3"
+// 	req, err := http.NewRequest("GET", srv.URL+"?"+query, nil)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	headers := map[string]string{"Keep": "ok", "Clear": "secret", "Remove": "bye"}
+// 	for k, v := range headers {
+// 		req.Header.Set(k, v)
+// 	}
+// 	if _, err := hc.Do(req); err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	if err := rec.Close(); err != nil {
+// 		t.Fatal(err)
+// 	}
 
-	// Replay
-	// For both headers and query param:
-	// - k or Keep must be present and identical
-	// - c or Clear must be present, but can be different
-	// - r or Remove can be anything
-	for _, test := range []struct {
-		query       string
-		headers     map[string]string
-		wantSuccess bool
-	}{
-		{query, headers, true}, // same query string and headers
-		{query,
-			map[string]string{"Keep": "oops", "Clear": "secret", "Remove": "bye"},
-			false, // different Keep
-		},
-		{query, map[string]string{}, false},                               // missing Keep and Clear
-		{query, map[string]string{"Keep": "ok"}, false},                   // missing Clear
-		{query, map[string]string{"Keep": "ok", "Clear": "secret"}, true}, // missing Remove is OK
-		{
-			query,
-			map[string]string{"Keep": "ok", "Clear": "secret", "Remove": "whatev"},
-			true,
-		}, // different Remove is OK
-		{query, map[string]string{"Keep": "ok", "Clear": "diff"}, true}, // different Clear is OK
-		{"", headers, false},            // no query string
-		{"k=x&r=2&c=3", headers, false}, // different k
-		{"r=2", headers, false},         // missing k and c
-		{"k=1&r=2", headers, false},     // missing c
-		{"k=1&c=3", headers, true},      // missing r is OK
-		{"k=1&r=x&c=3", headers, true},  // different r is OK,
-		{"k=1&r=2&c=x", headers, true},  // different clear is OK
-	} {
-		rep, err := httpreplay.NewReplayer(replayFilename)
-		if err != nil {
-			t.Fatal(err)
-		}
-		hc, err = rep.Client(ctx)
-		if err != nil {
-			t.Fatal(err)
-		}
-		url := srv.URL
-		if test.query != "" {
-			url += "?" + test.query
-		}
-		req, err = http.NewRequest("GET", url, nil)
-		if err != nil {
-			t.Fatal(err)
-		}
-		for k, v := range test.headers {
-			req.Header.Set(k, v)
-		}
-		resp, err := hc.Do(req)
-		if err != nil {
-			t.Fatal(err)
-		}
-		rep.Close()
-		if (resp.StatusCode == 200) != test.wantSuccess {
-			t.Errorf("%q, %v: got %d, wanted success=%t",
-				test.query, test.headers, resp.StatusCode, test.wantSuccess)
-		}
-	}
-}
+// 	// Replay
+// 	// For both headers and query param:
+// 	// - k or Keep must be present and identical
+// 	// - c or Clear must be present, but can be different
+// 	// - r or Remove can be anything
+// 	for _, test := range []struct {
+// 		query       string
+// 		headers     map[string]string
+// 		wantSuccess bool
+// 	}{
+// 		{query, headers, true}, // same query string and headers
+// 		{query,
+// 			map[string]string{"Keep": "oops", "Clear": "secret", "Remove": "bye"},
+// 			false, // different Keep
+// 		},
+// 		{query, map[string]string{}, false},                               // missing Keep and Clear
+// 		{query, map[string]string{"Keep": "ok"}, false},                   // missing Clear
+// 		{query, map[string]string{"Keep": "ok", "Clear": "secret"}, true}, // missing Remove is OK
+// 		{
+// 			query,
+// 			map[string]string{"Keep": "ok", "Clear": "secret", "Remove": "whatev"},
+// 			true,
+// 		}, // different Remove is OK
+// 		{query, map[string]string{"Keep": "ok", "Clear": "diff"}, true}, // different Clear is OK
+// 		{"", headers, false},            // no query string
+// 		{"k=x&r=2&c=3", headers, false}, // different k
+// 		{"r=2", headers, false},         // missing k and c
+// 		{"k=1&r=2", headers, false},     // missing c
+// 		{"k=1&c=3", headers, true},      // missing r is OK
+// 		{"k=1&r=x&c=3", headers, true},  // different r is OK,
+// 		{"k=1&r=2&c=x", headers, true},  // different clear is OK
+// 	} {
+// 		rep, err := httpreplay.NewReplayer(replayFilename)
+// 		if err != nil {
+// 			t.Fatal(err)
+// 		}
+// 		hc, err = rep.Client(ctx)
+// 		if err != nil {
+// 			t.Fatal(err)
+// 		}
+// 		url := srv.URL
+// 		if test.query != "" {
+// 			url += "?" + test.query
+// 		}
+// 		req, err = http.NewRequest("GET", url, nil)
+// 		if err != nil {
+// 			t.Fatal(err)
+// 		}
+// 		for k, v := range test.headers {
+// 			req.Header.Set(k, v)
+// 		}
+// 		resp, err := hc.Do(req)
+// 		if err != nil {
+// 			t.Fatal(err)
+// 		}
+// 		rep.Close()
+// 		if (resp.StatusCode == 200) != test.wantSuccess {
+// 			t.Errorf("%q, %v: got %d, wanted success=%t",
+// 				test.query, test.headers, resp.StatusCode, test.wantSuccess)
+// 		}
+// 	}
+// }
 
-func tempFilename(t *testing.T, pattern string) string {
-	f, err := ioutil.TempFile("", pattern)
-	if err != nil {
-		t.Fatal(err)
-	}
-	filename := f.Name()
-	if err := f.Close(); err != nil {
-		t.Fatal(err)
-	}
-	return filename
-}
+// func tempFilename(t *testing.T, pattern string) string {
+// 	f, err := ioutil.TempFile("", pattern)
+// 	if err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	filename := f.Name()
+// 	if err := f.Close(); err != nil {
+// 		t.Fatal(err)
+// 	}
+// 	return filename
+// }
diff --git a/iam/CHANGES.md b/iam/CHANGES.md
new file mode 100644
index 0000000..deca87d
--- /dev/null
+++ b/iam/CHANGES.md
@@ -0,0 +1,6 @@
+# Changes
+
+## v0.1.0
+
+This is the first tag to carve out iam as its own module. See
+[Add a module to a multi-module repository](https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository).
diff --git a/iam/README.md b/iam/README.md
new file mode 100644
index 0000000..0072cc9
--- /dev/null
+++ b/iam/README.md
@@ -0,0 +1,40 @@
+# IAM API
+
+[![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/iam.svg)](https://pkg.go.dev/cloud.google.com/go/iam)
+
+Go Client Library for IAM API.
+
+## Install
+
+```bash
+go get cloud.google.com/go/iam
+```
+
+## Stability
+
+The stability of this module is indicated by SemVer.
+
+However, a `v1+` module may have breaking changes in two scenarios:
+
+* Packages with `alpha` or `beta` in the import path
+* The GoDoc has an explicit stability disclaimer (for example, for an experimental feature).
+
+## Go Version Support
+
+See the [Go Versions Supported](https://github.com/googleapis/google-cloud-go#go-versions-supported)
+section in the root directory's README.
+
+## Authorization
+
+See the [Authorization](https://github.com/googleapis/google-cloud-go#authorization)
+section in the root directory's README.
+
+## Contributing
+
+Contributions are welcome. Please, see the [CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md)
+document for details.
+
+Please note that this project is released with a Contributor Code of Conduct.
+By participating in this project you agree to abide by its terms. See
+[Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md#contributor-code-of-conduct)
+for more information.
diff --git a/iam/go.mod b/iam/go.mod
new file mode 100644
index 0000000..7ab14bf
--- /dev/null
+++ b/iam/go.mod
@@ -0,0 +1,12 @@
+module cloud.google.com/go/iam
+
+go 1.11
+
+require (
+	cloud.google.com/go v0.100.1
+	github.com/golang/protobuf v1.5.2
+	github.com/googleapis/gax-go/v2 v2.1.1
+	google.golang.org/api v0.63.0
+	google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c
+	google.golang.org/grpc v1.40.1
+)
diff --git a/iam/go.sum b/iam/go.sum
new file mode 100644
index 0000000..4a68541
--- /dev/null
+++ b/iam/go.sum
@@ -0,0 +1,200 @@
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed h1:OZmjad4L3H8ncOIR8rnb5MREYqG8ixi5+WbeUsquF0c=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0 h1:dulLQAYQFYtG5MTplgNGHWuV2D+OBD+Z8lmDBmbLg+s=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
+github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
+github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
+github.com/googleapis/gax-go/v2 v2.1.1 h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU=
+github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk=
+golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211210111614-af8b64212486 h1:5hpz5aRr+W1erYCL5JRhSUBJRph7l9XkNveoExlrKYk=
+golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
+google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
+google.golang.org/api v0.63.0 h1:n2bqqK895ygnBpdPDYetfy23K7fJ22wsrZKCyfuRkkA=
+google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c h1:c5afAQ+F8m49fzDEIKvD7o/D350YjVseBMjtoKL1xsg=
+google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.40.1 h1:pnP7OclFFFgFi4VHQDQDaoXUVauOFyktqTsqqgzFKbc=
+google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/iam/go_mod_tidy_hack.go b/iam/go_mod_tidy_hack.go
new file mode 100644
index 0000000..fbdd65f
--- /dev/null
+++ b/iam/go_mod_tidy_hack.go
@@ -0,0 +1,22 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This file, and the cloud.google.com/go import, won't actually become part of
+// the resultant binary.
+// +build modhack
+
+package iam
+
+// Necessary for safely adding multi-module repo. See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
+import _ "cloud.google.com/go"