@cubist-labs/cubesigner-sdk 0.2.28 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -28
- package/dist/cjs/package.json +41 -0
- package/dist/cjs/spec/env/beta.json +9 -0
- package/dist/cjs/spec/env/gamma.json +9 -0
- package/dist/cjs/spec/env/prod.json +9 -0
- package/dist/cjs/src/api.d.ts +652 -0
- package/dist/cjs/src/api.js +1345 -0
- package/dist/cjs/src/client.d.ts +642 -0
- package/dist/cjs/src/client.js +455 -0
- package/dist/cjs/src/env.d.ts +15 -0
- package/dist/cjs/src/env.js +35 -0
- package/dist/cjs/src/error.d.ts +32 -0
- package/dist/cjs/src/error.js +37 -0
- package/dist/cjs/src/events.d.ts +84 -0
- package/dist/cjs/src/events.js +195 -0
- package/dist/cjs/src/index.d.ts +203 -0
- package/dist/cjs/src/index.js +298 -0
- package/dist/cjs/src/key.d.ts +169 -0
- package/dist/cjs/src/key.js +262 -0
- package/dist/{src/fido.d.ts → cjs/src/mfa.d.ts} +38 -17
- package/dist/cjs/src/mfa.js +172 -0
- package/dist/cjs/src/org.d.ts +99 -0
- package/dist/cjs/src/org.js +95 -0
- package/dist/cjs/src/paginator.d.ts +76 -0
- package/dist/cjs/src/paginator.js +99 -0
- package/dist/cjs/src/response.d.ts +114 -0
- package/dist/cjs/src/response.js +203 -0
- package/dist/cjs/src/role.d.ts +289 -0
- package/dist/cjs/src/role.js +261 -0
- package/dist/cjs/src/schema.d.ts +6404 -0
- package/dist/cjs/src/schema.js +7 -0
- package/dist/cjs/src/schema_types.d.ts +116 -0
- package/dist/cjs/src/schema_types.js +3 -0
- package/dist/cjs/src/session/session_storage.d.ts +27 -0
- package/dist/cjs/src/session/session_storage.js +47 -0
- package/dist/cjs/src/session/signer_session_manager.d.ts +125 -0
- package/dist/cjs/src/session/signer_session_manager.js +239 -0
- package/dist/cjs/src/signer_session.d.ts +41 -0
- package/dist/cjs/src/signer_session.js +77 -0
- package/dist/cjs/src/user_export.d.ts +52 -0
- package/dist/cjs/src/user_export.js +129 -0
- package/dist/cjs/src/util.d.ts +56 -0
- package/dist/cjs/src/util.js +87 -0
- package/dist/esm/package.json +41 -0
- package/dist/esm/spec/env/beta.json +9 -0
- package/dist/esm/spec/env/gamma.json +9 -0
- package/dist/esm/spec/env/prod.json +9 -0
- package/dist/esm/src/api.d.ts +652 -0
- package/dist/esm/src/api.js +1335 -0
- package/dist/esm/src/client.d.ts +642 -0
- package/dist/esm/src/client.js +451 -0
- package/dist/esm/src/env.d.ts +15 -0
- package/dist/esm/src/env.js +9 -0
- package/dist/esm/src/error.d.ts +32 -0
- package/dist/esm/src/error.js +32 -0
- package/dist/esm/src/events.d.ts +84 -0
- package/dist/esm/src/events.js +189 -0
- package/dist/esm/src/index.d.ts +203 -0
- package/dist/esm/src/index.js +276 -0
- package/dist/esm/src/key.d.ts +169 -0
- package/dist/esm/src/key.js +256 -0
- package/dist/esm/src/mfa.d.ts +97 -0
- package/dist/esm/src/mfa.js +166 -0
- package/dist/esm/src/org.d.ts +99 -0
- package/dist/esm/src/org.js +91 -0
- package/dist/esm/src/paginator.d.ts +76 -0
- package/dist/esm/src/paginator.js +94 -0
- package/dist/esm/src/response.d.ts +114 -0
- package/dist/esm/src/response.js +198 -0
- package/dist/esm/src/role.d.ts +289 -0
- package/dist/esm/src/role.js +256 -0
- package/dist/esm/src/schema.d.ts +6404 -0
- package/dist/esm/src/schema.js +6 -0
- package/dist/esm/src/schema_types.d.ts +116 -0
- package/dist/esm/src/schema_types.js +2 -0
- package/dist/esm/src/session/session_storage.d.ts +27 -0
- package/dist/esm/src/session/session_storage.js +43 -0
- package/dist/esm/src/session/signer_session_manager.d.ts +125 -0
- package/dist/esm/src/session/signer_session_manager.js +235 -0
- package/dist/esm/src/signer_session.d.ts +41 -0
- package/dist/esm/src/signer_session.js +72 -0
- package/dist/esm/src/user_export.d.ts +52 -0
- package/dist/esm/src/user_export.js +99 -0
- package/dist/esm/src/util.d.ts +56 -0
- package/dist/esm/src/util.js +77 -0
- package/dist/package.json +13 -45
- package/dist/src/api.d.ts +29 -1
- package/dist/src/api.js +66 -1
- package/dist/src/client.d.ts +35 -14
- package/dist/src/client.js +12 -8
- package/dist/src/events.js +1 -1
- package/dist/src/index.d.ts +6 -11
- package/dist/src/index.js +9 -25
- package/dist/src/key.d.ts +18 -7
- package/dist/src/key.js +52 -19
- package/dist/src/role.d.ts +46 -3
- package/dist/src/role.js +60 -8
- package/dist/src/schema.d.ts +206 -72
- package/dist/src/schema.js +1 -1
- package/dist/src/schema_types.d.ts +3 -0
- package/dist/src/schema_types.js +1 -1
- package/dist/src/session/signer_session_manager.d.ts +38 -14
- package/dist/src/session/signer_session_manager.js +93 -33
- package/dist/src/util.d.ts +14 -0
- package/dist/src/util.js +24 -27
- package/package.json +19 -46
- package/src/api.ts +145 -19
- package/src/client.ts +106 -10
- package/src/error.ts +4 -0
- package/src/events.ts +2 -0
- package/src/index.ts +10 -24
- package/src/key.ts +67 -20
- package/src/mfa.ts +8 -4
- package/src/response.ts +50 -4
- package/src/role.ts +87 -7
- package/src/schema.ts +764 -152
- package/src/schema_types.ts +6 -0
- package/src/session/session_storage.ts +0 -32
- package/src/session/signer_session_manager.ts +126 -38
- package/src/util.ts +18 -10
- package/tsconfig.json +1 -21
- package/LICENSE-APACHE +0 -177
- package/LICENSE-MIT +0 -25
- package/NOTICE +0 -13
- package/dist/examples/ethers.d.ts +0 -1
- package/dist/examples/ethers.js +0 -142
- package/dist/src/ethers/index.d.ts +0 -95
- package/dist/src/ethers/index.js +0 -215
- package/dist/src/fido.js +0 -148
- package/dist/src/session/cognito_manager.d.ts +0 -71
- package/dist/src/session/cognito_manager.js +0 -129
- package/dist/src/session/generic.d.ts +0 -47
- package/dist/src/session/generic.js +0 -3
- package/dist/src/session/management_session_manager.d.ts +0 -59
- package/dist/src/session/management_session_manager.js +0 -111
- package/dist/src/session/oidc_session_manager.d.ts +0 -78
- package/dist/src/session/oidc_session_manager.js +0 -142
- package/dist/src/session/session_manager.d.ts +0 -99
- package/dist/src/session/session_manager.js +0 -136
- package/dist/src/sign.d.ts +0 -114
- package/dist/src/sign.js +0 -248
- package/dist/test/sessions.d.ts +0 -35
- package/dist/test/sessions.js +0 -56
- package/src/ethers/index.ts +0 -253
- package/src/session/cognito_manager.ts +0 -161
- package/src/session/session_manager.ts +0 -165
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
+
};
|
|
6
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
7
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
10
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
|
+
};
|
|
12
|
+
var _CubeSignerResponse_instances, _CubeSignerResponse_requestFn, _CubeSignerResponse_resp, _CubeSignerResponse_mfaRequired, _CubeSignerResponse_mfaVoteTotp, _CubeSignerResponse_mfaVoteCs;
|
|
13
|
+
/**
|
|
14
|
+
* Take a {@link Response<U>} and a {@link MapFn<U, V>} function and return
|
|
15
|
+
* a {@link Response<V>} that maps the value of the original response when its status code is 200.
|
|
16
|
+
*
|
|
17
|
+
* @param {Response<U>} resp Original response
|
|
18
|
+
* @param {Map<U, V>} mapFn Map to apply to the response value when its status code is 200.
|
|
19
|
+
* @return {Response<V>} Response whose value for status code 200 is mapped from U to V
|
|
20
|
+
*/
|
|
21
|
+
export function mapResponse(resp, mapFn) {
|
|
22
|
+
if (resp.accepted?.MfaRequired) {
|
|
23
|
+
return resp;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
return mapFn(resp);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A response of a CubeSigner request.
|
|
31
|
+
*/
|
|
32
|
+
export class CubeSignerResponse {
|
|
33
|
+
/** @return {string} The MFA id associated with this request (if any) */
|
|
34
|
+
mfaId() {
|
|
35
|
+
return __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f").id;
|
|
36
|
+
}
|
|
37
|
+
/** @return {boolean} True if this request requires an MFA approval */
|
|
38
|
+
requiresMfa() {
|
|
39
|
+
return __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f") !== undefined;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Return session information to use for any MFA approval requests (if any was included in the response).
|
|
43
|
+
* @return {ClientSessionInfo | undefined}
|
|
44
|
+
*/
|
|
45
|
+
mfaSessionInfo() {
|
|
46
|
+
return __classPrivateFieldGet(this, _CubeSignerResponse_resp, "f").accepted?.MfaRequired?.session ?? undefined;
|
|
47
|
+
}
|
|
48
|
+
/** @return {U} The response data, if no MFA is required */
|
|
49
|
+
data() {
|
|
50
|
+
if (this.requiresMfa()) {
|
|
51
|
+
throw new Error("Cannot call `data()` while MFA is required");
|
|
52
|
+
}
|
|
53
|
+
return __classPrivateFieldGet(this, _CubeSignerResponse_resp, "f");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Approve the MFA request using a given session and a TOTP code.
|
|
57
|
+
*
|
|
58
|
+
* @param {SignerSession} session Signer session to use
|
|
59
|
+
* @param {string} code 6-digit TOTP code
|
|
60
|
+
* @return {CubeSignerResponse<U>} The result of signing with the approval
|
|
61
|
+
*/
|
|
62
|
+
async approveTotp(session, code) {
|
|
63
|
+
return await __classPrivateFieldGet(this, _CubeSignerResponse_instances, "m", _CubeSignerResponse_mfaVoteTotp).call(this, session, code, "approve");
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reject the MFA request using a given session and a TOTP code.
|
|
67
|
+
*
|
|
68
|
+
* @param {SignerSession} session Signer session to use
|
|
69
|
+
* @param {string} code 6-digit TOTP code
|
|
70
|
+
*/
|
|
71
|
+
async rejectTotp(session, code) {
|
|
72
|
+
await __classPrivateFieldGet(this, _CubeSignerResponse_instances, "m", _CubeSignerResponse_mfaVoteTotp).call(this, session, code, "reject");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Approve the MFA request using a given {@link CubeSignerClient} instance (i.e., its session).
|
|
76
|
+
*
|
|
77
|
+
* @param {CubeSignerClient} cs CubeSigner whose session to use
|
|
78
|
+
* @return {CubeSignerResponse<U>} The result of signing with the approval
|
|
79
|
+
*/
|
|
80
|
+
async approve(cs) {
|
|
81
|
+
return await __classPrivateFieldGet(this, _CubeSignerResponse_instances, "m", _CubeSignerResponse_mfaVoteCs).call(this, cs, "approve");
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Reject the MFA request using a given {@link CubeSignerClient} instance (i.e., its session).
|
|
85
|
+
*
|
|
86
|
+
* @param {CubeSignerClient} cs CubeSigner client whose session to use
|
|
87
|
+
*/
|
|
88
|
+
async reject(cs) {
|
|
89
|
+
await __classPrivateFieldGet(this, _CubeSignerResponse_instances, "m", _CubeSignerResponse_mfaVoteCs).call(this, cs, "reject");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Resubmits the request with a given MFA receipt attached.
|
|
93
|
+
*
|
|
94
|
+
* @param {MfaReceipt} mfaReceipt The MFA receipt
|
|
95
|
+
* @return {Promise<CubeSignerResponse<U>>} The result of signing after MFA approval
|
|
96
|
+
*/
|
|
97
|
+
async signWithMfaApproval(mfaReceipt) {
|
|
98
|
+
const headers = CubeSignerResponse.getMfaHeaders(mfaReceipt);
|
|
99
|
+
return new CubeSignerResponse(__classPrivateFieldGet(this, _CubeSignerResponse_requestFn, "f"), await __classPrivateFieldGet(this, _CubeSignerResponse_requestFn, "f").call(this, headers));
|
|
100
|
+
}
|
|
101
|
+
// --------------------------------------------------------------------------
|
|
102
|
+
// -- INTERNAL --------------------------------------------------------------
|
|
103
|
+
// --------------------------------------------------------------------------
|
|
104
|
+
/**
|
|
105
|
+
* Constructor.
|
|
106
|
+
*
|
|
107
|
+
* @param {RequestFn} requestFn
|
|
108
|
+
* The signing function that this response is from.
|
|
109
|
+
* This argument is used to resend requests with different headers if needed.
|
|
110
|
+
* @param {U | AcceptedResponse} resp The response as returned by the OpenAPI client.
|
|
111
|
+
* @internal
|
|
112
|
+
*/
|
|
113
|
+
constructor(requestFn, resp) {
|
|
114
|
+
_CubeSignerResponse_instances.add(this);
|
|
115
|
+
_CubeSignerResponse_requestFn.set(this, void 0);
|
|
116
|
+
_CubeSignerResponse_resp.set(this, void 0);
|
|
117
|
+
/**
|
|
118
|
+
* Optional MFA id. Only set if there is an MFA request associated with the
|
|
119
|
+
* signing request
|
|
120
|
+
*/
|
|
121
|
+
_CubeSignerResponse_mfaRequired.set(this, void 0);
|
|
122
|
+
__classPrivateFieldSet(this, _CubeSignerResponse_requestFn, requestFn, "f");
|
|
123
|
+
__classPrivateFieldSet(this, _CubeSignerResponse_resp, resp, "f");
|
|
124
|
+
__classPrivateFieldSet(this, _CubeSignerResponse_mfaRequired, __classPrivateFieldGet(this, _CubeSignerResponse_resp, "f").accepted?.MfaRequired, "f");
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Static constructor.
|
|
128
|
+
* @param {RequestFn} requestFn
|
|
129
|
+
* The request function that this response is from.
|
|
130
|
+
* This argument is used to resend requests with different headers if needed.
|
|
131
|
+
* @param {MfaReceipt} mfaReceipt Optional MFA receipt
|
|
132
|
+
* @return {Promise<CubeSignerResponse<U>>} New instance of this class.
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
static async create(requestFn, mfaReceipt) {
|
|
136
|
+
const seed = await requestFn(this.getMfaHeaders(mfaReceipt));
|
|
137
|
+
return new CubeSignerResponse(requestFn, seed);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Return HTTP headers containing a given MFA receipt.
|
|
141
|
+
*
|
|
142
|
+
* @param {MfaReceipt} mfaReceipt MFA receipt
|
|
143
|
+
* @return {HeadersInit} Headers including that receipt
|
|
144
|
+
* @internal
|
|
145
|
+
*/
|
|
146
|
+
static getMfaHeaders(mfaReceipt) {
|
|
147
|
+
return mfaReceipt
|
|
148
|
+
? {
|
|
149
|
+
"x-cubist-mfa-id": mfaReceipt.mfaId,
|
|
150
|
+
"x-cubist-mfa-org-id": mfaReceipt.mfaOrgId,
|
|
151
|
+
"x-cubist-mfa-confirmation": mfaReceipt.mfaConf,
|
|
152
|
+
}
|
|
153
|
+
: undefined;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
_CubeSignerResponse_requestFn = new WeakMap(), _CubeSignerResponse_resp = new WeakMap(), _CubeSignerResponse_mfaRequired = new WeakMap(), _CubeSignerResponse_instances = new WeakSet(), _CubeSignerResponse_mfaVoteTotp =
|
|
157
|
+
/**
|
|
158
|
+
* Approve or reject an MFA request using a given session and a TOTP code.
|
|
159
|
+
*
|
|
160
|
+
* @param {SignerSession} session Signer session to use
|
|
161
|
+
* @param {string} code 6-digit TOTP code
|
|
162
|
+
* @param {MfaVote} vote Approve or reject
|
|
163
|
+
* @return {CubeSignerResponse<U>} The result of signing with the approval
|
|
164
|
+
*/
|
|
165
|
+
async function _CubeSignerResponse_mfaVoteTotp(session, code, vote) {
|
|
166
|
+
if (!this.requiresMfa()) {
|
|
167
|
+
return this;
|
|
168
|
+
}
|
|
169
|
+
const mfaId = this.mfaId();
|
|
170
|
+
const mfaOrgId = __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f").org_id;
|
|
171
|
+
const mfaApproval = await session.mfaVoteTotp(mfaId, code, vote);
|
|
172
|
+
const mfaConf = mfaApproval.receipt?.confirmation;
|
|
173
|
+
if (!mfaConf) {
|
|
174
|
+
return this;
|
|
175
|
+
}
|
|
176
|
+
return await this.signWithMfaApproval({ mfaId, mfaOrgId, mfaConf });
|
|
177
|
+
}, _CubeSignerResponse_mfaVoteCs =
|
|
178
|
+
/**
|
|
179
|
+
* Approve or reject an MFA request using a given {@link CubeSignerClient} instance (i.e., its session).
|
|
180
|
+
*
|
|
181
|
+
* @param {CubeSignerClient} cs CubeSigner whose session to use
|
|
182
|
+
* @param {MfaVote} mfaVote Approve or reject
|
|
183
|
+
* @return {CubeSignerResponse<U>} The result of signing with the approval
|
|
184
|
+
*/
|
|
185
|
+
async function _CubeSignerResponse_mfaVoteCs(cs, mfaVote) {
|
|
186
|
+
if (!this.requiresMfa()) {
|
|
187
|
+
return this;
|
|
188
|
+
}
|
|
189
|
+
const mfaId = __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f").id;
|
|
190
|
+
const mfaOrgId = __classPrivateFieldGet(this, _CubeSignerResponse_mfaRequired, "f").org_id;
|
|
191
|
+
const mfaApproval = await cs.mfaVoteCs(mfaId, mfaVote);
|
|
192
|
+
const mfaConf = mfaApproval.receipt?.confirmation;
|
|
193
|
+
if (!mfaConf) {
|
|
194
|
+
return this;
|
|
195
|
+
}
|
|
196
|
+
return await this.signWithMfaApproval({ mfaId, mfaOrgId, mfaConf });
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBcUJBOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFPLElBQWlCLEVBQUUsS0FBa0I7SUFDckUsSUFBSyxJQUF5QixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNyRCxPQUFPLElBQXdCLENBQUM7SUFDbEMsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEtBQUssQ0FBQyxJQUFTLENBQUMsQ0FBQztJQUMxQixDQUFDO0FBQ0gsQ0FBQztBQVdEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQVM3Qix3RUFBd0U7SUFDeEUsS0FBSztRQUNILE9BQU8sdUJBQUEsSUFBSSx1Q0FBYyxDQUFDLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLFdBQVc7UUFDVCxPQUFPLHVCQUFBLElBQUksdUNBQWEsS0FBSyxTQUFTLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWixPQUFRLHVCQUFBLElBQUksZ0NBQTJCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLElBQUksU0FBUyxDQUFDO0lBQ3RGLENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLHVCQUFBLElBQUksZ0NBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFzQixFQUFFLElBQVk7UUFDcEQsT0FBTyxNQUFNLHVCQUFBLElBQUksc0VBQWEsTUFBakIsSUFBSSxFQUFjLE9BQU8sRUFBRSxJQUFJ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QUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQXFCRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLHdDQUFZLEVBQW9CLEVBQUUsT0FBZ0I7SUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLHVCQUFBLElBQUksdUNBQWMsQ0FBQyxFQUFFLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQUcsdUJBQUEsSUFBSSx1Q0FBYyxDQUFDLE1BQU0sQ0FBQztJQUUzQyxNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDO0lBRWxELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDdEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1YmVTaWduZXJDbGllbnQsIE1mYVZvdGUsIFNpZ25lclNlc3Npb24gfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgTWZhUmVjZWlwdCB9IGZyb20gXCIuL21mYVwiO1xuaW1wb3J0IHsgQWNjZXB0ZWRSZXNwb25zZSwgTmV3U2Vzc2lvblJlc3BvbnNlIH0gZnJvbSBcIi4vc2NoZW1hX3R5cGVzXCI7XG5cbi8qKlxuICogUmVzcG9uc2UgdHlwZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHZhbHVlIG9mIHR5cGUge0BsaW5rIFV9XG4gKiBvciB7QGxpbmsgQWNjZXB0ZWRSZXNwb25zZX0gKHN0YXR1cyBjb2RlIDIwMikgd2hpY2ggcmVxdWlyZXMgTUZBLlxuICovXG5leHBvcnQgdHlwZSBSZXNwb25zZTxVPiA9IFUgfCBBY2NlcHRlZFJlc3BvbnNlO1xuXG4vKipcbiAqIFJlcXVlc3QgZnVuY3Rpb24gd2hpY2ggb3B0aW9uYWxseSB0YWtlcyBhZGRpdGlvbmFsIGhlYWRlcnNcbiAqICh3aGljaCwgZm9yIGV4YW1wbGUsIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhbiBNRkEgcmVjZWlwdCkuXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVlc3RGbjxVPiA9IChoZWFkZXJzPzogSGVhZGVyc0luaXQpID0+IFByb21pc2U8UmVzcG9uc2U8VT4+O1xuXG4vKipcbiAqIE1hcCBmdW5jdGlvbiBvY2Nhc2lvbmFsbHkgdXNlZCB0byBtYXAgYSByZXNwb25zZSBmcm9tIHRoZSBBUEkgaW50byBhIGhpZ2hlci1sZXZlbCB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBNYXBGbjxVLCBWPiA9ICh1OiBVKSA9PiBWO1xuXG4vKipcbiAqIFRha2UgYSB7QGxpbmsgUmVzcG9uc2U8VT59IGFuZCBhIHtAbGluayBNYXBGbjxVLCBWPn0gZnVuY3Rpb24gYW5kIHJldHVyblxuICogYSB7QGxpbmsgUmVzcG9uc2U8Vj59IHRoYXQgbWFwcyB0aGUgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIHdoZW4gaXRzIHN0YXR1cyBjb2RlIGlzIDIwMC5cbiAqXG4gKiBAcGFyYW0ge1Jlc3BvbnNlPFU+fSByZXNwIE9yaWdpbmFsIHJlc3BvbnNlXG4gKiBAcGFyYW0ge01hcDxVLCBWPn0gbWFwRm4gTWFwIHRvIGFwcGx5IHRvIHRoZSByZXNwb25zZSB2YWx1ZSB3aGVuIGl0cyBzdGF0dXMgY29kZSBpcyAyMDAuXG4gKiBAcmV0dXJuIHtSZXNwb25zZTxWPn0gUmVzcG9uc2Ugd2hvc2UgdmFsdWUgZm9yIHN0YXR1cyBjb2RlIDIwMCBpcyBtYXBwZWQgZnJvbSBVIHRvIFZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFJlc3BvbnNlPFUsIFY+KHJlc3A6IFJlc3BvbnNlPFU+LCBtYXBGbjogTWFwRm48VSwgVj4pOiBSZXNwb25zZTxWPiB7XG4gIGlmICgocmVzcCBhcyBBY2NlcHRlZFJlc3BvbnNlKS5hY2NlcHRlZD8uTWZhUmVxdWlyZWQpIHtcbiAgICByZXR1cm4gcmVzcCBhcyBBY2NlcHRlZFJlc3BvbnNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBtYXBGbihyZXNwIGFzIFUpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWZhUmVxdWlyZWQge1xuICAvKiogT3JnIGlkICovXG4gIG9yZ19pZDogc3RyaW5nO1xuICAvKiogTUZBIHJlcXVlc3QgaWQgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIE1GQSBzZXNzaW9uICovXG4gIHNlc3Npb24/OiBOZXdTZXNzaW9uUmVzcG9uc2UgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgcmVzcG9uc2Ugb2YgYSBDdWJlU2lnbmVyIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBDdWJlU2lnbmVyUmVzcG9uc2U8VT4ge1xuICByZWFkb25seSAjcmVxdWVzdEZuOiBSZXF1ZXN0Rm48VT47XG4gIHJlYWRvbmx5ICNyZXNwOiBVIHwgQWNjZXB0ZWRSZXNwb25zZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1GQSBpZC4gT25seSBzZXQgaWYgdGhlcmUgaXMgYW4gTUZBIHJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBzaWduaW5nIHJlcXVlc3RcbiAgICovXG4gIHJlYWRvbmx5ICNtZmFSZXF1aXJlZD86IE1mYVJlcXVpcmVkO1xuXG4gIC8qKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBNRkEgaWQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCAoaWYgYW55KSAqL1xuICBtZmFJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNtZmFSZXF1aXJlZCEuaWQ7XG4gIH1cblxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIHJlcXVlc3QgcmVxdWlyZXMgYW4gTUZBIGFwcHJvdmFsICovXG4gIHJlcXVpcmVzTWZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNtZmFSZXF1aXJlZCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBzZXNzaW9uIGluZm9ybWF0aW9uIHRvIHVzZSBmb3IgYW55IE1GQSBhcHByb3ZhbCByZXF1ZXN0cyAoaWYgYW55IHdhcyBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UpLlxuICAgKiBAcmV0dXJuIHtDbGllbnRTZXNzaW9uSW5mbyB8IHVuZGVmaW5lZH1cbiAgICovXG4gIG1mYVNlc3Npb25JbmZvKCk6IE5ld1Nlc3Npb25SZXNwb25zZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuICh0aGlzLiNyZXNwIGFzIEFjY2VwdGVkUmVzcG9uc2UpLmFjY2VwdGVkPy5NZmFSZXF1aXJlZD8uc2Vzc2lvbiA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQHJldHVybiB7VX0gVGhlIHJlc3BvbnNlIGRhdGEsIGlmIG5vIE1GQSBpcyByZXF1aXJlZCAqL1xuICBkYXRhKCk6IFUge1xuICAgIGlmICh0aGlzLnJlcXVpcmVzTWZhKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjYWxsIGBkYXRhKClgIHdoaWxlIE1GQSBpcyByZXF1aXJlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI3Jlc3AgYXMgVTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIHRoZSBNRkEgcmVxdWVzdCB1c2luZyBhIGdpdmVuIHNlc3Npb24gYW5kIGEgVE9UUCBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge1NpZ25lclNlc3Npb259IHNlc3Npb24gU2lnbmVyIHNlc3Npb24gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIDYtZGlnaXQgVE9UUCBjb2RlXG4gICAqIEByZXR1cm4ge0N1YmVTaWduZXJSZXNwb25zZTxVPn0gVGhlIHJlc3VsdCBvZiBzaWduaW5nIHdpdGggdGhlIGFwcHJvdmFsXG4gICAqL1xuICBhc3luYyBhcHByb3ZlVG90cChzZXNzaW9uOiBTaWduZXJTZXNzaW9uLCBjb2RlOiBzdHJpbmcpOiBQcm9taXNlPEN1YmVTaWduZXJSZXNwb25zZTxVPj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLiNtZmFWb3RlVG90cChzZXNzaW9uLCBjb2RlLCBcImFwcHJvdmVcIik7XG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0IHRoZSBNRkEgcmVxdWVzdCB1c2luZyBhIGdpdmVuIHNlc3Npb24gYW5kIGEgVE9UUCBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge1NpZ25lclNlc3Npb259IHNlc3Npb24gU2lnbmVyIHNlc3Npb24gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIDYtZGlnaXQgVE9UUCBjb2RlXG4gICAqL1xuICBhc3luYyByZWplY3RUb3RwKHNlc3Npb246IFNpZ25lclNlc3Npb24sIGNvZGU6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuI21mYVZvdGVUb3RwKHNlc3Npb24sIGNvZGUsIFwicmVqZWN0XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcHJvdmUgb3IgcmVqZWN0IGFuIE1GQSByZXF1ZXN0IHVzaW5nIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgYSBUT1RQIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7U2lnbmVyU2Vzc2lvbn0gc2Vzc2lvbiBTaWduZXIgc2Vzc2lvbiB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgNi1kaWdpdCBUT1RQIGNvZGVcbiAgICogQHBhcmFtIHtNZmFWb3RlfSB2b3RlIEFwcHJvdmUgb3IgcmVqZWN0XG4gICAqIEByZXR1cm4ge0N1YmVTaWduZXJSZXNwb25zZTxVPn0gVGhlIHJlc3VsdCBvZiBzaWduaW5nIHdpdGggdGhlIGFwcHJvdmFsXG4gICAqL1xuICBhc3luYyAjbWZhVm90ZVRvdHAoXG4gICAgc2Vzc2lvbjogU2lnbmVyU2Vzc2lvbixcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgdm90ZTogTWZhVm90ZSxcbiAgKTogUHJvbWlzZTxDdWJlU2lnbmVyUmVzcG9uc2U8VT4+IHtcbiAgICBpZiAoIXRoaXMucmVxdWlyZXNNZmEoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgbWZhSWQgPSB0aGlzLm1mYUlkKCk7XG4gICAgY29uc3QgbWZhT3JnSWQgPSB0aGlzLiNtZmFSZXF1aXJlZCEub3JnX2lkO1xuICAgIGNvbnN0IG1mYUFwcHJvdmFsID0gYXdhaXQgc2Vzc2lvbi5tZmFWb3RlVG90cChtZmFJZCwgY29kZSwgdm90ZSk7XG4gICAgY29uc3QgbWZhQ29uZiA9IG1mYUFwcHJvdmFsLnJlY2VpcHQ/LmNvbmZpcm1hdGlvbjtcblxuICAgIGlmICghbWZhQ29uZikge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2lnbldpdGhNZmFBcHByb3ZhbCh7IG1mYUlkLCBtZmFPcmdJZCwgbWZhQ29uZiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIHRoZSBNRkEgcmVxdWVzdCB1c2luZyBhIGdpdmVuIHtAbGluayBDdWJlU2lnbmVyQ2xpZW50fSBpbnN0YW5jZSAoaS5lLiwgaXRzIHNlc3Npb24pLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1YmVTaWduZXJDbGllbnR9IGNzIEN1YmVTaWduZXIgd2hvc2Ugc2Vzc2lvbiB0byB1c2VcbiAgICogQHJldHVybiB7Q3ViZVNpZ25lclJlc3BvbnNlPFU+fSBUaGUgcmVzdWx0IG9mIHNpZ25pbmcgd2l0aCB0aGUgYXBwcm92YWxcbiAgICovXG4gIGFzeW5jIGFwcHJvdmUoY3M6IEN1YmVTaWduZXJDbGllbnQpOiBQcm9taXNlPEN1YmVTaWduZXJSZXNwb25zZTxVPj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLiNtZmFWb3RlQ3MoY3MsIFwiYXBwcm92ZVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3QgdGhlIE1GQSByZXF1ZXN0IHVzaW5nIGEgZ2l2ZW4ge0BsaW5rIEN1YmVTaWduZXJDbGllbnR9IGluc3RhbmNlIChpLmUuLCBpdHMgc2Vzc2lvbikuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3ViZVNpZ25lckNsaWVudH0gY3MgQ3ViZVNpZ25lciBjbGllbnQgd2hvc2Ugc2Vzc2lvbiB0byB1c2VcbiAgICovXG4gIGFzeW5jIHJlamVjdChjczogQ3ViZVNpZ25lckNsaWVudCkge1xuICAgIGF3YWl0IHRoaXMuI21mYVZvdGVDcyhjcywgXCJyZWplY3RcIik7XG4gIH1cblxuICAvKipcbiAgICogQXBwcm92ZSBvciByZWplY3QgYW4gTUZBIHJlcXVlc3QgdXNpbmcgYSBnaXZlbiB7QGxpbmsgQ3ViZVNpZ25lckNsaWVudH0gaW5zdGFuY2UgKGkuZS4sIGl0cyBzZXNzaW9uKS5cbiAgICpcbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyQ2xpZW50fSBjcyBDdWJlU2lnbmVyIHdob3NlIHNlc3Npb24gdG8gdXNlXG4gICAqIEBwYXJhbSB7TWZhVm90ZX0gbWZhVm90ZSBBcHByb3ZlIG9yIHJlamVjdFxuICAgKiBAcmV0dXJuIHtDdWJlU2lnbmVyUmVzcG9uc2U8VT59IFRoZSByZXN1bHQgb2Ygc2lnbmluZyB3aXRoIHRoZSBhcHByb3ZhbFxuICAgKi9cbiAgYXN5bmMgI21mYVZvdGVDcyhjczogQ3ViZVNpZ25lckNsaWVudCwgbWZhVm90ZTogTWZhVm90ZSk6IFByb21pc2U8Q3ViZVNpZ25lclJlc3BvbnNlPFU+PiB7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVzTWZhKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNvbnN0IG1mYUlkID0gdGhpcy4jbWZhUmVxdWlyZWQhLmlkO1xuICAgIGNvbnN0IG1mYU9yZ0lkID0gdGhpcy4jbWZhUmVxdWlyZWQhLm9yZ19pZDtcblxuICAgIGNvbnN0IG1mYUFwcHJvdmFsID0gYXdhaXQgY3MubWZhVm90ZUNzKG1mYUlkLCBtZmFWb3RlKTtcbiAgICBjb25zdCBtZmFDb25mID0gbWZhQXBwcm92YWwucmVjZWlwdD8uY29uZmlybWF0aW9uO1xuXG4gICAgaWYgKCFtZmFDb25mKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduV2l0aE1mYUFwcHJvdmFsKHsgbWZhSWQsIG1mYU9yZ0lkLCBtZmFDb25mIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VibWl0cyB0aGUgcmVxdWVzdCB3aXRoIGEgZ2l2ZW4gTUZBIHJlY2VpcHQgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7TWZhUmVjZWlwdH0gbWZhUmVjZWlwdCBUaGUgTUZBIHJlY2VpcHRcbiAgICogQHJldHVybiB7UHJvbWlzZTxDdWJlU2lnbmVyUmVzcG9uc2U8VT4+fSBUaGUgcmVzdWx0IG9mIHNpZ25pbmcgYWZ0ZXIgTUZBIGFwcHJvdmFsXG4gICAqL1xuICBhc3luYyBzaWduV2l0aE1mYUFwcHJvdmFsKG1mYVJlY2VpcHQ6IE1mYVJlY2VpcHQpOiBQcm9taXNlPEN1YmVTaWduZXJSZXNwb25zZTxVPj4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBDdWJlU2lnbmVyUmVzcG9uc2UuZ2V0TWZhSGVhZGVycyhtZmFSZWNlaXB0KTtcbiAgICByZXR1cm4gbmV3IEN1YmVTaWduZXJSZXNwb25zZSh0aGlzLiNyZXF1ZXN0Rm4sIGF3YWl0IHRoaXMuI3JlcXVlc3RGbihoZWFkZXJzKSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLSBJTlRFUk5BTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHtSZXF1ZXN0Rm59IHJlcXVlc3RGblxuICAgKiAgICBUaGUgc2lnbmluZyBmdW5jdGlvbiB0aGF0IHRoaXMgcmVzcG9uc2UgaXMgZnJvbS5cbiAgICogICAgVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvIHJlc2VuZCByZXF1ZXN0cyB3aXRoIGRpZmZlcmVudCBoZWFkZXJzIGlmIG5lZWRlZC5cbiAgICogQHBhcmFtIHtVIHwgQWNjZXB0ZWRSZXNwb25zZX0gcmVzcCBUaGUgcmVzcG9uc2UgYXMgcmV0dXJuZWQgYnkgdGhlIE9wZW5BUEkgY2xpZW50LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3RGbjogUmVxdWVzdEZuPFU+LCByZXNwOiBVIHwgQWNjZXB0ZWRSZXNwb25zZSkge1xuICAgIHRoaXMuI3JlcXVlc3RGbiA9IHJlcXVlc3RGbjtcbiAgICB0aGlzLiNyZXNwID0gcmVzcDtcbiAgICB0aGlzLiNtZmFSZXF1aXJlZCA9ICh0aGlzLiNyZXNwIGFzIEFjY2VwdGVkUmVzcG9uc2UpLmFjY2VwdGVkPy5NZmFSZXF1aXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7UmVxdWVzdEZufSByZXF1ZXN0Rm5cbiAgICogICAgVGhlIHJlcXVlc3QgZnVuY3Rpb24gdGhhdCB0aGlzIHJlc3BvbnNlIGlzIGZyb20uXG4gICAqICAgIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byByZXNlbmQgcmVxdWVzdHMgd2l0aCBkaWZmZXJlbnQgaGVhZGVycyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7TWZhUmVjZWlwdH0gbWZhUmVjZWlwdCBPcHRpb25hbCBNRkEgcmVjZWlwdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEN1YmVTaWduZXJSZXNwb25zZTxVPj59IE5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGU8VT4oXG4gICAgcmVxdWVzdEZuOiBSZXF1ZXN0Rm48VT4sXG4gICAgbWZhUmVjZWlwdD86IE1mYVJlY2VpcHQsXG4gICk6IFByb21pc2U8Q3ViZVNpZ25lclJlc3BvbnNlPFU+PiB7XG4gICAgY29uc3Qgc2VlZCA9IGF3YWl0IHJlcXVlc3RGbih0aGlzLmdldE1mYUhlYWRlcnMobWZhUmVjZWlwdCkpO1xuICAgIHJldHVybiBuZXcgQ3ViZVNpZ25lclJlc3BvbnNlKHJlcXVlc3RGbiwgc2VlZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIEhUVFAgaGVhZGVycyBjb250YWluaW5nIGEgZ2l2ZW4gTUZBIHJlY2VpcHQuXG4gICAqXG4gICAqIEBwYXJhbSB7TWZhUmVjZWlwdH0gbWZhUmVjZWlwdCBNRkEgcmVjZWlwdFxuICAgKiBAcmV0dXJuIHtIZWFkZXJzSW5pdH0gSGVhZGVycyBpbmNsdWRpbmcgdGhhdCByZWNlaXB0XG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIGdldE1mYUhlYWRlcnMobWZhUmVjZWlwdD86IE1mYVJlY2VpcHQpOiBIZWFkZXJzSW5pdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG1mYVJlY2VpcHRcbiAgICAgID8ge1xuICAgICAgICAgIFwieC1jdWJpc3QtbWZhLWlkXCI6IG1mYVJlY2VpcHQubWZhSWQsXG4gICAgICAgICAgXCJ4LWN1YmlzdC1tZmEtb3JnLWlkXCI6IG1mYVJlY2VpcHQubWZhT3JnSWQsXG4gICAgICAgICAgXCJ4LWN1YmlzdC1tZmEtY29uZmlybWF0aW9uXCI6IG1mYVJlY2VpcHQubWZhQ29uZixcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { Key, KeyWithPoliciesInfo, MfaType, PageOpts, RoleInfo, SignerSession, SignerSessionInfo, SignerSessionLifetime, SignerSessionStorage } from ".";
|
|
2
|
+
import { CubeSignerClient } from "./client";
|
|
3
|
+
/**
|
|
4
|
+
* Restrict transaction receiver.
|
|
5
|
+
*
|
|
6
|
+
* @example { TxReceiver: "0x8c594691c0e592ffa21f153a16ae41db5befcaaa" }
|
|
7
|
+
*/
|
|
8
|
+
export type TxReceiver = {
|
|
9
|
+
TxReceiver: string;
|
|
10
|
+
};
|
|
11
|
+
/** The kind of deposit contracts. */
|
|
12
|
+
export declare enum DepositContract {
|
|
13
|
+
/** Canonical deposit contract */
|
|
14
|
+
Canonical = 0,// eslint-disable-line no-unused-vars
|
|
15
|
+
/** Wrapper deposit contract */
|
|
16
|
+
Wrapper = 1
|
|
17
|
+
}
|
|
18
|
+
/** Restrict transactions to calls to deposit contract. */
|
|
19
|
+
export type TxDeposit = TxDepositBase | TxDepositPubkey | TxDepositRole;
|
|
20
|
+
/** Restrict transactions to calls to deposit contract*/
|
|
21
|
+
export type TxDepositBase = {
|
|
22
|
+
TxDeposit: {
|
|
23
|
+
kind: DepositContract;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Restrict transactions to calls to deposit contract with fixed validator (pubkey):
|
|
28
|
+
*
|
|
29
|
+
* @example { TxDeposit: { kind: DespositContract.Canonical, validator: { pubkey: "8879...8"} }}
|
|
30
|
+
*/
|
|
31
|
+
export type TxDepositPubkey = {
|
|
32
|
+
TxDeposit: {
|
|
33
|
+
kind: DepositContract;
|
|
34
|
+
pubkey: string;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Restrict transactions to calls to deposit contract with any validator key in a role:
|
|
39
|
+
*
|
|
40
|
+
* @example { TxDeposit: { kind: DespositContract.Canonical, validator: { role_id: "Role#c63...af"} }}
|
|
41
|
+
*/
|
|
42
|
+
export type TxDepositRole = {
|
|
43
|
+
TxDeposit: {
|
|
44
|
+
kind: DepositContract;
|
|
45
|
+
role_id: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Only allow connections from clients whose IP addresses match any of these IPv4 CIDR blocks.
|
|
50
|
+
*
|
|
51
|
+
* @example { SourceIpAllowlist: [ "123.456.78.9/16" ] }
|
|
52
|
+
*/
|
|
53
|
+
export type SourceIpAllowlist = {
|
|
54
|
+
SourceIpAllowlist: string[];
|
|
55
|
+
};
|
|
56
|
+
/** All different kinds of sensitive operations. */
|
|
57
|
+
export declare enum OperationKind {
|
|
58
|
+
BlobSign = "BlobSign",// eslint-disable-line no-unused-vars
|
|
59
|
+
EvmSign = "Eth1Sign",// eslint-disable-line no-unused-vars
|
|
60
|
+
Eth2Sign = "Eth2Sign",// eslint-disable-line no-unused-vars
|
|
61
|
+
Eth2Stake = "Eth2Stake",// eslint-disable-line no-unused-vars
|
|
62
|
+
Eth2Unstake = "Eth2Unstake",// eslint-disable-line no-unused-vars
|
|
63
|
+
SolanaSign = "SolanaSign"
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* MFA policy
|
|
67
|
+
*
|
|
68
|
+
* @example {
|
|
69
|
+
* {
|
|
70
|
+
* count: 1,
|
|
71
|
+
* num_auth_factors: 1,
|
|
72
|
+
* allowed_mfa_types: [ "Totp" ],
|
|
73
|
+
* allowed_approvers: [ "User#123" ],
|
|
74
|
+
* }
|
|
75
|
+
*/
|
|
76
|
+
export type MfaPolicy = {
|
|
77
|
+
count?: number;
|
|
78
|
+
num_auth_factors?: number;
|
|
79
|
+
allowed_approvers?: string[];
|
|
80
|
+
allowed_mfa_types?: MfaType[];
|
|
81
|
+
restricted_operations?: OperationKind[];
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Require MFA for transactions.
|
|
85
|
+
*
|
|
86
|
+
* @example {
|
|
87
|
+
* RequireMfa: {
|
|
88
|
+
* count: 1,
|
|
89
|
+
* allowed_mfa_types: [ "Totp" ],
|
|
90
|
+
* allowed_approvers: [ "User#123" ],
|
|
91
|
+
* restricted_operations: [
|
|
92
|
+
* "Eth1Sign",
|
|
93
|
+
* "BlobSign"
|
|
94
|
+
* ]
|
|
95
|
+
* }
|
|
96
|
+
* }
|
|
97
|
+
*/
|
|
98
|
+
export type RequireMfa = {
|
|
99
|
+
RequireMfa: MfaPolicy;
|
|
100
|
+
};
|
|
101
|
+
/** Allow raw blob signing */
|
|
102
|
+
export declare const AllowRawBlobSigning: "AllowRawBlobSigning";
|
|
103
|
+
export type AllowRawBlobSigning = typeof AllowRawBlobSigning;
|
|
104
|
+
/** Allow EIP-191 signing */
|
|
105
|
+
export declare const AllowEip191Signing: "AllowEip191Signing";
|
|
106
|
+
export type AllowEip191Signing = typeof AllowEip191Signing;
|
|
107
|
+
/** Allow EIP-712 signing */
|
|
108
|
+
export declare const AllowEip712Signing: "AllowEip712Signing";
|
|
109
|
+
export type AllowEip712Signing = typeof AllowEip712Signing;
|
|
110
|
+
/** Key policies that restrict the requests that the signing endpoints accept */
|
|
111
|
+
type KeyDenyPolicy = TxReceiver | TxDeposit | SourceIpAllowlist | RequireMfa;
|
|
112
|
+
/**
|
|
113
|
+
* Key policy
|
|
114
|
+
*
|
|
115
|
+
* @example [
|
|
116
|
+
* {
|
|
117
|
+
* "TxReceiver": "0x8c594691c0e592ffa21f153a16ae41db5befcaaa"
|
|
118
|
+
* },
|
|
119
|
+
* {
|
|
120
|
+
* "TxDeposit": {
|
|
121
|
+
* "kind": "Canonical"
|
|
122
|
+
* }
|
|
123
|
+
* },
|
|
124
|
+
* {
|
|
125
|
+
* "RequireMfa": {
|
|
126
|
+
* "count": 1,
|
|
127
|
+
* "allowed_mfa_types": ["CubeSigner"],
|
|
128
|
+
* "restricted_operations": [
|
|
129
|
+
* "Eth1Sign",
|
|
130
|
+
* "BlobSign"
|
|
131
|
+
* ]
|
|
132
|
+
* }
|
|
133
|
+
* }
|
|
134
|
+
* ]
|
|
135
|
+
*/
|
|
136
|
+
export type KeyPolicy = (KeyDenyPolicy | AllowRawBlobSigning | AllowEip191Signing | AllowEip712Signing)[];
|
|
137
|
+
/** Role policy */
|
|
138
|
+
export type RolePolicy = KeyDenyPolicy[];
|
|
139
|
+
/** A key guarded by a policy. */
|
|
140
|
+
export declare class KeyWithPolicies {
|
|
141
|
+
#private;
|
|
142
|
+
readonly keyId: string;
|
|
143
|
+
readonly policy?: KeyPolicy;
|
|
144
|
+
/** @return {Promise<Key>} The key */
|
|
145
|
+
getKey(): Promise<Key>;
|
|
146
|
+
/**
|
|
147
|
+
* Constructor.
|
|
148
|
+
* @param {CubeSignerClient} csc The CubeSigner instance to use for signing.
|
|
149
|
+
* @param {KeyWithPoliciesInfo} keyWithPolicies The key and its policies
|
|
150
|
+
* @internal
|
|
151
|
+
*/
|
|
152
|
+
constructor(csc: CubeSignerClient, keyWithPolicies: KeyWithPoliciesInfo);
|
|
153
|
+
}
|
|
154
|
+
/** Roles. */
|
|
155
|
+
export declare class Role {
|
|
156
|
+
#private;
|
|
157
|
+
/** Human-readable name for the role */
|
|
158
|
+
get name(): string | undefined;
|
|
159
|
+
/**
|
|
160
|
+
* The ID of the role.
|
|
161
|
+
* @example Role#bfe3eccb-731e-430d-b1e5-ac1363e6b06b
|
|
162
|
+
*/
|
|
163
|
+
get id(): string;
|
|
164
|
+
/**
|
|
165
|
+
* @return {RoleInfo} the cached properties of this role. The cached properties
|
|
166
|
+
* reflect the state of the last fetch or update (e.g., after awaiting
|
|
167
|
+
* `Role.enabled()` or `Role.disable()`).
|
|
168
|
+
*/
|
|
169
|
+
get cached(): RoleInfo;
|
|
170
|
+
/** Delete the role. */
|
|
171
|
+
delete(): Promise<void>;
|
|
172
|
+
/** Is the role enabled? */
|
|
173
|
+
enabled(): Promise<boolean>;
|
|
174
|
+
/** Enable the role. */
|
|
175
|
+
enable(): Promise<void>;
|
|
176
|
+
/** Disable the role. */
|
|
177
|
+
disable(): Promise<void>;
|
|
178
|
+
/**
|
|
179
|
+
* Set new policy (overwriting any policies previously set for this role)
|
|
180
|
+
* @param {RolePolicy} policy The new policy to set
|
|
181
|
+
*/
|
|
182
|
+
setPolicy(policy: RolePolicy): Promise<void>;
|
|
183
|
+
/**
|
|
184
|
+
* Append to existing role policy. This append is not atomic---it uses
|
|
185
|
+
* {@link policy} to fetch the current policy and then {@link setPolicy}
|
|
186
|
+
* to set the policy---and should not be used in across concurrent sessions.
|
|
187
|
+
*
|
|
188
|
+
* @param {RolePolicy} policy The policy to append to the existing one.
|
|
189
|
+
*/
|
|
190
|
+
appendPolicy(policy: RolePolicy): Promise<void>;
|
|
191
|
+
/**
|
|
192
|
+
* Get the policy for the role.
|
|
193
|
+
* @return {Promise<RolePolicy>} The policy for the role.
|
|
194
|
+
*/
|
|
195
|
+
policy(): Promise<RolePolicy>;
|
|
196
|
+
/**
|
|
197
|
+
* The list of all users with access to the role.
|
|
198
|
+
* @example [
|
|
199
|
+
* "User#c3b9379c-4e8c-4216-bd0a-65ace53cf98f",
|
|
200
|
+
* "User#5593c25b-52e2-4fb5-b39b-96d41d681d82"
|
|
201
|
+
* ]
|
|
202
|
+
*
|
|
203
|
+
* @param {PageOpts} page Optional pagination options; by default, retrieves all users.
|
|
204
|
+
*/
|
|
205
|
+
users(page?: PageOpts): Promise<string[]>;
|
|
206
|
+
/**
|
|
207
|
+
* Add an existing user to an existing role.
|
|
208
|
+
*
|
|
209
|
+
* @param {string} userId The user-id of the user to add to the role.
|
|
210
|
+
*/
|
|
211
|
+
addUser(userId: string): Promise<void>;
|
|
212
|
+
/**
|
|
213
|
+
* Remove an existing user from an existing role.
|
|
214
|
+
*
|
|
215
|
+
* @param {string} userId The user-id of the user to remove from the role.
|
|
216
|
+
*/
|
|
217
|
+
removeUser(userId: string): Promise<void>;
|
|
218
|
+
/**
|
|
219
|
+
* The list of keys in the role.
|
|
220
|
+
* @example [
|
|
221
|
+
* {
|
|
222
|
+
* id: "Key#bfe3eccb-731e-430d-b1e5-ac1363e6b06b",
|
|
223
|
+
* policy: { TxReceiver: "0x8c594691c0e592ffa21f153a16ae41db5befcaaa" }
|
|
224
|
+
* },
|
|
225
|
+
* ]
|
|
226
|
+
*
|
|
227
|
+
* @param {PageOpts} page Optional pagination options; by default, retrieves all keys in this role.
|
|
228
|
+
*/
|
|
229
|
+
keys(page?: PageOpts): Promise<KeyWithPolicies[]>;
|
|
230
|
+
/**
|
|
231
|
+
* Add a list of existing keys to an existing role.
|
|
232
|
+
*
|
|
233
|
+
* @param {Key[]} keys The list of keys to add to the role.
|
|
234
|
+
* @param {KeyPolicy?} policy The optional policy to apply to each key.
|
|
235
|
+
*/
|
|
236
|
+
addKeys(keys: Key[], policy?: KeyPolicy): Promise<void>;
|
|
237
|
+
/**
|
|
238
|
+
* Add an existing key to an existing role.
|
|
239
|
+
*
|
|
240
|
+
* @param {Key} key The key to add to the role.
|
|
241
|
+
* @param {KeyPolicy?} policy The optional policy to apply to the key.
|
|
242
|
+
*/
|
|
243
|
+
addKey(key: Key, policy?: KeyPolicy): Promise<void>;
|
|
244
|
+
/**
|
|
245
|
+
* Remove an existing key from an existing role.
|
|
246
|
+
*
|
|
247
|
+
* @param {Key} key The key to remove from the role.
|
|
248
|
+
*/
|
|
249
|
+
removeKey(key: Key): Promise<void>;
|
|
250
|
+
/**
|
|
251
|
+
* Create a new session for this role.
|
|
252
|
+
* @param {SignerSessionStorage} storage The session storage to use
|
|
253
|
+
* @param {string} purpose Descriptive purpose.
|
|
254
|
+
* @param {SignerSessionLifetime} lifetimes Optional session lifetimes.
|
|
255
|
+
* @param {string[]} scopes Session scopes. Only `sign:*` scopes are allowed.
|
|
256
|
+
* @return {Promise<SignerSession>} New signer session.
|
|
257
|
+
*/
|
|
258
|
+
createSession(storage: SignerSessionStorage, purpose: string, lifetimes?: SignerSessionLifetime, scopes?: string[]): Promise<SignerSession>;
|
|
259
|
+
/**
|
|
260
|
+
* List all signer sessions for this role. Returned objects can be used to
|
|
261
|
+
* revoke individual sessions, but they cannot be used for authentication.
|
|
262
|
+
*
|
|
263
|
+
* @param {PageOpts} page Optional pagination options; by default, retrieves all sessions.
|
|
264
|
+
* @return {Promise<SignerSessionInfo[]>} Signer sessions for this role.
|
|
265
|
+
*/
|
|
266
|
+
sessions(page?: PageOpts): Promise<SignerSessionInfo[]>;
|
|
267
|
+
/**
|
|
268
|
+
* Constructor.
|
|
269
|
+
* @param {CubeSignerClient} csc The CubeSigner instance to use for signing.
|
|
270
|
+
* @param {RoleInfo} data The JSON response from the API server.
|
|
271
|
+
* @internal
|
|
272
|
+
*/
|
|
273
|
+
constructor(csc: CubeSignerClient, data: RoleInfo);
|
|
274
|
+
/**
|
|
275
|
+
* Update the role.
|
|
276
|
+
*
|
|
277
|
+
* @param {UpdateRoleRequest} request The JSON request to send to the API server.
|
|
278
|
+
* @return {Promise<RoleInfo>} The updated role information.
|
|
279
|
+
*/
|
|
280
|
+
private update;
|
|
281
|
+
/**
|
|
282
|
+
* Fetches the role information.
|
|
283
|
+
*
|
|
284
|
+
* @return {RoleInfo} The role information.
|
|
285
|
+
* @internal
|
|
286
|
+
*/
|
|
287
|
+
private fetch;
|
|
288
|
+
}
|
|
289
|
+
export {};
|