Browse Source

*: replace grpc-gateway endpoint with stable /v3

Sam Batschelet 7 years ago
parent
commit
488ee99ae8

+ 17 - 17
Documentation/dev-guide/api_grpc_gateway.md

@@ -10,7 +10,7 @@ The gateway accepts a [JSON mapping][json-mapping] for etcd's [protocol buffer][
 
 
 ### Put and get keys
 ### Put and get keys
 
 
-Use the `/v3beta/kv/range` and `/v3beta/kv/put` services to read and write keys:
+Use the `/v3/kv/range` and `/v3/kv/put` services to read and write keys:
 
 
 ```bash
 ```bash
 <<COMMENT
 <<COMMENT
@@ -19,40 +19,40 @@ foo is 'Zm9v' in Base64
 bar is 'YmFy'
 bar is 'YmFy'
 COMMENT
 COMMENT
 
 
-curl -L http://localhost:2379/v3beta/kv/put \
+curl -L http://localhost:2379/v3/kv/put \
 	-X POST -d '{"key": "Zm9v", "value": "YmFy"}'
 	-X POST -d '{"key": "Zm9v", "value": "YmFy"}'
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"3"}}
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"3"}}
 
 
-curl -L http://localhost:2379/v3beta/kv/range \
+curl -L http://localhost:2379/v3/kv/range \
 	-X POST -d '{"key": "Zm9v"}'
 	-X POST -d '{"key": "Zm9v"}'
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"3"},"kvs":[{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}],"count":"1"}
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"3"},"kvs":[{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}],"count":"1"}
 
 
 # get all keys prefixed with "foo"
 # get all keys prefixed with "foo"
-curl -L http://localhost:2379/v3beta/kv/range \
+curl -L http://localhost:2379/v3/kv/range \
 	-X POST -d '{"key": "Zm9v", "range_end": "Zm9w"}'
 	-X POST -d '{"key": "Zm9v", "range_end": "Zm9w"}'
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"3"},"kvs":[{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}],"count":"1"}
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"3"},"kvs":[{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}],"count":"1"}
 ```
 ```
 
 
 ### Watch keys
 ### Watch keys
 
 
-Use the `/v3beta/watch` service to watch keys:
+Use the `/v3/watch` service to watch keys:
 
 
 ```bash
 ```bash
-curl http://localhost:2379/v3beta/watch \
+curl http://localhost:2379/v3/watch \
         -X POST -d '{"create_request": {"key":"Zm9v"} }' &
         -X POST -d '{"create_request": {"key":"Zm9v"} }' &
 # {"result":{"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"1","raft_term":"2"},"created":true}}
 # {"result":{"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"1","raft_term":"2"},"created":true}}
 
 
-curl -L http://localhost:2379/v3beta/kv/put \
+curl -L http://localhost:2379/v3/kv/put \
 	-X POST -d '{"key": "Zm9v", "value": "YmFy"}' >/dev/null 2>&1
 	-X POST -d '{"key": "Zm9v", "value": "YmFy"}' >/dev/null 2>&1
 # {"result":{"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"2"},"events":[{"kv":{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}}]}}
 # {"result":{"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"2"},"events":[{"kv":{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}}]}}
 ```
 ```
 
 
 ### Transactions
 ### Transactions
 
 
-Issue a transaction with `/v3beta/kv/txn`:
+Issue a transaction with `/v3/kv/txn`:
 
 
 ```bash
 ```bash
-curl -L http://localhost:2379/v3beta/kv/txn \
+curl -L http://localhost:2379/v3/kv/txn \
 	-X POST \
 	-X POST \
 	-d '{"compare":[{"target":"CREATE","key":"Zm9v","createRevision":"2"}],"success":[{"requestPut":{"key":"Zm9v","value":"YmFy"}}]}'
 	-d '{"compare":[{"target":"CREATE","key":"Zm9v","createRevision":"2"}],"success":[{"requestPut":{"key":"Zm9v","value":"YmFy"}}]}'
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"3","raft_term":"2"},"succeeded":true,"responses":[{"response_put":{"header":{"revision":"3"}}}]}
 # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"3","raft_term":"2"},"succeeded":true,"responses":[{"response_put":{"header":{"revision":"3"}}}]}
@@ -60,34 +60,34 @@ curl -L http://localhost:2379/v3beta/kv/txn \
 
 
 ### Authentication
 ### Authentication
 
 
-Set up authentication with the `/v3beta/auth` service:
+Set up authentication with the `/v3/auth` service:
 
 
 ```bash
 ```bash
 # create root user
 # create root user
-curl -L http://localhost:2379/v3beta/auth/user/add \
+curl -L http://localhost:2379/v3/auth/user/add \
 	-X POST -d '{"name": "root", "password": "pass"}'
 	-X POST -d '{"name": "root", "password": "pass"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 
 
 # create root role
 # create root role
-curl -L http://localhost:2379/v3beta/auth/role/add \
+curl -L http://localhost:2379/v3/auth/role/add \
 	-X POST -d '{"name": "root"}'
 	-X POST -d '{"name": "root"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 
 
 # grant root role
 # grant root role
-curl -L http://localhost:2379/v3beta/auth/user/grant \
+curl -L http://localhost:2379/v3/auth/user/grant \
 	-X POST -d '{"user": "root", "role": "root"}'
 	-X POST -d '{"user": "root", "role": "root"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 
 
 # enable auth
 # enable auth
-curl -L http://localhost:2379/v3beta/auth/enable -X POST -d '{}'
+curl -L http://localhost:2379/v3/auth/enable -X POST -d '{}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"}}
 ```
 ```
 
 
-Authenticate with etcd for an authentication token using `/v3beta/auth/authenticate`:
+Authenticate with etcd for an authentication token using `/v3/auth/authenticate`:
 
 
 ```bash
 ```bash
 # get the auth token for the root user
 # get the auth token for the root user
-curl -L http://localhost:2379/v3beta/auth/authenticate \
+curl -L http://localhost:2379/v3/auth/authenticate \
 	-X POST -d '{"name": "root", "password": "pass"}'
 	-X POST -d '{"name": "root", "password": "pass"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"},"token":"sssvIpwfnLAcWAQH.9"}
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"1","raft_term":"2"},"token":"sssvIpwfnLAcWAQH.9"}
 ```
 ```
@@ -95,7 +95,7 @@ curl -L http://localhost:2379/v3beta/auth/authenticate \
 Set the `Authorization` header to the authentication token to fetch a key using authentication credentials:
 Set the `Authorization` header to the authentication token to fetch a key using authentication credentials:
 
 
 ```bash
 ```bash
-curl -L http://localhost:2379/v3beta/kv/put \
+curl -L http://localhost:2379/v3/kv/put \
 	-H 'Authorization : sssvIpwfnLAcWAQH.9' \
 	-H 'Authorization : sssvIpwfnLAcWAQH.9' \
 	-X POST -d '{"key": "Zm9v", "value": "YmFy"}'
 	-X POST -d '{"key": "Zm9v", "value": "YmFy"}'
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"2","raft_term":"2"}}
 # {"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"2","raft_term":"2"}}

+ 37 - 37
Documentation/dev-guide/apispec/swagger/rpc.swagger.json

@@ -15,7 +15,7 @@
     "version": "version not set"
     "version": "version not set"
   },
   },
   "paths": {
   "paths": {
-    "/v3beta/auth/authenticate": {
+    "/v3/auth/authenticate": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -42,7 +42,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/disable": {
+    "/v3/auth/disable": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -69,7 +69,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/enable": {
+    "/v3/auth/enable": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -96,7 +96,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/role/add": {
+    "/v3/auth/role/add": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -123,7 +123,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/role/delete": {
+    "/v3/auth/role/delete": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -150,7 +150,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/role/get": {
+    "/v3/auth/role/get": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -177,7 +177,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/role/grant": {
+    "/v3/auth/role/grant": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -204,7 +204,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/role/list": {
+    "/v3/auth/role/list": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -231,7 +231,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/role/revoke": {
+    "/v3/auth/role/revoke": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -258,7 +258,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/user/add": {
+    "/v3/auth/user/add": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -285,7 +285,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/user/changepw": {
+    "/v3/auth/user/changepw": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -312,7 +312,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/user/delete": {
+    "/v3/auth/user/delete": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -339,7 +339,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/user/get": {
+    "/v3/auth/user/get": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -366,7 +366,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/user/grant": {
+    "/v3/auth/user/grant": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -393,7 +393,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/user/list": {
+    "/v3/auth/user/list": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -420,7 +420,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/auth/user/revoke": {
+    "/v3/auth/user/revoke": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Auth"
           "Auth"
@@ -447,7 +447,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/cluster/member/add": {
+    "/v3/cluster/member/add": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Cluster"
           "Cluster"
@@ -474,7 +474,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/cluster/member/list": {
+    "/v3/cluster/member/list": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Cluster"
           "Cluster"
@@ -501,7 +501,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/cluster/member/remove": {
+    "/v3/cluster/member/remove": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Cluster"
           "Cluster"
@@ -528,7 +528,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/cluster/member/update": {
+    "/v3/cluster/member/update": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Cluster"
           "Cluster"
@@ -555,7 +555,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/kv/compaction": {
+    "/v3/kv/compaction": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "KV"
           "KV"
@@ -582,7 +582,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/kv/deleterange": {
+    "/v3/kv/deleterange": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "KV"
           "KV"
@@ -609,7 +609,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/kv/lease/leases": {
+    "/v3/kv/lease/leases": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Lease"
           "Lease"
@@ -636,7 +636,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/kv/lease/revoke": {
+    "/v3/kv/lease/revoke": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Lease"
           "Lease"
@@ -663,7 +663,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/kv/lease/timetolive": {
+    "/v3/kv/lease/timetolive": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Lease"
           "Lease"
@@ -690,7 +690,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/kv/put": {
+    "/v3/kv/put": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "KV"
           "KV"
@@ -717,7 +717,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/kv/range": {
+    "/v3/kv/range": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "KV"
           "KV"
@@ -744,7 +744,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/kv/txn": {
+    "/v3/kv/txn": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "KV"
           "KV"
@@ -771,7 +771,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/lease/grant": {
+    "/v3/lease/grant": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Lease"
           "Lease"
@@ -798,7 +798,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/lease/keepalive": {
+    "/v3/lease/keepalive": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Lease"
           "Lease"
@@ -826,7 +826,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/maintenance/alarm": {
+    "/v3/maintenance/alarm": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Maintenance"
           "Maintenance"
@@ -853,7 +853,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/maintenance/defragment": {
+    "/v3/maintenance/defragment": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Maintenance"
           "Maintenance"
@@ -880,7 +880,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/maintenance/hash": {
+    "/v3/maintenance/hash": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Maintenance"
           "Maintenance"
@@ -907,7 +907,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/maintenance/snapshot": {
+    "/v3/maintenance/snapshot": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Maintenance"
           "Maintenance"
@@ -934,7 +934,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/maintenance/status": {
+    "/v3/maintenance/status": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Maintenance"
           "Maintenance"
@@ -961,7 +961,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/maintenance/transfer-leadership": {
+    "/v3/maintenance/transfer-leadership": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Maintenance"
           "Maintenance"
@@ -988,7 +988,7 @@
         }
         }
       }
       }
     },
     },
-    "/v3beta/watch": {
+    "/v3/watch": {
       "post": {
       "post": {
         "tags": [
         "tags": [
           "Watch"
           "Watch"

+ 5 - 5
Documentation/dev-guide/apispec/swagger/v3election.swagger.json

@@ -15,7 +15,7 @@
     "application/json"
     "application/json"
   ],
   ],
   "paths": {
   "paths": {
-    "/v3beta/election/campaign": {
+    "/v3/election/campaign": {
       "post": {
       "post": {
         "summary": "Campaign waits to acquire leadership in an election, returning a LeaderKey\nrepresenting the leadership if successful. The LeaderKey can then be used\nto issue new values on the election, transactionally guard API requests on\nleadership still being held, and resign from the election.",
         "summary": "Campaign waits to acquire leadership in an election, returning a LeaderKey\nrepresenting the leadership if successful. The LeaderKey can then be used\nto issue new values on the election, transactionally guard API requests on\nleadership still being held, and resign from the election.",
         "operationId": "Campaign",
         "operationId": "Campaign",
@@ -42,7 +42,7 @@
         ]
         ]
       }
       }
     },
     },
-    "/v3beta/election/leader": {
+    "/v3/election/leader": {
       "post": {
       "post": {
         "summary": "Leader returns the current election proclamation, if any.",
         "summary": "Leader returns the current election proclamation, if any.",
         "operationId": "Leader",
         "operationId": "Leader",
@@ -69,7 +69,7 @@
         ]
         ]
       }
       }
     },
     },
-    "/v3beta/election/observe": {
+    "/v3/election/observe": {
       "post": {
       "post": {
         "summary": "Observe streams election proclamations in-order as made by the election's\nelected leaders.",
         "summary": "Observe streams election proclamations in-order as made by the election's\nelected leaders.",
         "operationId": "Observe",
         "operationId": "Observe",
@@ -96,7 +96,7 @@
         ]
         ]
       }
       }
     },
     },
-    "/v3beta/election/proclaim": {
+    "/v3/election/proclaim": {
       "post": {
       "post": {
         "summary": "Proclaim updates the leader's posted value with a new value.",
         "summary": "Proclaim updates the leader's posted value with a new value.",
         "operationId": "Proclaim",
         "operationId": "Proclaim",
@@ -123,7 +123,7 @@
         ]
         ]
       }
       }
     },
     },
-    "/v3beta/election/resign": {
+    "/v3/election/resign": {
       "post": {
       "post": {
         "summary": "Resign releases election leadership so other campaigners may acquire\nleadership on the election.",
         "summary": "Resign releases election leadership so other campaigners may acquire\nleadership on the election.",
         "operationId": "Resign",
         "operationId": "Resign",

+ 2 - 2
Documentation/dev-guide/apispec/swagger/v3lock.swagger.json

@@ -15,7 +15,7 @@
     "application/json"
     "application/json"
   ],
   ],
   "paths": {
   "paths": {
-    "/v3beta/lock/lock": {
+    "/v3/lock/lock": {
       "post": {
       "post": {
         "summary": "Lock acquires a distributed shared lock on a given named lock.\nOn success, it will return a unique key that exists so long as the\nlock is held by the caller. This key can be used in conjunction with\ntransactions to safely ensure updates to etcd only occur while holding\nlock ownership. The lock is held until Unlock is called on the key or the\nlease associate with the owner expires.",
         "summary": "Lock acquires a distributed shared lock on a given named lock.\nOn success, it will return a unique key that exists so long as the\nlock is held by the caller. This key can be used in conjunction with\ntransactions to safely ensure updates to etcd only occur while holding\nlock ownership. The lock is held until Unlock is called on the key or the\nlease associate with the owner expires.",
         "operationId": "Lock",
         "operationId": "Lock",
@@ -42,7 +42,7 @@
         ]
         ]
       }
       }
     },
     },
-    "/v3beta/lock/unlock": {
+    "/v3/lock/unlock": {
       "post": {
       "post": {
         "summary": "Unlock takes a key returned by Lock and releases the hold on lock. The\nnext Lock caller waiting for the lock will then be woken up and given\nownership of the lock.",
         "summary": "Unlock takes a key returned by Lock and releases the hold on lock. The\nnext Lock caller waiting for the lock will then be woken up and given\nownership of the lock.",
         "operationId": "Unlock",
         "operationId": "Unlock",

+ 5 - 0
e2e/ctl_v3_test.go

@@ -53,6 +53,7 @@ func dialWithSchemeTest(cx ctlCtx) {
 
 
 type ctlCtx struct {
 type ctlCtx struct {
 	t                 *testing.T
 	t                 *testing.T
+	apiPrefix         string
 	cfg               etcdProcessClusterConfig
 	cfg               etcdProcessClusterConfig
 	quotaBackendBytes int64
 	quotaBackendBytes int64
 	corruptFunc       func(string) error
 	corruptFunc       func(string) error
@@ -121,6 +122,10 @@ func withNoStrictReconfig() ctlOption {
 	return func(cx *ctlCtx) { cx.noStrictReconfig = true }
 	return func(cx *ctlCtx) { cx.noStrictReconfig = true }
 }
 }
 
 
+func withApiPrefix(p string) ctlOption {
+	return func(cx *ctlCtx) { cx.apiPrefix = p }
+}
+
 func withFlagByEnv() ctlOption {
 func withFlagByEnv() ctlOption {
 	return func(cx *ctlCtx) { cx.envMap = make(map[string]struct{}) }
 	return func(cx *ctlCtx) { cx.envMap = make(map[string]struct{}) }
 }
 }

+ 89 - 115
e2e/v3_curl_test.go

@@ -25,43 +25,51 @@ import (
 	"github.com/grpc-ecosystem/grpc-gateway/runtime"
 	"github.com/grpc-ecosystem/grpc-gateway/runtime"
 )
 )
 
 
-// TODO: remove /v3alpha tests in 3.4 release
+// TODO: remove /v3beta tests in 3.5 release
+var apiPrefix = []string{"/v3", "/v3beta"}
 
 
-func TestV3CurlPutGetNoTLSAlpha(t *testing.T) { testCurlPutGetGRPCGateway(t, &configNoTLS, "/v3alpha") }
-func TestV3CurlPutGetNoTLSBeta(t *testing.T)  { testCurlPutGetGRPCGateway(t, &configNoTLS, "/v3beta") }
-func TestV3CurlPutGetAutoTLSAlpha(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configAutoTLS, "/v3alpha")
+func TestV3CurlPutGetNoTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configNoTLS))
+	}
 }
 }
-func TestV3CurlPutGetAutoTLSBeta(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configAutoTLS, "/v3beta")
+func TestV3CurlPutGetAutoTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configAutoTLS))
+	}
 }
 }
-func TestV3CurlPutGetAllTLSAlpha(t *testing.T) { testCurlPutGetGRPCGateway(t, &configTLS, "/v3alpha") }
-func TestV3CurlPutGetAllTLSBeta(t *testing.T)  { testCurlPutGetGRPCGateway(t, &configTLS, "/v3beta") }
-func TestV3CurlPutGetPeerTLSAlpha(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configPeerTLS, "/v3alpha")
+func TestV3CurlPutGetAllTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configTLS))
+	}
 }
 }
-func TestV3CurlPutGetPeerTLSBeta(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configPeerTLS, "/v3beta")
+func TestV3CurlPutGetPeerTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configPeerTLS))
+	}
 }
 }
-func TestV3CurlPutGetClientTLSAlpha(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configClientTLS, "/v3alpha")
+func TestV3CurlPutGetClientTLS(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlPutGet, withApiPrefix(p), withCfg(configClientTLS))
+	}
 }
 }
-func TestV3CurlPutGetClientTLSBeta(t *testing.T) {
-	testCurlPutGetGRPCGateway(t, &configClientTLS, "/v3beta")
+func TestV3CurlWatch(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlWatch, withApiPrefix(p))
+	}
 }
 }
-func testCurlPutGetGRPCGateway(t *testing.T, cfg *etcdProcessClusterConfig, pathPrefix string) {
-	defer testutil.AfterTest(t)
-
-	epc, err := newEtcdProcessCluster(cfg)
-	if err != nil {
-		t.Fatalf("could not start etcd process cluster (%v)", err)
+func TestV3CurlTxn(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlTxn, withApiPrefix(p))
 	}
 	}
-	defer func() {
-		if cerr := epc.Close(); err != nil {
-			t.Fatalf("error closing etcd processes (%v)", cerr)
-		}
-	}()
+}
+func TestV3CurlAuth(t *testing.T) {
+	for _, p := range apiPrefix {
+		testCtl(t, testV3CurlAuth, withApiPrefix(p))
+	}
+}
 
 
+func testV3CurlPutGet(cx ctlCtx) {
 	var (
 	var (
 		key   = []byte("foo")
 		key   = []byte("foo")
 		value = []byte("bar") // this will be automatically base64-encoded by Go
 		value = []byte("bar") // this will be automatically base64-encoded by Go
@@ -74,82 +82,58 @@ func testCurlPutGetGRPCGateway(t *testing.T, cfg *etcdProcessClusterConfig, path
 		Value: value,
 		Value: value,
 	})
 	})
 	if err != nil {
 	if err != nil {
-		t.Fatal(err)
+		cx.t.Fatal(err)
 	}
 	}
 	rangeData, err := json.Marshal(&pb.RangeRequest{
 	rangeData, err := json.Marshal(&pb.RangeRequest{
 		Key: key,
 		Key: key,
 	})
 	})
 	if err != nil {
 	if err != nil {
-		t.Fatal(err)
+		cx.t.Fatal(err)
 	}
 	}
 
 
-	if err := cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/put"), value: string(putData), expected: expectPut}); err != nil {
-		t.Fatalf("failed put with curl (%v)", err)
+	p := cx.apiPrefix
+
+	if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/put"), value: string(putData), expected: expectPut}); err != nil {
+		cx.t.Fatalf("failed testV3CurlPutGet put with curl using prefix (%s) (%v)", p, err)
 	}
 	}
-	if err := cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/range"), value: string(rangeData), expected: expectGet}); err != nil {
-		t.Fatalf("failed get with curl (%v)", err)
+	if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/range"), value: string(rangeData), expected: expectGet}); err != nil {
+		cx.t.Fatalf("failed testV3CurlPutGet get with curl using prefix (%s) (%v)", p, err)
 	}
 	}
-
-	if cfg.clientTLS == clientTLSAndNonTLS {
-		if err := cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/range"), value: string(rangeData), expected: expectGet, isTLS: true}); err != nil {
-			t.Fatalf("failed get with curl (%v)", err)
+	if cx.cfg.clientTLS == clientTLSAndNonTLS {
+		if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/range"), value: string(rangeData), expected: expectGet, isTLS: true}); err != nil {
+			cx.t.Fatalf("failed testV3CurlPutGet get with curl using prefix (%s) (%v)", p, err)
 		}
 		}
 	}
 	}
 }
 }
 
 
-func TestV3CurlWatchAlpha(t *testing.T) { testV3CurlWatch(t, "/v3alpha") }
-func TestV3CurlWatchBeta(t *testing.T)  { testV3CurlWatch(t, "/v3beta") }
-func testV3CurlWatch(t *testing.T, pathPrefix string) {
-	defer testutil.AfterTest(t)
-
-	epc, err := newEtcdProcessCluster(&configNoTLS)
-	if err != nil {
-		t.Fatalf("could not start etcd process cluster (%v)", err)
-	}
-	defer func() {
-		if cerr := epc.Close(); err != nil {
-			t.Fatalf("error closing etcd processes (%v)", cerr)
-		}
-	}()
-
+func testV3CurlWatch(cx ctlCtx) {
 	// store "bar" into "foo"
 	// store "bar" into "foo"
 	putreq, err := json.Marshal(&pb.PutRequest{Key: []byte("foo"), Value: []byte("bar")})
 	putreq, err := json.Marshal(&pb.PutRequest{Key: []byte("foo"), Value: []byte("bar")})
 	if err != nil {
 	if err != nil {
-		t.Fatal(err)
-	}
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/put"), value: string(putreq), expected: "revision"}); err != nil {
-		t.Fatalf("failed put with curl (%v)", err)
+		cx.t.Fatal(err)
 	}
 	}
 	// watch for first update to "foo"
 	// watch for first update to "foo"
 	wcr := &pb.WatchCreateRequest{Key: []byte("foo"), StartRevision: 1}
 	wcr := &pb.WatchCreateRequest{Key: []byte("foo"), StartRevision: 1}
 	wreq, err := json.Marshal(wcr)
 	wreq, err := json.Marshal(wcr)
 	if err != nil {
 	if err != nil {
-		t.Fatal(err)
+		cx.t.Fatal(err)
 	}
 	}
 	// marshaling the grpc to json gives:
 	// marshaling the grpc to json gives:
 	// "{"RequestUnion":{"CreateRequest":{"key":"Zm9v","start_revision":1}}}"
 	// "{"RequestUnion":{"CreateRequest":{"key":"Zm9v","start_revision":1}}}"
 	// but the gprc-gateway expects a different format..
 	// but the gprc-gateway expects a different format..
 	wstr := `{"create_request" : ` + string(wreq) + "}"
 	wstr := `{"create_request" : ` + string(wreq) + "}"
+	p := cx.apiPrefix
+
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/put"), value: string(putreq), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlWatch put with curl using prefix (%s) (%v)", p, err)
+	}
 	// expects "bar", timeout after 2 seconds since stream waits forever
 	// expects "bar", timeout after 2 seconds since stream waits forever
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/watch"), value: wstr, expected: `"YmFy"`, timeout: 2}); err != nil {
-		t.Fatal(err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/watch"), value: wstr, expected: `"YmFy"`, timeout: 2}); err != nil {
+		cx.t.Fatalf("failed testV3CurlWatch watch with curl using prefix (%s) (%v)", p, err)
 	}
 	}
 }
 }
 
 
-func TestV3CurlTxnAlpha(t *testing.T) { testV3CurlTxn(t, "/v3alpha") }
-func TestV3CurlTxnBeta(t *testing.T)  { testV3CurlTxn(t, "/v3beta") }
-func testV3CurlTxn(t *testing.T, pathPrefix string) {
-	defer testutil.AfterTest(t)
-	epc, err := newEtcdProcessCluster(&configNoTLS)
-	if err != nil {
-		t.Fatalf("could not start etcd process cluster (%v)", err)
-	}
-	defer func() {
-		if cerr := epc.Close(); err != nil {
-			t.Fatalf("error closing etcd processes (%v)", cerr)
-		}
-	}()
-
+func testV3CurlTxn(cx ctlCtx) {
 	txn := &pb.TxnRequest{
 	txn := &pb.TxnRequest{
 		Compare: []*pb.Compare{
 		Compare: []*pb.Compare{
 			{
 			{
@@ -173,75 +157,65 @@ func testV3CurlTxn(t *testing.T, pathPrefix string) {
 	m := &runtime.JSONPb{}
 	m := &runtime.JSONPb{}
 	jsonDat, jerr := m.Marshal(txn)
 	jsonDat, jerr := m.Marshal(txn)
 	if jerr != nil {
 	if jerr != nil {
-		t.Fatal(jerr)
+		cx.t.Fatal(jerr)
 	}
 	}
 	expected := `"succeeded":true,"responses":[{"response_put":{"header":{"revision":"2"}}}]`
 	expected := `"succeeded":true,"responses":[{"response_put":{"header":{"revision":"2"}}}]`
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/txn"), value: string(jsonDat), expected: expected}); err != nil {
-		t.Fatalf("failed txn with curl (%v)", err)
+	p := cx.apiPrefix
+	if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/txn"), value: string(jsonDat), expected: expected}); err != nil {
+		cx.t.Fatalf("failed testV3CurlTxn txn with curl using prefix (%s) (%v)", p, err)
 	}
 	}
 
 
 	// was crashing etcd server
 	// was crashing etcd server
 	malformed := `{"compare":[{"result":0,"target":1,"key":"Zm9v","TargetUnion":null}],"success":[{"Request":{"RequestPut":{"key":"Zm9v","value":"YmFy"}}}]}`
 	malformed := `{"compare":[{"result":0,"target":1,"key":"Zm9v","TargetUnion":null}],"success":[{"Request":{"RequestPut":{"key":"Zm9v","value":"YmFy"}}}]}`
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/txn"), value: malformed, expected: "error"}); err != nil {
-		t.Fatalf("failed put with curl (%v)", err)
+	if err := cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/txn"), value: malformed, expected: "error"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlTxn put with curl using prefix (%s) (%v)", p, err)
 	}
 	}
-}
 
 
-func TestV3CurlAuthAlpha(t *testing.T) { testV3CurlAuth(t, "/v3alpha") }
-func TestV3CurlAuthBeta(t *testing.T)  { testV3CurlAuth(t, "/v3beta") }
-func testV3CurlAuth(t *testing.T, pathPrefix string) {
-	defer testutil.AfterTest(t)
-	epc, err := newEtcdProcessCluster(&configNoTLS)
-	if err != nil {
-		t.Fatalf("could not start etcd process cluster (%v)", err)
-	}
-	defer func() {
-		if cerr := epc.Close(); err != nil {
-			t.Fatalf("error closing etcd processes (%v)", cerr)
-		}
-	}()
+}
 
 
+func testV3CurlAuth(cx ctlCtx) {
 	// create root user
 	// create root user
 	userreq, err := json.Marshal(&pb.AuthUserAddRequest{Name: string("root"), Password: string("toor")})
 	userreq, err := json.Marshal(&pb.AuthUserAddRequest{Name: string("root"), Password: string("toor")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/auth/user/add"), value: string(userreq), expected: "revision"}); err != nil {
-		t.Fatalf("failed add user with curl (%v)", err)
+	p := cx.apiPrefix
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/auth/user/add"), value: string(userreq), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth add user with curl (%v)", err)
 	}
 	}
 
 
 	// create root role
 	// create root role
 	rolereq, err := json.Marshal(&pb.AuthRoleAddRequest{Name: string("root")})
 	rolereq, err := json.Marshal(&pb.AuthRoleAddRequest{Name: string("root")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/auth/role/add"), value: string(rolereq), expected: "revision"}); err != nil {
-		t.Fatalf("failed create role with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/auth/role/add"), value: string(rolereq), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth create role with curl using prefix (%s) (%v)", p, err)
 	}
 	}
 
 
 	// grant root role
 	// grant root role
 	grantrolereq, err := json.Marshal(&pb.AuthUserGrantRoleRequest{User: string("root"), Role: string("root")})
 	grantrolereq, err := json.Marshal(&pb.AuthUserGrantRoleRequest{User: string("root"), Role: string("root")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/auth/user/grant"), value: string(grantrolereq), expected: "revision"}); err != nil {
-		t.Fatalf("failed grant role with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/auth/user/grant"), value: string(grantrolereq), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth grant role with curl using prefix (%s) (%v)", p, err)
 	}
 	}
 
 
 	// enable auth
 	// enable auth
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/auth/enable"), value: string("{}"), expected: "revision"}); err != nil {
-		t.Fatalf("failed enable auth with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/auth/enable"), value: string("{}"), expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth enable auth with curl using prefix (%s) (%v)", p, err)
 	}
 	}
 
 
 	// put "bar" into "foo"
 	// put "bar" into "foo"
 	putreq, err := json.Marshal(&pb.PutRequest{Key: []byte("foo"), Value: []byte("bar")})
 	putreq, err := json.Marshal(&pb.PutRequest{Key: []byte("foo"), Value: []byte("bar")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 
 	// fail put no auth
 	// fail put no auth
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/put"), value: string(putreq), expected: "error"}); err != nil {
-		t.Fatalf("failed no auth put with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/put"), value: string(putreq), expected: "error"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth no auth put with curl using prefix (%s) (%v)", p, err)
 	}
 	}
 
 
 	// auth request
 	// auth request
 	authreq, err := json.Marshal(&pb.AuthenticateRequest{Name: string("root"), Password: string("toor")})
 	authreq, err := json.Marshal(&pb.AuthenticateRequest{Name: string("root"), Password: string("toor")})
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 
 	var (
 	var (
 		authHeader string
 		authHeader string
@@ -249,25 +223,25 @@ func testV3CurlAuth(t *testing.T, pathPrefix string) {
 		lineFunc   = func(txt string) bool { return true }
 		lineFunc   = func(txt string) bool { return true }
 	)
 	)
 
 
-	cmdArgs = cURLPrefixArgs(epc, "POST", cURLReq{endpoint: path.Join(pathPrefix, "/auth/authenticate"), value: string(authreq)})
+	cmdArgs = cURLPrefixArgs(cx.epc, "POST", cURLReq{endpoint: path.Join(p, "/auth/authenticate"), value: string(authreq)})
 	proc, err := spawnCmd(cmdArgs)
 	proc, err := spawnCmd(cmdArgs)
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 
 	cURLRes, err := proc.ExpectFunc(lineFunc)
 	cURLRes, err := proc.ExpectFunc(lineFunc)
-	testutil.AssertNil(t, err)
+	testutil.AssertNil(cx.t, err)
 
 
 	authRes := make(map[string]interface{})
 	authRes := make(map[string]interface{})
-	testutil.AssertNil(t, json.Unmarshal([]byte(cURLRes), &authRes))
+	testutil.AssertNil(cx.t, json.Unmarshal([]byte(cURLRes), &authRes))
 
 
 	token, ok := authRes["token"].(string)
 	token, ok := authRes["token"].(string)
 	if !ok {
 	if !ok {
-		t.Fatalf("failed invalid token in authenticate response with curl")
+		cx.t.Fatalf("failed invalid token in authenticate response with curl")
 	}
 	}
 
 
 	authHeader = "Authorization : " + token
 	authHeader = "Authorization : " + token
 
 
 	// put with auth
 	// put with auth
-	if err = cURLPost(epc, cURLReq{endpoint: path.Join(pathPrefix, "/kv/put"), value: string(putreq), header: authHeader, expected: "revision"}); err != nil {
-		t.Fatalf("failed auth put with curl (%v)", err)
+	if err = cURLPost(cx.epc, cURLReq{endpoint: path.Join(p, "/kv/put"), value: string(putreq), header: authHeader, expected: "revision"}); err != nil {
+		cx.t.Fatalf("failed testV3CurlAuth auth put with curl using prefix (%s) (%v)", p, err)
 	}
 	}
 }
 }

+ 5 - 5
embed/serve.go

@@ -230,7 +230,7 @@ func (sctx *serveCtx) createMux(gwmux *gw.ServeMux, handler http.Handler) *http.
 	}
 	}
 
 
 	httpmux.Handle(
 	httpmux.Handle(
-		"/v3beta/",
+		"/v3/",
 		wsproxy.WebsocketProxy(
 		wsproxy.WebsocketProxy(
 			gwmux,
 			gwmux,
 			wsproxy.WithRequestMutator(
 			wsproxy.WithRequestMutator(
@@ -248,8 +248,8 @@ func (sctx *serveCtx) createMux(gwmux *gw.ServeMux, handler http.Handler) *http.
 	return httpmux
 	return httpmux
 }
 }
 
 
-// wraps HTTP multiplexer to mute requests to /v3alpha
-// TODO: deprecate this in 3.4 release
+// wraps HTTP multiplexer to mute requests to /v3beta
+// TODO: deprecate this in 3.5 release
 func wrapMux(mux *http.ServeMux) http.Handler { return &v3alphaMutator{mux: mux} }
 func wrapMux(mux *http.ServeMux) http.Handler { return &v3alphaMutator{mux: mux} }
 
 
 type v3alphaMutator struct {
 type v3alphaMutator struct {
@@ -257,8 +257,8 @@ type v3alphaMutator struct {
 }
 }
 
 
 func (m *v3alphaMutator) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
 func (m *v3alphaMutator) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
-	if req != nil && req.URL != nil && strings.HasPrefix(req.URL.Path, "/v3alpha/") {
-		req.URL.Path = strings.Replace(req.URL.Path, "/v3alpha/", "/v3beta/", 1)
+	if req != nil && req.URL != nil && strings.HasPrefix(req.URL.Path, "/v3beta/") {
+		req.URL.Path = strings.Replace(req.URL.Path, "/v3beta/", "/v3/", 1)
 	}
 	}
 	m.mux.ServeHTTP(rw, req)
 	m.mux.ServeHTTP(rw, req)
 }
 }

+ 5 - 5
etcdserver/api/v3election/v3electionpb/gw/v3election.pb.gw.go

@@ -289,15 +289,15 @@ func RegisterElectionHandlerClient(ctx context.Context, mux *runtime.ServeMux, c
 }
 }
 
 
 var (
 var (
-	pattern_Election_Campaign_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "campaign"}, ""))
+	pattern_Election_Campaign_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "campaign"}, ""))
 
 
-	pattern_Election_Proclaim_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "proclaim"}, ""))
+	pattern_Election_Proclaim_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "proclaim"}, ""))
 
 
-	pattern_Election_Leader_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "leader"}, ""))
+	pattern_Election_Leader_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "leader"}, ""))
 
 
-	pattern_Election_Observe_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "observe"}, ""))
+	pattern_Election_Observe_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "observe"}, ""))
 
 
-	pattern_Election_Resign_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "election", "resign"}, ""))
+	pattern_Election_Resign_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "election", "resign"}, ""))
 )
 )
 
 
 var (
 var (

+ 35 - 35
etcdserver/api/v3election/v3electionpb/v3election.pb.go

@@ -2041,39 +2041,39 @@ var (
 func init() { proto.RegisterFile("v3election.proto", fileDescriptorV3Election) }
 func init() { proto.RegisterFile("v3election.proto", fileDescriptorV3Election) }
 
 
 var fileDescriptorV3Election = []byte{
 var fileDescriptorV3Election = []byte{
-	// 544 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xc1, 0x6e, 0xd3, 0x40,
-	0x10, 0x65, 0x9d, 0x10, 0xca, 0x90, 0xb6, 0x96, 0x55, 0xa9, 0x21, 0xa4, 0x56, 0xb4, 0x45, 0xa8,
-	0xca, 0xc1, 0x8b, 0x1a, 0x4e, 0x39, 0x21, 0x10, 0xa8, 0x52, 0x91, 0x00, 0x1f, 0x10, 0x1c, 0xd7,
-	0xee, 0xc8, 0x8d, 0xe2, 0x78, 0x8d, 0xed, 0x5a, 0xca, 0x95, 0x5f, 0xe0, 0xc2, 0x3f, 0xf0, 0x23,
-	0x1c, 0x91, 0xf8, 0x01, 0x14, 0xf8, 0x10, 0xb4, 0xbb, 0x36, 0x76, 0xdc, 0x10, 0xa1, 0xe6, 0x62,
-	0x8d, 0x67, 0x9e, 0xe7, 0xcd, 0x7b, 0x3b, 0x6b, 0x30, 0xf3, 0x31, 0x86, 0xe8, 0x67, 0x53, 0x11,
-	0x39, 0x71, 0x22, 0x32, 0x61, 0x75, 0xab, 0x4c, 0xec, 0xf5, 0x0f, 0x02, 0x11, 0x08, 0x55, 0x60,
-	0x32, 0xd2, 0x98, 0xfe, 0x23, 0xcc, 0xfc, 0x0b, 0x26, 0x1f, 0x29, 0x26, 0x39, 0x26, 0xb5, 0x30,
-	0xf6, 0x58, 0x12, 0xfb, 0x05, 0x8e, 0x2a, 0xdc, 0x34, 0xca, 0x30, 0x89, 0x78, 0xc8, 0xe6, 0xb9,
-	0xef, 0xab, 0x47, 0xec, 0xb1, 0x59, 0x5e, 0x60, 0x06, 0x81, 0x10, 0x41, 0x88, 0x8c, 0xc7, 0x53,
-	0xc6, 0xa3, 0x48, 0x64, 0x5c, 0x52, 0xa7, 0xba, 0x4a, 0xdf, 0xc2, 0xfe, 0x73, 0x3e, 0x8f, 0xf9,
-	0x34, 0x88, 0x5c, 0xfc, 0x78, 0x85, 0x69, 0x66, 0x59, 0xd0, 0x8e, 0xf8, 0x1c, 0x7b, 0x64, 0x48,
-	0x4e, 0xba, 0xae, 0x8a, 0xad, 0x03, 0xb8, 0x1d, 0x22, 0x4f, 0xb1, 0x67, 0x0c, 0xc9, 0x49, 0xcb,
-	0xd5, 0x2f, 0x32, 0x9b, 0xf3, 0xf0, 0x0a, 0x7b, 0x2d, 0x05, 0xd5, 0x2f, 0x74, 0x01, 0x66, 0xd5,
-	0x32, 0x8d, 0x45, 0x94, 0xa2, 0xf5, 0x04, 0x3a, 0x97, 0xc8, 0x2f, 0x30, 0x51, 0x5d, 0xef, 0x9d,
-	0x0e, 0x9c, 0xba, 0x22, 0xa7, 0xc4, 0x9d, 0x29, 0x8c, 0x5b, 0x60, 0x2d, 0x06, 0x9d, 0x50, 0x7f,
-	0x65, 0xa8, 0xaf, 0x0e, 0x9d, 0xba, 0x77, 0xce, 0x2b, 0x55, 0x3b, 0xc7, 0x85, 0x5b, 0xc0, 0xe8,
-	0x07, 0xb8, 0xfb, 0x37, 0xb9, 0x56, 0x87, 0x09, 0xad, 0x19, 0x2e, 0x54, 0xbb, 0xae, 0x2b, 0x43,
-	0x99, 0x49, 0x30, 0x57, 0x0a, 0x5a, 0xae, 0x0c, 0x2b, 0xad, 0xed, 0x9a, 0x56, 0x7a, 0x0c, 0xbb,
-	0xba, 0xf5, 0x06, 0x9b, 0xe8, 0x25, 0xec, 0x95, 0xa0, 0xad, 0x84, 0x0f, 0xc1, 0x98, 0xe5, 0x85,
-	0x68, 0xd3, 0xd1, 0x27, 0xea, 0x9c, 0xe3, 0xe2, 0x9d, 0x34, 0xd8, 0x35, 0x66, 0x39, 0x7d, 0x0a,
-	0xbb, 0x2e, 0xa6, 0xb5, 0x53, 0xab, 0xbc, 0x22, 0xff, 0xe7, 0xd5, 0x4b, 0xd8, 0x2b, 0x3b, 0x6c,
-	0x33, 0x2b, 0x7d, 0x0f, 0xfb, 0x6f, 0x12, 0xe1, 0x87, 0x7c, 0x3a, 0xbf, 0xe9, 0x2c, 0xd5, 0x22,
-	0x19, 0xf5, 0x45, 0x3a, 0x03, 0xb3, 0xea, 0xbc, 0xcd, 0x8c, 0xa7, 0x5f, 0xdb, 0xb0, 0xf3, 0xa2,
-	0x18, 0xc0, 0x12, 0xb0, 0x53, 0xee, 0xa7, 0x75, 0xb4, 0x3a, 0x59, 0xe3, 0x2a, 0xf4, 0xed, 0x7f,
-	0x95, 0x35, 0x0b, 0x7d, 0xf8, 0xe9, 0xc7, 0xef, 0xcf, 0x86, 0x4d, 0xef, 0xb3, 0x7c, 0xec, 0x61,
-	0xc6, 0x59, 0x09, 0x66, 0x7e, 0x01, 0x9d, 0x90, 0x91, 0x24, 0x2c, 0x75, 0x34, 0x09, 0x1b, 0xce,
-	0x35, 0x09, 0x9b, 0xf2, 0x37, 0x10, 0xc6, 0x05, 0x54, 0x12, 0x06, 0xd0, 0xd1, 0x1e, 0x5b, 0x0f,
-	0xd6, 0x39, 0x5f, 0x92, 0x0d, 0xd6, 0x17, 0x0b, 0x2a, 0xaa, 0xa8, 0x06, 0xf4, 0xf0, 0x1a, 0x95,
-	0x3e, 0x34, 0x49, 0x34, 0x83, 0x3b, 0xaf, 0x3d, 0x65, 0xfe, 0x36, 0x4c, 0xc7, 0x8a, 0xe9, 0x88,
-	0xf6, 0xae, 0x31, 0x09, 0xdd, 0x7c, 0x42, 0x46, 0x8f, 0x89, 0x54, 0xa5, 0x17, 0xb6, 0xc9, 0xb5,
-	0x72, 0x11, 0x9a, 0x5c, 0xab, 0x3b, 0xbe, 0x41, 0x55, 0xa2, 0x80, 0x13, 0x32, 0x7a, 0x66, 0x7e,
-	0x5b, 0xda, 0xe4, 0xfb, 0xd2, 0x26, 0x3f, 0x97, 0x36, 0xf9, 0xf2, 0xcb, 0xbe, 0xe5, 0x75, 0xd4,
-	0xcf, 0x72, 0xfc, 0x27, 0x00, 0x00, 0xff, 0xff, 0x10, 0xc5, 0xc8, 0x9a, 0xce, 0x05, 0x00, 0x00,
+	// 541 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x94, 0xcf, 0x6e, 0xd3, 0x40,
+	0x10, 0xc6, 0x59, 0xa7, 0x84, 0x32, 0xa4, 0xad, 0x65, 0x82, 0x08, 0x21, 0x98, 0x68, 0x91, 0x50,
+	0x95, 0x83, 0x17, 0x35, 0x9c, 0x72, 0x42, 0x20, 0x50, 0xa5, 0x22, 0x01, 0x3e, 0x20, 0x38, 0x6e,
+	0xdc, 0x91, 0x1b, 0xd9, 0xf1, 0x1a, 0xdb, 0xb5, 0x94, 0x2b, 0xaf, 0xc0, 0x01, 0x1e, 0x89, 0x23,
+	0x12, 0x2f, 0x80, 0x02, 0x0f, 0x82, 0x76, 0xd7, 0xc6, 0x7f, 0x94, 0x20, 0x44, 0x2e, 0xd6, 0x78,
+	0xe7, 0xf3, 0xfc, 0xe6, 0x9b, 0x9d, 0x04, 0xcc, 0x7c, 0x8a, 0x21, 0x7a, 0xd9, 0x42, 0x44, 0x4e,
+	0x9c, 0x88, 0x4c, 0x58, 0xbd, 0xea, 0x24, 0x9e, 0x0f, 0xfb, 0xbe, 0xf0, 0x85, 0x4a, 0x30, 0x19,
+	0x69, 0xcd, 0xf0, 0x21, 0x66, 0xde, 0x39, 0x93, 0x8f, 0x14, 0x93, 0x1c, 0x93, 0x5a, 0x18, 0xcf,
+	0x59, 0x12, 0x7b, 0x85, 0x8e, 0x2a, 0xdd, 0x22, 0xca, 0x30, 0x89, 0x78, 0xc8, 0x96, 0xb9, 0xe7,
+	0xa9, 0x47, 0x3c, 0x67, 0x41, 0x5e, 0x68, 0x46, 0xbe, 0x10, 0x7e, 0x88, 0x8c, 0xc7, 0x0b, 0xc6,
+	0xa3, 0x48, 0x64, 0x5c, 0xa2, 0x53, 0x9d, 0xa5, 0x6f, 0xe0, 0xe8, 0x19, 0x5f, 0xc6, 0x7c, 0xe1,
+	0x47, 0x2e, 0x7e, 0xb8, 0xc4, 0x34, 0xb3, 0x2c, 0xd8, 0x8b, 0xf8, 0x12, 0x07, 0x64, 0x4c, 0x8e,
+	0x7b, 0xae, 0x8a, 0xad, 0x3e, 0x5c, 0x0d, 0x91, 0xa7, 0x38, 0x30, 0xc6, 0xe4, 0xb8, 0xe3, 0xea,
+	0x17, 0x79, 0x9a, 0xf3, 0xf0, 0x12, 0x07, 0x1d, 0x25, 0xd5, 0x2f, 0x74, 0x05, 0x66, 0x55, 0x32,
+	0x8d, 0x45, 0x94, 0xa2, 0xf5, 0x18, 0xba, 0x17, 0xc8, 0xcf, 0x31, 0x51, 0x55, 0x6f, 0x9c, 0x8c,
+	0x9c, 0xba, 0x23, 0xa7, 0xd4, 0x9d, 0x2a, 0x8d, 0x5b, 0x68, 0x2d, 0x06, 0xdd, 0x50, 0x7f, 0x65,
+	0xa8, 0xaf, 0x6e, 0x3b, 0xf5, 0xd9, 0x39, 0x2f, 0x55, 0xee, 0x0c, 0x57, 0x6e, 0x21, 0xa3, 0xef,
+	0xe1, 0xfa, 0x9f, 0xc3, 0x8d, 0x3e, 0x4c, 0xe8, 0x04, 0xb8, 0x52, 0xe5, 0x7a, 0xae, 0x0c, 0xe5,
+	0x49, 0x82, 0xb9, 0x72, 0xd0, 0x71, 0x65, 0x58, 0x79, 0xdd, 0xab, 0x79, 0xa5, 0x0f, 0xe0, 0x40,
+	0x97, 0xfe, 0xcb, 0x98, 0xe8, 0x05, 0x1c, 0x96, 0xa2, 0x9d, 0x8c, 0x8f, 0xc1, 0x08, 0xf2, 0xc2,
+	0xb4, 0xe9, 0xe8, 0x1b, 0x75, 0xce, 0x70, 0xf5, 0x56, 0x0e, 0xd8, 0x35, 0x82, 0x9c, 0x3e, 0x81,
+	0x03, 0x17, 0xd3, 0xda, 0xad, 0x55, 0xb3, 0x22, 0xff, 0x36, 0xab, 0x17, 0x70, 0x58, 0x56, 0xd8,
+	0xa5, 0x57, 0xfa, 0x0e, 0x8e, 0x5e, 0x27, 0xc2, 0x0b, 0xf9, 0x62, 0xf9, 0xbf, 0xbd, 0x54, 0x8b,
+	0x64, 0xd4, 0x17, 0xe9, 0x14, 0xcc, 0xaa, 0xf2, 0x2e, 0x3d, 0x9e, 0x7c, 0xde, 0x83, 0xfd, 0xe7,
+	0x45, 0x03, 0x56, 0x00, 0xfb, 0xe5, 0x7e, 0x5a, 0xf7, 0x9a, 0x9d, 0xb5, 0x7e, 0x0a, 0x43, 0x7b,
+	0x5b, 0x5a, 0x53, 0xe8, 0xf8, 0xe3, 0xf7, 0x5f, 0x9f, 0x8c, 0x21, 0xbd, 0xc5, 0xf2, 0x29, 0x2b,
+	0x85, 0xcc, 0x2b, 0x64, 0x33, 0x32, 0x91, 0xb0, 0xd2, 0x43, 0x1b, 0xd6, 0x9a, 0x5a, 0x1b, 0xd6,
+	0xb6, 0xbe, 0x05, 0x16, 0x17, 0x32, 0x09, 0xf3, 0xa0, 0xab, 0x67, 0x6b, 0xdd, 0xdd, 0x34, 0xf1,
+	0x12, 0x34, 0xda, 0x9c, 0x2c, 0x30, 0xb6, 0xc2, 0x0c, 0xe8, 0xcd, 0x06, 0x46, 0x5f, 0x94, 0x84,
+	0xf8, 0x70, 0xed, 0xd5, 0x5c, 0x0d, 0x7c, 0x17, 0xca, 0x7d, 0x45, 0xb9, 0x43, 0xfb, 0x0d, 0x8a,
+	0xd0, 0x85, 0x67, 0x64, 0xf2, 0x88, 0x48, 0x37, 0x7a, 0x41, 0xdb, 0x9c, 0xc6, 0xe2, 0xb7, 0x39,
+	0xcd, 0x9d, 0xde, 0xe2, 0x26, 0x51, 0xa2, 0x19, 0x99, 0x3c, 0x35, 0xbf, 0xae, 0x6d, 0xf2, 0x6d,
+	0x6d, 0x93, 0x1f, 0x6b, 0x9b, 0x7c, 0xf9, 0x69, 0x5f, 0x99, 0x77, 0xd5, 0x1f, 0xe3, 0xf4, 0x77,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0xa4, 0x60, 0xb0, 0x9f, 0xba, 0x05, 0x00, 0x00,
 }
 }

+ 5 - 5
etcdserver/api/v3election/v3electionpb/v3election.proto

@@ -19,21 +19,21 @@ service Election {
   // leadership still being held, and resign from the election.
   // leadership still being held, and resign from the election.
   rpc Campaign(CampaignRequest) returns (CampaignResponse) {
   rpc Campaign(CampaignRequest) returns (CampaignResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/election/campaign"
+        post: "/v3/election/campaign"
         body: "*"
         body: "*"
     };
     };
   }
   }
   // Proclaim updates the leader's posted value with a new value.
   // Proclaim updates the leader's posted value with a new value.
   rpc Proclaim(ProclaimRequest) returns (ProclaimResponse) {
   rpc Proclaim(ProclaimRequest) returns (ProclaimResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/election/proclaim"
+        post: "/v3/election/proclaim"
         body: "*"
         body: "*"
     };
     };
   }
   }
   // Leader returns the current election proclamation, if any.
   // Leader returns the current election proclamation, if any.
   rpc Leader(LeaderRequest) returns (LeaderResponse) {
   rpc Leader(LeaderRequest) returns (LeaderResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/election/leader"
+        post: "/v3/election/leader"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -41,7 +41,7 @@ service Election {
   // elected leaders.
   // elected leaders.
   rpc Observe(LeaderRequest) returns (stream LeaderResponse) {
   rpc Observe(LeaderRequest) returns (stream LeaderResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/election/observe"
+        post: "/v3/election/observe"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -49,7 +49,7 @@ service Election {
   // leadership on the election.
   // leadership on the election.
   rpc Resign(ResignRequest) returns (ResignResponse) {
   rpc Resign(ResignRequest) returns (ResignResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/election/resign"
+        post: "/v3/election/resign"
         body: "*"
         body: "*"
     };
     };
   }
   }

+ 2 - 2
etcdserver/api/v3lock/v3lockpb/gw/v3lock.pb.gw.go

@@ -155,9 +155,9 @@ func RegisterLockHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien
 }
 }
 
 
 var (
 var (
-	pattern_Lock_Lock_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1}, []string{"v3beta", "lock"}, ""))
+	pattern_Lock_Lock_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1}, []string{"v3", "lock"}, ""))
 
 
-	pattern_Lock_Unlock_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "lock", "unlock"}, ""))
+	pattern_Lock_Unlock_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "lock", "unlock"}, ""))
 )
 )
 
 
 var (
 var (

+ 9 - 9
etcdserver/api/v3lock/v3lockpb/v3lock.pb.go

@@ -934,7 +934,7 @@ var (
 func init() { proto.RegisterFile("v3lock.proto", fileDescriptorV3Lock) }
 func init() { proto.RegisterFile("v3lock.proto", fileDescriptorV3Lock) }
 
 
 var fileDescriptorV3Lock = []byte{
 var fileDescriptorV3Lock = []byte{
-	// 335 bytes of a gzipped FileDescriptorProto
+	// 331 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0x33, 0xce, 0xc9,
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0x33, 0xce, 0xc9,
 	0x4f, 0xce, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x80, 0xf0, 0x0a, 0x92, 0xa4, 0x44,
 	0x4f, 0xce, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x80, 0xf0, 0x0a, 0x92, 0xa4, 0x44,
 	0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x82, 0xfa, 0x20, 0x16, 0x44, 0x5e, 0x4a, 0x2d, 0xb5, 0x24, 0x39,
 	0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x82, 0xfa, 0x20, 0x16, 0x44, 0x5e, 0x4a, 0x2d, 0xb5, 0x24, 0x39,
@@ -948,12 +948,12 @@ var fileDescriptorV3Lock = []byte{
 	0x98, 0x92, 0x5a, 0x04, 0xd6, 0xcb, 0x6d, 0x24, 0xa3, 0x87, 0xec, 0x1e, 0x3d, 0x98, 0x3a, 0x0f,
 	0x98, 0x92, 0x5a, 0x04, 0xd6, 0xcb, 0x6d, 0x24, 0xa3, 0x87, 0xec, 0x1e, 0x3d, 0x98, 0x3a, 0x0f,
 	0xb0, 0x9a, 0x20, 0xa8, 0x5a, 0x21, 0x01, 0x2e, 0xe6, 0xec, 0xd4, 0x4a, 0xb0, 0xc9, 0x3c, 0x41,
 	0xb0, 0x9a, 0x20, 0xa8, 0x5a, 0x21, 0x01, 0x2e, 0xe6, 0xec, 0xd4, 0x4a, 0xb0, 0xc9, 0x3c, 0x41,
 	0x20, 0xa6, 0x92, 0x22, 0x17, 0x6f, 0x68, 0x5e, 0x0e, 0x92, 0x93, 0xa0, 0x4a, 0x18, 0x11, 0x4a,
 	0x20, 0xa6, 0x92, 0x22, 0x17, 0x6f, 0x68, 0x5e, 0x0e, 0x92, 0x93, 0xa0, 0x4a, 0x18, 0x11, 0x4a,
-	0xdc, 0xb8, 0xf8, 0x60, 0x4a, 0x28, 0xb1, 0xdc, 0x68, 0x07, 0x23, 0x17, 0x0b, 0xc8, 0x0f, 0x42,
-	0xc1, 0x50, 0x5a, 0x54, 0x0f, 0x16, 0xe6, 0x7a, 0x48, 0x81, 0x22, 0x25, 0x86, 0x2e, 0x0c, 0x31,
-	0x4d, 0x49, 0xa6, 0xe9, 0xf2, 0x93, 0xc9, 0x4c, 0x62, 0x4a, 0x82, 0xfa, 0x65, 0xc6, 0x49, 0xa9,
-	0x25, 0x89, 0xfa, 0x20, 0x45, 0x60, 0xc2, 0x8a, 0x51, 0x4b, 0x28, 0x9a, 0x8b, 0x0d, 0xe2, 0x4a,
-	0x21, 0x71, 0x84, 0x7e, 0x14, 0xaf, 0x49, 0x49, 0x60, 0x4a, 0x40, 0x8d, 0x96, 0x03, 0x1b, 0x2d,
-	0xa1, 0x24, 0x8c, 0x62, 0x74, 0x69, 0x1e, 0xd4, 0x70, 0x27, 0x81, 0x13, 0x8f, 0xe4, 0x18, 0x2f,
-	0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc6, 0x63, 0x39, 0x86, 0x24, 0x36, 0x70, 0x7c,
-	0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x10, 0x82, 0x89, 0xf0, 0x45, 0x02, 0x00, 0x00,
+	0xdc, 0xb8, 0xf8, 0x60, 0x4a, 0x28, 0xb1, 0xdc, 0x68, 0x03, 0x23, 0x17, 0x0b, 0xc8, 0x0f, 0x42,
+	0xfe, 0x50, 0x5a, 0x54, 0x0f, 0x16, 0xe6, 0x7a, 0x48, 0x81, 0x22, 0x25, 0x86, 0x2e, 0x0c, 0x31,
+	0x4d, 0x49, 0xa2, 0xe9, 0xf2, 0x93, 0xc9, 0x4c, 0x42, 0x4a, 0xbc, 0xfa, 0x65, 0xc6, 0xfa, 0x20,
+	0x05, 0x60, 0xc2, 0x8a, 0x51, 0x4b, 0x28, 0x9c, 0x8b, 0x0d, 0xe2, 0x42, 0x21, 0x71, 0x84, 0x5e,
+	0x14, 0x6f, 0x49, 0x49, 0x60, 0x4a, 0x40, 0x8d, 0x95, 0x02, 0x1b, 0x2b, 0xa2, 0xc4, 0x0f, 0x37,
+	0xb6, 0x34, 0x0f, 0x6a, 0xb0, 0x93, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e,
+	0x78, 0x24, 0xc7, 0x38, 0xe3, 0xb1, 0x1c, 0x43, 0x12, 0x1b, 0x38, 0x1e, 0x8d, 0x01, 0x01, 0x00,
+	0x00, 0xff, 0xff, 0x65, 0xa8, 0x61, 0xb1, 0x3d, 0x02, 0x00, 0x00,
 }
 }

+ 2 - 2
etcdserver/api/v3lock/v3lockpb/v3lock.proto

@@ -20,7 +20,7 @@ service Lock {
   // lease associate with the owner expires.
   // lease associate with the owner expires.
   rpc Lock(LockRequest) returns (LockResponse) {
   rpc Lock(LockRequest) returns (LockResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/lock/lock"
+        post: "/v3/lock/lock"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -30,7 +30,7 @@ service Lock {
   // ownership of the lock.
   // ownership of the lock.
   rpc Unlock(UnlockRequest) returns (UnlockResponse) {
   rpc Unlock(UnlockRequest) returns (UnlockResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/lock/unlock"
+        post: "/v3/lock/unlock"
         body: "*"
         body: "*"
     };
     };
   }
   }

+ 38 - 38
etcdserver/etcdserverpb/gw/rpc.pb.gw.go

@@ -796,15 +796,15 @@ func RegisterKVHandlerClient(ctx context.Context, mux *runtime.ServeMux, client
 }
 }
 
 
 var (
 var (
-	pattern_KV_Range_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "range"}, ""))
+	pattern_KV_Range_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "range"}, ""))
 
 
-	pattern_KV_Put_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "put"}, ""))
+	pattern_KV_Put_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "put"}, ""))
 
 
-	pattern_KV_DeleteRange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "deleterange"}, ""))
+	pattern_KV_DeleteRange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "deleterange"}, ""))
 
 
-	pattern_KV_Txn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "txn"}, ""))
+	pattern_KV_Txn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "txn"}, ""))
 
 
-	pattern_KV_Compact_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "kv", "compaction"}, ""))
+	pattern_KV_Compact_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "compaction"}, ""))
 )
 )
 
 
 var (
 var (
@@ -890,7 +890,7 @@ func RegisterWatchHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
 }
 }
 
 
 var (
 var (
-	pattern_Watch_Watch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v3beta", "watch"}, ""))
+	pattern_Watch_Watch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v3", "watch"}, ""))
 )
 )
 
 
 var (
 var (
@@ -1084,15 +1084,15 @@ func RegisterLeaseHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
 }
 }
 
 
 var (
 var (
-	pattern_Lease_LeaseGrant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "lease", "grant"}, ""))
+	pattern_Lease_LeaseGrant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "lease", "grant"}, ""))
 
 
-	pattern_Lease_LeaseRevoke_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "kv", "lease", "revoke"}, ""))
+	pattern_Lease_LeaseRevoke_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "kv", "lease", "revoke"}, ""))
 
 
-	pattern_Lease_LeaseKeepAlive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "lease", "keepalive"}, ""))
+	pattern_Lease_LeaseKeepAlive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "lease", "keepalive"}, ""))
 
 
-	pattern_Lease_LeaseTimeToLive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "kv", "lease", "timetolive"}, ""))
+	pattern_Lease_LeaseTimeToLive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "kv", "lease", "timetolive"}, ""))
 
 
-	pattern_Lease_LeaseLeases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "kv", "lease", "leases"}, ""))
+	pattern_Lease_LeaseLeases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "kv", "lease", "leases"}, ""))
 )
 )
 
 
 var (
 var (
@@ -1265,13 +1265,13 @@ func RegisterClusterHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl
 }
 }
 
 
 var (
 var (
-	pattern_Cluster_MemberAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "cluster", "member", "add"}, ""))
+	pattern_Cluster_MemberAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "cluster", "member", "add"}, ""))
 
 
-	pattern_Cluster_MemberRemove_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "cluster", "member", "remove"}, ""))
+	pattern_Cluster_MemberRemove_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "cluster", "member", "remove"}, ""))
 
 
-	pattern_Cluster_MemberUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "cluster", "member", "update"}, ""))
+	pattern_Cluster_MemberUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "cluster", "member", "update"}, ""))
 
 
-	pattern_Cluster_MemberList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "cluster", "member", "list"}, ""))
+	pattern_Cluster_MemberList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "cluster", "member", "list"}, ""))
 )
 )
 
 
 var (
 var (
@@ -1529,19 +1529,19 @@ func RegisterMaintenanceHandlerClient(ctx context.Context, mux *runtime.ServeMux
 }
 }
 
 
 var (
 var (
-	pattern_Maintenance_Alarm_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "alarm"}, ""))
+	pattern_Maintenance_Alarm_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "alarm"}, ""))
 
 
-	pattern_Maintenance_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "status"}, ""))
+	pattern_Maintenance_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "status"}, ""))
 
 
-	pattern_Maintenance_Defragment_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "defragment"}, ""))
+	pattern_Maintenance_Defragment_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "defragment"}, ""))
 
 
-	pattern_Maintenance_Hash_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "hash"}, ""))
+	pattern_Maintenance_Hash_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "hash"}, ""))
 
 
-	pattern_Maintenance_HashKV_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "hash"}, ""))
+	pattern_Maintenance_HashKV_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "hash"}, ""))
 
 
-	pattern_Maintenance_Snapshot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "snapshot"}, ""))
+	pattern_Maintenance_Snapshot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "snapshot"}, ""))
 
 
-	pattern_Maintenance_MoveLeader_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "maintenance", "transfer-leadership"}, ""))
+	pattern_Maintenance_MoveLeader_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "maintenance", "transfer-leadership"}, ""))
 )
 )
 
 
 var (
 var (
@@ -2066,37 +2066,37 @@ func RegisterAuthHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien
 }
 }
 
 
 var (
 var (
-	pattern_Auth_AuthEnable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "auth", "enable"}, ""))
+	pattern_Auth_AuthEnable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "auth", "enable"}, ""))
 
 
-	pattern_Auth_AuthDisable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "auth", "disable"}, ""))
+	pattern_Auth_AuthDisable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "auth", "disable"}, ""))
 
 
-	pattern_Auth_Authenticate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3beta", "auth", "authenticate"}, ""))
+	pattern_Auth_Authenticate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "auth", "authenticate"}, ""))
 
 
-	pattern_Auth_UserAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "add"}, ""))
+	pattern_Auth_UserAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "add"}, ""))
 
 
-	pattern_Auth_UserGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "get"}, ""))
+	pattern_Auth_UserGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "get"}, ""))
 
 
-	pattern_Auth_UserList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "list"}, ""))
+	pattern_Auth_UserList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "list"}, ""))
 
 
-	pattern_Auth_UserDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "delete"}, ""))
+	pattern_Auth_UserDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "delete"}, ""))
 
 
-	pattern_Auth_UserChangePassword_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "changepw"}, ""))
+	pattern_Auth_UserChangePassword_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "changepw"}, ""))
 
 
-	pattern_Auth_UserGrantRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "grant"}, ""))
+	pattern_Auth_UserGrantRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "grant"}, ""))
 
 
-	pattern_Auth_UserRevokeRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "user", "revoke"}, ""))
+	pattern_Auth_UserRevokeRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "user", "revoke"}, ""))
 
 
-	pattern_Auth_RoleAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "add"}, ""))
+	pattern_Auth_RoleAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "add"}, ""))
 
 
-	pattern_Auth_RoleGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "get"}, ""))
+	pattern_Auth_RoleGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "get"}, ""))
 
 
-	pattern_Auth_RoleList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "list"}, ""))
+	pattern_Auth_RoleList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "list"}, ""))
 
 
-	pattern_Auth_RoleDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "delete"}, ""))
+	pattern_Auth_RoleDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "delete"}, ""))
 
 
-	pattern_Auth_RoleGrantPermission_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "grant"}, ""))
+	pattern_Auth_RoleGrantPermission_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "grant"}, ""))
 
 
-	pattern_Auth_RoleRevokePermission_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3beta", "auth", "role", "revoke"}, ""))
+	pattern_Auth_RoleRevokePermission_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3", "auth", "role", "revoke"}, ""))
 )
 )
 
 
 var (
 var (

+ 233 - 234
etcdserver/etcdserverpb/rpc.pb.go

@@ -18602,238 +18602,237 @@ var (
 func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) }
 func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) }
 
 
 var fileDescriptorRpc = []byte{
 var fileDescriptorRpc = []byte{
-	// 3724 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x4b, 0x6f, 0x1b, 0x4b,
-	0x76, 0x56, 0x93, 0xe2, 0xeb, 0xf0, 0x21, 0xba, 0x24, 0xdb, 0x34, 0x6d, 0xcb, 0x72, 0xf9, 0x25,
-	0x3f, 0xae, 0x38, 0xa3, 0x99, 0x64, 0xe1, 0x04, 0x83, 0x91, 0x25, 0x8e, 0xa5, 0x91, 0x2c, 0x69,
-	0x5a, 0x94, 0xef, 0x0d, 0x30, 0x89, 0xd0, 0x22, 0x4b, 0x52, 0x47, 0x64, 0x37, 0xd3, 0xdd, 0xa4,
-	0x25, 0x67, 0x90, 0x00, 0x93, 0x49, 0x90, 0x4d, 0x36, 0x19, 0x20, 0x48, 0xb2, 0x0d, 0x82, 0xc1,
-	0xec, 0xb2, 0xb9, 0xc8, 0x5f, 0xc8, 0x2e, 0x01, 0xf2, 0x07, 0x82, 0x9b, 0x6c, 0xf2, 0x0b, 0xf2,
-	0x58, 0x0d, 0xea, 0xd5, 0x5d, 0xfd, 0xa2, 0x74, 0x2f, 0xef, 0xbd, 0x1b, 0xb9, 0xeb, 0xd4, 0xa9,
-	0x73, 0x4e, 0x9d, 0xaa, 0x73, 0x4e, 0xd5, 0x57, 0x34, 0x94, 0x9c, 0x61, 0x77, 0x65, 0xe8, 0xd8,
-	0x9e, 0x8d, 0x2a, 0xc4, 0xeb, 0xf6, 0x5c, 0xe2, 0x8c, 0x89, 0x33, 0x3c, 0x6e, 0x2e, 0x9c, 0xda,
-	0xa7, 0x36, 0xeb, 0x68, 0xd1, 0x2f, 0xce, 0xd3, 0xc4, 0x94, 0xa7, 0x65, 0x5a, 0x1e, 0x71, 0x2c,
-	0xa3, 0xdf, 0x1a, 0x8c, 0xbb, 0x5d, 0xf6, 0x67, 0x78, 0xdc, 0x3a, 0x1f, 0x0b, 0x9e, 0xc7, 0x61,
-	0x1e, 0x63, 0xe4, 0x9d, 0xb1, 0x3f, 0xc3, 0x63, 0xf6, 0x8f, 0xe0, 0xba, 0x77, 0x6a, 0xdb, 0xa7,
-	0x7d, 0xd2, 0x32, 0x86, 0x66, 0xcb, 0xb0, 0x2c, 0xdb, 0x33, 0x3c, 0xd3, 0xb6, 0x5c, 0xde, 0x8b,
-	0xff, 0x5c, 0x83, 0x9a, 0x4e, 0xdc, 0xa1, 0x6d, 0xb9, 0x64, 0x93, 0x18, 0x3d, 0xe2, 0xa0, 0xfb,
-	0x00, 0xdd, 0xfe, 0xc8, 0xf5, 0x88, 0x73, 0x64, 0xf6, 0x1a, 0xda, 0x92, 0xb6, 0x3c, 0xab, 0x97,
-	0x04, 0x65, 0xab, 0x87, 0xee, 0x42, 0x69, 0x40, 0x06, 0xc7, 0xbc, 0x37, 0xc3, 0x7a, 0x8b, 0x9c,
-	0xb0, 0xd5, 0x43, 0x4d, 0x28, 0x3a, 0x64, 0x6c, 0xba, 0xa6, 0x6d, 0x35, 0xb2, 0x4b, 0xda, 0x72,
-	0x56, 0xf7, 0xdb, 0x74, 0xa0, 0x63, 0x9c, 0x78, 0x47, 0x1e, 0x71, 0x06, 0x8d, 0x59, 0x3e, 0x90,
-	0x12, 0x3a, 0xc4, 0x19, 0xe0, 0x5f, 0xe4, 0xa0, 0xa2, 0x1b, 0xd6, 0x29, 0xd1, 0xc9, 0x1f, 0x8d,
-	0x88, 0xeb, 0xa1, 0x3a, 0x64, 0xcf, 0xc9, 0x25, 0x53, 0x5f, 0xd1, 0xe9, 0x27, 0x1f, 0x6f, 0x9d,
-	0x92, 0x23, 0x62, 0x71, 0xc5, 0x15, 0x3a, 0xde, 0x3a, 0x25, 0x6d, 0xab, 0x87, 0x16, 0x20, 0xd7,
-	0x37, 0x07, 0xa6, 0x27, 0xb4, 0xf2, 0x46, 0xc8, 0x9c, 0xd9, 0x88, 0x39, 0xeb, 0x00, 0xae, 0xed,
-	0x78, 0x47, 0xb6, 0xd3, 0x23, 0x4e, 0x23, 0xb7, 0xa4, 0x2d, 0xd7, 0x56, 0x1f, 0xaf, 0xa8, 0x4b,
-	0xb3, 0xa2, 0x1a, 0xb4, 0x72, 0x60, 0x3b, 0xde, 0x1e, 0xe5, 0xd5, 0x4b, 0xae, 0xfc, 0x44, 0x3f,
-	0x82, 0x32, 0x13, 0xe2, 0x19, 0xce, 0x29, 0xf1, 0x1a, 0x79, 0x26, 0xe5, 0xc9, 0x15, 0x52, 0x3a,
-	0x8c, 0x59, 0x67, 0xea, 0xf9, 0x37, 0xc2, 0x50, 0x71, 0x89, 0x63, 0x1a, 0x7d, 0xf3, 0xa3, 0x71,
-	0xdc, 0x27, 0x8d, 0xc2, 0x92, 0xb6, 0x5c, 0xd4, 0x43, 0x34, 0x3a, 0xff, 0x73, 0x72, 0xe9, 0x1e,
-	0xd9, 0x56, 0xff, 0xb2, 0x51, 0x64, 0x0c, 0x45, 0x4a, 0xd8, 0xb3, 0xfa, 0x97, 0x6c, 0xd1, 0xec,
-	0x91, 0xe5, 0xf1, 0xde, 0x12, 0xeb, 0x2d, 0x31, 0x0a, 0xeb, 0x5e, 0x86, 0xfa, 0xc0, 0xb4, 0x8e,
-	0x06, 0x76, 0xef, 0xc8, 0x77, 0x08, 0x30, 0x87, 0xd4, 0x06, 0xa6, 0xf5, 0xce, 0xee, 0xe9, 0xd2,
-	0x2d, 0x94, 0xd3, 0xb8, 0x08, 0x73, 0x96, 0x05, 0xa7, 0x71, 0xa1, 0x72, 0xae, 0xc0, 0x3c, 0x95,
-	0xd9, 0x75, 0x88, 0xe1, 0x91, 0x80, 0xb9, 0xc2, 0x98, 0x6f, 0x0c, 0x4c, 0x6b, 0x9d, 0xf5, 0x84,
-	0xf8, 0x8d, 0x8b, 0x18, 0x7f, 0x55, 0xf0, 0x1b, 0x17, 0x61, 0x7e, 0xbc, 0x02, 0x25, 0xdf, 0xe7,
-	0xa8, 0x08, 0xb3, 0xbb, 0x7b, 0xbb, 0xed, 0xfa, 0x0c, 0x02, 0xc8, 0xaf, 0x1d, 0xac, 0xb7, 0x77,
-	0x37, 0xea, 0x1a, 0x2a, 0x43, 0x61, 0xa3, 0xcd, 0x1b, 0x19, 0xfc, 0x06, 0x20, 0xf0, 0x2e, 0x2a,
-	0x40, 0x76, 0xbb, 0xfd, 0x7b, 0xf5, 0x19, 0xca, 0xf3, 0xbe, 0xad, 0x1f, 0x6c, 0xed, 0xed, 0xd6,
-	0x35, 0x3a, 0x78, 0x5d, 0x6f, 0xaf, 0x75, 0xda, 0xf5, 0x0c, 0xe5, 0x78, 0xb7, 0xb7, 0x51, 0xcf,
-	0xa2, 0x12, 0xe4, 0xde, 0xaf, 0xed, 0x1c, 0xb6, 0xeb, 0xb3, 0xf8, 0x97, 0x1a, 0x54, 0xc5, 0x7a,
-	0xf1, 0x98, 0x40, 0xdf, 0x87, 0xfc, 0x19, 0x8b, 0x0b, 0xb6, 0x15, 0xcb, 0xab, 0xf7, 0x22, 0x8b,
-	0x1b, 0x8a, 0x1d, 0x5d, 0xf0, 0x22, 0x0c, 0xd9, 0xf3, 0xb1, 0xdb, 0xc8, 0x2c, 0x65, 0x97, 0xcb,
-	0xab, 0xf5, 0x15, 0x1e, 0xb9, 0x2b, 0xdb, 0xe4, 0xf2, 0xbd, 0xd1, 0x1f, 0x11, 0x9d, 0x76, 0x22,
-	0x04, 0xb3, 0x03, 0xdb, 0x21, 0x6c, 0xc7, 0x16, 0x75, 0xf6, 0x4d, 0xb7, 0x31, 0x5b, 0x34, 0xb1,
-	0x5b, 0x79, 0x03, 0xff, 0x5a, 0x03, 0xd8, 0x1f, 0x79, 0xe9, 0xa1, 0xb1, 0x00, 0xb9, 0x31, 0x15,
-	0x2c, 0xc2, 0x82, 0x37, 0x58, 0x4c, 0x10, 0xc3, 0x25, 0x7e, 0x4c, 0xd0, 0x06, 0xba, 0x0d, 0x85,
-	0xa1, 0x43, 0xc6, 0x47, 0xe7, 0x63, 0xa6, 0xa4, 0xa8, 0xe7, 0x69, 0x73, 0x7b, 0x8c, 0x1e, 0x42,
-	0xc5, 0x3c, 0xb5, 0x6c, 0x87, 0x1c, 0x71, 0x59, 0x39, 0xd6, 0x5b, 0xe6, 0x34, 0x66, 0xb7, 0xc2,
-	0xc2, 0x05, 0xe7, 0x55, 0x96, 0x1d, 0x4a, 0xc2, 0x16, 0x94, 0x99, 0xa9, 0x53, 0xb9, 0xef, 0x79,
-	0x60, 0x63, 0x86, 0x0d, 0x8b, 0xbb, 0x50, 0x58, 0x8d, 0x7f, 0x0a, 0x68, 0x83, 0xf4, 0x89, 0x47,
-	0xa6, 0xc9, 0x1e, 0x8a, 0x4f, 0xb2, 0xaa, 0x4f, 0xf0, 0x5f, 0x6b, 0x30, 0x1f, 0x12, 0x3f, 0xd5,
-	0xb4, 0x1a, 0x50, 0xe8, 0x31, 0x61, 0xdc, 0x82, 0xac, 0x2e, 0x9b, 0xe8, 0x25, 0x14, 0x85, 0x01,
-	0x6e, 0x23, 0x9b, 0xb2, 0x69, 0x0a, 0xdc, 0x26, 0x17, 0xff, 0x3a, 0x03, 0x25, 0x31, 0xd1, 0xbd,
-	0x21, 0x5a, 0x83, 0xaa, 0xc3, 0x1b, 0x47, 0x6c, 0x3e, 0xc2, 0xa2, 0x66, 0x7a, 0x12, 0xda, 0x9c,
-	0xd1, 0x2b, 0x62, 0x08, 0x23, 0xa3, 0xdf, 0x81, 0xb2, 0x14, 0x31, 0x1c, 0x79, 0xc2, 0xe5, 0x8d,
-	0xb0, 0x80, 0x60, 0xff, 0x6d, 0xce, 0xe8, 0x20, 0xd8, 0xf7, 0x47, 0x1e, 0xea, 0xc0, 0x82, 0x1c,
-	0xcc, 0x67, 0x23, 0xcc, 0xc8, 0x32, 0x29, 0x4b, 0x61, 0x29, 0xf1, 0xa5, 0xda, 0x9c, 0xd1, 0x91,
-	0x18, 0xaf, 0x74, 0xaa, 0x26, 0x79, 0x17, 0x3c, 0x79, 0xc7, 0x4c, 0xea, 0x5c, 0x58, 0x71, 0x93,
-	0x3a, 0x17, 0xd6, 0x9b, 0x12, 0x14, 0x44, 0x0b, 0xff, 0x73, 0x06, 0x40, 0xae, 0xc6, 0xde, 0x10,
-	0x6d, 0x40, 0xcd, 0x11, 0xad, 0x90, 0xb7, 0xee, 0x26, 0x7a, 0x4b, 0x2c, 0xe2, 0x8c, 0x5e, 0x95,
-	0x83, 0xb8, 0x71, 0x3f, 0x80, 0x8a, 0x2f, 0x25, 0x70, 0xd8, 0x9d, 0x04, 0x87, 0xf9, 0x12, 0xca,
-	0x72, 0x00, 0x75, 0xd9, 0xa7, 0x70, 0xd3, 0x1f, 0x9f, 0xe0, 0xb3, 0x87, 0x13, 0x7c, 0xe6, 0x0b,
-	0x9c, 0x97, 0x12, 0x54, 0xaf, 0xa9, 0x86, 0x05, 0x6e, 0xbb, 0x93, 0xe0, 0xb6, 0xb8, 0x61, 0xd4,
-	0x71, 0x40, 0xeb, 0x25, 0x6f, 0xe2, 0xff, 0xce, 0x42, 0x61, 0xdd, 0x1e, 0x0c, 0x0d, 0x87, 0xae,
-	0x46, 0xde, 0x21, 0xee, 0xa8, 0xef, 0x31, 0x77, 0xd5, 0x56, 0x1f, 0x85, 0x25, 0x0a, 0x36, 0xf9,
-	0xaf, 0xce, 0x58, 0x75, 0x31, 0x84, 0x0e, 0x16, 0xe5, 0x31, 0x73, 0x8d, 0xc1, 0xa2, 0x38, 0x8a,
-	0x21, 0x32, 0x90, 0xb3, 0x41, 0x20, 0x37, 0xa1, 0x30, 0x26, 0x4e, 0x50, 0xd2, 0x37, 0x67, 0x74,
-	0x49, 0x40, 0xcf, 0x61, 0x2e, 0x5a, 0x5e, 0x72, 0x82, 0xa7, 0xd6, 0x0d, 0x57, 0xa3, 0x47, 0x50,
-	0x09, 0xd5, 0xb8, 0xbc, 0xe0, 0x2b, 0x0f, 0x94, 0x12, 0x77, 0x4b, 0xe6, 0x55, 0x5a, 0x8f, 0x2b,
-	0x9b, 0x33, 0x32, 0xb3, 0xde, 0x92, 0x99, 0xb5, 0x28, 0x46, 0x89, 0xdc, 0x1a, 0x4a, 0x32, 0x3f,
-	0x0c, 0x27, 0x19, 0xfc, 0x43, 0xa8, 0x86, 0x1c, 0x44, 0xeb, 0x4e, 0xfb, 0x27, 0x87, 0x6b, 0x3b,
-	0xbc, 0x48, 0xbd, 0x65, 0x75, 0x49, 0xaf, 0x6b, 0xb4, 0xd6, 0xed, 0xb4, 0x0f, 0x0e, 0xea, 0x19,
-	0x54, 0x85, 0xd2, 0xee, 0x5e, 0xe7, 0x88, 0x73, 0x65, 0xf1, 0x5b, 0x5f, 0x82, 0x28, 0x72, 0x4a,
-	0x6d, 0x9b, 0x51, 0x6a, 0x9b, 0x26, 0x6b, 0x5b, 0x26, 0xa8, 0x6d, 0xac, 0xcc, 0xed, 0xb4, 0xd7,
-	0x0e, 0xda, 0xf5, 0xd9, 0x37, 0x35, 0xa8, 0x70, 0xff, 0x1e, 0x8d, 0x2c, 0x5a, 0x6a, 0xff, 0x41,
-	0x03, 0x08, 0xa2, 0x09, 0xb5, 0xa0, 0xd0, 0xe5, 0x7a, 0x1a, 0x1a, 0x4b, 0x46, 0x37, 0x13, 0x97,
-	0x4c, 0x97, 0x5c, 0xe8, 0xbb, 0x50, 0x70, 0x47, 0xdd, 0x2e, 0x71, 0x65, 0xc9, 0xbb, 0x1d, 0xcd,
-	0x87, 0x22, 0x5b, 0xe9, 0x92, 0x8f, 0x0e, 0x39, 0x31, 0xcc, 0xfe, 0x88, 0x15, 0xc0, 0xc9, 0x43,
-	0x04, 0x1f, 0xfe, 0x3b, 0x0d, 0xca, 0xca, 0xe6, 0xfd, 0x8a, 0x49, 0xf8, 0x1e, 0x94, 0x98, 0x0d,
-	0xa4, 0x27, 0xd2, 0x70, 0x51, 0x0f, 0x08, 0xe8, 0xb7, 0xa1, 0x24, 0x23, 0x40, 0x66, 0xe2, 0x46,
-	0xb2, 0xd8, 0xbd, 0xa1, 0x1e, 0xb0, 0xe2, 0x6d, 0xb8, 0xc1, 0xbc, 0xd2, 0xa5, 0x87, 0x6b, 0xe9,
-	0x47, 0xf5, 0xf8, 0xa9, 0x45, 0x8e, 0x9f, 0x4d, 0x28, 0x0e, 0xcf, 0x2e, 0x5d, 0xb3, 0x6b, 0xf4,
-	0x85, 0x15, 0x7e, 0x1b, 0xff, 0x18, 0x90, 0x2a, 0x6c, 0x9a, 0xe9, 0xe2, 0x2a, 0x94, 0x37, 0x0d,
-	0xf7, 0x4c, 0x98, 0x84, 0x5f, 0x42, 0x95, 0x36, 0xb7, 0xdf, 0x5f, 0xc3, 0x46, 0x76, 0x39, 0x90,
-	0xdc, 0x53, 0xf9, 0x1c, 0xc1, 0xec, 0x99, 0xe1, 0x9e, 0xb1, 0x89, 0x56, 0x75, 0xf6, 0x8d, 0x9e,
-	0x43, 0xbd, 0xcb, 0x27, 0x79, 0x14, 0xb9, 0x32, 0xcc, 0x09, 0xba, 0x7f, 0x12, 0xfc, 0x0c, 0x2a,
-	0x7c, 0x0e, 0x5f, 0xb7, 0x11, 0xf8, 0x06, 0xcc, 0x1d, 0x58, 0xc6, 0xd0, 0x3d, 0xb3, 0x65, 0x75,
-	0xa3, 0x93, 0xae, 0x07, 0xb4, 0xa9, 0x34, 0x3e, 0x83, 0x39, 0x87, 0x0c, 0x0c, 0xd3, 0x32, 0xad,
-	0xd3, 0xa3, 0xe3, 0x4b, 0x8f, 0xb8, 0xe2, 0xc2, 0x54, 0xf3, 0xc9, 0x6f, 0x28, 0x95, 0x9a, 0x76,
-	0xdc, 0xb7, 0x8f, 0x45, 0x9a, 0x63, 0xdf, 0xf8, 0x73, 0x0d, 0x2a, 0x9f, 0x1a, 0x5e, 0x57, 0x2e,
-	0x1d, 0xda, 0x82, 0x9a, 0x9f, 0xdc, 0x18, 0x45, 0xd8, 0x12, 0x29, 0xb1, 0x6c, 0x8c, 0x3c, 0x4a,
-	0xcb, 0xea, 0x58, 0xed, 0xaa, 0x04, 0x26, 0xca, 0xb0, 0xba, 0xa4, 0xef, 0x8b, 0xca, 0xa4, 0x8b,
-	0x62, 0x8c, 0xaa, 0x28, 0x95, 0xf0, 0x66, 0x2e, 0x38, 0x7e, 0xf0, 0x5c, 0xf2, 0x79, 0x06, 0x50,
-	0xdc, 0x86, 0x2f, 0x7b, 0x22, 0x7b, 0x02, 0x35, 0xd7, 0x33, 0x9c, 0xd8, 0xde, 0xa8, 0x32, 0xaa,
-	0x9f, 0xa0, 0x9f, 0xc1, 0xdc, 0xd0, 0xb1, 0x4f, 0x1d, 0xe2, 0xba, 0x47, 0x96, 0xed, 0x99, 0x27,
-	0x97, 0xe2, 0x50, 0x5b, 0x93, 0xe4, 0x5d, 0x46, 0x45, 0x6d, 0x28, 0x9c, 0x98, 0x7d, 0x8f, 0x38,
-	0x6e, 0x23, 0xb7, 0x94, 0x5d, 0xae, 0xad, 0xbe, 0xbc, 0xca, 0x6b, 0x2b, 0x3f, 0x62, 0xfc, 0x9d,
-	0xcb, 0x21, 0xd1, 0xe5, 0x58, 0xf5, 0xa0, 0x98, 0x0f, 0x1d, 0x9e, 0xef, 0x40, 0xf1, 0x03, 0x15,
-	0x41, 0x2f, 0xc5, 0x05, 0x7e, 0xb6, 0x63, 0xed, 0xad, 0x1e, 0x7e, 0x02, 0x10, 0x88, 0xa2, 0x59,
-	0x78, 0x77, 0x6f, 0xff, 0xb0, 0x53, 0x9f, 0x41, 0x15, 0x28, 0xee, 0xee, 0x6d, 0xb4, 0x77, 0xda,
-	0x34, 0x65, 0xe3, 0x96, 0x74, 0x9b, 0xea, 0xde, 0x90, 0x5c, 0x2d, 0x2c, 0xf7, 0xaf, 0x32, 0x50,
-	0x15, 0x1b, 0x64, 0xaa, 0x5d, 0xaa, 0xaa, 0xc8, 0x84, 0x54, 0xd0, 0x03, 0x2b, 0xdf, 0x38, 0x3d,
-	0x71, 0x2e, 0x96, 0x4d, 0x9a, 0x36, 0xf8, 0x3e, 0x20, 0x3d, 0xe1, 0x71, 0xbf, 0x9d, 0x18, 0xd9,
-	0xb9, 0xc4, 0xc8, 0x46, 0x8f, 0xa0, 0xea, 0x6f, 0x44, 0xc3, 0x15, 0x65, 0xb8, 0xa4, 0x57, 0xe4,
-	0x1e, 0xa3, 0x34, 0xf4, 0x04, 0xf2, 0x64, 0x4c, 0x2c, 0xcf, 0x6d, 0x94, 0x59, 0x42, 0xae, 0xca,
-	0xa3, 0x71, 0x9b, 0x52, 0x75, 0xd1, 0x89, 0x7f, 0x0b, 0x6e, 0xb0, 0x2b, 0xc8, 0x5b, 0xc7, 0xb0,
-	0xd4, 0xbb, 0x52, 0xa7, 0xb3, 0x23, 0x5c, 0x47, 0x3f, 0x51, 0x0d, 0x32, 0x5b, 0x1b, 0x62, 0xa2,
-	0x99, 0xad, 0x0d, 0xfc, 0x73, 0x0d, 0x90, 0x3a, 0x6e, 0x2a, 0x5f, 0x46, 0x84, 0x4b, 0xf5, 0xd9,
-	0x40, 0xfd, 0x02, 0xe4, 0x88, 0xe3, 0xd8, 0x0e, 0xf3, 0x5a, 0x49, 0xe7, 0x0d, 0xfc, 0x58, 0xd8,
-	0xa0, 0x93, 0xb1, 0x7d, 0xee, 0xc7, 0x0c, 0x97, 0xa6, 0xf9, 0xa6, 0x6e, 0xc3, 0x7c, 0x88, 0x6b,
-	0xaa, 0xc2, 0xf0, 0x0c, 0x6e, 0x32, 0x61, 0xdb, 0x84, 0x0c, 0xd7, 0xfa, 0xe6, 0x38, 0x55, 0xeb,
-	0x10, 0x6e, 0x45, 0x19, 0xbf, 0x59, 0x1f, 0xe1, 0xdf, 0x15, 0x1a, 0x3b, 0xe6, 0x80, 0x74, 0xec,
-	0x9d, 0x74, 0xdb, 0x68, 0xe2, 0x3c, 0x27, 0x97, 0xae, 0xa8, 0xa0, 0xec, 0x1b, 0xff, 0xa3, 0x06,
-	0xb7, 0x63, 0xc3, 0xbf, 0xe1, 0x55, 0x5d, 0x04, 0x38, 0xa5, 0xdb, 0x87, 0xf4, 0x68, 0x07, 0xbf,
-	0xbc, 0x2b, 0x14, 0xdf, 0x4e, 0x9a, 0x7b, 0x2a, 0xc2, 0xce, 0x05, 0xb1, 0xe6, 0xec, 0x8f, 0x2b,
-	0xcb, 0xcf, 0x7d, 0x28, 0x33, 0xc2, 0x81, 0x67, 0x78, 0x23, 0x37, 0xb6, 0x18, 0x7f, 0x22, 0xb6,
-	0x80, 0x1c, 0x34, 0xd5, 0xbc, 0xbe, 0x0b, 0x79, 0x76, 0x6e, 0x95, 0xa7, 0xb6, 0xc8, 0x45, 0x41,
-	0xb1, 0x43, 0x17, 0x8c, 0xf8, 0x0c, 0xf2, 0xef, 0x18, 0xd8, 0xa7, 0x58, 0x36, 0x2b, 0x97, 0xc2,
-	0x32, 0x06, 0x1c, 0x82, 0x28, 0xe9, 0xec, 0x9b, 0x1d, 0x72, 0x08, 0x71, 0x0e, 0xf5, 0x1d, 0x7e,
-	0x98, 0x2a, 0xe9, 0x7e, 0x9b, 0xba, 0xac, 0xdb, 0x37, 0x89, 0xe5, 0xb1, 0xde, 0x59, 0xd6, 0xab,
-	0x50, 0xf0, 0x0a, 0xd4, 0xb9, 0xa6, 0xb5, 0x5e, 0x4f, 0x39, 0xac, 0xf8, 0xf2, 0xb4, 0xb0, 0x3c,
-	0xfc, 0x2b, 0x0d, 0x6e, 0x28, 0x03, 0xa6, 0x72, 0xcc, 0x2b, 0xc8, 0x73, 0x48, 0x53, 0xd4, 0xc5,
-	0x85, 0xf0, 0x28, 0xae, 0x46, 0x17, 0x3c, 0x68, 0x05, 0x0a, 0xfc, 0x4b, 0x9e, 0x18, 0x93, 0xd9,
-	0x25, 0x13, 0x7e, 0x02, 0xf3, 0x82, 0x44, 0x06, 0x76, 0xd2, 0xde, 0x66, 0x0e, 0xc5, 0x3f, 0x83,
-	0x85, 0x30, 0xdb, 0x54, 0x53, 0x52, 0x8c, 0xcc, 0x5c, 0xc7, 0xc8, 0x35, 0x69, 0xe4, 0xe1, 0xb0,
-	0xa7, 0x94, 0xf1, 0xe8, 0xaa, 0xab, 0x2b, 0x92, 0x89, 0xac, 0x88, 0x3f, 0x01, 0x29, 0xe2, 0x5b,
-	0x9d, 0xc0, 0xbc, 0xdc, 0x0e, 0x3b, 0xa6, 0xeb, 0x1f, 0xee, 0x3e, 0x02, 0x52, 0x89, 0xdf, 0xb6,
-	0x41, 0x1b, 0xe4, 0xc4, 0x31, 0x4e, 0x07, 0xc4, 0xaf, 0x4f, 0xf4, 0xa8, 0xaf, 0x12, 0xa7, 0xca,
-	0xe8, 0x2d, 0xb8, 0xf1, 0xce, 0x1e, 0xd3, 0xd4, 0x40, 0xa9, 0x41, 0xc8, 0xf0, 0xab, 0x9e, 0xbf,
-	0x6c, 0x7e, 0x9b, 0x2a, 0x57, 0x07, 0x4c, 0xa5, 0xfc, 0x5f, 0x35, 0xa8, 0xac, 0xf5, 0x0d, 0x67,
-	0x20, 0x15, 0xff, 0x00, 0xf2, 0xfc, 0x02, 0x23, 0x30, 0x83, 0xa7, 0x61, 0x31, 0x2a, 0x2f, 0x6f,
-	0xac, 0xf1, 0xeb, 0x8e, 0x18, 0x45, 0x0d, 0x17, 0xcf, 0x0a, 0x1b, 0x91, 0x67, 0x86, 0x0d, 0xf4,
-	0x09, 0xe4, 0x0c, 0x3a, 0x84, 0xa5, 0xe0, 0x5a, 0xf4, 0xea, 0xc8, 0xa4, 0xb1, 0x73, 0x1b, 0xe7,
-	0xc2, 0xdf, 0x87, 0xb2, 0xa2, 0x81, 0x5e, 0x8e, 0xdf, 0xb6, 0xc5, 0x01, 0x6c, 0x6d, 0xbd, 0xb3,
-	0xf5, 0x9e, 0xdf, 0x99, 0x6b, 0x00, 0x1b, 0x6d, 0xbf, 0x9d, 0xc1, 0x9f, 0x89, 0x51, 0x22, 0xdf,
-	0xa9, 0xf6, 0x68, 0x69, 0xf6, 0x64, 0xae, 0x65, 0xcf, 0x05, 0x54, 0xc5, 0xf4, 0xa7, 0x4d, 0xdf,
-	0x4c, 0x5e, 0x4a, 0xfa, 0x56, 0x8c, 0xd7, 0x05, 0x23, 0x9e, 0x83, 0xaa, 0x48, 0xe8, 0x62, 0xff,
-	0xfd, 0x53, 0x06, 0x6a, 0x92, 0x32, 0x2d, 0xb6, 0x29, 0x61, 0x19, 0x5e, 0x01, 0x7c, 0x50, 0xe6,
-	0x16, 0xe4, 0x7b, 0xc7, 0x07, 0xe6, 0x47, 0x89, 0x43, 0x8b, 0x16, 0xa5, 0xf7, 0xb9, 0x1e, 0xfe,
-	0x18, 0x24, 0x5a, 0xf4, 0x82, 0xee, 0x18, 0x27, 0xde, 0x96, 0xd5, 0x23, 0x17, 0xec, 0xdc, 0x38,
-	0xab, 0x07, 0x04, 0x76, 0x5f, 0x15, 0x8f, 0x46, 0xec, 0xb0, 0xa8, 0x3c, 0x22, 0xa1, 0x17, 0x50,
-	0xa7, 0xdf, 0x6b, 0xc3, 0x61, 0xdf, 0x24, 0x3d, 0x2e, 0xa0, 0xc0, 0x78, 0x62, 0x74, 0xaa, 0x9d,
-	0x1d, 0xbd, 0xdc, 0x46, 0x91, 0xa5, 0x2d, 0xd1, 0x42, 0x4b, 0x50, 0xe6, 0xf6, 0x6d, 0x59, 0x87,
-	0x2e, 0x61, 0x2f, 0x29, 0x59, 0x5d, 0x25, 0xd1, 0x38, 0x5e, 0x1b, 0x79, 0x67, 0x6d, 0xcb, 0x38,
-	0xee, 0xcb, 0xbc, 0x48, 0x8b, 0x39, 0x25, 0x6e, 0x98, 0xae, 0x4a, 0x6d, 0xc3, 0x3c, 0xa5, 0x12,
-	0xcb, 0x33, 0xbb, 0x4a, 0x12, 0x95, 0xa5, 0x52, 0x8b, 0x94, 0x4a, 0xc3, 0x75, 0x3f, 0xd8, 0x4e,
-	0x4f, 0x38, 0xd0, 0x6f, 0xe3, 0x0d, 0x2e, 0xfc, 0xd0, 0x0d, 0x15, 0xc3, 0x2f, 0x2b, 0x65, 0x39,
-	0x90, 0xf2, 0x96, 0x78, 0x13, 0xa4, 0xe0, 0x97, 0x70, 0x53, 0x72, 0x0a, 0x74, 0x71, 0x02, 0xf3,
-	0x1e, 0xdc, 0x97, 0xcc, 0xeb, 0x67, 0xf4, 0xfa, 0xb6, 0x2f, 0x14, 0x7e, 0x55, 0x3b, 0xdf, 0x40,
-	0xc3, 0xb7, 0x93, 0x1d, 0xc9, 0xed, 0xbe, 0x6a, 0xc0, 0xc8, 0x15, 0x3b, 0xb3, 0xa4, 0xb3, 0x6f,
-	0x4a, 0x73, 0xec, 0xbe, 0x7f, 0xf0, 0xa0, 0xdf, 0x78, 0x1d, 0xee, 0x48, 0x19, 0xe2, 0xb0, 0x1c,
-	0x16, 0x12, 0x33, 0x28, 0x49, 0x88, 0x70, 0x18, 0x1d, 0x3a, 0xd9, 0xed, 0x2a, 0x67, 0xd8, 0xb5,
-	0x4c, 0xa6, 0xa6, 0xc8, 0xbc, 0xc9, 0x77, 0x04, 0x35, 0x4c, 0xad, 0x4b, 0x82, 0x4c, 0x05, 0xa8,
-	0x64, 0xb1, 0x10, 0x94, 0x1c, 0x5b, 0x88, 0x98, 0xe8, 0x9f, 0xc2, 0xa2, 0x6f, 0x04, 0xf5, 0xdb,
-	0x3e, 0x71, 0x06, 0xa6, 0xeb, 0x2a, 0x78, 0x54, 0xd2, 0xc4, 0x9f, 0xc2, 0xec, 0x90, 0x88, 0xcc,
-	0x55, 0x5e, 0x45, 0x2b, 0xfc, 0x01, 0x79, 0x45, 0x19, 0xcc, 0xfa, 0x71, 0x0f, 0x1e, 0x48, 0xe9,
-	0xdc, 0xa3, 0x89, 0xe2, 0xa3, 0x46, 0xc9, 0x6b, 0x3f, 0x77, 0x6b, 0xfc, 0xda, 0x9f, 0xe5, 0x6b,
-	0xef, 0x63, 0xa4, 0x3f, 0xe6, 0x8e, 0x94, 0xb1, 0x35, 0x55, 0x45, 0xda, 0xe6, 0x3e, 0xf5, 0x43,
-	0x72, 0x2a, 0x61, 0xc7, 0xb0, 0x10, 0x8e, 0xe4, 0xa9, 0x92, 0xe5, 0x02, 0xe4, 0x3c, 0xfb, 0x9c,
-	0xc8, 0x54, 0xc9, 0x1b, 0xd2, 0x60, 0x3f, 0xcc, 0xa7, 0x32, 0xd8, 0x08, 0x84, 0xb1, 0x2d, 0x39,
-	0xad, 0xbd, 0x74, 0x35, 0xe5, 0x11, 0x8f, 0x37, 0xf0, 0x2e, 0xdc, 0x8a, 0xa6, 0x89, 0xa9, 0x4c,
-	0x7e, 0xcf, 0x37, 0x70, 0x52, 0x26, 0x99, 0x4a, 0xee, 0x4f, 0x82, 0x64, 0xa0, 0x24, 0x94, 0xa9,
-	0x44, 0xea, 0xd0, 0x4c, 0xca, 0x2f, 0x5f, 0xc7, 0x7e, 0xf5, 0xd3, 0xcd, 0x54, 0xc2, 0xdc, 0x40,
-	0xd8, 0xf4, 0xcb, 0x1f, 0xe4, 0x88, 0xec, 0xc4, 0x1c, 0x21, 0x82, 0x24, 0xc8, 0x62, 0xdf, 0xc0,
-	0xa6, 0x13, 0x3a, 0x82, 0x04, 0x3a, 0xad, 0x0e, 0x5a, 0x43, 0x7c, 0x1d, 0xac, 0x21, 0x37, 0xb6,
-	0x9a, 0x76, 0xa7, 0x5a, 0x8c, 0x4f, 0x83, 0xdc, 0x19, 0xcb, 0xcc, 0x53, 0x09, 0xfe, 0x0c, 0x96,
-	0xd2, 0x93, 0xf2, 0x34, 0x92, 0x5f, 0xb4, 0xa0, 0xe4, 0x1f, 0x5b, 0x95, 0x1f, 0x5f, 0x94, 0xa1,
-	0xb0, 0xbb, 0x77, 0xb0, 0xbf, 0xb6, 0xde, 0xe6, 0xbf, 0xbe, 0x58, 0xdf, 0xd3, 0xf5, 0xc3, 0xfd,
-	0x4e, 0x3d, 0xb3, 0xfa, 0xbf, 0x59, 0xc8, 0x6c, 0xbf, 0x47, 0xbf, 0x0f, 0x39, 0xfe, 0x14, 0x39,
-	0xe1, 0xfd, 0xb9, 0x39, 0xe9, 0xb5, 0x15, 0xdf, 0xfd, 0xf9, 0xbf, 0xff, 0xd7, 0x2f, 0x33, 0x37,
-	0x71, 0xbd, 0x35, 0xfe, 0xde, 0x31, 0xf1, 0x8c, 0xd6, 0xf9, 0xb8, 0xc5, 0xea, 0xc3, 0x6b, 0xed,
-	0x05, 0x3a, 0x84, 0xec, 0xfe, 0xc8, 0x43, 0xa9, 0x6f, 0xd3, 0xcd, 0xf4, 0x47, 0x58, 0x7c, 0x87,
-	0x09, 0x9e, 0xc7, 0x35, 0x45, 0xf0, 0x70, 0xe4, 0x51, 0xb1, 0x23, 0x28, 0xab, 0xcf, 0xa8, 0x57,
-	0x3e, 0x5a, 0x37, 0xaf, 0x7e, 0xa2, 0xc5, 0x0f, 0x99, 0xba, 0xbb, 0xf8, 0x96, 0xa2, 0x8e, 0x3f,
-	0xf6, 0xaa, 0xb3, 0xe9, 0x5c, 0x58, 0x28, 0xf5, 0x59, 0xbb, 0x99, 0xfe, 0x72, 0x9b, 0x38, 0x1b,
-	0xef, 0xc2, 0xa2, 0x62, 0x2d, 0xf1, 0x70, 0xdb, 0xf5, 0xd0, 0x83, 0x84, 0x87, 0x3b, 0xf5, 0x89,
-	0xaa, 0xb9, 0x94, 0xce, 0x20, 0x14, 0x2d, 0x31, 0x45, 0x4d, 0x7c, 0x53, 0x51, 0xd4, 0xf5, 0xd9,
-	0x5e, 0x6b, 0x2f, 0x56, 0x4f, 0x21, 0xc7, 0x70, 0x68, 0xf4, 0x07, 0xf2, 0xa3, 0x99, 0x00, 0xae,
-	0xa7, 0x2c, 0x7e, 0x08, 0xc1, 0xc6, 0x0d, 0xa6, 0x0c, 0xe1, 0xaa, 0x54, 0xc6, 0x90, 0xe8, 0xd7,
-	0xda, 0x8b, 0x65, 0xed, 0x3b, 0xda, 0xea, 0xff, 0xcc, 0x42, 0x8e, 0x81, 0x52, 0xc8, 0x06, 0x08,
-	0x30, 0xdb, 0xe8, 0x2c, 0x63, 0x28, 0x70, 0x74, 0x96, 0x71, 0xb8, 0x17, 0x2f, 0x32, 0xc5, 0x0d,
-	0x3c, 0x2f, 0x15, 0x33, 0xbc, 0xab, 0xc5, 0x20, 0x3c, 0xea, 0xd3, 0xb1, 0x80, 0xe5, 0x78, 0x98,
-	0xa1, 0x24, 0x81, 0x21, 0xec, 0x36, 0xba, 0x43, 0x12, 0x70, 0x5b, 0x8c, 0x99, 0xce, 0x7b, 0xf8,
-	0xb6, 0xe2, 0x59, 0xae, 0xd6, 0x61, 0x8c, 0x54, 0xef, 0x9f, 0x69, 0x50, 0x0b, 0xa3, 0xaf, 0xe8,
-	0x51, 0x82, 0xe4, 0x28, 0x88, 0xdb, 0x7c, 0x3c, 0x99, 0x29, 0xcd, 0x02, 0xae, 0xfe, 0x9c, 0x90,
-	0xa1, 0x41, 0x19, 0x85, 0xe3, 0xd1, 0x5f, 0x68, 0x30, 0x17, 0x81, 0x54, 0x51, 0x92, 0x86, 0x18,
-	0x60, 0xdb, 0x7c, 0x72, 0x05, 0x97, 0x30, 0xe4, 0x29, 0x33, 0x64, 0x09, 0xdf, 0x8d, 0xb9, 0xc2,
-	0x33, 0x07, 0xc4, 0xb3, 0x85, 0x31, 0xfe, 0x32, 0x70, 0xf8, 0x33, 0x71, 0x19, 0x42, 0x70, 0x6a,
-	0xe2, 0x32, 0x84, 0xb1, 0xd3, 0x09, 0xcb, 0xc0, 0x31, 0x4f, 0xba, 0xc5, 0xff, 0x2f, 0x0b, 0x85,
-	0x75, 0xfe, 0x13, 0x48, 0xe4, 0x42, 0xc9, 0xc7, 0x19, 0xd1, 0x62, 0x12, 0xe6, 0x13, 0xdc, 0x16,
-	0x9a, 0x0f, 0x52, 0xfb, 0x85, 0xf6, 0x27, 0x4c, 0xfb, 0x03, 0xdc, 0x94, 0xda, 0xc5, 0x2f, 0x2d,
-	0x5b, 0x1c, 0x5c, 0x68, 0x19, 0xbd, 0x1e, 0x9d, 0xf8, 0x9f, 0x42, 0x45, 0x05, 0x03, 0xd1, 0xc3,
-	0x44, 0xac, 0x49, 0xc5, 0x13, 0x9b, 0x78, 0x12, 0x8b, 0xd0, 0xbe, 0xcc, 0xb4, 0x63, 0x7c, 0x3f,
-	0x45, 0xbb, 0xc3, 0xd8, 0x43, 0x06, 0x70, 0x30, 0x2f, 0xd9, 0x80, 0x10, 0x56, 0x98, 0x6c, 0x40,
-	0x18, 0x0b, 0xbc, 0xd2, 0x80, 0x11, 0x63, 0xa7, 0x06, 0x7c, 0x00, 0x08, 0xa0, 0x3b, 0x94, 0xe8,
-	0x57, 0xe5, 0xea, 0x14, 0x0d, 0xf9, 0x38, 0xea, 0x17, 0xdf, 0x73, 0x11, 0xd5, 0x7d, 0xd3, 0xa5,
-	0xa1, 0xbf, 0xfa, 0xab, 0x3c, 0x94, 0xdf, 0x19, 0xa6, 0xe5, 0x11, 0xcb, 0xb0, 0xba, 0x04, 0x9d,
-	0x40, 0x8e, 0x95, 0xc6, 0x68, 0x96, 0x53, 0x11, 0xad, 0x68, 0x96, 0x0b, 0xc1, 0x3d, 0xf8, 0x31,
-	0xd3, 0xbc, 0x88, 0xef, 0x48, 0xcd, 0x83, 0x40, 0x7c, 0x8b, 0x21, 0x35, 0x74, 0xc2, 0x7f, 0x08,
-	0x79, 0xf1, 0x08, 0x10, 0x11, 0x16, 0x42, 0x70, 0x9a, 0xf7, 0x92, 0x3b, 0xd3, 0xb6, 0x97, 0xaa,
-	0xca, 0x65, 0xbc, 0x54, 0xd7, 0x47, 0x80, 0x00, 0x86, 0x8c, 0x3a, 0x37, 0x86, 0x5a, 0x36, 0x97,
-	0xd2, 0x19, 0x84, 0xde, 0xe7, 0x4c, 0xef, 0x23, 0xbc, 0x98, 0xa4, 0xb7, 0xe7, 0xf3, 0x53, 0xdd,
-	0xc7, 0x30, 0xbb, 0x69, 0xb8, 0x67, 0x28, 0x52, 0xec, 0x94, 0x5f, 0x2d, 0x34, 0x9b, 0x49, 0x5d,
-	0x42, 0xd3, 0x23, 0xa6, 0xe9, 0x3e, 0x6e, 0x24, 0x69, 0x3a, 0x33, 0x5c, 0x5a, 0x3d, 0xd0, 0x19,
-	0xe4, 0xf9, 0x0f, 0x19, 0xa2, 0xbe, 0x0c, 0xfd, 0x18, 0x22, 0xea, 0xcb, 0xf0, 0x6f, 0x1f, 0xae,
-	0xa7, 0xc9, 0x83, 0xa2, 0xfc, 0xf5, 0x00, 0xba, 0x1f, 0x59, 0x9a, 0xf0, 0x2f, 0x0d, 0x9a, 0x8b,
-	0x69, 0xdd, 0x42, 0xdf, 0x33, 0xa6, 0xef, 0x21, 0xbe, 0x97, 0xb8, 0x76, 0x82, 0xfb, 0xb5, 0xf6,
-	0xe2, 0x3b, 0x1a, 0x2d, 0x13, 0x10, 0x40, 0xb9, 0xb1, 0xe8, 0x88, 0xa2, 0xc2, 0xb1, 0xe8, 0x88,
-	0xa1, 0xc0, 0x78, 0x95, 0x29, 0x7f, 0x85, 0x9f, 0x25, 0x29, 0xf7, 0x1c, 0xc3, 0x72, 0x4f, 0x88,
-	0xf3, 0x09, 0x87, 0xec, 0xdc, 0x33, 0x73, 0x48, 0x23, 0xe5, 0xff, 0xe7, 0x60, 0x96, 0x9e, 0x47,
-	0x69, 0x79, 0x0e, 0xae, 0xf1, 0x51, 0x6b, 0x62, 0xe0, 0x59, 0xd4, 0x9a, 0x38, 0x02, 0x10, 0x2f,
-	0xcf, 0xec, 0xc7, 0xee, 0x84, 0x31, 0x51, 0xaf, 0xbb, 0x50, 0x56, 0xee, 0xfa, 0x28, 0x41, 0x60,
-	0x18, 0x99, 0x8b, 0xd6, 0x85, 0x04, 0xa0, 0x00, 0x3f, 0x60, 0x3a, 0xef, 0xe0, 0x85, 0x90, 0xce,
-	0x1e, 0xe7, 0xa2, 0x4a, 0xff, 0x18, 0x2a, 0x2a, 0x26, 0x80, 0x12, 0x64, 0x46, 0x90, 0xbf, 0x68,
-	0x4a, 0x4c, 0x82, 0x14, 0xe2, 0xd9, 0xc1, 0xff, 0x61, 0xbf, 0x64, 0xa5, 0xca, 0x87, 0x50, 0x10,
-	0x40, 0x41, 0xd2, 0x6c, 0xc3, 0x50, 0x61, 0xd2, 0x6c, 0x23, 0x28, 0x43, 0xfc, 0x98, 0xc7, 0xb4,
-	0xd2, 0xfb, 0x90, 0x2c, 0x41, 0x42, 0xe3, 0x5b, 0xe2, 0xa5, 0x69, 0x0c, 0xb0, 0xaf, 0x34, 0x8d,
-	0xca, 0x5d, 0x74, 0x92, 0xc6, 0x53, 0xe2, 0x89, 0x58, 0x92, 0xf7, 0x3c, 0x94, 0x22, 0x50, 0x4d,
-	0xf9, 0x78, 0x12, 0x4b, 0xda, 0xa9, 0x3c, 0x50, 0x2a, 0xf2, 0x3d, 0xfa, 0x19, 0x40, 0x00, 0x69,
-	0x44, 0x4f, 0x5b, 0x89, 0xb8, 0x68, 0xf4, 0xb4, 0x95, 0x8c, 0x8a, 0xc4, 0xf3, 0x47, 0xa0, 0x9b,
-	0x5f, 0x0c, 0xa8, 0xf6, 0xbf, 0xd1, 0x00, 0xc5, 0x11, 0x10, 0xf4, 0x32, 0x59, 0x43, 0x22, 0xe2,
-	0xda, 0x7c, 0x75, 0x3d, 0xe6, 0xb4, 0x12, 0x11, 0x98, 0xd5, 0x65, 0x23, 0x86, 0x1f, 0xa8, 0x61,
-	0xbf, 0xd0, 0xa0, 0x1a, 0x82, 0x50, 0xd0, 0xd3, 0x94, 0x35, 0x8e, 0x80, 0xb6, 0xcd, 0x67, 0x57,
-	0xf2, 0xa5, 0x9d, 0xc4, 0x94, 0x1d, 0x21, 0x0f, 0xe2, 0x7f, 0xa9, 0x41, 0x2d, 0x0c, 0xbb, 0xa0,
-	0x14, 0xf9, 0x31, 0xe0, 0xb7, 0xb9, 0x7c, 0x35, 0xe3, 0xd5, 0x4b, 0x15, 0x9c, 0xcd, 0x87, 0x50,
-	0x10, 0x60, 0x4d, 0x52, 0x40, 0x84, 0x61, 0xe3, 0xa4, 0x80, 0x88, 0x20, 0x3d, 0x29, 0x01, 0xe1,
-	0xd8, 0x7d, 0xa2, 0x84, 0xa0, 0x40, 0x74, 0xd2, 0x34, 0x4e, 0x0e, 0xc1, 0x08, 0x1c, 0x34, 0x49,
-	0x63, 0x10, 0x82, 0x12, 0xce, 0x41, 0x29, 0x02, 0xaf, 0x08, 0xc1, 0x28, 0x1a, 0x94, 0x12, 0x82,
-	0x4c, 0xa9, 0x12, 0x82, 0x01, 0xf8, 0x92, 0x14, 0x82, 0x31, 0x44, 0x3c, 0x29, 0x04, 0xe3, 0xf8,
-	0x4d, 0xca, 0xba, 0x32, 0xdd, 0xa1, 0x10, 0x9c, 0x4f, 0xc0, 0x6a, 0xd0, 0xab, 0x14, 0x87, 0x26,
-	0x82, 0xed, 0xcd, 0x4f, 0xae, 0xc9, 0x3d, 0x71, 0xef, 0xf3, 0xa5, 0x90, 0x7b, 0xff, 0xef, 0x35,
-	0x58, 0x48, 0xc2, 0x7a, 0x50, 0x8a, 0xae, 0x14, 0xa0, 0xbe, 0xb9, 0x72, 0x5d, 0xf6, 0xab, 0xbd,
-	0xe6, 0x47, 0xc3, 0x9b, 0xfa, 0xbf, 0x7c, 0xb1, 0xa8, 0xfd, 0xdb, 0x17, 0x8b, 0xda, 0x7f, 0x7c,
-	0xb1, 0xa8, 0xfd, 0xed, 0x7f, 0x2e, 0xce, 0x1c, 0xe7, 0xd9, 0x7f, 0x31, 0xfb, 0xde, 0x6f, 0x02,
-	0x00, 0x00, 0xff, 0xff, 0x8e, 0x1f, 0x05, 0xf6, 0xfb, 0x36, 0x00, 0x00,
+	// 3712 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xdd, 0x6f, 0x1b, 0xc7,
+	0x76, 0xd7, 0x92, 0xe2, 0xd7, 0xe1, 0x87, 0xa8, 0x91, 0x64, 0xd3, 0xb4, 0x2d, 0xcb, 0x63, 0x3b,
+	0x56, 0xec, 0x44, 0xbc, 0x57, 0xf7, 0xb6, 0x0f, 0x6e, 0x71, 0x71, 0x65, 0x89, 0xd7, 0xd2, 0x95,
+	0x2c, 0x29, 0x2b, 0xca, 0x49, 0x8a, 0xa0, 0xc2, 0x8a, 0x1c, 0x49, 0x5b, 0x91, 0xbb, 0xcc, 0xee,
+	0x92, 0x96, 0xd2, 0xa2, 0x29, 0x82, 0xf4, 0xa5, 0x40, 0x5f, 0x12, 0xa0, 0x68, 0x9f, 0x8b, 0xa2,
+	0xc8, 0x5b, 0x5f, 0x82, 0x02, 0xfd, 0x0b, 0xfa, 0xd6, 0x02, 0xfd, 0x07, 0x0a, 0x37, 0x2f, 0xfd,
+	0x2f, 0x2e, 0xe6, 0x6b, 0x77, 0xf6, 0x4b, 0x72, 0xc2, 0x24, 0x2f, 0xf2, 0xce, 0x99, 0x33, 0xe7,
+	0x77, 0xe6, 0xcc, 0xcc, 0x39, 0x67, 0xce, 0xd0, 0x50, 0x72, 0x86, 0xdd, 0x95, 0xa1, 0x63, 0x7b,
+	0x36, 0xaa, 0x10, 0xaf, 0xdb, 0x73, 0x89, 0x33, 0x26, 0xce, 0xf0, 0xb8, 0x39, 0x7f, 0x6a, 0x9f,
+	0xda, 0xac, 0xa3, 0x45, 0xbf, 0x38, 0x4f, 0x13, 0x53, 0x9e, 0x96, 0x69, 0x79, 0xc4, 0xb1, 0x8c,
+	0x7e, 0x6b, 0x30, 0xee, 0x76, 0xd9, 0x9f, 0xe1, 0x71, 0xeb, 0x7c, 0x2c, 0x78, 0x1e, 0x86, 0x79,
+	0x8c, 0x91, 0x77, 0xc6, 0xfe, 0x0c, 0x8f, 0xd9, 0x3f, 0x82, 0xeb, 0xce, 0xa9, 0x6d, 0x9f, 0xf6,
+	0x49, 0xcb, 0x18, 0x9a, 0x2d, 0xc3, 0xb2, 0x6c, 0xcf, 0xf0, 0x4c, 0xdb, 0x72, 0x79, 0x2f, 0xfe,
+	0x5b, 0x0d, 0x6a, 0x3a, 0x71, 0x87, 0xb6, 0xe5, 0x92, 0x4d, 0x62, 0xf4, 0x88, 0x83, 0xee, 0x02,
+	0x74, 0xfb, 0x23, 0xd7, 0x23, 0xce, 0x91, 0xd9, 0x6b, 0x68, 0x4b, 0xda, 0xf2, 0xb4, 0x5e, 0x12,
+	0x94, 0xad, 0x1e, 0xba, 0x0d, 0xa5, 0x01, 0x19, 0x1c, 0xf3, 0xde, 0x0c, 0xeb, 0x2d, 0x72, 0xc2,
+	0x56, 0x0f, 0x35, 0xa1, 0xe8, 0x90, 0xb1, 0xe9, 0x9a, 0xb6, 0xd5, 0xc8, 0x2e, 0x69, 0xcb, 0x59,
+	0xdd, 0x6f, 0xd3, 0x81, 0x8e, 0x71, 0xe2, 0x1d, 0x79, 0xc4, 0x19, 0x34, 0xa6, 0xf9, 0x40, 0x4a,
+	0xe8, 0x10, 0x67, 0x80, 0xbf, 0xcc, 0x41, 0x45, 0x37, 0xac, 0x53, 0xa2, 0x93, 0x4f, 0x47, 0xc4,
+	0xf5, 0x50, 0x1d, 0xb2, 0xe7, 0xe4, 0x92, 0xc1, 0x57, 0x74, 0xfa, 0xc9, 0xc7, 0x5b, 0xa7, 0xe4,
+	0x88, 0x58, 0x1c, 0xb8, 0x42, 0xc7, 0x5b, 0xa7, 0xa4, 0x6d, 0xf5, 0xd0, 0x3c, 0xe4, 0xfa, 0xe6,
+	0xc0, 0xf4, 0x04, 0x2a, 0x6f, 0x84, 0xd4, 0x99, 0x8e, 0xa8, 0xb3, 0x0e, 0xe0, 0xda, 0x8e, 0x77,
+	0x64, 0x3b, 0x3d, 0xe2, 0x34, 0x72, 0x4b, 0xda, 0x72, 0x6d, 0xf5, 0xe1, 0x8a, 0xba, 0x34, 0x2b,
+	0xaa, 0x42, 0x2b, 0x07, 0xb6, 0xe3, 0xed, 0x51, 0x5e, 0xbd, 0xe4, 0xca, 0x4f, 0xf4, 0x3b, 0x28,
+	0x33, 0x21, 0x9e, 0xe1, 0x9c, 0x12, 0xaf, 0x91, 0x67, 0x52, 0x1e, 0x5d, 0x23, 0xa5, 0xc3, 0x98,
+	0x75, 0x06, 0xcf, 0xbf, 0x11, 0x86, 0x8a, 0x4b, 0x1c, 0xd3, 0xe8, 0x9b, 0x9f, 0x19, 0xc7, 0x7d,
+	0xd2, 0x28, 0x2c, 0x69, 0xcb, 0x45, 0x3d, 0x44, 0xa3, 0xf3, 0x3f, 0x27, 0x97, 0xee, 0x91, 0x6d,
+	0xf5, 0x2f, 0x1b, 0x45, 0xc6, 0x50, 0xa4, 0x84, 0x3d, 0xab, 0x7f, 0xc9, 0x16, 0xcd, 0x1e, 0x59,
+	0x1e, 0xef, 0x2d, 0xb1, 0xde, 0x12, 0xa3, 0xb0, 0xee, 0x65, 0xa8, 0x0f, 0x4c, 0xeb, 0x68, 0x60,
+	0xf7, 0x8e, 0x7c, 0x83, 0x00, 0x33, 0x48, 0x6d, 0x60, 0x5a, 0x2f, 0xed, 0x9e, 0x2e, 0xcd, 0x42,
+	0x39, 0x8d, 0x8b, 0x30, 0x67, 0x59, 0x70, 0x1a, 0x17, 0x2a, 0xe7, 0x0a, 0xcc, 0x51, 0x99, 0x5d,
+	0x87, 0x18, 0x1e, 0x09, 0x98, 0x2b, 0x8c, 0x79, 0x76, 0x60, 0x5a, 0xeb, 0xac, 0x27, 0xc4, 0x6f,
+	0x5c, 0xc4, 0xf8, 0xab, 0x82, 0xdf, 0xb8, 0x08, 0xf3, 0xe3, 0x15, 0x28, 0xf9, 0x36, 0x47, 0x45,
+	0x98, 0xde, 0xdd, 0xdb, 0x6d, 0xd7, 0xa7, 0x10, 0x40, 0x7e, 0xed, 0x60, 0xbd, 0xbd, 0xbb, 0x51,
+	0xd7, 0x50, 0x19, 0x0a, 0x1b, 0x6d, 0xde, 0xc8, 0xe0, 0xe7, 0x00, 0x81, 0x75, 0x51, 0x01, 0xb2,
+	0xdb, 0xed, 0x8f, 0xeb, 0x53, 0x94, 0xe7, 0x55, 0x5b, 0x3f, 0xd8, 0xda, 0xdb, 0xad, 0x6b, 0x74,
+	0xf0, 0xba, 0xde, 0x5e, 0xeb, 0xb4, 0xeb, 0x19, 0xca, 0xf1, 0x72, 0x6f, 0xa3, 0x9e, 0x45, 0x25,
+	0xc8, 0xbd, 0x5a, 0xdb, 0x39, 0x6c, 0xd7, 0xa7, 0xf1, 0xd7, 0x1a, 0x54, 0xc5, 0x7a, 0xf1, 0x33,
+	0x81, 0x7e, 0x0d, 0xf9, 0x33, 0x76, 0x2e, 0xd8, 0x56, 0x2c, 0xaf, 0xde, 0x89, 0x2c, 0x6e, 0xe8,
+	0xec, 0xe8, 0x82, 0x17, 0x61, 0xc8, 0x9e, 0x8f, 0xdd, 0x46, 0x66, 0x29, 0xbb, 0x5c, 0x5e, 0xad,
+	0xaf, 0xf0, 0x93, 0xbb, 0xb2, 0x4d, 0x2e, 0x5f, 0x19, 0xfd, 0x11, 0xd1, 0x69, 0x27, 0x42, 0x30,
+	0x3d, 0xb0, 0x1d, 0xc2, 0x76, 0x6c, 0x51, 0x67, 0xdf, 0x74, 0x1b, 0xb3, 0x45, 0x13, 0xbb, 0x95,
+	0x37, 0xf0, 0x37, 0x1a, 0xc0, 0xfe, 0xc8, 0x4b, 0x3f, 0x1a, 0xf3, 0x90, 0x1b, 0x53, 0xc1, 0xe2,
+	0x58, 0xf0, 0x06, 0x3b, 0x13, 0xc4, 0x70, 0x89, 0x7f, 0x26, 0x68, 0x03, 0xdd, 0x84, 0xc2, 0xd0,
+	0x21, 0xe3, 0xa3, 0xf3, 0x31, 0x03, 0x29, 0xea, 0x79, 0xda, 0xdc, 0x1e, 0xa3, 0xfb, 0x50, 0x31,
+	0x4f, 0x2d, 0xdb, 0x21, 0x47, 0x5c, 0x56, 0x8e, 0xf5, 0x96, 0x39, 0x8d, 0xe9, 0xad, 0xb0, 0x70,
+	0xc1, 0x79, 0x95, 0x65, 0x87, 0x92, 0xb0, 0x05, 0x65, 0xa6, 0xea, 0x44, 0xe6, 0x7b, 0x37, 0xd0,
+	0x31, 0xc3, 0x86, 0xc5, 0x4d, 0x28, 0xb4, 0xc6, 0x9f, 0x00, 0xda, 0x20, 0x7d, 0xe2, 0x91, 0x49,
+	0xbc, 0x87, 0x62, 0x93, 0xac, 0x6a, 0x13, 0xfc, 0x95, 0x06, 0x73, 0x21, 0xf1, 0x13, 0x4d, 0xab,
+	0x01, 0x85, 0x1e, 0x13, 0xc6, 0x35, 0xc8, 0xea, 0xb2, 0x89, 0x9e, 0x42, 0x51, 0x28, 0xe0, 0x36,
+	0xb2, 0x29, 0x9b, 0xa6, 0xc0, 0x75, 0x72, 0xf1, 0x37, 0x19, 0x28, 0x89, 0x89, 0xee, 0x0d, 0xd1,
+	0x1a, 0x54, 0x1d, 0xde, 0x38, 0x62, 0xf3, 0x11, 0x1a, 0x35, 0xd3, 0x9d, 0xd0, 0xe6, 0x94, 0x5e,
+	0x11, 0x43, 0x18, 0x19, 0xfd, 0x09, 0x94, 0xa5, 0x88, 0xe1, 0xc8, 0x13, 0x26, 0x6f, 0x84, 0x05,
+	0x04, 0xfb, 0x6f, 0x73, 0x4a, 0x07, 0xc1, 0xbe, 0x3f, 0xf2, 0x50, 0x07, 0xe6, 0xe5, 0x60, 0x3e,
+	0x1b, 0xa1, 0x46, 0x96, 0x49, 0x59, 0x0a, 0x4b, 0x89, 0x2f, 0xd5, 0xe6, 0x94, 0x8e, 0xc4, 0x78,
+	0xa5, 0x53, 0x55, 0xc9, 0xbb, 0xe0, 0xce, 0x3b, 0xa6, 0x52, 0xe7, 0xc2, 0x8a, 0xab, 0xd4, 0xb9,
+	0xb0, 0x9e, 0x97, 0xa0, 0x20, 0x5a, 0xf8, 0xdf, 0x33, 0x00, 0x72, 0x35, 0xf6, 0x86, 0x68, 0x03,
+	0x6a, 0x8e, 0x68, 0x85, 0xac, 0x75, 0x3b, 0xd1, 0x5a, 0x62, 0x11, 0xa7, 0xf4, 0xaa, 0x1c, 0xc4,
+	0x95, 0xfb, 0x0d, 0x54, 0x7c, 0x29, 0x81, 0xc1, 0x6e, 0x25, 0x18, 0xcc, 0x97, 0x50, 0x96, 0x03,
+	0xa8, 0xc9, 0x3e, 0x84, 0x05, 0x7f, 0x7c, 0x82, 0xcd, 0xee, 0x5f, 0x61, 0x33, 0x5f, 0xe0, 0x9c,
+	0x94, 0xa0, 0x5a, 0x4d, 0x55, 0x2c, 0x30, 0xdb, 0xad, 0x04, 0xb3, 0xc5, 0x15, 0xa3, 0x86, 0x03,
+	0x1a, 0x2f, 0x79, 0x13, 0xff, 0x7f, 0x16, 0x0a, 0xeb, 0xf6, 0x60, 0x68, 0x38, 0x74, 0x35, 0xf2,
+	0x0e, 0x71, 0x47, 0x7d, 0x8f, 0x99, 0xab, 0xb6, 0xfa, 0x20, 0x2c, 0x51, 0xb0, 0xc9, 0x7f, 0x75,
+	0xc6, 0xaa, 0x8b, 0x21, 0x74, 0xb0, 0x08, 0x8f, 0x99, 0xb7, 0x18, 0x2c, 0x82, 0xa3, 0x18, 0x22,
+	0x0f, 0x72, 0x36, 0x38, 0xc8, 0x4d, 0x28, 0x8c, 0x89, 0x13, 0x84, 0xf4, 0xcd, 0x29, 0x5d, 0x12,
+	0xd0, 0xbb, 0x30, 0x13, 0x0d, 0x2f, 0x39, 0xc1, 0x53, 0xeb, 0x86, 0xa3, 0xd1, 0x03, 0xa8, 0x84,
+	0x62, 0x5c, 0x5e, 0xf0, 0x95, 0x07, 0x4a, 0x88, 0xbb, 0x21, 0xfd, 0x2a, 0x8d, 0xc7, 0x95, 0xcd,
+	0x29, 0xe9, 0x59, 0x6f, 0x48, 0xcf, 0x5a, 0x14, 0xa3, 0x84, 0x6f, 0x0d, 0x39, 0x99, 0xdf, 0x86,
+	0x9d, 0x0c, 0xfe, 0x2d, 0x54, 0x43, 0x06, 0xa2, 0x71, 0xa7, 0xfd, 0xc1, 0xe1, 0xda, 0x0e, 0x0f,
+	0x52, 0x2f, 0x58, 0x5c, 0xd2, 0xeb, 0x1a, 0x8d, 0x75, 0x3b, 0xed, 0x83, 0x83, 0x7a, 0x06, 0x55,
+	0xa1, 0xb4, 0xbb, 0xd7, 0x39, 0xe2, 0x5c, 0x59, 0xfc, 0xc2, 0x97, 0x20, 0x82, 0x9c, 0x12, 0xdb,
+	0xa6, 0x94, 0xd8, 0xa6, 0xc9, 0xd8, 0x96, 0x09, 0x62, 0x1b, 0x0b, 0x73, 0x3b, 0xed, 0xb5, 0x83,
+	0x76, 0x7d, 0xfa, 0x79, 0x0d, 0x2a, 0xdc, 0xbe, 0x47, 0x23, 0x8b, 0x86, 0xda, 0x7f, 0xd6, 0x00,
+	0x82, 0xd3, 0x84, 0x5a, 0x50, 0xe8, 0x72, 0x9c, 0x86, 0xc6, 0x9c, 0xd1, 0x42, 0xe2, 0x92, 0xe9,
+	0x92, 0x0b, 0xfd, 0x12, 0x0a, 0xee, 0xa8, 0xdb, 0x25, 0xae, 0x0c, 0x79, 0x37, 0xa3, 0xfe, 0x50,
+	0x78, 0x2b, 0x5d, 0xf2, 0xd1, 0x21, 0x27, 0x86, 0xd9, 0x1f, 0xb1, 0x00, 0x78, 0xf5, 0x10, 0xc1,
+	0x87, 0xff, 0x49, 0x83, 0xb2, 0xb2, 0x79, 0x7f, 0xa0, 0x13, 0xbe, 0x03, 0x25, 0xa6, 0x03, 0xe9,
+	0x09, 0x37, 0x5c, 0xd4, 0x03, 0x02, 0xfa, 0x63, 0x28, 0xc9, 0x13, 0x20, 0x3d, 0x71, 0x23, 0x59,
+	0xec, 0xde, 0x50, 0x0f, 0x58, 0xf1, 0x36, 0xcc, 0x32, 0xab, 0x74, 0x69, 0x72, 0x2d, 0xed, 0xa8,
+	0xa6, 0x9f, 0x5a, 0x24, 0xfd, 0x6c, 0x42, 0x71, 0x78, 0x76, 0xe9, 0x9a, 0x5d, 0xa3, 0x2f, 0xb4,
+	0xf0, 0xdb, 0xf8, 0xf7, 0x80, 0x54, 0x61, 0x93, 0x4c, 0x17, 0x57, 0xa1, 0xbc, 0x69, 0xb8, 0x67,
+	0x42, 0x25, 0xfc, 0x14, 0xaa, 0xb4, 0xb9, 0xfd, 0xea, 0x2d, 0x74, 0x64, 0x97, 0x03, 0xc9, 0x3d,
+	0x91, 0xcd, 0x11, 0x4c, 0x9f, 0x19, 0xee, 0x19, 0x9b, 0x68, 0x55, 0x67, 0xdf, 0xe8, 0x5d, 0xa8,
+	0x77, 0xf9, 0x24, 0x8f, 0x22, 0x57, 0x86, 0x19, 0x41, 0xf7, 0x33, 0xc1, 0x8f, 0xa0, 0xc2, 0xe7,
+	0xf0, 0x63, 0x2b, 0x81, 0x67, 0x61, 0xe6, 0xc0, 0x32, 0x86, 0xee, 0x99, 0x2d, 0xa3, 0x1b, 0x9d,
+	0x74, 0x3d, 0xa0, 0x4d, 0x84, 0xf8, 0x18, 0x66, 0x1c, 0x32, 0x30, 0x4c, 0xcb, 0xb4, 0x4e, 0x8f,
+	0x8e, 0x2f, 0x3d, 0xe2, 0x8a, 0x0b, 0x53, 0xcd, 0x27, 0x3f, 0xa7, 0x54, 0xaa, 0xda, 0x71, 0xdf,
+	0x3e, 0x16, 0x6e, 0x8e, 0x7d, 0xe3, 0x6f, 0x35, 0xa8, 0x7c, 0x68, 0x78, 0x5d, 0xb9, 0x74, 0x68,
+	0x0b, 0x6a, 0xbe, 0x73, 0x63, 0x14, 0xa1, 0x4b, 0x24, 0xc4, 0xb2, 0x31, 0x32, 0x95, 0x96, 0xd1,
+	0xb1, 0xda, 0x55, 0x09, 0x4c, 0x94, 0x61, 0x75, 0x49, 0xdf, 0x17, 0x95, 0x49, 0x17, 0xc5, 0x18,
+	0x55, 0x51, 0x2a, 0xe1, 0xf9, 0x4c, 0x90, 0x7e, 0x70, 0x5f, 0xf2, 0x6d, 0x06, 0x50, 0x5c, 0x87,
+	0xef, 0x9b, 0x91, 0x3d, 0x82, 0x9a, 0xeb, 0x19, 0x4e, 0x6c, 0x6f, 0x54, 0x19, 0xd5, 0x77, 0xd0,
+	0x8f, 0x61, 0x66, 0xe8, 0xd8, 0xa7, 0x0e, 0x71, 0xdd, 0x23, 0xcb, 0xf6, 0xcc, 0x93, 0x4b, 0x91,
+	0xd4, 0xd6, 0x24, 0x79, 0x97, 0x51, 0x51, 0x1b, 0x0a, 0x27, 0x66, 0xdf, 0x23, 0x8e, 0xdb, 0xc8,
+	0x2d, 0x65, 0x97, 0x6b, 0xab, 0x4f, 0xaf, 0xb3, 0xda, 0xca, 0xef, 0x18, 0x7f, 0xe7, 0x72, 0x48,
+	0x74, 0x39, 0x56, 0x4d, 0x14, 0xf3, 0xa1, 0xe4, 0xf9, 0x16, 0x14, 0x5f, 0x53, 0x11, 0xf4, 0x52,
+	0x5c, 0xe0, 0xb9, 0x1d, 0x6b, 0x6f, 0xf5, 0xf0, 0x23, 0x80, 0x40, 0x14, 0xf5, 0xc2, 0xbb, 0x7b,
+	0xfb, 0x87, 0x9d, 0xfa, 0x14, 0xaa, 0x40, 0x71, 0x77, 0x6f, 0xa3, 0xbd, 0xd3, 0xa6, 0x2e, 0x1b,
+	0xb7, 0xa4, 0xd9, 0x54, 0xf3, 0x86, 0xe4, 0x6a, 0x61, 0xb9, 0x7f, 0x9f, 0x81, 0xaa, 0xd8, 0x20,
+	0x13, 0xed, 0x52, 0x15, 0x22, 0x13, 0x82, 0xa0, 0x09, 0x2b, 0xdf, 0x38, 0x3d, 0x91, 0x17, 0xcb,
+	0x26, 0x75, 0x1b, 0x7c, 0x1f, 0x90, 0x9e, 0xb0, 0xb8, 0xdf, 0x4e, 0x3c, 0xd9, 0xb9, 0xc4, 0x93,
+	0x8d, 0x1e, 0x40, 0xd5, 0xdf, 0x88, 0x86, 0x2b, 0xc2, 0x70, 0x49, 0xaf, 0xc8, 0x3d, 0x46, 0x69,
+	0xe8, 0x11, 0xe4, 0xc9, 0x98, 0x58, 0x9e, 0xdb, 0x28, 0x33, 0x87, 0x5c, 0x95, 0xa9, 0x71, 0x9b,
+	0x52, 0x75, 0xd1, 0x89, 0xff, 0x08, 0x66, 0xd9, 0x15, 0xe4, 0x85, 0x63, 0x58, 0xea, 0x5d, 0xa9,
+	0xd3, 0xd9, 0x11, 0xa6, 0xa3, 0x9f, 0xa8, 0x06, 0x99, 0xad, 0x0d, 0x31, 0xd1, 0xcc, 0xd6, 0x06,
+	0xfe, 0x42, 0x03, 0xa4, 0x8e, 0x9b, 0xc8, 0x96, 0x11, 0xe1, 0x12, 0x3e, 0x1b, 0xc0, 0xcf, 0x43,
+	0x8e, 0x38, 0x8e, 0xed, 0x30, 0xab, 0x95, 0x74, 0xde, 0xc0, 0x0f, 0x85, 0x0e, 0x3a, 0x19, 0xdb,
+	0xe7, 0xfe, 0x99, 0xe1, 0xd2, 0x34, 0x5f, 0xd5, 0x6d, 0x98, 0x0b, 0x71, 0x4d, 0x14, 0x18, 0x1e,
+	0xc3, 0x02, 0x13, 0xb6, 0x4d, 0xc8, 0x70, 0xad, 0x6f, 0x8e, 0x53, 0x51, 0x87, 0x70, 0x23, 0xca,
+	0xf8, 0xd3, 0xda, 0x08, 0xff, 0xa9, 0x40, 0xec, 0x98, 0x03, 0xd2, 0xb1, 0x77, 0xd2, 0x75, 0xa3,
+	0x8e, 0xf3, 0x9c, 0x5c, 0xba, 0x22, 0x82, 0xb2, 0x6f, 0xfc, 0x2f, 0x1a, 0xdc, 0x8c, 0x0d, 0xff,
+	0x89, 0x57, 0x75, 0x11, 0xe0, 0x94, 0x6e, 0x1f, 0xd2, 0xa3, 0x1d, 0xfc, 0xf2, 0xae, 0x50, 0x7c,
+	0x3d, 0xa9, 0xef, 0xa9, 0x08, 0x3d, 0xe7, 0xc5, 0x9a, 0xb3, 0x3f, 0xae, 0x0c, 0x3f, 0x77, 0xa1,
+	0xcc, 0x08, 0x07, 0x9e, 0xe1, 0x8d, 0xdc, 0xd8, 0x62, 0xfc, 0xb5, 0xd8, 0x02, 0x72, 0xd0, 0x44,
+	0xf3, 0xfa, 0x25, 0xe4, 0x59, 0xde, 0x2a, 0xb3, 0xb6, 0xc8, 0x45, 0x41, 0xd1, 0x43, 0x17, 0x8c,
+	0xf8, 0x0c, 0xf2, 0x2f, 0x59, 0xb1, 0x4f, 0xd1, 0x6c, 0x5a, 0x2e, 0x85, 0x65, 0x0c, 0x78, 0x09,
+	0xa2, 0xa4, 0xb3, 0x6f, 0x96, 0xe4, 0x10, 0xe2, 0x1c, 0xea, 0x3b, 0x3c, 0x99, 0x2a, 0xe9, 0x7e,
+	0x9b, 0x9a, 0xac, 0xdb, 0x37, 0x89, 0xe5, 0xb1, 0xde, 0x69, 0xd6, 0xab, 0x50, 0xf0, 0x0a, 0xd4,
+	0x39, 0xd2, 0x5a, 0xaf, 0xa7, 0x24, 0x2b, 0xbe, 0x3c, 0x2d, 0x2c, 0x0f, 0xff, 0xab, 0x06, 0xb3,
+	0xca, 0x80, 0x89, 0x0c, 0xf3, 0x1e, 0xe4, 0x79, 0x49, 0x53, 0xc4, 0xc5, 0xf9, 0xf0, 0x28, 0x0e,
+	0xa3, 0x0b, 0x1e, 0xb4, 0x02, 0x05, 0xfe, 0x25, 0x33, 0xc6, 0x64, 0x76, 0xc9, 0x84, 0x1f, 0xc1,
+	0x9c, 0x20, 0x91, 0x81, 0x9d, 0xb4, 0xb7, 0x99, 0x41, 0xf1, 0x5f, 0xc1, 0x7c, 0x98, 0x6d, 0xa2,
+	0x29, 0x29, 0x4a, 0x66, 0xde, 0x46, 0xc9, 0x35, 0xa9, 0xe4, 0xe1, 0xb0, 0xa7, 0x84, 0xf1, 0xe8,
+	0xaa, 0xab, 0x2b, 0x92, 0x89, 0xac, 0x88, 0x3f, 0x01, 0x29, 0xe2, 0x67, 0x9d, 0xc0, 0x9c, 0xdc,
+	0x0e, 0x3b, 0xa6, 0xeb, 0x27, 0x77, 0x9f, 0x01, 0x52, 0x89, 0x3f, 0xb7, 0x42, 0x1b, 0xe4, 0xc4,
+	0x31, 0x4e, 0x07, 0xc4, 0x8f, 0x4f, 0x34, 0xd5, 0x57, 0x89, 0x13, 0x79, 0xf4, 0x16, 0xcc, 0xbe,
+	0xb4, 0xc7, 0xd4, 0x35, 0x50, 0x6a, 0x70, 0x64, 0xf8, 0x55, 0xcf, 0x5f, 0x36, 0xbf, 0x4d, 0xc1,
+	0xd5, 0x01, 0x13, 0x81, 0xff, 0x97, 0x06, 0x95, 0xb5, 0xbe, 0xe1, 0x0c, 0x24, 0xf0, 0x6f, 0x20,
+	0xcf, 0x2f, 0x30, 0xa2, 0x66, 0xf0, 0x4e, 0x58, 0x8c, 0xca, 0xcb, 0x1b, 0x6b, 0xfc, 0xba, 0x23,
+	0x46, 0x51, 0xc5, 0xc5, 0xb3, 0xc2, 0x46, 0xe4, 0x99, 0x61, 0x03, 0xbd, 0x0f, 0x39, 0x83, 0x0e,
+	0x61, 0x2e, 0xb8, 0x16, 0xbd, 0x3a, 0x32, 0x69, 0x2c, 0x6f, 0xe3, 0x5c, 0xf8, 0xd7, 0x50, 0x56,
+	0x10, 0xe8, 0xe5, 0xf8, 0x45, 0x5b, 0x24, 0x60, 0x6b, 0xeb, 0x9d, 0xad, 0x57, 0xfc, 0xce, 0x5c,
+	0x03, 0xd8, 0x68, 0xfb, 0xed, 0x0c, 0xfe, 0x48, 0x8c, 0x12, 0xfe, 0x4e, 0xd5, 0x47, 0x4b, 0xd3,
+	0x27, 0xf3, 0x56, 0xfa, 0x5c, 0x40, 0x55, 0x4c, 0x7f, 0x52, 0xf7, 0xcd, 0xe4, 0xa5, 0xb8, 0x6f,
+	0x45, 0x79, 0x5d, 0x30, 0xe2, 0x19, 0xa8, 0x0a, 0x87, 0x2e, 0xf6, 0xdf, 0xbf, 0x65, 0xa0, 0x26,
+	0x29, 0x93, 0xd6, 0x36, 0x65, 0x59, 0x86, 0x47, 0x00, 0xbf, 0x28, 0x73, 0x03, 0xf2, 0xbd, 0xe3,
+	0x03, 0xf3, 0x33, 0x59, 0x87, 0x16, 0x2d, 0x4a, 0xef, 0x73, 0x1c, 0xfe, 0x18, 0x24, 0x5a, 0xf4,
+	0x82, 0xee, 0x18, 0x27, 0xde, 0x96, 0xd5, 0x23, 0x17, 0x2c, 0x6f, 0x9c, 0xd6, 0x03, 0x02, 0xbb,
+	0xaf, 0x8a, 0x47, 0x23, 0x96, 0x2c, 0x2a, 0x8f, 0x48, 0xe8, 0x09, 0xd4, 0xe9, 0xf7, 0xda, 0x70,
+	0xd8, 0x37, 0x49, 0x8f, 0x0b, 0x28, 0x30, 0x9e, 0x18, 0x9d, 0xa2, 0xb3, 0xd4, 0xcb, 0x6d, 0x14,
+	0x99, 0xdb, 0x12, 0x2d, 0xb4, 0x04, 0x65, 0xae, 0xdf, 0x96, 0x75, 0xe8, 0x12, 0xf6, 0x92, 0x92,
+	0xd5, 0x55, 0x12, 0x3d, 0xc7, 0x6b, 0x23, 0xef, 0xac, 0x6d, 0x19, 0xc7, 0x7d, 0xe9, 0x17, 0x69,
+	0x30, 0xa7, 0xc4, 0x0d, 0xd3, 0x55, 0xa9, 0x6d, 0x98, 0xa3, 0x54, 0x62, 0x79, 0x66, 0x57, 0x71,
+	0xa2, 0x32, 0x54, 0x6a, 0x91, 0x50, 0x69, 0xb8, 0xee, 0x6b, 0xdb, 0xe9, 0x09, 0x03, 0xfa, 0x6d,
+	0xbc, 0xc1, 0x85, 0x1f, 0xba, 0xa1, 0x60, 0xf8, 0x7d, 0xa5, 0x2c, 0x07, 0x52, 0x5e, 0x10, 0xef,
+	0x0a, 0x29, 0xf8, 0x29, 0x2c, 0x48, 0x4e, 0x51, 0x5d, 0xbc, 0x82, 0x79, 0x0f, 0xee, 0x4a, 0xe6,
+	0xf5, 0x33, 0x7a, 0x7d, 0xdb, 0x17, 0x80, 0x3f, 0x54, 0xcf, 0xe7, 0xd0, 0xf0, 0xf5, 0x64, 0x29,
+	0xb9, 0xdd, 0x57, 0x15, 0x18, 0xb9, 0x62, 0x67, 0x96, 0x74, 0xf6, 0x4d, 0x69, 0x8e, 0xdd, 0xf7,
+	0x13, 0x0f, 0xfa, 0x8d, 0xd7, 0xe1, 0x96, 0x94, 0x21, 0x92, 0xe5, 0xb0, 0x90, 0x98, 0x42, 0x49,
+	0x42, 0x84, 0xc1, 0xe8, 0xd0, 0xab, 0xcd, 0xae, 0x72, 0x86, 0x4d, 0xcb, 0x64, 0x6a, 0x8a, 0xcc,
+	0x05, 0xbe, 0x23, 0xa8, 0x62, 0x6a, 0x5c, 0x12, 0x64, 0x2a, 0x40, 0x25, 0x8b, 0x85, 0xa0, 0xe4,
+	0xd8, 0x42, 0xc4, 0x44, 0x7f, 0x02, 0x8b, 0xbe, 0x12, 0xd4, 0x6e, 0xfb, 0xc4, 0x19, 0x98, 0xae,
+	0xab, 0xd4, 0xa3, 0x92, 0x26, 0xfe, 0x0e, 0x4c, 0x0f, 0x89, 0xf0, 0x5c, 0xe5, 0x55, 0xb4, 0xc2,
+	0x1f, 0x90, 0x57, 0x94, 0xc1, 0xac, 0x1f, 0xf7, 0xe0, 0x9e, 0x94, 0xce, 0x2d, 0x9a, 0x28, 0x3e,
+	0xaa, 0x94, 0xbc, 0xf6, 0x73, 0xb3, 0xc6, 0xaf, 0xfd, 0x59, 0xbe, 0xf6, 0x7e, 0x8d, 0xf4, 0xf7,
+	0xdc, 0x90, 0xf2, 0x6c, 0x4d, 0x14, 0x91, 0xb6, 0xb9, 0x4d, 0xfd, 0x23, 0x39, 0x91, 0xb0, 0x63,
+	0x98, 0x0f, 0x9f, 0xe4, 0x89, 0x9c, 0xe5, 0x3c, 0xe4, 0x3c, 0xfb, 0x9c, 0x48, 0x57, 0xc9, 0x1b,
+	0x52, 0x61, 0xff, 0x98, 0x4f, 0xa4, 0xb0, 0x11, 0x08, 0x63, 0x5b, 0x72, 0x52, 0x7d, 0xe9, 0x6a,
+	0xca, 0x14, 0x8f, 0x37, 0xf0, 0x2e, 0xdc, 0x88, 0xba, 0x89, 0x89, 0x54, 0x7e, 0xc5, 0x37, 0x70,
+	0x92, 0x27, 0x99, 0x48, 0xee, 0x07, 0x81, 0x33, 0x50, 0x1c, 0xca, 0x44, 0x22, 0x75, 0x68, 0x26,
+	0xf9, 0x97, 0x1f, 0x63, 0xbf, 0xfa, 0xee, 0x66, 0x22, 0x61, 0x6e, 0x20, 0x6c, 0xf2, 0xe5, 0x0f,
+	0x7c, 0x44, 0xf6, 0x4a, 0x1f, 0x21, 0x0e, 0x49, 0xe0, 0xc5, 0x7e, 0x82, 0x4d, 0x27, 0x30, 0x02,
+	0x07, 0x3a, 0x29, 0x06, 0x8d, 0x21, 0x3e, 0x06, 0x6b, 0xc8, 0x8d, 0xad, 0xba, 0xdd, 0x89, 0x16,
+	0xe3, 0xc3, 0xc0, 0x77, 0xc6, 0x3c, 0xf3, 0x44, 0x82, 0x3f, 0x82, 0xa5, 0x74, 0xa7, 0x3c, 0x89,
+	0xe4, 0x27, 0x2d, 0x28, 0xf9, 0x69, 0xab, 0xf2, 0xe3, 0x8b, 0x32, 0x14, 0x76, 0xf7, 0x0e, 0xf6,
+	0xd7, 0xd6, 0xdb, 0xfc, 0xd7, 0x17, 0xeb, 0x7b, 0xba, 0x7e, 0xb8, 0xdf, 0xa9, 0x67, 0x56, 0xbf,
+	0xcb, 0x42, 0x66, 0xfb, 0x15, 0xfa, 0x18, 0x72, 0xfc, 0x29, 0xf2, 0x8a, 0xf7, 0xe7, 0xe6, 0x55,
+	0xaf, 0xad, 0xf8, 0xe6, 0x17, 0xff, 0xf3, 0xdd, 0xd7, 0x99, 0x59, 0x5c, 0x69, 0x8d, 0x7f, 0xd5,
+	0x3a, 0x1f, 0xb7, 0x58, 0x6c, 0x78, 0xa6, 0x3d, 0x41, 0x1f, 0x40, 0x76, 0x7f, 0xe4, 0xa1, 0xd4,
+	0x77, 0xe9, 0x66, 0xfa, 0x03, 0x2c, 0x5e, 0x60, 0x42, 0x67, 0x30, 0x08, 0xa1, 0xc3, 0x91, 0x47,
+	0x45, 0x7e, 0x0a, 0x65, 0xf5, 0xf9, 0xf4, 0xda, 0xc7, 0xea, 0xe6, 0xf5, 0x4f, 0xb3, 0xf8, 0x2e,
+	0x83, 0xba, 0x89, 0x91, 0x80, 0xe2, 0x0f, 0xbc, 0xea, 0x2c, 0x3a, 0x17, 0x16, 0x4a, 0x7d, 0xca,
+	0x6e, 0xa6, 0xbf, 0xd6, 0xc6, 0x66, 0xe1, 0x5d, 0x58, 0x54, 0xe4, 0x5f, 0x88, 0x87, 0xda, 0xae,
+	0x87, 0xee, 0x25, 0x3c, 0xd4, 0xa9, 0x4f, 0x52, 0xcd, 0xa5, 0x74, 0x06, 0x01, 0x72, 0x87, 0x81,
+	0xdc, 0xc0, 0xb3, 0x02, 0xa4, 0xeb, 0xb3, 0x3c, 0xd3, 0x9e, 0xac, 0x76, 0x21, 0xc7, 0x6a, 0xce,
+	0xe8, 0xcf, 0xe4, 0x47, 0x33, 0xa1, 0x90, 0x9e, 0xb2, 0xd0, 0xa1, 0x6a, 0x35, 0x9e, 0x67, 0x40,
+	0x35, 0x5c, 0xa2, 0x40, 0xac, 0xe2, 0xfc, 0x4c, 0x7b, 0xb2, 0xac, 0xfd, 0x42, 0x5b, 0x7d, 0x33,
+	0x0d, 0x39, 0x56, 0x7c, 0x42, 0xe7, 0x00, 0x41, 0x6d, 0x36, 0x3a, 0xbb, 0x58, 0xb5, 0x37, 0x3a,
+	0xbb, 0x78, 0x59, 0x17, 0x37, 0x19, 0xe8, 0x3c, 0x9e, 0xa1, 0xa0, 0xac, 0xa6, 0xd5, 0x62, 0x65,
+	0x3a, 0x6a, 0x47, 0x47, 0x94, 0xde, 0xf8, 0x51, 0x42, 0x49, 0xc2, 0x42, 0xf5, 0xd9, 0xe8, 0x6e,
+	0x48, 0xa8, 0xcd, 0xe2, 0x45, 0x86, 0xd7, 0xc0, 0x73, 0xc2, 0x9a, 0x1c, 0xd2, 0x61, 0x4c, 0x14,
+	0xf3, 0x73, 0xa8, 0x85, 0x8b, 0xab, 0xe8, 0x41, 0x82, 0xd0, 0x68, 0x8d, 0xb6, 0xf9, 0xf0, 0x6a,
+	0xa6, 0x24, 0x70, 0x8e, 0x7c, 0x4e, 0xc8, 0xd0, 0xa0, 0x4c, 0xc2, 0xd6, 0xe8, 0x0b, 0x0d, 0x66,
+	0x22, 0xd5, 0x52, 0x94, 0x24, 0x3d, 0x56, 0x8b, 0x6d, 0x3e, 0xba, 0x86, 0x4b, 0x28, 0x81, 0x99,
+	0x12, 0x77, 0xf0, 0xcd, 0x90, 0x05, 0x3c, 0x73, 0x40, 0x3c, 0x5b, 0x28, 0xe2, 0x5b, 0x9e, 0x57,
+	0x35, 0x13, 0x2d, 0x1f, 0xaa, 0x92, 0x26, 0x5a, 0x3e, 0x5c, 0x12, 0x4d, 0xb1, 0x3c, 0x2f, 0x63,
+	0xd2, 0x9d, 0xcc, 0x7e, 0xdf, 0xc0, 0x7f, 0xd5, 0x88, 0x6c, 0x28, 0xf9, 0xa5, 0x43, 0xb4, 0x98,
+	0x54, 0xc6, 0x09, 0x2e, 0x00, 0xcd, 0x7b, 0xa9, 0xfd, 0x02, 0xf9, 0x3e, 0x43, 0xbe, 0x8d, 0x6f,
+	0x50, 0x64, 0xf1, 0xc3, 0xc9, 0x16, 0xaf, 0x15, 0xb4, 0x8c, 0x5e, 0x8f, 0x4e, 0xf8, 0x2f, 0xa1,
+	0xa2, 0xd6, 0xf6, 0xd0, 0xfd, 0xc4, 0xd2, 0x91, 0x5a, 0x1e, 0x6c, 0xe2, 0xab, 0x58, 0x04, 0xf2,
+	0x43, 0x86, 0xbc, 0x88, 0x6f, 0x25, 0x20, 0x3b, 0x8c, 0x35, 0x04, 0xce, 0xeb, 0x72, 0xc9, 0xe0,
+	0xa1, 0xb2, 0x5f, 0x32, 0x78, 0xb8, 0xac, 0x77, 0x25, 0xf8, 0x88, 0xb1, 0x52, 0x70, 0x17, 0x20,
+	0xa8, 0xc0, 0xa1, 0x44, 0x5b, 0x2a, 0x37, 0xa0, 0xe8, 0x89, 0x8e, 0x17, 0xef, 0xc2, 0xfb, 0x2b,
+	0x02, 0xdb, 0x37, 0x5d, 0x7a, 0xb2, 0x57, 0xff, 0x2e, 0x0f, 0xe5, 0x97, 0x86, 0x69, 0x79, 0xc4,
+	0x32, 0xac, 0x2e, 0x41, 0xc7, 0x90, 0x63, 0xd1, 0x2d, 0xea, 0xbc, 0xd4, 0xa2, 0x54, 0xd4, 0x79,
+	0x85, 0x2a, 0x36, 0x78, 0x89, 0xa1, 0x36, 0xf1, 0x02, 0x45, 0x1d, 0x04, 0xa2, 0x5b, 0xac, 0xd0,
+	0x42, 0x27, 0x7a, 0x02, 0x79, 0x51, 0xc3, 0x8f, 0x08, 0x0a, 0x15, 0x60, 0x9a, 0x77, 0x92, 0x3b,
+	0x93, 0xb6, 0x92, 0x0a, 0xe3, 0x32, 0x3e, 0x8a, 0x33, 0x06, 0x08, 0x2a, 0x88, 0x51, 0x83, 0xc6,
+	0x0a, 0x8e, 0xcd, 0xa5, 0x74, 0x06, 0x81, 0xf9, 0x88, 0x61, 0xde, 0xc3, 0xcd, 0x28, 0x66, 0xcf,
+	0xe7, 0xa5, 0xb8, 0x7f, 0x0e, 0xd3, 0x9b, 0x86, 0x7b, 0x86, 0x22, 0xf1, 0x4a, 0xf9, 0xb1, 0x41,
+	0xb3, 0x99, 0xd4, 0x25, 0x50, 0xee, 0x31, 0x94, 0x5b, 0x78, 0x3e, 0x8a, 0x72, 0x66, 0xb8, 0x34,
+	0x10, 0xa0, 0x1e, 0xe4, 0xf9, 0x6f, 0x0f, 0xa2, 0xf6, 0x0b, 0xfd, 0x7e, 0x21, 0x6a, 0xbf, 0xf0,
+	0xcf, 0x15, 0xae, 0x47, 0x19, 0x42, 0x51, 0x3e, 0xf6, 0xa3, 0xbb, 0x91, 0xa5, 0x08, 0xff, 0x30,
+	0xa0, 0xb9, 0x98, 0xd6, 0x2d, 0xb0, 0x1e, 0x30, 0xac, 0xbb, 0xb8, 0x11, 0x5b, 0x2b, 0xc1, 0xf9,
+	0x4c, 0x7b, 0xf2, 0x0b, 0x0d, 0x7d, 0x0e, 0x10, 0x14, 0x5d, 0x63, 0x07, 0x20, 0x5a, 0xbf, 0x8d,
+	0x1d, 0x80, 0x58, 0xbd, 0x16, 0xaf, 0x30, 0xdc, 0x65, 0xfc, 0x20, 0x8a, 0xeb, 0x39, 0x86, 0xe5,
+	0x9e, 0x10, 0xe7, 0x7d, 0x5e, 0x58, 0x73, 0xcf, 0xcc, 0x21, 0x3d, 0x0c, 0xff, 0x31, 0x03, 0xd3,
+	0x34, 0x6b, 0xa4, 0xc1, 0x35, 0xb8, 0x6c, 0x47, 0x35, 0x89, 0x95, 0xb8, 0xa2, 0x9a, 0xc4, 0xef,
+	0xe9, 0xe1, 0xe0, 0xca, 0x7e, 0x8e, 0x4e, 0x18, 0x03, 0x35, 0xb4, 0x0d, 0x65, 0xe5, 0x36, 0x8e,
+	0x12, 0x84, 0x85, 0x6b, 0x67, 0x51, 0x17, 0x9f, 0x70, 0x95, 0xc7, 0xb7, 0x19, 0xde, 0x02, 0xae,
+	0xfb, 0x78, 0x3d, 0xce, 0x41, 0x01, 0x5f, 0x43, 0x45, 0xbd, 0xb1, 0xa3, 0x04, 0x79, 0x91, 0xba,
+	0x5c, 0xd4, 0xcb, 0x25, 0x5d, 0xf8, 0xc3, 0x07, 0xdf, 0xff, 0xc9, 0xbd, 0x64, 0xa3, 0xc0, 0x7d,
+	0x28, 0x88, 0x2b, 0x7c, 0xd2, 0x2c, 0xc3, 0x45, 0xbc, 0xa4, 0x59, 0x46, 0xee, 0xff, 0xe1, 0x84,
+	0x8c, 0x21, 0xd2, 0x5b, 0x8a, 0x8c, 0x24, 0x02, 0xed, 0x05, 0xf1, 0xd2, 0xd0, 0x82, 0x8a, 0x54,
+	0x1a, 0x9a, 0x72, 0x43, 0x4c, 0x43, 0x3b, 0x25, 0x9e, 0x38, 0x2e, 0xf2, 0xe6, 0x85, 0x52, 0x84,
+	0xa9, 0xde, 0x1b, 0x5f, 0xc5, 0x92, 0x94, 0x2f, 0x07, 0x80, 0xc2, 0x75, 0xa3, 0x0b, 0x80, 0xa0,
+	0xc0, 0x10, 0x4d, 0x8e, 0x12, 0xab, 0x94, 0xd1, 0xe4, 0x28, 0xb9, 0x46, 0x11, 0x76, 0x0d, 0x01,
+	0x2e, 0x4f, 0xd7, 0x29, 0xf2, 0x57, 0x1a, 0xa0, 0x78, 0x2d, 0x02, 0x3d, 0x4d, 0x96, 0x9e, 0x58,
+	0xfb, 0x6c, 0xbe, 0xf7, 0x76, 0xcc, 0x49, 0xde, 0x3e, 0x50, 0xa9, 0xcb, 0xb8, 0x87, 0xaf, 0xa9,
+	0x52, 0x7f, 0xa3, 0x41, 0x35, 0x54, 0xc8, 0x40, 0xef, 0xa4, 0xac, 0x69, 0xa4, 0x74, 0xda, 0x7c,
+	0x7c, 0x2d, 0x5f, 0x52, 0xe2, 0xa4, 0xec, 0x00, 0x99, 0x26, 0x7f, 0xa9, 0x41, 0x2d, 0x5c, 0xf8,
+	0x40, 0x29, 0xb2, 0x63, 0xa5, 0xd7, 0xe6, 0xf2, 0xf5, 0x8c, 0x57, 0x2f, 0x4f, 0x90, 0x39, 0xf7,
+	0xa1, 0x20, 0x4a, 0x25, 0x49, 0x1b, 0x3f, 0x5c, 0xb4, 0x4d, 0xda, 0xf8, 0x91, 0x3a, 0x4b, 0xc2,
+	0xc6, 0x77, 0xec, 0x3e, 0x51, 0x8e, 0x99, 0xa8, 0xa5, 0xa4, 0xa1, 0x5d, 0x7d, 0xcc, 0x22, 0x85,
+	0x98, 0x34, 0xb4, 0xe0, 0x98, 0xc9, 0x22, 0x0a, 0x4a, 0x11, 0x76, 0xcd, 0x31, 0x8b, 0xd6, 0x60,
+	0x12, 0x8e, 0x19, 0x03, 0x54, 0x8e, 0x59, 0x50, 0xee, 0x48, 0x3a, 0x66, 0xb1, 0x1a, 0x74, 0xd2,
+	0x31, 0x8b, 0x57, 0x4c, 0x12, 0xd6, 0x91, 0xe1, 0x86, 0x8e, 0xd9, 0x5c, 0x42, 0x65, 0x04, 0xbd,
+	0x97, 0x62, 0xc4, 0xc4, 0xd2, 0x76, 0xf3, 0xfd, 0xb7, 0xe4, 0x4e, 0xdd, 0xe3, 0xdc, 0xfc, 0x72,
+	0x8f, 0xff, 0x83, 0x06, 0xf3, 0x49, 0x55, 0x15, 0x94, 0x82, 0x93, 0x52, 0x12, 0x6f, 0xae, 0xbc,
+	0x2d, 0xfb, 0xd5, 0xd6, 0xf2, 0x77, 0xfd, 0xf3, 0xfa, 0x7f, 0xbe, 0x59, 0xd4, 0xfe, 0xfb, 0xcd,
+	0xa2, 0xf6, 0xbf, 0x6f, 0x16, 0xb5, 0x7f, 0xfc, 0xbf, 0xc5, 0xa9, 0xe3, 0x3c, 0xfb, 0x8f, 0x5c,
+	0xbf, 0xfa, 0x43, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x35, 0xa7, 0xba, 0x61, 0x36, 0x00, 0x00,
 }
 }

+ 38 - 38
etcdserver/etcdserverpb/rpc.proto

@@ -15,7 +15,7 @@ service KV {
   // Range gets the keys in the range from the key-value store.
   // Range gets the keys in the range from the key-value store.
   rpc Range(RangeRequest) returns (RangeResponse) {
   rpc Range(RangeRequest) returns (RangeResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/kv/range"
+        post: "/v3/kv/range"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -25,7 +25,7 @@ service KV {
   // and generates one event in the event history.
   // and generates one event in the event history.
   rpc Put(PutRequest) returns (PutResponse) {
   rpc Put(PutRequest) returns (PutResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/kv/put"
+        post: "/v3/kv/put"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -35,7 +35,7 @@ service KV {
   // and generates a delete event in the event history for every deleted key.
   // and generates a delete event in the event history for every deleted key.
   rpc DeleteRange(DeleteRangeRequest) returns (DeleteRangeResponse) {
   rpc DeleteRange(DeleteRangeRequest) returns (DeleteRangeResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/kv/deleterange"
+        post: "/v3/kv/deleterange"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -46,7 +46,7 @@ service KV {
   // It is not allowed to modify the same key several times within one txn.
   // It is not allowed to modify the same key several times within one txn.
   rpc Txn(TxnRequest) returns (TxnResponse) {
   rpc Txn(TxnRequest) returns (TxnResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/kv/txn"
+        post: "/v3/kv/txn"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -56,7 +56,7 @@ service KV {
   // indefinitely.
   // indefinitely.
   rpc Compact(CompactionRequest) returns (CompactionResponse) {
   rpc Compact(CompactionRequest) returns (CompactionResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/kv/compaction"
+        post: "/v3/kv/compaction"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -70,7 +70,7 @@ service Watch {
   // last compaction revision.
   // last compaction revision.
   rpc Watch(stream WatchRequest) returns (stream WatchResponse) {
   rpc Watch(stream WatchRequest) returns (stream WatchResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/watch"
+        post: "/v3/watch"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -82,7 +82,7 @@ service Lease {
   // deleted if the lease expires. Each expired key generates a delete event in the event history.
   // deleted if the lease expires. Each expired key generates a delete event in the event history.
   rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) {
   rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/lease/grant"
+        post: "/v3/lease/grant"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -90,7 +90,7 @@ service Lease {
   // LeaseRevoke revokes a lease. All keys attached to the lease will expire and be deleted.
   // LeaseRevoke revokes a lease. All keys attached to the lease will expire and be deleted.
   rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {
   rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/kv/lease/revoke"
+        post: "/v3/kv/lease/revoke"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -99,7 +99,7 @@ service Lease {
   // to the server and streaming keep alive responses from the server to the client.
   // to the server and streaming keep alive responses from the server to the client.
   rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) {
   rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/lease/keepalive"
+        post: "/v3/lease/keepalive"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -107,7 +107,7 @@ service Lease {
   // LeaseTimeToLive retrieves lease information.
   // LeaseTimeToLive retrieves lease information.
   rpc LeaseTimeToLive(LeaseTimeToLiveRequest) returns (LeaseTimeToLiveResponse) {
   rpc LeaseTimeToLive(LeaseTimeToLiveRequest) returns (LeaseTimeToLiveResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/kv/lease/timetolive"
+        post: "/v3/kv/lease/timetolive"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -115,7 +115,7 @@ service Lease {
   // LeaseLeases lists all existing leases.
   // LeaseLeases lists all existing leases.
   rpc LeaseLeases(LeaseLeasesRequest) returns (LeaseLeasesResponse) {
   rpc LeaseLeases(LeaseLeasesRequest) returns (LeaseLeasesResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/kv/lease/leases"
+        post: "/v3/kv/lease/leases"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -125,7 +125,7 @@ service Cluster {
   // MemberAdd adds a member into the cluster.
   // MemberAdd adds a member into the cluster.
   rpc MemberAdd(MemberAddRequest) returns (MemberAddResponse) {
   rpc MemberAdd(MemberAddRequest) returns (MemberAddResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/cluster/member/add"
+        post: "/v3/cluster/member/add"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -133,7 +133,7 @@ service Cluster {
   // MemberRemove removes an existing member from the cluster.
   // MemberRemove removes an existing member from the cluster.
   rpc MemberRemove(MemberRemoveRequest) returns (MemberRemoveResponse) {
   rpc MemberRemove(MemberRemoveRequest) returns (MemberRemoveResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/cluster/member/remove"
+        post: "/v3/cluster/member/remove"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -141,7 +141,7 @@ service Cluster {
   // MemberUpdate updates the member configuration.
   // MemberUpdate updates the member configuration.
   rpc MemberUpdate(MemberUpdateRequest) returns (MemberUpdateResponse) {
   rpc MemberUpdate(MemberUpdateRequest) returns (MemberUpdateResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/cluster/member/update"
+        post: "/v3/cluster/member/update"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -149,7 +149,7 @@ service Cluster {
   // MemberList lists all the members in the cluster.
   // MemberList lists all the members in the cluster.
   rpc MemberList(MemberListRequest) returns (MemberListResponse) {
   rpc MemberList(MemberListRequest) returns (MemberListResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/cluster/member/list"
+        post: "/v3/cluster/member/list"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -159,7 +159,7 @@ service Maintenance {
   // Alarm activates, deactivates, and queries alarms regarding cluster health.
   // Alarm activates, deactivates, and queries alarms regarding cluster health.
   rpc Alarm(AlarmRequest) returns (AlarmResponse) {
   rpc Alarm(AlarmRequest) returns (AlarmResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/alarm"
+        post: "/v3/maintenance/alarm"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -167,7 +167,7 @@ service Maintenance {
   // Status gets the status of the member.
   // Status gets the status of the member.
   rpc Status(StatusRequest) returns (StatusResponse) {
   rpc Status(StatusRequest) returns (StatusResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/status"
+        post: "/v3/maintenance/status"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -175,7 +175,7 @@ service Maintenance {
   // Defragment defragments a member's backend database to recover storage space.
   // Defragment defragments a member's backend database to recover storage space.
   rpc Defragment(DefragmentRequest) returns (DefragmentResponse) {
   rpc Defragment(DefragmentRequest) returns (DefragmentResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/defragment"
+        post: "/v3/maintenance/defragment"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -185,7 +185,7 @@ service Maintenance {
   // are ongoing transactions.
   // are ongoing transactions.
   rpc Hash(HashRequest) returns (HashResponse) {
   rpc Hash(HashRequest) returns (HashResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/hash"
+        post: "/v3/maintenance/hash"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -193,7 +193,7 @@ service Maintenance {
   // HashKV computes the hash of all MVCC keys up to a given revision.
   // HashKV computes the hash of all MVCC keys up to a given revision.
   rpc HashKV(HashKVRequest) returns (HashKVResponse) {
   rpc HashKV(HashKVRequest) returns (HashKVResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/hash"
+        post: "/v3/maintenance/hash"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -201,7 +201,7 @@ service Maintenance {
   // Snapshot sends a snapshot of the entire backend from a member over a stream to a client.
   // Snapshot sends a snapshot of the entire backend from a member over a stream to a client.
   rpc Snapshot(SnapshotRequest) returns (stream SnapshotResponse) {
   rpc Snapshot(SnapshotRequest) returns (stream SnapshotResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/snapshot"
+        post: "/v3/maintenance/snapshot"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -209,7 +209,7 @@ service Maintenance {
   // MoveLeader requests current leader node to transfer its leadership to transferee.
   // MoveLeader requests current leader node to transfer its leadership to transferee.
   rpc MoveLeader(MoveLeaderRequest) returns (MoveLeaderResponse) {
   rpc MoveLeader(MoveLeaderRequest) returns (MoveLeaderResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/maintenance/transfer-leadership"
+        post: "/v3/maintenance/transfer-leadership"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -219,7 +219,7 @@ service Auth {
   // AuthEnable enables authentication.
   // AuthEnable enables authentication.
   rpc AuthEnable(AuthEnableRequest) returns (AuthEnableResponse) {
   rpc AuthEnable(AuthEnableRequest) returns (AuthEnableResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/enable"
+        post: "/v3/auth/enable"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -227,7 +227,7 @@ service Auth {
   // AuthDisable disables authentication.
   // AuthDisable disables authentication.
   rpc AuthDisable(AuthDisableRequest) returns (AuthDisableResponse) {
   rpc AuthDisable(AuthDisableRequest) returns (AuthDisableResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/disable"
+        post: "/v3/auth/disable"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -235,7 +235,7 @@ service Auth {
   // Authenticate processes an authenticate request.
   // Authenticate processes an authenticate request.
   rpc Authenticate(AuthenticateRequest) returns (AuthenticateResponse) {
   rpc Authenticate(AuthenticateRequest) returns (AuthenticateResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/authenticate"
+        post: "/v3/auth/authenticate"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -243,7 +243,7 @@ service Auth {
   // UserAdd adds a new user.
   // UserAdd adds a new user.
   rpc UserAdd(AuthUserAddRequest) returns (AuthUserAddResponse) {
   rpc UserAdd(AuthUserAddRequest) returns (AuthUserAddResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/add"
+        post: "/v3/auth/user/add"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -251,7 +251,7 @@ service Auth {
   // UserGet gets detailed user information.
   // UserGet gets detailed user information.
   rpc UserGet(AuthUserGetRequest) returns (AuthUserGetResponse) {
   rpc UserGet(AuthUserGetRequest) returns (AuthUserGetResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/get"
+        post: "/v3/auth/user/get"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -259,7 +259,7 @@ service Auth {
   // UserList gets a list of all users.
   // UserList gets a list of all users.
   rpc UserList(AuthUserListRequest) returns (AuthUserListResponse) {
   rpc UserList(AuthUserListRequest) returns (AuthUserListResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/list"
+        post: "/v3/auth/user/list"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -267,7 +267,7 @@ service Auth {
   // UserDelete deletes a specified user.
   // UserDelete deletes a specified user.
   rpc UserDelete(AuthUserDeleteRequest) returns (AuthUserDeleteResponse) {
   rpc UserDelete(AuthUserDeleteRequest) returns (AuthUserDeleteResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/delete"
+        post: "/v3/auth/user/delete"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -275,7 +275,7 @@ service Auth {
   // UserChangePassword changes the password of a specified user.
   // UserChangePassword changes the password of a specified user.
   rpc UserChangePassword(AuthUserChangePasswordRequest) returns (AuthUserChangePasswordResponse) {
   rpc UserChangePassword(AuthUserChangePasswordRequest) returns (AuthUserChangePasswordResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/changepw"
+        post: "/v3/auth/user/changepw"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -283,7 +283,7 @@ service Auth {
   // UserGrant grants a role to a specified user.
   // UserGrant grants a role to a specified user.
   rpc UserGrantRole(AuthUserGrantRoleRequest) returns (AuthUserGrantRoleResponse) {
   rpc UserGrantRole(AuthUserGrantRoleRequest) returns (AuthUserGrantRoleResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/grant"
+        post: "/v3/auth/user/grant"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -291,7 +291,7 @@ service Auth {
   // UserRevokeRole revokes a role of specified user.
   // UserRevokeRole revokes a role of specified user.
   rpc UserRevokeRole(AuthUserRevokeRoleRequest) returns (AuthUserRevokeRoleResponse) {
   rpc UserRevokeRole(AuthUserRevokeRoleRequest) returns (AuthUserRevokeRoleResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/user/revoke"
+        post: "/v3/auth/user/revoke"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -299,7 +299,7 @@ service Auth {
   // RoleAdd adds a new role.
   // RoleAdd adds a new role.
   rpc RoleAdd(AuthRoleAddRequest) returns (AuthRoleAddResponse) {
   rpc RoleAdd(AuthRoleAddRequest) returns (AuthRoleAddResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/add"
+        post: "/v3/auth/role/add"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -307,7 +307,7 @@ service Auth {
   // RoleGet gets detailed role information.
   // RoleGet gets detailed role information.
   rpc RoleGet(AuthRoleGetRequest) returns (AuthRoleGetResponse) {
   rpc RoleGet(AuthRoleGetRequest) returns (AuthRoleGetResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/get"
+        post: "/v3/auth/role/get"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -315,7 +315,7 @@ service Auth {
   // RoleList gets lists of all roles.
   // RoleList gets lists of all roles.
   rpc RoleList(AuthRoleListRequest) returns (AuthRoleListResponse) {
   rpc RoleList(AuthRoleListRequest) returns (AuthRoleListResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/list"
+        post: "/v3/auth/role/list"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -323,7 +323,7 @@ service Auth {
   // RoleDelete deletes a specified role.
   // RoleDelete deletes a specified role.
   rpc RoleDelete(AuthRoleDeleteRequest) returns (AuthRoleDeleteResponse) {
   rpc RoleDelete(AuthRoleDeleteRequest) returns (AuthRoleDeleteResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/delete"
+        post: "/v3/auth/role/delete"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -331,7 +331,7 @@ service Auth {
   // RoleGrantPermission grants a permission of a specified key or range to a specified role.
   // RoleGrantPermission grants a permission of a specified key or range to a specified role.
   rpc RoleGrantPermission(AuthRoleGrantPermissionRequest) returns (AuthRoleGrantPermissionResponse) {
   rpc RoleGrantPermission(AuthRoleGrantPermissionRequest) returns (AuthRoleGrantPermissionResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/grant"
+        post: "/v3/auth/role/grant"
         body: "*"
         body: "*"
     };
     };
   }
   }
@@ -339,7 +339,7 @@ service Auth {
   // RoleRevokePermission revokes a key or range permission of a specified role.
   // RoleRevokePermission revokes a key or range permission of a specified role.
   rpc RoleRevokePermission(AuthRoleRevokePermissionRequest) returns (AuthRoleRevokePermissionResponse) {
   rpc RoleRevokePermission(AuthRoleRevokePermissionRequest) returns (AuthRoleRevokePermissionResponse) {
       option (google.api.http) = {
       option (google.api.http) = {
-        post: "/v3beta/auth/role/revoke"
+        post: "/v3/auth/role/revoke"
         body: "*"
         body: "*"
     };
     };
   }
   }