@cubist-labs/cubesigner-sdk 0.1.23
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/LICENSE-APACHE +177 -0
- package/LICENSE-MIT +25 -0
- package/NOTICE +13 -0
- package/README.md +470 -0
- package/dist/examples/ethers.d.ts +1 -0
- package/dist/examples/ethers.js +142 -0
- package/dist/spec/env/beta.json +9 -0
- package/dist/spec/env/gamma.json +9 -0
- package/dist/spec/env/prod.json +9 -0
- package/dist/src/client.d.ts +10 -0
- package/dist/src/client.js +21 -0
- package/dist/src/env.d.ts +15 -0
- package/dist/src/env.js +35 -0
- package/dist/src/ethers/index.d.ts +50 -0
- package/dist/src/ethers/index.js +122 -0
- package/dist/src/index.d.ts +114 -0
- package/dist/src/index.js +205 -0
- package/dist/src/key.d.ts +114 -0
- package/dist/src/key.js +201 -0
- package/dist/src/mfa.d.ts +23 -0
- package/dist/src/mfa.js +63 -0
- package/dist/src/org.d.ts +161 -0
- package/dist/src/org.js +264 -0
- package/dist/src/role.d.ts +224 -0
- package/dist/src/role.js +256 -0
- package/dist/src/schema.d.ts +3049 -0
- package/dist/src/schema.js +7 -0
- package/dist/src/session/generic.d.ts +47 -0
- package/dist/src/session/generic.js +3 -0
- package/dist/src/session/management_session_manager.d.ts +59 -0
- package/dist/src/session/management_session_manager.js +111 -0
- package/dist/src/session/oidc_session_manager.d.ts +78 -0
- package/dist/src/session/oidc_session_manager.js +142 -0
- package/dist/src/session/session_manager.d.ts +74 -0
- package/dist/src/session/session_manager.js +79 -0
- package/dist/src/session/session_storage.d.ts +47 -0
- package/dist/src/session/session_storage.js +76 -0
- package/dist/src/session/signer_session_manager.d.ts +88 -0
- package/dist/src/session/signer_session_manager.js +159 -0
- package/dist/src/sign.d.ts +114 -0
- package/dist/src/sign.js +248 -0
- package/dist/src/signer_session.d.ts +180 -0
- package/dist/src/signer_session.js +369 -0
- package/dist/src/util.d.ts +35 -0
- package/dist/src/util.js +75 -0
- package/dist/test/sessions.d.ts +35 -0
- package/dist/test/sessions.js +56 -0
- package/package.json +61 -0
- package/src/client.ts +12 -0
- package/src/env.ts +25 -0
- package/src/ethers/index.ts +131 -0
- package/src/index.ts +220 -0
- package/src/key.ts +249 -0
- package/src/org.ts +333 -0
- package/src/role.ts +385 -0
- package/src/schema.ts +3054 -0
- package/src/session/management_session_manager.ts +136 -0
- package/src/session/oidc_session_manager.ts +193 -0
- package/src/session/session_manager.ts +114 -0
- package/src/session/session_storage.ts +73 -0
- package/src/session/signer_session_manager.ts +211 -0
- package/src/signer_session.ts +464 -0
- package/src/util.ts +58 -0
- package/tsconfig.json +32 -0
package/dist/src/mfa.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
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");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
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");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _Mfa_sign, _Mfa_role;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.Mfa = void 0;
|
|
19
|
+
const assert_1 = __importDefault(require("assert"));
|
|
20
|
+
/**
|
|
21
|
+
* Wrapper around @type {Sign} and @type {Role} that adds a **single-approval**
|
|
22
|
+
* multi-factor authorization on top of all sign operations.
|
|
23
|
+
*/
|
|
24
|
+
class Mfa {
|
|
25
|
+
/* eslint-disable valid-jsdoc */
|
|
26
|
+
/**
|
|
27
|
+
* Auto approve a sign operation that requires MFA.
|
|
28
|
+
*
|
|
29
|
+
* @param signFn The sign operation to call
|
|
30
|
+
* @param {T} args Arguments to the sign operation
|
|
31
|
+
* @return {Promise<U>} The result of the sign operation.
|
|
32
|
+
*/
|
|
33
|
+
async autoApprove(// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
34
|
+
/* eslint-enable valid-jsdoc */
|
|
35
|
+
signFn, ...args) {
|
|
36
|
+
const data = await signFn.bind(__classPrivateFieldGet(this, _Mfa_sign, "f"))(...args);
|
|
37
|
+
if (data.requiresMfa()) {
|
|
38
|
+
const mfaId = data.mfaId();
|
|
39
|
+
const approval = await __classPrivateFieldGet(this, _Mfa_role, "f").mfaApprove(mfaId);
|
|
40
|
+
(0, assert_1.default)(approval.id === mfaId);
|
|
41
|
+
(0, assert_1.default)(approval.receipt);
|
|
42
|
+
const mfa = new Mfa(__classPrivateFieldGet(this, _Mfa_sign, "f").withMfaApproval(approval), __classPrivateFieldGet(this, _Mfa_role, "f"));
|
|
43
|
+
return await mfa.autoApprove(signFn, ...args);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Constructor.
|
|
51
|
+
* @param {Sign} sign Sign instance to use for signing
|
|
52
|
+
* @param {Role} role Role instance to use for MFA approval
|
|
53
|
+
*/
|
|
54
|
+
constructor(sign, role) {
|
|
55
|
+
_Mfa_sign.set(this, void 0);
|
|
56
|
+
_Mfa_role.set(this, void 0);
|
|
57
|
+
__classPrivateFieldSet(this, _Mfa_sign, sign, "f");
|
|
58
|
+
__classPrivateFieldSet(this, _Mfa_role, role, "f");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.Mfa = Mfa;
|
|
62
|
+
_Mfa_sign = new WeakMap(), _Mfa_role = new WeakMap();
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21mYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFHNUI7OztHQUdHO0FBQ0gsTUFBYSxHQUFHO0lBSWQsZ0NBQWdDO0lBQ2hDOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQTJCLHlEQUF5RDtJQUNuRywrQkFBK0I7SUFDL0IsTUFBZ0QsRUFDaEQsR0FBRyxJQUFPO1FBRVYsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUFBLElBQUksaUJBQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLE1BQU0sUUFBUSxHQUFHLE1BQU0sdUJBQUEsSUFBSSxpQkFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxJQUFBLGdCQUFNLEVBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUM5QixJQUFBLGdCQUFNLEVBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLHVCQUFBLElBQUksaUJBQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsdUJBQUEsSUFBSSxpQkFBTSxDQUFDLENBQUM7WUFDdEUsT0FBTyxNQUFNLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDL0M7YUFBTTtZQUNMLE9BQU8sSUFBUyxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLElBQVUsRUFBRSxJQUFVO1FBbEN6Qiw0QkFBWTtRQUNaLDRCQUFZO1FBa0NuQix1QkFBQSxJQUFJLGFBQVMsSUFBSSxNQUFBLENBQUM7UUFDbEIsdUJBQUEsSUFBSSxhQUFTLElBQUksTUFBQSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXZDRCxrQkF1Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IFNpZ24sIFNpZ25SZXNwb25zZSwgUm9sZSB9IGZyb20gXCIuXCI7XG5cbi8qKlxuICogV3JhcHBlciBhcm91bmQgQHR5cGUge1NpZ259IGFuZCBAdHlwZSB7Um9sZX0gdGhhdCBhZGRzIGEgKipzaW5nbGUtYXBwcm92YWwqKlxuICogbXVsdGktZmFjdG9yIGF1dGhvcml6YXRpb24gb24gdG9wIG9mIGFsbCBzaWduIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZmEge1xuICByZWFkb25seSAjc2lnbjogU2lnbjtcbiAgcmVhZG9ubHkgI3JvbGU6IFJvbGU7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi9cbiAgLyoqXG4gICAqIEF1dG8gYXBwcm92ZSBhIHNpZ24gb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgTUZBLlxuICAgKlxuICAgKiBAcGFyYW0gc2lnbkZuIFRoZSBzaWduIG9wZXJhdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7VH0gYXJncyBBcmd1bWVudHMgdG8gdGhlIHNpZ24gb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VT59IFRoZSByZXN1bHQgb2YgdGhlIHNpZ24gb3BlcmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgYXV0b0FwcHJvdmU8VCBleHRlbmRzIEFycmF5PGFueT4sIFU+KCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAvKiBlc2xpbnQtZW5hYmxlIHZhbGlkLWpzZG9jICovXG4gICAgc2lnbkZuOiAoLi4uYXJnczogVCkgPT4gUHJvbWlzZTxTaWduUmVzcG9uc2U8VT4+LFxuICAgIC4uLmFyZ3M6IFRcbiAgKTogUHJvbWlzZTxVPiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHNpZ25Gbi5iaW5kKHRoaXMuI3NpZ24pKC4uLmFyZ3MpO1xuICAgIGlmIChkYXRhLnJlcXVpcmVzTWZhKCkpIHtcbiAgICAgIGNvbnN0IG1mYUlkID0gZGF0YS5tZmFJZCgpO1xuICAgICAgY29uc3QgYXBwcm92YWwgPSBhd2FpdCB0aGlzLiNyb2xlLm1mYUFwcHJvdmUobWZhSWQpO1xuICAgICAgYXNzZXJ0KGFwcHJvdmFsLmlkID09PSBtZmFJZCk7XG4gICAgICBhc3NlcnQoYXBwcm92YWwucmVjZWlwdCk7XG4gICAgICBjb25zdCBtZmEgPSBuZXcgTWZhKHRoaXMuI3NpZ24ud2l0aE1mYUFwcHJvdmFsKGFwcHJvdmFsKSwgdGhpcy4jcm9sZSk7XG4gICAgICByZXR1cm4gYXdhaXQgbWZhLmF1dG9BcHByb3ZlKHNpZ25GbiwgLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkYXRhIGFzIFU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge1NpZ259IHNpZ24gU2lnbiBpbnN0YW5jZSB0byB1c2UgZm9yIHNpZ25pbmdcbiAgICogQHBhcmFtIHtSb2xlfSByb2xlIFJvbGUgaW5zdGFuY2UgdG8gdXNlIGZvciBNRkEgYXBwcm92YWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNpZ246IFNpZ24sIHJvbGU6IFJvbGUpIHtcbiAgICB0aGlzLiNzaWduID0gc2lnbjtcbiAgICB0aGlzLiNyb2xlID0gcm9sZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { CubeSigner, MfaRequestInfo } from ".";
|
|
2
|
+
import { components } from "./client";
|
|
3
|
+
import { KeyType, Key } from "./key";
|
|
4
|
+
import { Role } from "./role";
|
|
5
|
+
/** Organization id */
|
|
6
|
+
export type OrgId = string;
|
|
7
|
+
/** Org-wide policy */
|
|
8
|
+
export type OrgPolicy = SourceIpAllowlistPolicy | OriginAllowlistPolicy | MaxDailyUnstakePolicy;
|
|
9
|
+
/**
|
|
10
|
+
* Only allow requests from the specified origins.
|
|
11
|
+
* @example {"OriginAllowlist": "*"}
|
|
12
|
+
*/
|
|
13
|
+
export interface OriginAllowlistPolicy {
|
|
14
|
+
OriginAllowlist: string[] | "*";
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Restrict signing to specific source IP addresses.
|
|
18
|
+
* @example {"SourceIpAllowlist": ["10.1.2.3/8", "169.254.17.1/16"]}
|
|
19
|
+
*/
|
|
20
|
+
export interface SourceIpAllowlistPolicy {
|
|
21
|
+
SourceIpAllowlist: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Restrict the number of unstakes per day.
|
|
25
|
+
* @example {"MaxDailyUnstake": 5 }
|
|
26
|
+
*/
|
|
27
|
+
export interface MaxDailyUnstakePolicy {
|
|
28
|
+
MaxDailyUnstake: number;
|
|
29
|
+
}
|
|
30
|
+
type OrgInfo = components["schemas"]["OrgInfo"];
|
|
31
|
+
type UserIdInfo = components["schemas"]["UserIdInfo"];
|
|
32
|
+
export type OidcIdentity = components["schemas"]["OIDCIdentity"];
|
|
33
|
+
export type MemberRole = components["schemas"]["MemberRole"];
|
|
34
|
+
/** An organization. */
|
|
35
|
+
export declare class Org {
|
|
36
|
+
#private;
|
|
37
|
+
/**
|
|
38
|
+
* @description The org id
|
|
39
|
+
* @example Org#c3b9379c-4e8c-4216-bd0a-65ace53cf98f
|
|
40
|
+
* */
|
|
41
|
+
get id(): OrgId;
|
|
42
|
+
/** Human-readable name for the org */
|
|
43
|
+
name(): Promise<string | undefined>;
|
|
44
|
+
/** Set the human-readable name for the org.
|
|
45
|
+
* @param {string} name The new human-readable name for the org (must be alphanumeric).
|
|
46
|
+
* @example my_org_name
|
|
47
|
+
* */
|
|
48
|
+
setName(name: string): Promise<void>;
|
|
49
|
+
/** Is the org enabled? */
|
|
50
|
+
enabled(): Promise<boolean>;
|
|
51
|
+
/** Enable the org. */
|
|
52
|
+
enable(): Promise<void>;
|
|
53
|
+
/** Disable the org. */
|
|
54
|
+
disable(): Promise<void>;
|
|
55
|
+
/** Get the policy for the org. */
|
|
56
|
+
policy(): Promise<OrgPolicy[]>;
|
|
57
|
+
/** Set the policy for the org.
|
|
58
|
+
* @param {OrgPolicy[]} policy The new policy for the org.
|
|
59
|
+
* */
|
|
60
|
+
setPolicy(policy: OrgPolicy[]): Promise<void>;
|
|
61
|
+
/** Create a new signing key.
|
|
62
|
+
* @param {KeyType} type The type of key to create.
|
|
63
|
+
* @param {string?} ownerId The owner of the key. Defaults to the session's user.
|
|
64
|
+
* @return {Key[]} The new keys.
|
|
65
|
+
* */
|
|
66
|
+
createKey(type: KeyType, ownerId?: string): Promise<Key>;
|
|
67
|
+
/** Create new signing keys.
|
|
68
|
+
* @param {KeyType} type The type of key to create.
|
|
69
|
+
* @param {nummber} count The number of keys to create.
|
|
70
|
+
* @param {string?} ownerId The owner of the keys. Defaults to the session's user.
|
|
71
|
+
* @return {Key[]} The new keys.
|
|
72
|
+
* */
|
|
73
|
+
createKeys(type: KeyType, count: number, ownerId?: string): Promise<Key[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Create a new user in the organization and sends an invitation to that user
|
|
76
|
+
* @param {string} email Email of the user
|
|
77
|
+
* @param {string} name The full name of the user
|
|
78
|
+
*/
|
|
79
|
+
createUser(email: string, name: string): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Create a new OIDC user
|
|
82
|
+
* @param {OidcIdentity} identity The identity of the OIDC user
|
|
83
|
+
* @param {MemberRole} memberRole The type of membership of the new user
|
|
84
|
+
* @return {string} User id of the new user
|
|
85
|
+
*/
|
|
86
|
+
createOidcUser(identity: OidcIdentity, memberRole: MemberRole): Promise<string>;
|
|
87
|
+
/**
|
|
88
|
+
* List users in the organization
|
|
89
|
+
* @return {UserIdInfo[]} List of users
|
|
90
|
+
*/
|
|
91
|
+
users(): Promise<UserIdInfo[]>;
|
|
92
|
+
/** Get a key by id.
|
|
93
|
+
* @param {string} keyId The id of the key to get.
|
|
94
|
+
* @return {Key} The key.
|
|
95
|
+
* */
|
|
96
|
+
getKey(keyId: string): Promise<Key>;
|
|
97
|
+
/** Get all keys in the org.
|
|
98
|
+
* @param {KeyType?} type Optional key type to filter list for.
|
|
99
|
+
* @return {Key} The key.
|
|
100
|
+
* */
|
|
101
|
+
keys(type?: KeyType): Promise<Key[]>;
|
|
102
|
+
/** Create a new role.
|
|
103
|
+
* @param {string?} name The name of the role.
|
|
104
|
+
* @return {Role} The new role.
|
|
105
|
+
* */
|
|
106
|
+
createRole(name?: string): Promise<Role>;
|
|
107
|
+
/** Get a role by id or name.
|
|
108
|
+
* @param {string} roleId The id or name of the role to get.
|
|
109
|
+
* @return {Role} The role.
|
|
110
|
+
* */
|
|
111
|
+
getRole(roleId: string): Promise<Role>;
|
|
112
|
+
/** List all roles in the org..
|
|
113
|
+
* @return {Role[]} The roles.
|
|
114
|
+
* */
|
|
115
|
+
list(): Promise<Role[]>;
|
|
116
|
+
/**
|
|
117
|
+
* Get a pending MFA request by its id.
|
|
118
|
+
* @param {string} mfaId The id of the MFA request.
|
|
119
|
+
* @return {Promise<MfaRequestInfo>} The MFA request.
|
|
120
|
+
*/
|
|
121
|
+
mfaGet(mfaId: string): Promise<MfaRequestInfo>;
|
|
122
|
+
/**
|
|
123
|
+
* Approve a pending MFA request.
|
|
124
|
+
*
|
|
125
|
+
* @param {string} mfaId The id of the MFA request.
|
|
126
|
+
* @return {Promise<MfaRequestInfo>} The MFA request.
|
|
127
|
+
*/
|
|
128
|
+
mfaApprove(mfaId: string): Promise<MfaRequestInfo>;
|
|
129
|
+
/** Create a new org.
|
|
130
|
+
* @param {CubeSigner} cs The CubeSigner instance.
|
|
131
|
+
* @param {OrgInfo} data The JSON response from the API server.
|
|
132
|
+
* @internal
|
|
133
|
+
* */
|
|
134
|
+
constructor(cs: CubeSigner, data: OrgInfo);
|
|
135
|
+
/**
|
|
136
|
+
* Approve a pending MFA request.
|
|
137
|
+
*
|
|
138
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for requests
|
|
139
|
+
* @param {string} orgId The org id of the MFA request
|
|
140
|
+
* @param {string} mfaId The id of the MFA request
|
|
141
|
+
* @return {Promise<MfaRequestInfo>} The result of the MFA request
|
|
142
|
+
*/
|
|
143
|
+
static mfaApprove(cs: CubeSigner, orgId: string, mfaId: string): Promise<MfaRequestInfo>;
|
|
144
|
+
/** Fetch org info.
|
|
145
|
+
* @return {OrgInfo} The org info.
|
|
146
|
+
* */
|
|
147
|
+
private fetch;
|
|
148
|
+
/** Update the org.
|
|
149
|
+
* @param {UpdateOrgRequest} request The JSON request to send to the API server.
|
|
150
|
+
* @return {UpdateOrgResponse} The JSON response from the API server.
|
|
151
|
+
* */
|
|
152
|
+
private update;
|
|
153
|
+
/** List roles.
|
|
154
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for signing.
|
|
155
|
+
* @param {string} orgId The id of the organization to which the role belongs.
|
|
156
|
+
* @return {Role} The role.
|
|
157
|
+
* @internal
|
|
158
|
+
* */
|
|
159
|
+
private static roles;
|
|
160
|
+
}
|
|
161
|
+
export {};
|
package/dist/src/org.js
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
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");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
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");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var _Org_cs, _Org_id;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Org = void 0;
|
|
16
|
+
const util_1 = require("./util");
|
|
17
|
+
const key_1 = require("./key");
|
|
18
|
+
const role_1 = require("./role");
|
|
19
|
+
/** An organization. */
|
|
20
|
+
class Org {
|
|
21
|
+
/**
|
|
22
|
+
* @description The org id
|
|
23
|
+
* @example Org#c3b9379c-4e8c-4216-bd0a-65ace53cf98f
|
|
24
|
+
* */
|
|
25
|
+
get id() {
|
|
26
|
+
return __classPrivateFieldGet(this, _Org_id, "f");
|
|
27
|
+
}
|
|
28
|
+
/** Human-readable name for the org */
|
|
29
|
+
async name() {
|
|
30
|
+
const data = await this.fetch();
|
|
31
|
+
return data.name ?? undefined;
|
|
32
|
+
}
|
|
33
|
+
/** Set the human-readable name for the org.
|
|
34
|
+
* @param {string} name The new human-readable name for the org (must be alphanumeric).
|
|
35
|
+
* @example my_org_name
|
|
36
|
+
* */
|
|
37
|
+
async setName(name) {
|
|
38
|
+
if (!/^[a-zA-Z0-9_]{3,30}$/.test(name)) {
|
|
39
|
+
throw new Error("Org name must be alphanumeric and between 3 and 30 characters");
|
|
40
|
+
}
|
|
41
|
+
await this.update({ name });
|
|
42
|
+
}
|
|
43
|
+
/** Is the org enabled? */
|
|
44
|
+
async enabled() {
|
|
45
|
+
const data = await this.fetch();
|
|
46
|
+
return data.enabled;
|
|
47
|
+
}
|
|
48
|
+
/** Enable the org. */
|
|
49
|
+
async enable() {
|
|
50
|
+
await this.update({ enabled: true });
|
|
51
|
+
}
|
|
52
|
+
/** Disable the org. */
|
|
53
|
+
async disable() {
|
|
54
|
+
await this.update({ enabled: false });
|
|
55
|
+
}
|
|
56
|
+
/** Get the policy for the org. */
|
|
57
|
+
async policy() {
|
|
58
|
+
const data = await this.fetch();
|
|
59
|
+
return (data.policy ?? []);
|
|
60
|
+
}
|
|
61
|
+
/** Set the policy for the org.
|
|
62
|
+
* @param {OrgPolicy[]} policy The new policy for the org.
|
|
63
|
+
* */
|
|
64
|
+
async setPolicy(policy) {
|
|
65
|
+
const p = policy;
|
|
66
|
+
await this.update({ policy: p });
|
|
67
|
+
}
|
|
68
|
+
/** Create a new signing key.
|
|
69
|
+
* @param {KeyType} type The type of key to create.
|
|
70
|
+
* @param {string?} ownerId The owner of the key. Defaults to the session's user.
|
|
71
|
+
* @return {Key[]} The new keys.
|
|
72
|
+
* */
|
|
73
|
+
async createKey(type, ownerId) {
|
|
74
|
+
return (await key_1.Key.createKeys(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, type, 1, ownerId))[0];
|
|
75
|
+
}
|
|
76
|
+
/** Create new signing keys.
|
|
77
|
+
* @param {KeyType} type The type of key to create.
|
|
78
|
+
* @param {nummber} count The number of keys to create.
|
|
79
|
+
* @param {string?} ownerId The owner of the keys. Defaults to the session's user.
|
|
80
|
+
* @return {Key[]} The new keys.
|
|
81
|
+
* */
|
|
82
|
+
async createKeys(type, count, ownerId) {
|
|
83
|
+
return key_1.Key.createKeys(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, type, count, ownerId);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a new user in the organization and sends an invitation to that user
|
|
87
|
+
* @param {string} email Email of the user
|
|
88
|
+
* @param {string} name The full name of the user
|
|
89
|
+
*/
|
|
90
|
+
async createUser(email, name) {
|
|
91
|
+
const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).post("/v0/org/{org_id}/invite", {
|
|
92
|
+
params: { path: { org_id: this.id } },
|
|
93
|
+
body: {
|
|
94
|
+
email,
|
|
95
|
+
name,
|
|
96
|
+
skip_email: false,
|
|
97
|
+
},
|
|
98
|
+
parseAs: "json",
|
|
99
|
+
});
|
|
100
|
+
(0, util_1.assertOk)(resp);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create a new OIDC user
|
|
104
|
+
* @param {OidcIdentity} identity The identity of the OIDC user
|
|
105
|
+
* @param {MemberRole} memberRole The type of membership of the new user
|
|
106
|
+
* @return {string} User id of the new user
|
|
107
|
+
*/
|
|
108
|
+
async createOidcUser(identity, memberRole) {
|
|
109
|
+
const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).post("/v0/org/{org_id}/users", {
|
|
110
|
+
params: { path: { org_id: this.id } },
|
|
111
|
+
body: {
|
|
112
|
+
identity,
|
|
113
|
+
role: memberRole,
|
|
114
|
+
},
|
|
115
|
+
parseAs: "json",
|
|
116
|
+
});
|
|
117
|
+
return (0, util_1.assertOk)(resp).user_id;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* List users in the organization
|
|
121
|
+
* @return {UserIdInfo[]} List of users
|
|
122
|
+
*/
|
|
123
|
+
async users() {
|
|
124
|
+
const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).get("/v0/org/{org_id}/users", {
|
|
125
|
+
params: { path: { org_id: this.id } },
|
|
126
|
+
parseAs: "json",
|
|
127
|
+
});
|
|
128
|
+
return (0, util_1.assertOk)(resp).users;
|
|
129
|
+
}
|
|
130
|
+
/** Get a key by id.
|
|
131
|
+
* @param {string} keyId The id of the key to get.
|
|
132
|
+
* @return {Key} The key.
|
|
133
|
+
* */
|
|
134
|
+
async getKey(keyId) {
|
|
135
|
+
return await key_1.Key.getKey(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, keyId);
|
|
136
|
+
}
|
|
137
|
+
/** Get all keys in the org.
|
|
138
|
+
* @param {KeyType?} type Optional key type to filter list for.
|
|
139
|
+
* @return {Key} The key.
|
|
140
|
+
* */
|
|
141
|
+
async keys(type) {
|
|
142
|
+
const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).get("/v0/org/{org_id}/keys", {
|
|
143
|
+
params: {
|
|
144
|
+
path: { org_id: this.id },
|
|
145
|
+
query: type ? { key_type: type } : undefined,
|
|
146
|
+
},
|
|
147
|
+
parseAs: "json",
|
|
148
|
+
});
|
|
149
|
+
const data = (0, util_1.assertOk)(resp);
|
|
150
|
+
return data.keys.map((k) => new key_1.Key(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, k));
|
|
151
|
+
}
|
|
152
|
+
/** Create a new role.
|
|
153
|
+
* @param {string?} name The name of the role.
|
|
154
|
+
* @return {Role} The new role.
|
|
155
|
+
* */
|
|
156
|
+
async createRole(name) {
|
|
157
|
+
return role_1.Role.createRole(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, name);
|
|
158
|
+
}
|
|
159
|
+
/** Get a role by id or name.
|
|
160
|
+
* @param {string} roleId The id or name of the role to get.
|
|
161
|
+
* @return {Role} The role.
|
|
162
|
+
* */
|
|
163
|
+
async getRole(roleId) {
|
|
164
|
+
return role_1.Role.getRole(__classPrivateFieldGet(this, _Org_cs, "f"), this.id, roleId);
|
|
165
|
+
}
|
|
166
|
+
/** List all roles in the org..
|
|
167
|
+
* @return {Role[]} The roles.
|
|
168
|
+
* */
|
|
169
|
+
async list() {
|
|
170
|
+
return Org.roles(__classPrivateFieldGet(this, _Org_cs, "f"), this.id);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get a pending MFA request by its id.
|
|
174
|
+
* @param {string} mfaId The id of the MFA request.
|
|
175
|
+
* @return {Promise<MfaRequestInfo>} The MFA request.
|
|
176
|
+
*/
|
|
177
|
+
async mfaGet(mfaId) {
|
|
178
|
+
const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).get("/v0/org/{org_id}/mfa/{mfa_id}", {
|
|
179
|
+
params: { path: { org_id: __classPrivateFieldGet(this, _Org_id, "f"), mfa_id: mfaId } },
|
|
180
|
+
});
|
|
181
|
+
return (0, util_1.assertOk)(resp);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Approve a pending MFA request.
|
|
185
|
+
*
|
|
186
|
+
* @param {string} mfaId The id of the MFA request.
|
|
187
|
+
* @return {Promise<MfaRequestInfo>} The MFA request.
|
|
188
|
+
*/
|
|
189
|
+
async mfaApprove(mfaId) {
|
|
190
|
+
return Org.mfaApprove(__classPrivateFieldGet(this, _Org_cs, "f"), __classPrivateFieldGet(this, _Org_id, "f"), mfaId);
|
|
191
|
+
}
|
|
192
|
+
// --------------------------------------------------------------------------
|
|
193
|
+
// -- INTERNAL --------------------------------------------------------------
|
|
194
|
+
// --------------------------------------------------------------------------
|
|
195
|
+
/** Create a new org.
|
|
196
|
+
* @param {CubeSigner} cs The CubeSigner instance.
|
|
197
|
+
* @param {OrgInfo} data The JSON response from the API server.
|
|
198
|
+
* @internal
|
|
199
|
+
* */
|
|
200
|
+
constructor(cs, data) {
|
|
201
|
+
_Org_cs.set(this, void 0);
|
|
202
|
+
/**
|
|
203
|
+
* The ID of the organization.
|
|
204
|
+
* @example Org#124dfe3e-3bbd-487d-80c0-53c55e8ab87a
|
|
205
|
+
*/
|
|
206
|
+
_Org_id.set(this, void 0);
|
|
207
|
+
__classPrivateFieldSet(this, _Org_cs, cs, "f");
|
|
208
|
+
__classPrivateFieldSet(this, _Org_id, data.org_id, "f");
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Approve a pending MFA request.
|
|
212
|
+
*
|
|
213
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for requests
|
|
214
|
+
* @param {string} orgId The org id of the MFA request
|
|
215
|
+
* @param {string} mfaId The id of the MFA request
|
|
216
|
+
* @return {Promise<MfaRequestInfo>} The result of the MFA request
|
|
217
|
+
*/
|
|
218
|
+
static async mfaApprove(cs, orgId, mfaId) {
|
|
219
|
+
const resp = await (await cs.management()).patch("/v0/org/{org_id}/mfa/{mfa_id}", {
|
|
220
|
+
params: { path: { org_id: orgId, mfa_id: mfaId } },
|
|
221
|
+
});
|
|
222
|
+
return (0, util_1.assertOk)(resp);
|
|
223
|
+
}
|
|
224
|
+
/** Fetch org info.
|
|
225
|
+
* @return {OrgInfo} The org info.
|
|
226
|
+
* */
|
|
227
|
+
async fetch() {
|
|
228
|
+
const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).get("/v0/org/{org_id}", {
|
|
229
|
+
params: { path: { org_id: this.id } },
|
|
230
|
+
parseAs: "json",
|
|
231
|
+
});
|
|
232
|
+
const data = (0, util_1.assertOk)(resp);
|
|
233
|
+
return data;
|
|
234
|
+
}
|
|
235
|
+
/** Update the org.
|
|
236
|
+
* @param {UpdateOrgRequest} request The JSON request to send to the API server.
|
|
237
|
+
* @return {UpdateOrgResponse} The JSON response from the API server.
|
|
238
|
+
* */
|
|
239
|
+
async update(request) {
|
|
240
|
+
const resp = await (await __classPrivateFieldGet(this, _Org_cs, "f").management()).patch("/v0/org/{org_id}", {
|
|
241
|
+
params: { path: { org_id: this.id } },
|
|
242
|
+
body: request,
|
|
243
|
+
parseAs: "json",
|
|
244
|
+
});
|
|
245
|
+
return (0, util_1.assertOk)(resp);
|
|
246
|
+
}
|
|
247
|
+
/** List roles.
|
|
248
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for signing.
|
|
249
|
+
* @param {string} orgId The id of the organization to which the role belongs.
|
|
250
|
+
* @return {Role} The role.
|
|
251
|
+
* @internal
|
|
252
|
+
* */
|
|
253
|
+
static async roles(cs, orgId) {
|
|
254
|
+
const resp = await (await cs.management()).get("/v0/org/{org_id}/roles", {
|
|
255
|
+
params: { path: { org_id: orgId } },
|
|
256
|
+
parseAs: "json",
|
|
257
|
+
});
|
|
258
|
+
const data = (0, util_1.assertOk)(resp);
|
|
259
|
+
return data.roles.map((r) => new role_1.Role(cs, orgId, r));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.Org = Org;
|
|
263
|
+
_Org_cs = new WeakMap(), _Org_id = new WeakMap();
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFFQSxpQ0FBa0M7QUFDbEMsK0JBQXFDO0FBQ3JDLGlDQUF3QztBQTBDeEMsdUJBQXVCO0FBQ3ZCLE1BQWEsR0FBRztJQVFkOzs7U0FHSztJQUNMLElBQUksRUFBRTtRQUNKLE9BQU8sdUJBQUEsSUFBSSxlQUFJLENBQUM7SUFDbEIsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7U0FHSztJQUNMLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBWTtRQUN4QixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQztTQUNsRjtRQUNELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9B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LENBQUMsS0FBSyxDQUFDLEVBQWMsRUFBRSxLQUFhO1FBQ3RELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FDakIsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQ3RCLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFO1lBQzlCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNuQyxPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNGO0FBN1JELGtCQTZSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1YmVTaWduZXIsIEtleUluZm8sIE1mYVJlcXVlc3RJbmZvIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGNvbXBvbmVudHMsIHBhdGhzIH0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgeyBhc3NlcnRPayB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IEtleVR5cGUsIEtleSB9IGZyb20gXCIuL2tleVwiO1xuaW1wb3J0IHsgUm9sZSwgUm9sZUluZm8gfSBmcm9tIFwiLi9yb2xlXCI7XG5cbi8qKiBPcmdhbml6YXRpb24gaWQgKi9cbmV4cG9ydCB0eXBlIE9yZ0lkID0gc3RyaW5nO1xuXG4vKiogT3JnLXdpZGUgcG9saWN5ICovXG5leHBvcnQgdHlwZSBPcmdQb2xpY3kgPSBTb3VyY2VJcEFsbG93bGlzdFBvbGljeSB8IE9yaWdpbkFsbG93bGlzdFBvbGljeSB8IE1heERhaWx5VW5zdGFrZVBvbGljeTtcblxuLyoqXG4gKiBPbmx5IGFsbG93IHJlcXVlc3RzIGZyb20gdGhlIHNwZWNpZmllZCBvcmlnaW5zLlxuICogQGV4YW1wbGUge1wiT3JpZ2luQWxsb3dsaXN0XCI6IFwiKlwifVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbkFsbG93bGlzdFBvbGljeSB7XG4gIE9yaWdpbkFsbG93bGlzdDogc3RyaW5nW10gfCBcIipcIjtcbn1cblxuLyoqXG4gKiBSZXN0cmljdCBzaWduaW5nIHRvIHNwZWNpZmljIHNvdXJjZSBJUCBhZGRyZXNzZXMuXG4gKiBAZXhhbXBsZSB7XCJTb3VyY2VJcEFsbG93bGlzdFwiOiBbXCIxMC4xLjIuMy84XCIsIFwiMTY5LjI1NC4xNy4xLzE2XCJdfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUlwQWxsb3dsaXN0UG9saWN5IHtcbiAgU291cmNlSXBBbGxvd2xpc3Q6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFJlc3RyaWN0IHRoZSBudW1iZXIgb2YgdW5zdGFrZXMgcGVyIGRheS5cbiAqIEBleGFtcGxlIHtcIk1heERhaWx5VW5zdGFrZVwiOiA1IH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXhEYWlseVVuc3Rha2VQb2xpY3kge1xuICBNYXhEYWlseVVuc3Rha2U6IG51bWJlcjtcbn1cblxudHlwZSBPcmdJbmZvID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJPcmdJbmZvXCJdO1xudHlwZSBVc2VySWRJbmZvID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJVc2VySWRJbmZvXCJdO1xudHlwZSBVcGRhdGVPcmdSZXF1ZXN0ID1cbiAgcGF0aHNbXCIvdjAvb3JnL3tvcmdfaWR9XCJdW1wicGF0Y2hcIl1bXCJyZXF1ZXN0Qm9keVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xudHlwZSBVcGRhdGVPcmdSZXNwb25zZSA9XG4gIHBhdGhzW1wiL3YwL29yZy97b3JnX2lkfVwiXVtcInBhdGNoXCJdW1wicmVzcG9uc2VzXCJdW1wiMjAwXCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5cbmV4cG9ydCB0eXBlIE9pZGNJZGVudGl0eSA9IGNvbXBvbmVudHNbXCJzY2hlbWFzXCJdW1wiT0lEQ0lkZW50aXR5XCJdO1xuZXhwb3J0IHR5cGUgTWVtYmVyUm9sZSA9IGNvbXBvbmVudHNbXCJzY2hlbWFzXCJdW1wiTWVtYmVyUm9sZVwiXTtcblxuLyoqIEFuIG9yZ2FuaXphdGlvbi4gKi9cbmV4cG9ydCBjbGFzcyBPcmcge1xuICByZWFkb25seSAjY3M6IEN1YmVTaWduZXI7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIG9yZ2FuaXphdGlvbi5cbiAgICogQGV4YW1wbGUgT3JnIzEyNGRmZTNlLTNiYmQtNDg3ZC04MGMwLTUzYzU1ZThhYjg3YVxuICAgKi9cbiAgcmVhZG9ubHkgI2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgb3JnIGlkXG4gICAqIEBleGFtcGxlIE9yZyNjM2I5Mzc5Yy00ZThjLTQyMTYtYmQwYS02NWFjZTUzY2Y5OGZcbiAgICogKi9cbiAgZ2V0IGlkKCk6IE9yZ0lkIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIG9yZyAqL1xuICBhc3luYyBuYW1lKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZmV0Y2goKTtcbiAgICByZXR1cm4gZGF0YS5uYW1lID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSBvcmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuZXcgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIG9yZyAobXVzdCBiZSBhbHBoYW51bWVyaWMpLlxuICAgKiBAZXhhbXBsZSBteV9vcmdfbmFtZVxuICAgKiAqL1xuICBhc3luYyBzZXROYW1lKG5hbWU6IHN0cmluZykge1xuICAgIGlmICghL15bYS16QS1aMC05X117MywzMH0kLy50ZXN0KG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPcmcgbmFtZSBtdXN0IGJlIGFscGhhbnVtZXJpYyBhbmQgYmV0d2VlbiAzIGFuZCAzMCBjaGFyYWN0ZXJzXCIpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnVwZGF0ZSh7IG5hbWUgfSk7XG4gIH1cblxuICAvKiogSXMgdGhlIG9yZyBlbmFibGVkPyAqL1xuICBhc3luYyBlbmFibGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZldGNoKCk7XG4gICAgcmV0dXJuIGRhdGEuZW5hYmxlZDtcbiAgfVxuXG4gIC8qKiBFbmFibGUgdGhlIG9yZy4gKi9cbiAgYXN5bmMgZW5hYmxlKCkge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlKHsgZW5hYmxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBEaXNhYmxlIHRoZSBvcmcuICovXG4gIGFzeW5jIGRpc2FibGUoKSB7XG4gICAgYXdhaXQgdGhpcy51cGRhdGUoeyBlbmFibGVkOiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHBvbGljeSBmb3IgdGhlIG9yZy4gKi9cbiAgYXN5bmMgcG9saWN5KCk6IFByb21pc2U8T3JnUG9saWN5W10+IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaCgpO1xuICAgIHJldHVybiAoZGF0YS5wb2xpY3kgPz8gW10pIGFzIHVua25vd24gYXMgT3JnUG9saWN5W107XG4gIH1cblxuICAvKiogU2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBvcmcuXG4gICAqIEBwYXJhbSB7T3JnUG9saWN5W119IHBvbGljeSBUaGUgbmV3IHBvbGljeSBmb3IgdGhlIG9yZy5cbiAgICogKi9cbiAgYXN5bmMgc2V0UG9saWN5KHBvbGljeTogT3JnUG9saWN5W10pIHtcbiAgICBjb25zdCBwID0gcG9saWN5IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgbmV2ZXI+W107XG4gICAgYXdhaXQgdGhpcy51cGRhdGUoeyBwb2xpY3k6IHAgfSk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IHNpZ25pbmcga2V5LlxuICAgKiBAcGFyYW0ge0tleVR5cGV9IHR5cGUgVGhlIHR5cGUgb2Yga2V5IHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmc/fSBvd25lcklkIFRoZSBvd25lciBvZiB0aGUga2V5LiBEZWZhdWx0cyB0byB0aGUgc2Vzc2lvbidzIHVzZXIuXG4gICAqIEByZXR1cm4ge0tleVtdfSBUaGUgbmV3IGtleXMuXG4gICAqICovXG4gIGFzeW5jIGNyZWF0ZUtleSh0eXBlOiBLZXlUeXBlLCBvd25lcklkPzogc3RyaW5nKTogUHJvbWlzZTxLZXk+IHtcbiAgICByZXR1cm4gKGF3YWl0IEtleS5jcmVhdGVLZXlzKHRoaXMuI2NzLCB0aGlzLmlkLCB0eXBlLCAxLCBvd25lcklkKSlbMF07XG4gIH1cblxuICAvKiogQ3JlYXRlIG5ldyBzaWduaW5nIGtleXMuXG4gICAqIEBwYXJhbSB7S2V5VHlwZX0gdHlwZSBUaGUgdHlwZSBvZiBrZXkgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0ge251bW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2Yga2V5cyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nP30gb3duZXJJZCBUaGUgb3duZXIgb2YgdGhlIGtleXMuIERlZmF1bHRzIHRvIHRoZSBzZXNzaW9uJ3MgdXNlci5cbiAgICogQHJldHVybiB7S2V5W119IFRoZSBuZXcga2V5cy5cbiAgICogKi9cbiAgYXN5bmMgY3JlYXRlS2V5cyh0eXBlOiBLZXlUeXBlLCBjb3VudDogbnVtYmVyLCBvd25lcklkPzogc3RyaW5nKTogUHJvbWlzZTxLZXlbXT4ge1xuICAgIHJldHVybiBLZXkuY3JlYXRlS2V5cyh0aGlzLiNjcywgdGhpcy5pZCwgdHlwZSwgY291bnQsIG93bmVySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB1c2VyIGluIHRoZSBvcmdhbml6YXRpb24gYW5kIHNlbmRzIGFuIGludml0YXRpb24gdG8gdGhhdCB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbCBFbWFpbCBvZiB0aGUgdXNlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVsbCBuYW1lIG9mIHRoZSB1c2VyXG4gICAqL1xuICBhc3luYyBjcmVhdGVVc2VyKGVtYWlsOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLiNjcy5tYW5hZ2VtZW50KClcbiAgICApLnBvc3QoXCIvdjAvb3JnL3tvcmdfaWR9L2ludml0ZVwiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuaWQgfSB9LFxuICAgICAgYm9keToge1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2tpcF9lbWFpbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgYXNzZXJ0T2socmVzcCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IE9JREMgdXNlclxuICAgKiBAcGFyYW0ge09pZGNJZGVudGl0eX0gaWRlbnRpdHkgVGhlIGlkZW50aXR5IG9mIHRoZSBPSURDIHVzZXJcbiAgICogQHBhcmFtIHtNZW1iZXJSb2xlfSBtZW1iZXJSb2xlIFRoZSB0eXBlIG9mIG1lbWJlcnNoaXAgb2YgdGhlIG5ldyB1c2VyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVXNlciBpZCBvZiB0aGUgbmV3IHVzZXJcbiAgICovXG4gIGFzeW5jIGNyZWF0ZU9pZGNVc2VyKGlkZW50aXR5OiBPaWRjSWRlbnRpdHksIG1lbWJlclJvbGU6IE1lbWJlclJvbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLiNjcy5tYW5hZ2VtZW50KClcbiAgICApLnBvc3QoXCIvdjAvb3JnL3tvcmdfaWR9L3VzZXJzXCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy5pZCB9IH0sXG4gICAgICBib2R5OiB7XG4gICAgICAgIGlkZW50aXR5LFxuICAgICAgICByb2xlOiBtZW1iZXJSb2xlLFxuICAgICAgfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIHJldHVybiBhc3NlcnRPayhyZXNwKS51c2VyX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdXNlcnMgaW4gdGhlIG9yZ2FuaXphdGlvblxuICAgKiBAcmV0dXJuIHtVc2VySWRJbmZvW119IExpc3Qgb2YgdXNlcnNcbiAgICovXG4gIGFzeW5jIHVzZXJzKCk6IFByb21pc2U8VXNlcklkSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IHRoaXMuI2NzLm1hbmFnZW1lbnQoKVxuICAgICkuZ2V0KFwiL3YwL29yZy97b3JnX2lkfS91c2Vyc1wiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuaWQgfSB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIGFzc2VydE9rKHJlc3ApLnVzZXJzO1xuICB9XG5cbiAgLyoqIEdldCBhIGtleSBieSBpZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleUlkIFRoZSBpZCBvZiB0aGUga2V5IHRvIGdldC5cbiAgICogQHJldHVybiB7S2V5fSBUaGUga2V5LlxuICAgKiAqL1xuICBhc3luYyBnZXRLZXkoa2V5SWQ6IHN0cmluZyk6IFByb21pc2U8S2V5PiB7XG4gICAgcmV0dXJuIGF3YWl0IEtleS5nZXRLZXkodGhpcy4jY3MsIHRoaXMuaWQsIGtleUlkKTtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIGtleXMgaW4gdGhlIG9yZy5cbiAgICogQHBhcmFtIHtLZXlUeXBlP30gdHlwZSBPcHRpb25hbCBrZXkgdHlwZSB0byBmaWx0ZXIgbGlzdCBmb3IuXG4gICAqIEByZXR1cm4ge0tleX0gVGhlIGtleS5cbiAgICogKi9cbiAgYXN5bmMga2V5cyh0eXBlPzogS2V5VHlwZSk6IFByb21pc2U8S2V5W10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgYXdhaXQgdGhpcy4jY3MubWFuYWdlbWVudCgpXG4gICAgKS5nZXQoXCIvdjAvb3JnL3tvcmdfaWR9L2tleXNcIiwge1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIHBhdGg6IHsgb3JnX2lkOiB0aGlzLmlkIH0sXG4gICAgICAgIHF1ZXJ5OiB0eXBlID8geyBrZXlfdHlwZTogdHlwZSB9IDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhc3NlcnRPayhyZXNwKTtcbiAgICByZXR1cm4gZGF0YS5rZXlzLm1hcCgoazogS2V5SW5mbykgPT4gbmV3IEtleSh0aGlzLiNjcywgdGhpcy5pZCwgaykpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyByb2xlLlxuICAgKiBAcGFyYW0ge3N0cmluZz99IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHJvbGUuXG4gICAqIEByZXR1cm4ge1JvbGV9IFRoZSBuZXcgcm9sZS5cbiAgICogKi9cbiAgYXN5bmMgY3JlYXRlUm9sZShuYW1lPzogc3RyaW5nKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgcmV0dXJuIFJvbGUuY3JlYXRlUm9sZSh0aGlzLiNjcywgdGhpcy5pZCwgbmFtZSk7XG4gIH1cblxuICAvKiogR2V0IGEgcm9sZSBieSBpZCBvciBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZUlkIFRoZSBpZCBvciBuYW1lIG9mIHRoZSByb2xlIHRvIGdldC5cbiAgICogQHJldHVybiB7Um9sZX0gVGhlIHJvbGUuXG4gICAqICovXG4gIGFzeW5jIGdldFJvbGUocm9sZUlkOiBzdHJpbmcpOiBQcm9taXNlPFJvbGU+IHtcbiAgICByZXR1cm4gUm9sZS5nZXRSb2xlKHRoaXMuI2NzLCB0aGlzLmlkLCByb2xlSWQpO1xuICB9XG5cbiAgLyoqIExpc3QgYWxsIHJvbGVzIGluIHRoZSBvcmcuLlxuICAgKiBAcmV0dXJuIHtSb2xlW119IFRoZSByb2xlcy5cbiAgICogKi9cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFJvbGVbXT4ge1xuICAgIHJldHVybiBPcmcucm9sZXModGhpcy4jY3MsIHRoaXMuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHBlbmRpbmcgTUZBIHJlcXVlc3QgYnkgaXRzIGlkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWZhSWQgVGhlIGlkIG9mIHRoZSBNRkEgcmVxdWVzdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNZmFSZXF1ZXN0SW5mbz59IFRoZSBNRkEgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIG1mYUdldChtZmFJZDogc3RyaW5nKTogUHJvbWlzZTxNZmFSZXF1ZXN0SW5mbz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLiNjcy5tYW5hZ2VtZW50KClcbiAgICApLmdldChcIi92MC9vcmcve29yZ19pZH0vbWZhL3ttZmFfaWR9XCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jaWQsIG1mYV9pZDogbWZhSWQgfSB9LFxuICAgIH0pO1xuICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIGEgcGVuZGluZyBNRkEgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1mYUlkIFRoZSBpZCBvZiB0aGUgTUZBIHJlcXVlc3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TWZhUmVxdWVzdEluZm8+fSBUaGUgTUZBIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBtZmFBcHByb3ZlKG1mYUlkOiBzdHJpbmcpOiBQcm9taXNlPE1mYVJlcXVlc3RJbmZvPiB7XG4gICAgcmV0dXJuIE9yZy5tZmFBcHByb3ZlKHRoaXMuI2NzLCB0aGlzLiNpZCwgbWZhSWQpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0gSU5URVJOQUwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogQ3JlYXRlIGEgbmV3IG9yZy5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtPcmdJbmZvfSBkYXRhIFRoZSBKU09OIHJlc3BvbnNlIGZyb20gdGhlIEFQSSBzZXJ2ZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKiAqL1xuICBjb25zdHJ1Y3RvcihjczogQ3ViZVNpZ25lciwgZGF0YTogT3JnSW5mbykge1xuICAgIHRoaXMuI2NzID0gY3M7XG4gICAgdGhpcy4jaWQgPSBkYXRhLm9yZ19pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIGEgcGVuZGluZyBNRkEgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2UgZm9yIHJlcXVlc3RzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdJZCBUaGUgb3JnIGlkIG9mIHRoZSBNRkEgcmVxdWVzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWZhSWQgVGhlIGlkIG9mIHRoZSBNRkEgcmVxdWVzdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1mYVJlcXVlc3RJbmZvPn0gVGhlIHJlc3VsdCBvZiB0aGUgTUZBIHJlcXVlc3RcbiAgICovXG4gIHN0YXRpYyBhc3luYyBtZmFBcHByb3ZlKGNzOiBDdWJlU2lnbmVyLCBvcmdJZDogc3RyaW5nLCBtZmFJZDogc3RyaW5nKTogUHJvbWlzZTxNZmFSZXF1ZXN0SW5mbz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCBjcy5tYW5hZ2VtZW50KClcbiAgICApLnBhdGNoKFwiL3YwL29yZy97b3JnX2lkfS9tZmEve21mYV9pZH1cIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiBvcmdJZCwgbWZhX2lkOiBtZmFJZCB9IH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGFzc2VydE9rKHJlc3ApO1xuICB9XG5cbiAgLyoqIEZldGNoIG9yZyBpbmZvLlxuICAgKiBAcmV0dXJuIHtPcmdJbmZvfSBUaGUgb3JnIGluZm8uXG4gICAqICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2goKTogUHJvbWlzZTxPcmdJbmZvPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IHRoaXMuI2NzLm1hbmFnZW1lbnQoKVxuICAgICkuZ2V0KFwiL3YwL29yZy97b3JnX2lkfVwiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuaWQgfSB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGFzc2VydE9rKHJlc3ApO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqIFVwZGF0ZSB0aGUgb3JnLlxuICAgKiBAcGFyYW0ge1VwZGF0ZU9yZ1JlcXVlc3R9IHJlcXVlc3QgVGhlIEpTT04gcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBBUEkgc2VydmVyLlxuICAgKiBAcmV0dXJuIHtVcGRhdGVPcmdSZXNwb25zZX0gVGhlIEpTT04gcmVzcG9uc2UgZnJvbSB0aGUgQVBJIHNlcnZlci5cbiAgICogKi9cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGUocmVxdWVzdDogVXBkYXRlT3JnUmVxdWVzdCk6IFByb21pc2U8VXBkYXRlT3JnUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgYXdhaXQgdGhpcy4jY3MubWFuYWdlbWVudCgpXG4gICAgKS5wYXRjaChcIi92MC9vcmcve29yZ19pZH1cIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiB0aGlzLmlkIH0gfSxcbiAgICAgIGJvZHk6IHJlcXVlc3QsXG4gICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICB9KTtcbiAgICByZXR1cm4gYXNzZXJ0T2socmVzcCk7XG4gIH1cblxuICAvKiogTGlzdCByb2xlcy5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2UgZm9yIHNpZ25pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdJZCBUaGUgaWQgb2YgdGhlIG9yZ2FuaXphdGlvbiB0byB3aGljaCB0aGUgcm9sZSBiZWxvbmdzLlxuICAgKiBAcmV0dXJuIHtSb2xlfSBUaGUgcm9sZS5cbiAgICogQGludGVybmFsXG4gICAqICovXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIHJvbGVzKGNzOiBDdWJlU2lnbmVyLCBvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxSb2xlW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgYXdhaXQgY3MubWFuYWdlbWVudCgpXG4gICAgKS5nZXQoXCIvdjAvb3JnL3tvcmdfaWR9L3JvbGVzXCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogb3JnSWQgfSB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGFzc2VydE9rKHJlc3ApO1xuICAgIHJldHVybiBkYXRhLnJvbGVzLm1hcCgocjogUm9sZUluZm8pID0+IG5ldyBSb2xlKGNzLCBvcmdJZCwgcikpO1xuICB9XG59XG4iXX0=
|