@fjall/components-infrastructure 0.24.0 → 0.25.1

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.
Files changed (29) hide show
  1. package/package.json +3 -3
  2. package/dist/lib/config/aws/bootstrap.d.ts +0 -12
  3. package/dist/lib/config/aws/bootstrap.js +0 -72
  4. package/dist/lib/config/aws/bootstrap.original.d.ts +0 -13
  5. package/dist/lib/config/aws/bootstrap.original.js +0 -94
  6. package/dist/lib/config/aws/bootstrapAccounts.d.ts +0 -12
  7. package/dist/lib/config/aws/bootstrapAccounts.js +0 -89
  8. package/dist/lib/config/aws/bootstrapMultiRegion.example.d.ts +0 -15
  9. package/dist/lib/config/aws/bootstrapMultiRegion.example.js +0 -105
  10. package/dist/lib/config/aws/bootstrapSelfManaged.example.d.ts +0 -13
  11. package/dist/lib/config/aws/bootstrapSelfManaged.example.js +0 -56
  12. package/dist/lib/config/aws/managedAccountStackSet.d.ts +0 -16
  13. package/dist/lib/config/aws/managedAccountStackSet.js +0 -75
  14. package/dist/lib/config/aws/managedPlatformStackSet.d.ts +0 -24
  15. package/dist/lib/config/aws/managedPlatformStackSet.js +0 -101
  16. package/dist/lib/patterns/aws/fivetranAppBuilder.d.ts +0 -4
  17. package/dist/lib/patterns/aws/fivetranAppBuilder.js +0 -32
  18. package/dist/lib/patterns/aws/managedAccountStackSet.d.ts +0 -11
  19. package/dist/lib/patterns/aws/managedAccountStackSet.js +0 -36
  20. package/dist/lib/patterns/aws/managedPlatformStackSet.d.ts +0 -17
  21. package/dist/lib/patterns/aws/managedPlatformStackSet.js +0 -45
  22. package/dist/lib/resources/aws/iam/identityCenter/assignmentNew.d.ts +0 -11
  23. package/dist/lib/resources/aws/iam/identityCenter/assignmentNew.js +0 -102
  24. package/dist/lib/resources/aws/iam/identityCenter/lambda/assignmentHandler.d.ts +0 -24
  25. package/dist/lib/resources/aws/iam/identityCenter/lambda/assignmentHandler.js +0 -246
  26. package/dist/lib/resources/aws/organizations/index.d.ts +0 -54
  27. package/dist/lib/resources/aws/organizations/index.js +0 -196
  28. package/dist/lib/utils/getCidr.d.ts +0 -8
  29. package/dist/lib/utils/getCidr.js +0 -40
@@ -1,246 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = void 0;
4
- const client_sso_admin_1 = require("@aws-sdk/client-sso-admin");
5
- const client_sts_1 = require("@aws-sdk/client-sts");
6
- const client_s3_1 = require("@aws-sdk/client-s3");
7
- const ssoAdmin = new client_sso_admin_1.SSOAdminClient();
8
- const sts = new client_sts_1.STSClient();
9
- const s3 = new client_s3_1.S3Client();
10
- // Helper function to add delay
11
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
12
- // Function to send response to CloudFormation
13
- const sendResponse = async (event, response) => {
14
- console.info("Sending CloudFormation response:");
15
- console.info(`Status: ${response.Status}`);
16
- console.info(`PhysicalResourceId: ${response.PhysicalResourceId}`);
17
- if (response.Reason) {
18
- console.info(`Reason: ${response.Reason}`);
19
- }
20
- const responseBody = JSON.stringify(response);
21
- console.info(`Sending response to: ${event.ResponseURL}`);
22
- try {
23
- // Extract bucket and key from the pre-signed URL
24
- const url = new URL(event.ResponseURL);
25
- const bucketName = url.hostname.split(".")[0];
26
- const key = url.pathname.substring(1); // remove leading slash
27
- // Use S3 client to upload directly
28
- await s3.send(new client_s3_1.PutObjectCommand({
29
- Bucket: bucketName,
30
- Key: key,
31
- Body: responseBody,
32
- ContentType: "application/json"
33
- }));
34
- console.info(`Status code: 200`);
35
- console.info(`Status message: OK`);
36
- }
37
- catch (error) {
38
- console.error("Error sending response:", error);
39
- throw error;
40
- }
41
- };
42
- // Function to check if an assignment exists
43
- const verifyAssignmentExists = async (instanceArn, permissionSetArn, targetId, principalId, principalType, retries = 10, delay = 5000) => {
44
- for (let attempt = 1; attempt <= retries; attempt++) {
45
- try {
46
- console.info(`Verifying assignment exists - attempt ${attempt}/${retries}`);
47
- const listResponse = await ssoAdmin.send(new client_sso_admin_1.ListAccountAssignmentsCommand({
48
- InstanceArn: instanceArn,
49
- AccountId: targetId,
50
- PermissionSetArn: permissionSetArn
51
- }));
52
- const assignments = listResponse.AccountAssignments || [];
53
- console.info(`Found ${assignments.length} assignments for account ${targetId} and permission set`);
54
- const exists = assignments.some((assignment) => assignment.PrincipalId === principalId &&
55
- assignment.PrincipalType === principalType);
56
- if (exists) {
57
- console.info("Assignment exists");
58
- return true;
59
- }
60
- if (attempt < retries) {
61
- console.info(`Assignment not found, waiting ${delay / 1000} seconds before retrying...`);
62
- await sleep(delay);
63
- }
64
- }
65
- catch (error) {
66
- console.error(`Error verifying assignment (attempt ${attempt}/${retries}):`, error);
67
- if (attempt < retries) {
68
- console.info(`Waiting ${delay / 1000} seconds before retrying...`);
69
- await sleep(delay);
70
- }
71
- }
72
- }
73
- console.info("Assignment not found after maximum retries");
74
- return false;
75
- };
76
- // Handle CloudFormation custom resource event
77
- const handler = async (event) => {
78
- console.info("Received event: ", JSON.stringify(event, null, 2));
79
- // Log environment variables (without sensitive data)
80
- console.info("Environment variables: " +
81
- JSON.stringify({
82
- AWS_REGION: process.env.AWS_REGION,
83
- AWS_EXECUTION_ENV: process.env.AWS_EXECUTION_ENV,
84
- AWS_LAMBDA_FUNCTION_NAME: process.env.AWS_LAMBDA_FUNCTION_NAME,
85
- AWS_LAMBDA_FUNCTION_VERSION: process.env.AWS_LAMBDA_FUNCTION_VERSION,
86
- AWS_LAMBDA_FUNCTION_MEMORY_SIZE: process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE
87
- }));
88
- // Get current identity for debugging purposes
89
- try {
90
- const identity = await sts.send(new client_sts_1.GetCallerIdentityCommand({}));
91
- console.info("Current identity: ", JSON.stringify(identity, null, 2));
92
- }
93
- catch (error) {
94
- console.error("Error getting caller identity:", error);
95
- }
96
- const { InstanceArn: instanceArn, PermissionSetArn: permissionSetArn, PrincipalType: principalTypeStr, PrincipalId: principalId, TargetType: targetTypeStr, TargetId: targetId } = event.ResourceProperties;
97
- // Convert string types to enum types
98
- const principalType = principalTypeStr;
99
- const targetType = targetTypeStr;
100
- // Generate a consistent physical ID regardless of whether the assignment exists
101
- const physicalResourceId = event.PhysicalResourceId ||
102
- `${permissionSetArn}-${principalId}-${targetId}`;
103
- // Prepare the response
104
- const response = {
105
- Status: "SUCCESS",
106
- PhysicalResourceId: physicalResourceId,
107
- StackId: event.StackId,
108
- RequestId: event.RequestId,
109
- LogicalResourceId: event.LogicalResourceId
110
- };
111
- const MAX_RETRIES = 5;
112
- try {
113
- switch (event.RequestType) {
114
- case "Create":
115
- case "Update":
116
- const operation = event.RequestType === "Create" ? "Creating" : "Updating";
117
- // Check if assignment already exists for updates to avoid errors
118
- if (event.RequestType === "Update") {
119
- const exists = await verifyAssignmentExists(instanceArn, permissionSetArn, targetId, principalId, principalTypeStr);
120
- if (exists) {
121
- console.info("Assignment already exists for update operation - no action needed");
122
- await sendResponse(event, response);
123
- return response;
124
- }
125
- }
126
- // Create the assignment
127
- for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
128
- console.info(`Attempt ${attempt}/${MAX_RETRIES}`);
129
- console.info(`${operation} Account Assignment`);
130
- try {
131
- await ssoAdmin.send(new client_sso_admin_1.CreateAccountAssignmentCommand({
132
- InstanceArn: instanceArn,
133
- PermissionSetArn: permissionSetArn,
134
- PrincipalType: principalType,
135
- PrincipalId: principalId,
136
- TargetType: targetType,
137
- TargetId: targetId
138
- }));
139
- console.info("Create assignment command sent successfully");
140
- console.info("Verifying assignment exists");
141
- // Verify the assignment was created
142
- const exists = await verifyAssignmentExists(instanceArn, permissionSetArn, targetId, principalId, principalTypeStr);
143
- if (exists) {
144
- console.info("Assignment verified successfully");
145
- await sendResponse(event, response);
146
- return response;
147
- }
148
- else {
149
- throw new Error("Assignment verification failed: Assignment not found after creation");
150
- }
151
- }
152
- catch (error) {
153
- console.error(`Error in attempt ${attempt}:`, error);
154
- // If it's the last attempt, propagate the error
155
- if (attempt === MAX_RETRIES) {
156
- throw error;
157
- }
158
- // If it's a ConflictException or the assignment already exists, consider it a success
159
- if (error.name === "ConflictException" ||
160
- error.message.includes("already exists") ||
161
- (await verifyAssignmentExists(instanceArn, permissionSetArn, targetId, principalId, principalTypeStr))) {
162
- console.info("Assignment already exists or was created successfully");
163
- await sendResponse(event, response);
164
- return response;
165
- }
166
- // Otherwise, wait and retry
167
- await sleep(2000 * attempt); // Exponential backoff
168
- }
169
- }
170
- break;
171
- case "Delete":
172
- // Check if assignment exists before attempting deletion
173
- const assignmentExists = await verifyAssignmentExists(instanceArn, permissionSetArn, targetId, principalId, principalTypeStr);
174
- if (!assignmentExists) {
175
- console.info("Assignment does not exist, no need to delete");
176
- await sendResponse(event, response);
177
- return response;
178
- }
179
- // Delete the assignment
180
- for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
181
- console.info(`Attempt ${attempt}/${MAX_RETRIES}`);
182
- console.info("Deleting Account Assignment");
183
- try {
184
- await ssoAdmin.send(new client_sso_admin_1.DeleteAccountAssignmentCommand({
185
- InstanceArn: instanceArn,
186
- PermissionSetArn: permissionSetArn,
187
- PrincipalType: principalType,
188
- PrincipalId: principalId,
189
- TargetType: targetType,
190
- TargetId: targetId
191
- }));
192
- console.info("Delete assignment command sent successfully");
193
- console.info("Verifying assignment does not exist");
194
- // Here we're inverting the logic - wait for the assignment to NOT exist
195
- const stillExists = await verifyAssignmentExists(instanceArn, permissionSetArn, targetId, principalId, principalTypeStr);
196
- if (!stillExists) {
197
- console.info("Assignment deleted successfully");
198
- await sendResponse(event, response);
199
- return response;
200
- }
201
- else {
202
- // On the final attempt, consider it an error if it still exists
203
- if (attempt === MAX_RETRIES) {
204
- throw new Error("Assignment verification failed: Assignment still exists after deletion");
205
- }
206
- // Otherwise, wait and retry the verification
207
- console.info(`Assignment still exists after deletion attempt ${attempt}, waiting...`);
208
- await sleep(3000);
209
- }
210
- }
211
- catch (error) {
212
- console.error(`Error in delete attempt ${attempt}:`, error);
213
- // If it's a ResourceNotFoundException, consider it a success
214
- if (error.name === "ResourceNotFoundException" ||
215
- error.message.includes("does not exist")) {
216
- console.info("Assignment does not exist or was already deleted");
217
- await sendResponse(event, response);
218
- return response;
219
- }
220
- // On the last attempt, propagate the error
221
- if (attempt === MAX_RETRIES) {
222
- throw error;
223
- }
224
- // Otherwise, wait and retry
225
- await sleep(2000 * attempt);
226
- }
227
- }
228
- break;
229
- }
230
- }
231
- catch (error) {
232
- console.error(`Operation failed: ${error.message}`, error);
233
- response.Status = "FAILED";
234
- response.Reason = `${event.RequestType} operation failed: ${error.message}`;
235
- try {
236
- await sendResponse(event, response);
237
- }
238
- catch (responseError) {
239
- console.error("Failed to send response to CloudFormation:", responseError);
240
- }
241
- throw error;
242
- }
243
- return response;
244
- };
245
- exports.handler = handler;
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWdubWVudEhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9pYW0vaWRlbnRpdHlDZW50ZXIvbGFtYmRhL2Fzc2lnbm1lbnRIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdFQVFtQztBQUNuQyxvREFBMEU7QUFDMUUsa0RBQWdFO0FBcUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLGlDQUFjLEVBQUUsQ0FBQztBQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLHNCQUFTLEVBQUUsQ0FBQztBQUM1QixNQUFNLEVBQUUsR0FBRyxJQUFJLG9CQUFRLEVBQUUsQ0FBQztBQUUxQiwrQkFBK0I7QUFDL0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFaEYsOENBQThDO0FBQzlDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFDeEIsS0FBMEIsRUFDMUIsUUFBZ0MsRUFDakIsRUFBRTtJQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDakQsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDbkUsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlD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Q3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRCxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUMzQixRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVcsc0JBQXNCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1RSxJQUFJLENBQUM7WUFDSCxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUFDLE9BQU8sYUFBYSxFQUFFLENBQUM7WUFDdkIsT0FBTyxDQUFDLEtBQUssQ0FDWCw0Q0FBNEMsRUFDNUMsYUFBYSxDQUNkLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBalFXLFFBQUEsT0FBTyxXQWlRbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBTU09BZG1pbkNsaWVudCxcbiAgQ3JlYXRlQWNjb3VudEFzc2lnbm1lbnRDb21tYW5kLFxuICBEZWxldGVBY2NvdW50QXNzaWdubWVudENvbW1hbmQsXG4gIExpc3RBY2NvdW50QXNzaWdubWVudHNDb21tYW5kLFxuICBBY2NvdW50QXNzaWdubWVudCxcbiAgUHJpbmNpcGFsVHlwZSxcbiAgVGFyZ2V0VHlwZVxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNzby1hZG1pblwiO1xuaW1wb3J0IHsgU1RTQ2xpZW50LCBHZXRDYWxsZXJJZGVudGl0eUNvbW1hbmQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXN0c1wiO1xuaW1wb3J0IHsgUHV0T2JqZWN0Q29tbWFuZCwgUzNDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5cbmludGVyZmFjZSBDbG91ZEZvcm1hdGlvbkV2ZW50IHtcbiAgUmVxdWVzdFR5cGU6IFwiQ3JlYXRlXCIgfCBcIlVwZGF0ZVwiIHwgXCJEZWxldGVcIjtcbiAgUmVzcG9uc2VVUkw6IHN0cmluZztcbiAgU3RhY2tJZDogc3RyaW5nO1xuICBSZXF1ZXN0SWQ6IHN0cmluZztcbiAgUmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIExvZ2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG4gIFBoeXNpY2FsUmVzb3VyY2VJZD86IHN0cmluZztcbiAgUmVzb3VyY2VQcm9wZXJ0aWVzOiB7XG4gICAgU2VydmljZVRva2VuOiBzdHJpbmc7XG4gICAgSW5zdGFuY2VBcm46IHN0cmluZztcbiAgICBQZXJtaXNzaW9uU2V0QXJuOiBzdHJpbmc7XG4gICAgUHJpbmNpcGFsVHlwZTogc3RyaW5nO1xuICAgIFByaW5jaXBhbElkOiBzdHJpbmc7XG4gICAgVGFyZ2V0VHlwZTogc3RyaW5nO1xuICAgIFRhcmdldElkOiBzdHJpbmc7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xuICBPbGRSZXNvdXJjZVByb3BlcnRpZXM/OiB7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQ2xvdWRGb3JtYXRpb25SZXNwb25zZSB7XG4gIFN0YXR1czogXCJTVUNDRVNTXCIgfCBcIkZBSUxFRFwiO1xuICBQaHlzaWNhbFJlc291cmNlSWQ6IHN0cmluZztcbiAgU3RhY2tJZDogc3RyaW5nO1xuICBSZXF1ZXN0SWQ6IHN0cmluZztcbiAgTG9naWNhbFJlc291cmNlSWQ6IHN0cmluZztcbiAgUmVhc29uPzogc3RyaW5nO1xuICBEYXRhPzoge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgfTtcbn1cblxuY29uc3Qgc3NvQWRtaW4gPSBuZXcgU1NPQWRtaW5DbGllbnQoKTtcbmNvbnN0IHN0cyA9IG5ldyBTVFNDbGllbnQoKTtcbmNvbnN0IHMzID0gbmV3IFMzQ2xpZW50KCk7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBhZGQgZGVsYXlcbmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbi8vIEZ1bmN0aW9uIHRvIHNlbmQgcmVzcG9uc2UgdG8gQ2xvdWRGb3JtYXRpb25cbmNvbnN0IHNlbmRSZXNwb25zZSA9IGFzeW5jIChcbiAgZXZlbnQ6IENsb3VkRm9ybWF0aW9uRXZlbnQsXG4gIHJlc3BvbnNlOiBDbG91ZEZvcm1hdGlvblJlc3BvbnNlXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc29sZS5pbmZvKFwiU2VuZGluZyBDbG91ZEZvcm1hdGlvbiByZXNwb25zZTpcIik7XG4gIGNvbnNvbGUuaW5mbyhgU3RhdHVzOiAke3Jlc3BvbnNlLlN0YXR1c31gKTtcbiAgY29uc29sZS5pbmZvKGBQaHlzaWNhbFJlc291cmNlSWQ6ICR7cmVzcG9uc2UuUGh5c2ljYWxSZXNvdXJjZUlkfWApO1xuICBpZiAocmVzcG9uc2UuUmVhc29uKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZWFzb246ICR7cmVzcG9uc2UuUmVhc29ufWApO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2VCb2R5ID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpO1xuICBjb25zb2xlLmluZm8oYFNlbmRpbmcgcmVzcG9uc2UgdG86ICR7ZXZlbnQuUmVzcG9uc2VVUkx9YCk7XG5cbiAgdHJ5IHtcbiAgICAvLyBFeHRyYWN0IGJ1Y2tldCBhbmQga2V5IGZyb20gdGhlIHByZS1zaWduZWQgVVJMXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChldmVudC5SZXNwb25zZVVSTCk7XG4gICAgY29uc3QgYnVja2V0TmFtZSA9IHVybC5ob3N0bmFtZS5zcGxpdChcIi5cIilbMF07XG4gICAgY29uc3Qga2V5ID0gdXJsLnBhdGhuYW1lLnN1YnN0cmluZygxKTsgLy8gcmVtb3ZlIGxlYWRpbmcgc2xhc2hcblxuICAgIC8vIFVzZSBTMyBjbGllbnQgdG8gdXBsb2FkIGRpcmVjdGx5XG4gICAgYXdhaXQgczMuc2VuZChcbiAgICAgIG5ldyBQdXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICBLZXk6IGtleSxcbiAgICAgICAgQm9keTogcmVzcG9uc2VCb2R5LFxuICAgICAgICBDb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnNvbGUuaW5mbyhgU3RhdHVzIGNvZGU6IDIwMGApO1xuICAgIGNvbnNvbGUuaW5mbyhgU3RhdHVzIG1lc3NhZ2U6IE9LYCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIHNlbmRpbmcgcmVzcG9uc2U6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuLy8gRnVuY3Rpb24gdG8gY2hlY2sgaWYgYW4gYXNzaWdubWVudCBleGlzdHNcbmNvbnN0IHZlcmlmeUFzc2lnbm1lbnRFeGlzdHMgPSBhc3luYyAoXG4gIGluc3RhbmNlQXJuOiBzdHJpbmcsXG4gIHBlcm1pc3Npb25TZXRBcm46IHN0cmluZyxcbiAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgcHJpbmNpcGFsVHlwZTogc3RyaW5nLFxuICByZXRyaWVzID0gMTAsXG4gIGRlbGF5ID0gNTAwMFxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBWZXJpZnlpbmcgYXNzaWdubWVudCBleGlzdHMgLSBhdHRlbXB0ICR7YXR0ZW1wdH0vJHtyZXRyaWVzfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGxpc3RSZXNwb25zZSA9IGF3YWl0IHNzb0FkbWluLnNlbmQoXG4gICAgICAgIG5ldyBMaXN0QWNjb3VudEFzc2lnbm1lbnRzQ29tbWFuZCh7XG4gICAgICAgICAgSW5zdGFuY2VBcm46IGluc3RhbmNlQXJuLFxuICAgICAgICAgIEFjY291bnRJZDogdGFyZ2V0SWQsXG4gICAgICAgICAgUGVybWlzc2lvblNldEFybjogcGVybWlzc2lvblNldEFyblxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgYXNzaWdubWVudHMgPSBsaXN0UmVzcG9uc2UuQWNjb3VudEFzc2lnbm1lbnRzIHx8IFtdO1xuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBGb3VuZCAke2Fzc2lnbm1lbnRzLmxlbmd0aH0gYXNzaWdubWVudHMgZm9yIGFjY291bnQgJHt0YXJnZXRJZH0gYW5kIHBlcm1pc3Npb24gc2V0YFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXhpc3RzID0gYXNzaWdubWVudHMuc29tZShcbiAgICAgICAgKGFzc2lnbm1lbnQ6IEFjY291bnRBc3NpZ25tZW50KSA9PlxuICAgICAgICAgIGFzc2lnbm1lbnQuUHJpbmNpcGFsSWQgPT09IHByaW5jaXBhbElkICYmXG4gICAgICAgICAgYXNzaWdubWVudC5QcmluY2lwYWxUeXBlID09PSAocHJpbmNpcGFsVHlwZSBhcyBQcmluY2lwYWxUeXBlKVxuICAgICAgKTtcblxuICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICBjb25zb2xlLmluZm8oXCJBc3NpZ25tZW50IGV4aXN0c1wiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdHRlbXB0IDwgcmV0cmllcykge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgYEFzc2lnbm1lbnQgbm90IGZvdW5kLCB3YWl0aW5nICR7XG4gICAgICAgICAgICBkZWxheSAvIDEwMDBcbiAgICAgICAgICB9IHNlY29uZHMgYmVmb3JlIHJldHJ5aW5nLi4uYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChkZWxheSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yIHZlcmlmeWluZyBhc3NpZ25tZW50IChhdHRlbXB0ICR7YXR0ZW1wdH0vJHtyZXRyaWVzfSk6YCxcbiAgICAgICAgZXJyb3JcbiAgICAgICk7XG5cbiAgICAgIGlmIChhdHRlbXB0IDwgcmV0cmllcykge1xuICAgICAgICBjb25zb2xlLmluZm8oYFdhaXRpbmcgJHtkZWxheSAvIDEwMDB9IHNlY29uZHMgYmVmb3JlIHJldHJ5aW5nLi4uYCk7XG4gICAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmluZm8oXCJBc3NpZ25tZW50IG5vdCBmb3VuZCBhZnRlciBtYXhpbXVtIHJldHJpZXNcIik7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8vIEhhbmRsZSBDbG91ZEZvcm1hdGlvbiBjdXN0b20gcmVzb3VyY2UgZXZlbnRcbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBDbG91ZEZvcm1hdGlvbkV2ZW50KTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc29sZS5pbmZvKFwiUmVjZWl2ZWQgZXZlbnQ6IFwiLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1xuXG4gIC8vIExvZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKHdpdGhvdXQgc2Vuc2l0aXZlIGRhdGEpXG4gIGNvbnNvbGUuaW5mbyhcbiAgICBcIkVudmlyb25tZW50IHZhcmlhYmxlczogXCIgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBBV1NfUkVHSU9OOiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OLFxuICAgICAgICBBV1NfRVhFQ1VUSU9OX0VOVjogcHJvY2Vzcy5lbnYuQVdTX0VYRUNVVElPTl9FTlYsXG4gICAgICAgIEFXU19MQU1CREFfRlVOQ1RJT05fTkFNRTogcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FLFxuICAgICAgICBBV1NfTEFNQkRBX0ZVTkNUSU9OX1ZFUlNJT046IHByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fVkVSU0lPTixcbiAgICAgICAgQVdTX0xBTUJEQV9GVU5DVElPTl9NRU1PUllfU0laRTpcbiAgICAgICAgICBwcm9jZXNzLmVudi5BV1NfTEFNQkRBX0ZVTkNUSU9OX01FTU9SWV9TSVpFXG4gICAgICB9KVxuICApO1xuXG4gIC8vIEdldCBjdXJyZW50IGlkZW50aXR5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgdHJ5IHtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHN0cy5zZW5kKG5ldyBHZXRDYWxsZXJJZGVudGl0eUNvbW1hbmQoe30pKTtcbiAgICBjb25zb2xlLmluZm8oXCJDdXJyZW50IGlkZW50aXR5OiBcIiwgSlNPTi5zdHJpbmdpZnkoaWRlbnRpdHksIG51bGwsIDIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZ2V0dGluZyBjYWxsZXIgaWRlbnRpdHk6XCIsIGVycm9yKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBJbnN0YW5jZUFybjogaW5zdGFuY2VBcm4sXG4gICAgUGVybWlzc2lvblNldEFybjogcGVybWlzc2lvblNldEFybixcbiAgICBQcmluY2lwYWxUeXBlOiBwcmluY2lwYWxUeXBlU3RyLFxuICAgIFByaW5jaXBhbElkOiBwcmluY2lwYWxJZCxcbiAgICBUYXJnZXRUeXBlOiB0YXJnZXRUeXBlU3RyLFxuICAgIFRhcmdldElkOiB0YXJnZXRJZFxuICB9ID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzO1xuXG4gIC8vIENvbnZlcnQgc3RyaW5nIHR5cGVzIHRvIGVudW0gdHlwZXNcbiAgY29uc3QgcHJpbmNpcGFsVHlwZSA9IHByaW5jaXBhbFR5cGVTdHIgYXMgUHJpbmNpcGFsVHlwZTtcbiAgY29uc3QgdGFyZ2V0VHlwZSA9IHRhcmdldFR5cGVTdHIgYXMgVGFyZ2V0VHlwZTtcblxuICAvLyBHZW5lcmF0ZSBhIGNvbnNpc3RlbnQgcGh5c2ljYWwgSUQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3NpZ25tZW50IGV4aXN0c1xuICBjb25zdCBwaHlzaWNhbFJlc291cmNlSWQgPVxuICAgIGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB8fFxuICAgIGAke3Blcm1pc3Npb25TZXRBcm59LSR7cHJpbmNpcGFsSWR9LSR7dGFyZ2V0SWR9YDtcblxuICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICBjb25zdCByZXNwb25zZTogQ2xvdWRGb3JtYXRpb25SZXNwb25zZSA9IHtcbiAgICBTdGF0dXM6IFwiU1VDQ0VTU1wiLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcGh5c2ljYWxSZXNvdXJjZUlkLFxuICAgIFN0YWNrSWQ6IGV2ZW50LlN0YWNrSWQsXG4gICAgUmVxdWVzdElkOiBldmVudC5SZXF1ZXN0SWQsXG4gICAgTG9naWNhbFJlc291cmNlSWQ6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkXG4gIH07XG5cbiAgY29uc3QgTUFYX1JFVFJJRVMgPSA1O1xuXG4gIHRyeSB7XG4gICAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSBcIkNyZWF0ZVwiOlxuICAgICAgY2FzZSBcIlVwZGF0ZVwiOlxuICAgICAgICBjb25zdCBvcGVyYXRpb24gPVxuICAgICAgICAgIGV2ZW50LlJlcXVlc3RUeXBlID09PSBcIkNyZWF0ZVwiID8gXCJDcmVhdGluZ1wiIDogXCJVcGRhdGluZ1wiO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGFzc2lnbm1lbnQgYWxyZWFkeSBleGlzdHMgZm9yIHVwZGF0ZXMgdG8gYXZvaWQgZXJyb3JzXG4gICAgICAgIGlmIChldmVudC5SZXF1ZXN0VHlwZSA9PT0gXCJVcGRhdGVcIikge1xuICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHZlcmlmeUFzc2lnbm1lbnRFeGlzdHMoXG4gICAgICAgICAgICBpbnN0YW5jZUFybixcbiAgICAgICAgICAgIHBlcm1pc3Npb25TZXRBcm4sXG4gICAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgICAgIHByaW5jaXBhbElkLFxuICAgICAgICAgICAgcHJpbmNpcGFsVHlwZVN0clxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgIFwiQXNzaWdubWVudCBhbHJlYWR5IGV4aXN0cyBmb3IgdXBkYXRlIG9wZXJhdGlvbiAtIG5vIGFjdGlvbiBuZWVkZWRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHNlbmRSZXNwb25zZShldmVudCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgYXNzaWdubWVudFxuICAgICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBNQVhfUkVUUklFUzsgYXR0ZW1wdCsrKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBBdHRlbXB0ICR7YXR0ZW1wdH0vJHtNQVhfUkVUUklFU31gKTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYCR7b3BlcmF0aW9ufSBBY2NvdW50IEFzc2lnbm1lbnRgKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBzc29BZG1pbi5zZW5kKFxuICAgICAgICAgICAgICBuZXcgQ3JlYXRlQWNjb3VudEFzc2lnbm1lbnRDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBJbnN0YW5jZUFybjogaW5zdGFuY2VBcm4sXG4gICAgICAgICAgICAgICAgUGVybWlzc2lvblNldEFybjogcGVybWlzc2lvblNldEFybixcbiAgICAgICAgICAgICAgICBQcmluY2lwYWxUeXBlOiBwcmluY2lwYWxUeXBlLFxuICAgICAgICAgICAgICAgIFByaW5jaXBhbElkOiBwcmluY2lwYWxJZCxcbiAgICAgICAgICAgICAgICBUYXJnZXRUeXBlOiB0YXJnZXRUeXBlLFxuICAgICAgICAgICAgICAgIFRhcmdldElkOiB0YXJnZXRJZFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiQ3JlYXRlIGFzc2lnbm1lbnQgY29tbWFuZCBzZW50IHN1Y2Nlc3NmdWxseVwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlZlcmlmeWluZyBhc3NpZ25tZW50IGV4aXN0c1wiKTtcblxuICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBhc3NpZ25tZW50IHdhcyBjcmVhdGVkXG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB2ZXJpZnlBc3NpZ25tZW50RXhpc3RzKFxuICAgICAgICAgICAgICBpbnN0YW5jZUFybixcbiAgICAgICAgICAgICAgcGVybWlzc2lvblNldEFybixcbiAgICAgICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIHByaW5jaXBhbElkLFxuICAgICAgICAgICAgICBwcmluY2lwYWxUeXBlU3RyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkFzc2lnbm1lbnQgdmVyaWZpZWQgc3VjY2Vzc2Z1bGx5XCIpO1xuICAgICAgICAgICAgICBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQXNzaWdubWVudCB2ZXJpZmljYXRpb24gZmFpbGVkOiBBc3NpZ25tZW50IG5vdCBmb3VuZCBhZnRlciBjcmVhdGlvblwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gYXR0ZW1wdCAke2F0dGVtcHR9OmAsIGVycm9yKTtcblxuICAgICAgICAgICAgLy8gSWYgaXQncyB0aGUgbGFzdCBhdHRlbXB0LCBwcm9wYWdhdGUgdGhlIGVycm9yXG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIGl0J3MgYSBDb25mbGljdEV4Y2VwdGlvbiBvciB0aGUgYXNzaWdubWVudCBhbHJlYWR5IGV4aXN0cywgY29uc2lkZXIgaXQgYSBzdWNjZXNzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGVycm9yLm5hbWUgPT09IFwiQ29uZmxpY3RFeGNlcHRpb25cIiB8fFxuICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiYWxyZWFkeSBleGlzdHNcIikgfHxcbiAgICAgICAgICAgICAgKGF3YWl0IHZlcmlmeUFzc2lnbm1lbnRFeGlzdHMoXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VBcm4sXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvblNldEFybixcbiAgICAgICAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgICBwcmluY2lwYWxJZCxcbiAgICAgICAgICAgICAgICBwcmluY2lwYWxUeXBlU3RyXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICAgIFwiQXNzaWdubWVudCBhbHJlYWR5IGV4aXN0cyBvciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHlcIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdhaXQgYW5kIHJldHJ5XG4gICAgICAgICAgICBhd2FpdCBzbGVlcCgyMDAwICogYXR0ZW1wdCk7IC8vIEV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkRlbGV0ZVwiOlxuICAgICAgICAvLyBDaGVjayBpZiBhc3NpZ25tZW50IGV4aXN0cyBiZWZvcmUgYXR0ZW1wdGluZyBkZWxldGlvblxuICAgICAgICBjb25zdCBhc3NpZ25tZW50RXhpc3RzID0gYXdhaXQgdmVyaWZ5QXNzaWdubWVudEV4aXN0cyhcbiAgICAgICAgICBpbnN0YW5jZUFybixcbiAgICAgICAgICBwZXJtaXNzaW9uU2V0QXJuLFxuICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICAgIHByaW5jaXBhbElkLFxuICAgICAgICAgIHByaW5jaXBhbFR5cGVTdHJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWFzc2lnbm1lbnRFeGlzdHMpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJBc3NpZ25tZW50IGRvZXMgbm90IGV4aXN0LCBubyBuZWVkIHRvIGRlbGV0ZVwiKTtcbiAgICAgICAgICBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWxldGUgdGhlIGFzc2lnbm1lbnRcbiAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gTUFYX1JFVFJJRVM7IGF0dGVtcHQrKykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgQXR0ZW1wdCAke2F0dGVtcHR9LyR7TUFYX1JFVFJJRVN9YCk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFwiRGVsZXRpbmcgQWNjb3VudCBBc3NpZ25tZW50XCIpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHNzb0FkbWluLnNlbmQoXG4gICAgICAgICAgICAgIG5ldyBEZWxldGVBY2NvdW50QXNzaWdubWVudENvbW1hbmQoe1xuICAgICAgICAgICAgICAgIEluc3RhbmNlQXJuOiBpbnN0YW5jZUFybixcbiAgICAgICAgICAgICAgICBQZXJtaXNzaW9uU2V0QXJuOiBwZXJtaXNzaW9uU2V0QXJuLFxuICAgICAgICAgICAgICAgIFByaW5jaXBhbFR5cGU6IHByaW5jaXBhbFR5cGUsXG4gICAgICAgICAgICAgICAgUHJpbmNpcGFsSWQ6IHByaW5jaXBhbElkLFxuICAgICAgICAgICAgICAgIFRhcmdldFR5cGU6IHRhcmdldFR5cGUsXG4gICAgICAgICAgICAgICAgVGFyZ2V0SWQ6IHRhcmdldElkXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXCJEZWxldGUgYXNzaWdubWVudCBjb21tYW5kIHNlbnQgc3VjY2Vzc2Z1bGx5XCIpO1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiVmVyaWZ5aW5nIGFzc2lnbm1lbnQgZG9lcyBub3QgZXhpc3RcIik7XG5cbiAgICAgICAgICAgIC8vIEhlcmUgd2UncmUgaW52ZXJ0aW5nIHRoZSBsb2dpYyAtIHdhaXQgZm9yIHRoZSBhc3NpZ25tZW50IHRvIE5PVCBleGlzdFxuICAgICAgICAgICAgY29uc3Qgc3RpbGxFeGlzdHMgPSBhd2FpdCB2ZXJpZnlBc3NpZ25tZW50RXhpc3RzKFxuICAgICAgICAgICAgICBpbnN0YW5jZUFybixcbiAgICAgICAgICAgICAgcGVybWlzc2lvblNldEFybixcbiAgICAgICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIHByaW5jaXBhbElkLFxuICAgICAgICAgICAgICBwcmluY2lwYWxUeXBlU3RyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIXN0aWxsRXhpc3RzKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkFzc2lnbm1lbnQgZGVsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgICAgICAgICAgIGF3YWl0IHNlbmRSZXNwb25zZShldmVudCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBPbiB0aGUgZmluYWwgYXR0ZW1wdCwgY29uc2lkZXIgaXQgYW4gZXJyb3IgaWYgaXQgc3RpbGwgZXhpc3RzXG4gICAgICAgICAgICAgIGlmIChhdHRlbXB0ID09PSBNQVhfUkVUUklFUykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiQXNzaWdubWVudCB2ZXJpZmljYXRpb24gZmFpbGVkOiBBc3NpZ25tZW50IHN0aWxsIGV4aXN0cyBhZnRlciBkZWxldGlvblwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2FpdCBhbmQgcmV0cnkgdGhlIHZlcmlmaWNhdGlvblxuICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgICAgYEFzc2lnbm1lbnQgc3RpbGwgZXhpc3RzIGFmdGVyIGRlbGV0aW9uIGF0dGVtcHQgJHthdHRlbXB0fSwgd2FpdGluZy4uLmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoMzAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gZGVsZXRlIGF0dGVtcHQgJHthdHRlbXB0fTpgLCBlcnJvcik7XG5cbiAgICAgICAgICAgIC8vIElmIGl0J3MgYSBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBjb25zaWRlciBpdCBhIHN1Y2Nlc3NcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXJyb3IubmFtZSA9PT0gXCJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uXCIgfHxcbiAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcImRvZXMgbm90IGV4aXN0XCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiQXNzaWdubWVudCBkb2VzIG5vdCBleGlzdCBvciB3YXMgYWxyZWFkeSBkZWxldGVkXCIpO1xuICAgICAgICAgICAgICBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbiB0aGUgbGFzdCBhdHRlbXB0LCBwcm9wYWdhdGUgdGhlIGVycm9yXG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2FpdCBhbmQgcmV0cnlcbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKDIwMDAgKiBhdHRlbXB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBPcGVyYXRpb24gZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpO1xuICAgIHJlc3BvbnNlLlN0YXR1cyA9IFwiRkFJTEVEXCI7XG4gICAgcmVzcG9uc2UuUmVhc29uID0gYCR7ZXZlbnQuUmVxdWVzdFR5cGV9IG9wZXJhdGlvbiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlbmRSZXNwb25zZShldmVudCwgcmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiRmFpbGVkIHRvIHNlbmQgcmVzcG9uc2UgdG8gQ2xvdWRGb3JtYXRpb246XCIsXG4gICAgICAgIHJlc3BvbnNlRXJyb3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuIl19
@@ -1,54 +0,0 @@
1
- import { Construct } from "constructs";
2
- export declare enum FeatureSet {
3
- ALL = "ALL",
4
- CONSOLIDATED_BILLING = "CONSOLIDATED_BILLING"
5
- }
6
- export declare enum PolicyType {
7
- SERVICE_CONTROL_POLICY = "SERVICE_CONTROL_POLICY",
8
- TAG_POLICY = "TAG_POLICY",
9
- BACKUP_POLICY = "BACKUP_POLICY",
10
- AISERVICES_OPT_OUT_POLICY = "AISERVICES_OPT_OUT_POLICY"
11
- }
12
- interface OrganizationProps {
13
- readonly featureSet?: FeatureSet;
14
- }
15
- export declare class Root extends Construct {
16
- readonly id: string;
17
- constructor(scope: Construct, id: string, rootId: string);
18
- }
19
- export declare class Organization extends Construct {
20
- readonly organizationId: string;
21
- readonly rootId: string;
22
- readonly root: Root;
23
- constructor(scope: Construct, id: string, props?: OrganizationProps);
24
- enableAwsServiceAccess(servicePrincipal: string): void;
25
- enablePolicyType(policyType: PolicyType): void;
26
- }
27
- interface OrganizationalUnitProps {
28
- readonly organizationalUnitName: string;
29
- readonly parent: Root | OrganizationalUnit;
30
- readonly importOnDuplicate?: boolean;
31
- }
32
- export declare class OrganizationalUnit extends Construct {
33
- readonly ouId: string;
34
- constructor(scope: Construct, id: string, props: OrganizationalUnitProps);
35
- }
36
- interface AccountProps {
37
- readonly accountName: string;
38
- readonly email: string;
39
- readonly parent: OrganizationalUnit | Root;
40
- readonly importOnDuplicate?: boolean;
41
- }
42
- export declare class Account extends Construct {
43
- readonly accountId: string;
44
- readonly accountArn: string;
45
- constructor(scope: Construct, id: string, props: AccountProps);
46
- }
47
- declare const _default: {
48
- Account: typeof Account;
49
- Organization: typeof Organization;
50
- OrganizationalUnit: typeof OrganizationalUnit;
51
- FeatureSet: typeof FeatureSet;
52
- PolicyType: typeof PolicyType;
53
- };
54
- export default _default;
@@ -1,196 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Account = exports.OrganizationalUnit = exports.Organization = exports.Root = exports.PolicyType = exports.FeatureSet = void 0;
4
- /* eslint-disable @typescript-eslint/ban-ts-comment */
5
- const aws_cdk_lib_1 = require("aws-cdk-lib");
6
- const cr = require("aws-cdk-lib/custom-resources");
7
- const constructs_1 = require("constructs");
8
- const awsCustomResource_1 = require("../utilities/awsCustomResource");
9
- // Feature sets supported by AWS Organizations
10
- var FeatureSet;
11
- (function (FeatureSet) {
12
- FeatureSet["ALL"] = "ALL";
13
- FeatureSet["CONSOLIDATED_BILLING"] = "CONSOLIDATED_BILLING";
14
- })(FeatureSet || (exports.FeatureSet = FeatureSet = {}));
15
- // Policy types supported by AWS Organizations
16
- var PolicyType;
17
- (function (PolicyType) {
18
- PolicyType["SERVICE_CONTROL_POLICY"] = "SERVICE_CONTROL_POLICY";
19
- PolicyType["TAG_POLICY"] = "TAG_POLICY";
20
- PolicyType["BACKUP_POLICY"] = "BACKUP_POLICY";
21
- PolicyType["AISERVICES_OPT_OUT_POLICY"] = "AISERVICES_OPT_OUT_POLICY";
22
- })(PolicyType || (exports.PolicyType = PolicyType = {}));
23
- class Root extends constructs_1.Construct {
24
- constructor(scope, id, rootId) {
25
- super(scope, id);
26
- this.id = rootId;
27
- }
28
- }
29
- exports.Root = Root;
30
- class Organization extends constructs_1.Construct {
31
- constructor(scope, id, props) {
32
- super(scope, id);
33
- const org = new awsCustomResource_1.AwsCustomResource(this, "Organization", {
34
- functionName: `organization${id}`,
35
- onCreate: {
36
- service: "organizations",
37
- action: "CreateOrganization",
38
- parameters: {
39
- FeatureSet: props?.featureSet || FeatureSet.ALL
40
- },
41
- physicalResourceId: cr.PhysicalResourceId.of("OrganizationResource"),
42
- // Ignore error if the organization already exists
43
- ignoreErrorCodesMatching: "AlreadyInOrganization|DuplicateOrganizationException"
44
- },
45
- onUpdate: {
46
- service: "organizations",
47
- action: "DescribeOrganization",
48
- physicalResourceId: cr.PhysicalResourceId.of("OrganizationResource")
49
- },
50
- // Leaving organization deletion unmanaged; no-op to keep stack deletions simple
51
- policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
52
- resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE
53
- })
54
- });
55
- this.organizationId = org.getResponseField("Organization.Id");
56
- this.rootId = org.getResponseField("Organization.Roots.0.Id");
57
- this.root = new Root(this, "Root", this.rootId);
58
- }
59
- enableAwsServiceAccess(servicePrincipal) {
60
- new awsCustomResource_1.AwsCustomResource(this, `EnableServiceAccess${servicePrincipal}`, {
61
- functionName: `enableServiceAccess${servicePrincipal.replace(/\./g, "")}`,
62
- onCreate: {
63
- service: "organizations",
64
- action: "EnableAWSServiceAccess",
65
- parameters: { ServicePrincipal: servicePrincipal },
66
- physicalResourceId: cr.PhysicalResourceId.of(`EnableServiceAccess-${servicePrincipal}`)
67
- },
68
- policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
69
- resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE
70
- })
71
- });
72
- }
73
- enablePolicyType(policyType) {
74
- new awsCustomResource_1.AwsCustomResource(this, `EnablePolicyType${policyType}`, {
75
- functionName: `enablePolicyType${policyType}`,
76
- onCreate: {
77
- service: "organizations",
78
- action: "EnablePolicyType",
79
- parameters: {
80
- RootId: this.rootId,
81
- PolicyType: policyType
82
- },
83
- physicalResourceId: cr.PhysicalResourceId.of(`EnablePolicyType-${policyType}`)
84
- },
85
- policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
86
- resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE
87
- })
88
- });
89
- }
90
- }
91
- exports.Organization = Organization;
92
- class OrganizationalUnit extends constructs_1.Construct {
93
- constructor(scope, id, props) {
94
- super(scope, id);
95
- const parentId = props.parent.ouId || props.parent.id;
96
- const createOu = new awsCustomResource_1.AwsCustomResource(this, "OrganizationalUnit", {
97
- functionName: `organizationalUnit${id}`,
98
- onCreate: {
99
- service: "organizations",
100
- action: "CreateOrganizationalUnit",
101
- parameters: {
102
- Name: props.organizationalUnitName,
103
- ParentId: parentId
104
- },
105
- physicalResourceId: cr.PhysicalResourceId.of(`OU-${props.organizationalUnitName}`),
106
- // Allow importing existing OU by ignoring duplicate error
107
- ignoreErrorCodesMatching: props.importOnDuplicate
108
- ? "DuplicateOrganizationalUnitException"
109
- : undefined
110
- },
111
- policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
112
- resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE
113
- })
114
- });
115
- this.ouId = createOu.getResponseField("OrganizationalUnit.Id");
116
- }
117
- }
118
- exports.OrganizationalUnit = OrganizationalUnit;
119
- class Account extends constructs_1.Construct {
120
- constructor(scope, id, props) {
121
- super(scope, id);
122
- const physicalId = `Account-${props.accountName}`;
123
- // Initiate account creation
124
- const createAccount = new awsCustomResource_1.AwsCustomResource(this, "CreateAccount", {
125
- functionName: `createAccount${id}`,
126
- onCreate: {
127
- service: "organizations",
128
- action: "CreateAccount",
129
- parameters: {
130
- AccountName: props.accountName,
131
- Email: props.email
132
- },
133
- physicalResourceId: cr.PhysicalResourceId.of(physicalId),
134
- ignoreErrorCodesMatching: props.importOnDuplicate
135
- ? "DuplicateAccountException"
136
- : undefined
137
- },
138
- policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
139
- resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE
140
- })
141
- });
142
- const requestId = createAccount.getResponseField("CreateAccountStatus.Id");
143
- // Poll for completion and retrieve the new account Id
144
- const describeStatus = new awsCustomResource_1.AwsCustomResource(this, "DescribeAccountStatus", {
145
- functionName: `describeAccountStatus${id}`,
146
- onCreate: {
147
- service: "organizations",
148
- action: "DescribeCreateAccountStatus",
149
- parameters: {
150
- CreateAccountRequestId: requestId
151
- },
152
- physicalResourceId: cr.PhysicalResourceId.of(`${physicalId}-status`)
153
- },
154
- policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
155
- resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE
156
- })
157
- });
158
- this.accountId = describeStatus.getResponseField("CreateAccountStatus.AccountId");
159
- // If the desired parent is not the root, move the account once it's created.
160
- const destinationParentId = props.parent.ouId || props.parent.id;
161
- if (destinationParentId) {
162
- new awsCustomResource_1.AwsCustomResource(this, "MoveAccount", {
163
- functionName: `moveAccount${id}`,
164
- onCreate: {
165
- service: "organizations",
166
- action: "MoveAccount",
167
- parameters: {
168
- AccountId: this.accountId,
169
- SourceParentId: props.parent.rootId ||
170
- props.parent.parentId ||
171
- "r-root", // attempt to move from root
172
- DestinationParentId: destinationParentId
173
- },
174
- physicalResourceId: cr.PhysicalResourceId.of(`Move-${physicalId}`),
175
- // Ignore if it's already in correct OU
176
- ignoreErrorCodesMatching: "AccountAlreadyExistsException|DuplicateAccountException|ChildNotFoundException"
177
- },
178
- policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
179
- resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE
180
- })
181
- });
182
- }
183
- // Compute account ARN lazily (structure: arn:aws:organizations::<management_account_id>:account/<org_id>/<account_id>)
184
- const managementAccount = aws_cdk_lib_1.Stack.of(this).account;
185
- this.accountArn = `arn:aws:organizations::${managementAccount}:account/*/${this.accountId}`;
186
- }
187
- }
188
- exports.Account = Account;
189
- exports.default = {
190
- Account,
191
- Organization,
192
- OrganizationalUnit,
193
- FeatureSet,
194
- PolicyType
195
- };
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9vcmdhbml6YXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFzRDtBQUN0RCw2Q0FBb0M7QUFDcEMsbURBQW1EO0FBQ25ELDJDQUF1QztBQUN2QyxzRUFBbUU7QUFFbkUsOENBQThDO0FBQzlDLElBQVksVUFHWDtBQUhELFdBQVksVUFBVTtJQUNwQix5QkFBVyxDQUFBO0lBQ1gsMkRBQTZDLENBQUE7QUFDL0MsQ0FBQyxFQUhXLFVBQVUsMEJBQVYsVUFBVSxRQUdyQjtBQUVELDhDQUE4QztBQUM5QyxJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIsK0RBQWlELENBQUE7SUFDakQsdUNBQXlCLENBQUE7SUFDekIsNkNBQStCLENBQUE7SUFDL0IscUVBQXVELENBQUE7QUFDekQsQ0FBQyxFQUxXLFVBQVUsMEJBQVYsVUFBVSxRQUtyQjtBQU1ELE1BQWEsSUFBSyxTQUFRLHNCQUFTO0lBR2pDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsTUFBYztRQUN0RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQVBELG9CQU9DO0FBRUQsTUFBYSxZQUFhLFNBQVEsc0JBQVM7SUFLekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sR0FBRyxHQUFHLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUN0RCxZQUFZLEVBQUUsZUFBZSxFQUFFLEVBQUU7WUFDakMsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixNQUFNLEVBQUUsb0JBQW9CO2dC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O0lBQ2IsT0FBTztJQUNQLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFVBQVU7Q0FDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgY3IgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcblxuLy8gRmVhdHVyZSBzZXRzIHN1cHBvcnRlZCBieSBBV1MgT3JnYW5pemF0aW9uc1xuZXhwb3J0IGVudW0gRmVhdHVyZVNldCB7XG4gIEFMTCA9IFwiQUxMXCIsXG4gIENPTlNPTElEQVRFRF9CSUxMSU5HID0gXCJDT05TT0xJREFURURfQklMTElOR1wiXG59XG5cbi8vIFBvbGljeSB0eXBlcyBzdXBwb3J0ZWQgYnkgQVdTIE9yZ2FuaXphdGlvbnNcbmV4cG9ydCBlbnVtIFBvbGljeVR5cGUge1xuICBTRVJWSUNFX0NPTlRST0xfUE9MSUNZID0gXCJTRVJWSUNFX0NPTlRST0xfUE9MSUNZXCIsXG4gIFRBR19QT0xJQ1kgPSBcIlRBR19QT0xJQ1lcIixcbiAgQkFDS1VQX1BPTElDWSA9IFwiQkFDS1VQX1BPTElDWVwiLFxuICBBSVNFUlZJQ0VTX09QVF9PVVRfUE9MSUNZID0gXCJBSVNFUlZJQ0VTX09QVF9PVVRfUE9MSUNZXCJcbn1cblxuaW50ZXJmYWNlIE9yZ2FuaXphdGlvblByb3BzIHtcbiAgcmVhZG9ubHkgZmVhdHVyZVNldD86IEZlYXR1cmVTZXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSb290IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcm9vdElkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSByb290SWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBvcmdhbml6YXRpb25JZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcm9vdElkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb290OiBSb290O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogT3JnYW5pemF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qgb3JnID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiT3JnYW5pemF0aW9uXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYG9yZ2FuaXphdGlvbiR7aWR9YCxcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiQ3JlYXRlT3JnYW5pemF0aW9uXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBGZWF0dXJlU2V0OiBwcm9wcz8uZmVhdHVyZVNldCB8fCBGZWF0dXJlU2V0LkFMTFxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGNyLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcIk9yZ2FuaXphdGlvblJlc291cmNlXCIpLFxuICAgICAgICAvLyBJZ25vcmUgZXJyb3IgaWYgdGhlIG9yZ2FuaXphdGlvbiBhbHJlYWR5IGV4aXN0c1xuICAgICAgICBpZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmc6XG4gICAgICAgICAgXCJBbHJlYWR5SW5Pcmdhbml6YXRpb258RHVwbGljYXRlT3JnYW5pemF0aW9uRXhjZXB0aW9uXCJcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgYWN0aW9uOiBcIkRlc2NyaWJlT3JnYW5pemF0aW9uXCIsXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFwiT3JnYW5pemF0aW9uUmVzb3VyY2VcIilcbiAgICAgIH0sXG4gICAgICAvLyBMZWF2aW5nIG9yZ2FuaXphdGlvbiBkZWxldGlvbiB1bm1hbmFnZWQ7IG5vLW9wIHRvIGtlZXAgc3RhY2sgZGVsZXRpb25zIHNpbXBsZVxuICAgICAgcG9saWN5OiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoe1xuICAgICAgICByZXNvdXJjZXM6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LkFOWV9SRVNPVVJDRVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIHRoaXMub3JnYW5pemF0aW9uSWQgPSBvcmcuZ2V0UmVzcG9uc2VGaWVsZChcIk9yZ2FuaXphdGlvbi5JZFwiKTtcbiAgICB0aGlzLnJvb3RJZCA9IG9yZy5nZXRSZXNwb25zZUZpZWxkKFwiT3JnYW5pemF0aW9uLlJvb3RzLjAuSWRcIik7XG4gICAgdGhpcy5yb290ID0gbmV3IFJvb3QodGhpcywgXCJSb290XCIsIHRoaXMucm9vdElkKTtcbiAgfVxuXG4gIHB1YmxpYyBlbmFibGVBd3NTZXJ2aWNlQWNjZXNzKHNlcnZpY2VQcmluY2lwYWw6IHN0cmluZykge1xuICAgIG5ldyBBd3NDdXN0b21SZXNvdXJjZSh0aGlzLCBgRW5hYmxlU2VydmljZUFjY2VzcyR7c2VydmljZVByaW5jaXBhbH1gLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGBlbmFibGVTZXJ2aWNlQWNjZXNzJHtzZXJ2aWNlUHJpbmNpcGFsLnJlcGxhY2UoL1xcLi9nLCBcIlwiKX1gLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJFbmFibGVBV1NTZXJ2aWNlQWNjZXNzXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHsgU2VydmljZVByaW5jaXBhbDogc2VydmljZVByaW5jaXBhbCB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGNyLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgRW5hYmxlU2VydmljZUFjY2Vzcy0ke3NlcnZpY2VQcmluY2lwYWx9YFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgcG9saWN5OiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoe1xuICAgICAgICByZXNvdXJjZXM6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LkFOWV9SRVNPVVJDRVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBlbmFibGVQb2xpY3lUeXBlKHBvbGljeVR5cGU6IFBvbGljeVR5cGUpIHtcbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgYEVuYWJsZVBvbGljeVR5cGUke3BvbGljeVR5cGV9YCwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBgZW5hYmxlUG9saWN5VHlwZSR7cG9saWN5VHlwZX1gLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJFbmFibGVQb2xpY3lUeXBlXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBSb290SWQ6IHRoaXMucm9vdElkLFxuICAgICAgICAgIFBvbGljeVR5cGU6IHBvbGljeVR5cGVcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjci5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgYEVuYWJsZVBvbGljeVR5cGUtJHtwb2xpY3lUeXBlfWBcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHtcbiAgICAgICAgcmVzb3VyY2VzOiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5BTllfUkVTT1VSQ0VcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIE9yZ2FuaXphdGlvbmFsVW5pdFByb3BzIHtcbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uYWxVbml0TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXJlbnQ6IFJvb3QgfCBPcmdhbml6YXRpb25hbFVuaXQ7XG4gIHJlYWRvbmx5IGltcG9ydE9uRHVwbGljYXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvbmFsVW5pdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBvdUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9yZ2FuaXphdGlvbmFsVW5pdFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHBhcmVudElkID0gKHByb3BzLnBhcmVudCBhcyBhbnkpLm91SWQgfHwgKHByb3BzLnBhcmVudCBhcyBhbnkpLmlkO1xuXG4gICAgY29uc3QgY3JlYXRlT3UgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJPcmdhbml6YXRpb25hbFVuaXRcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBgb3JnYW5pemF0aW9uYWxVbml0JHtpZH1gLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJDcmVhdGVPcmdhbml6YXRpb25hbFVuaXRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIE5hbWU6IHByb3BzLm9yZ2FuaXphdGlvbmFsVW5pdE5hbWUsXG4gICAgICAgICAgUGFyZW50SWQ6IHBhcmVudElkXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgIGBPVS0ke3Byb3BzLm9yZ2FuaXphdGlvbmFsVW5pdE5hbWV9YFxuICAgICAgICApLFxuICAgICAgICAvLyBBbGxvdyBpbXBvcnRpbmcgZXhpc3RpbmcgT1UgYnkgaWdub3JpbmcgZHVwbGljYXRlIGVycm9yXG4gICAgICAgIGlnbm9yZUVycm9yQ29kZXNNYXRjaGluZzogcHJvcHMuaW1wb3J0T25EdXBsaWNhdGVcbiAgICAgICAgICA/IFwiRHVwbGljYXRlT3JnYW5pemF0aW9uYWxVbml0RXhjZXB0aW9uXCJcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHtcbiAgICAgICAgcmVzb3VyY2VzOiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5BTllfUkVTT1VSQ0VcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICB0aGlzLm91SWQgPSBjcmVhdGVPdS5nZXRSZXNwb25zZUZpZWxkKFwiT3JnYW5pemF0aW9uYWxVbml0LklkXCIpO1xuICB9XG59XG5cbmludGVyZmFjZSBBY2NvdW50UHJvcHMge1xuICByZWFkb25seSBhY2NvdW50TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBlbWFpbDogc3RyaW5nO1xuICByZWFkb25seSBwYXJlbnQ6IE9yZ2FuaXphdGlvbmFsVW5pdCB8IFJvb3Q7XG4gIHJlYWRvbmx5IGltcG9ydE9uRHVwbGljYXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEFjY291bnQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBhY2NvdW50QXJuOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFjY291bnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBwaHlzaWNhbElkID0gYEFjY291bnQtJHtwcm9wcy5hY2NvdW50TmFtZX1gO1xuXG4gICAgLy8gSW5pdGlhdGUgYWNjb3VudCBjcmVhdGlvblxuICAgIGNvbnN0IGNyZWF0ZUFjY291bnQgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJDcmVhdGVBY2NvdW50XCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYGNyZWF0ZUFjY291bnQke2lkfWAsXG4gICAgICBvbkNyZWF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgYWN0aW9uOiBcIkNyZWF0ZUFjY291bnRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEFjY291bnROYW1lOiBwcm9wcy5hY2NvdW50TmFtZSxcbiAgICAgICAgICBFbWFpbDogcHJvcHMuZW1haWxcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjci5QaHlzaWNhbFJlc291cmNlSWQub2YocGh5c2ljYWxJZCksXG4gICAgICAgIGlnbm9yZUVycm9yQ29kZXNNYXRjaGluZzogcHJvcHMuaW1wb3J0T25EdXBsaWNhdGVcbiAgICAgICAgICA/IFwiRHVwbGljYXRlQWNjb3VudEV4Y2VwdGlvblwiXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICBwb2xpY3k6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7XG4gICAgICAgIHJlc291cmNlczogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuQU5ZX1JFU09VUkNFXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdElkID0gY3JlYXRlQWNjb3VudC5nZXRSZXNwb25zZUZpZWxkKFwiQ3JlYXRlQWNjb3VudFN0YXR1cy5JZFwiKTtcblxuICAgIC8vIFBvbGwgZm9yIGNvbXBsZXRpb24gYW5kIHJldHJpZXZlIHRoZSBuZXcgYWNjb3VudCBJZFxuICAgIGNvbnN0IGRlc2NyaWJlU3RhdHVzID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiRGVzY3JpYmVBY2NvdW50U3RhdHVzXCIsXG4gICAgICB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogYGRlc2NyaWJlQWNjb3VudFN0YXR1cyR7aWR9YCxcbiAgICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgICBhY3Rpb246IFwiRGVzY3JpYmVDcmVhdGVBY2NvdW50U3RhdHVzXCIsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgQ3JlYXRlQWNjb3VudFJlcXVlc3RJZDogcmVxdWVzdElkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGNyLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihgJHtwaHlzaWNhbElkfS1zdGF0dXNgKVxuICAgICAgICB9LFxuICAgICAgICBwb2xpY3k6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5BTllfUkVTT1VSQ0VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5hY2NvdW50SWQgPSBkZXNjcmliZVN0YXR1cy5nZXRSZXNwb25zZUZpZWxkKFxuICAgICAgXCJDcmVhdGVBY2NvdW50U3RhdHVzLkFjY291bnRJZFwiXG4gICAgKTtcblxuICAgIC8vIElmIHRoZSBkZXNpcmVkIHBhcmVudCBpcyBub3QgdGhlIHJvb3QsIG1vdmUgdGhlIGFjY291bnQgb25jZSBpdCdzIGNyZWF0ZWQuXG4gICAgY29uc3QgZGVzdGluYXRpb25QYXJlbnRJZCA9XG4gICAgICAocHJvcHMucGFyZW50IGFzIGFueSkub3VJZCB8fCAocHJvcHMucGFyZW50IGFzIGFueSkuaWQ7XG5cbiAgICBpZiAoZGVzdGluYXRpb25QYXJlbnRJZCkge1xuICAgICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiTW92ZUFjY291bnRcIiwge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGBtb3ZlQWNjb3VudCR7aWR9YCxcbiAgICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgICBhY3Rpb246IFwiTW92ZUFjY291bnRcIixcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBBY2NvdW50SWQ6IHRoaXMuYWNjb3VudElkLFxuICAgICAgICAgICAgU291cmNlUGFyZW50SWQ6XG4gICAgICAgICAgICAgIChwcm9wcy5wYXJlbnQgYXMgYW55KS5yb290SWQgfHxcbiAgICAgICAgICAgICAgKHByb3BzLnBhcmVudCBhcyBhbnkpLnBhcmVudElkIHx8XG4gICAgICAgICAgICAgIFwici1yb290XCIsIC8vIGF0dGVtcHQgdG8gbW92ZSBmcm9tIHJvb3RcbiAgICAgICAgICAgIERlc3RpbmF0aW9uUGFyZW50SWQ6IGRlc3RpbmF0aW9uUGFyZW50SWRcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKGBNb3ZlLSR7cGh5c2ljYWxJZH1gKSxcbiAgICAgICAgICAvLyBJZ25vcmUgaWYgaXQncyBhbHJlYWR5IGluIGNvcnJlY3QgT1VcbiAgICAgICAgICBpZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmc6XG4gICAgICAgICAgICBcIkFjY291bnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9ufER1cGxpY2F0ZUFjY291bnRFeGNlcHRpb258Q2hpbGROb3RGb3VuZEV4Y2VwdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHtcbiAgICAgICAgICByZXNvdXJjZXM6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LkFOWV9SRVNPVVJDRVxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSBhY2NvdW50IEFSTiBsYXppbHkgKHN0cnVjdHVyZTogYXJuOmF3czpvcmdhbml6YXRpb25zOjo8bWFuYWdlbWVudF9hY2NvdW50X2lkPjphY2NvdW50LzxvcmdfaWQ+LzxhY2NvdW50X2lkPilcbiAgICBjb25zdCBtYW5hZ2VtZW50QWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG4gICAgdGhpcy5hY2NvdW50QXJuID0gYGFybjphd3M6b3JnYW5pemF0aW9uczo6JHttYW5hZ2VtZW50QWNjb3VudH06YWNjb3VudC8qLyR7dGhpcy5hY2NvdW50SWR9YDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIEFjY291bnQsXG4gIE9yZ2FuaXphdGlvbixcbiAgT3JnYW5pemF0aW9uYWxVbml0LFxuICBGZWF0dXJlU2V0LFxuICBQb2xpY3lUeXBlXG59O1xuIl19
@@ -1,8 +0,0 @@
1
- export default class CidrBlock {
2
- private cidrBlock;
3
- private configFile;
4
- constructor();
5
- writeState(): void;
6
- getCidrBlock(): string;
7
- updateState(cidrBlock: string, status: boolean): void;
8
- }
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const fs = require("fs");
4
- class CidrBlock {
5
- constructor() {
6
- this.configFile = "../cidr-config.json";
7
- // Import config, or create it if it doesn't exist
8
- if (fs.existsSync(this.configFile)) {
9
- const configString = fs.readFileSync(this.configFile, "utf-8");
10
- this.cidrBlock = JSON.parse(configString);
11
- }
12
- else {
13
- this.cidrBlock = {};
14
- for (let i = 1; i <= 255; i++) {
15
- this.cidrBlock[`${i}.0.0.0/8`] = true;
16
- }
17
- const configString = JSON.stringify(this.cidrBlock, null, 2);
18
- fs.writeFileSync(this.configFile, configString);
19
- }
20
- }
21
- writeState() {
22
- // JSON-ify config and write to file
23
- const configString = JSON.stringify(this.cidrBlock, null, 2);
24
- fs.writeFileSync(this.configFile, configString);
25
- }
26
- getCidrBlock() {
27
- for (const key in this.cidrBlock) {
28
- if (this.cidrBlock[key]) {
29
- return key;
30
- }
31
- }
32
- return "0.0.0.0/8";
33
- }
34
- updateState(cidrBlock, status) {
35
- this.cidrBlock[cidrBlock] = status;
36
- this.writeState();
37
- }
38
- }
39
- exports.default = CidrBlock;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q2lkci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlscy9nZXRDaWRyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUJBQXlCO0FBTXpCLE1BQXFCLFNBQVM7SUFJNUI7UUFGUSxlQUFVLEdBQUcscUJBQXFCLENBQUM7UUFHekMsa0RBQWtEO1FBQ2xELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDeEMsQ0FBQztZQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0QsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLG9DQUFvQztRQUNwQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdELEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsWUFBWTtRQUNWLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFpQixFQUFFLE1BQWU7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXRDRCw0QkFzQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcblxuaW50ZXJmYWNlIGNpZHJUYWJsZSB7XG4gIFtrZXk6IHN0cmluZ106IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENpZHJCbG9jayB7XG4gIHByaXZhdGUgY2lkckJsb2NrOiBjaWRyVGFibGU7XG4gIHByaXZhdGUgY29uZmlnRmlsZSA9IFwiLi4vY2lkci1jb25maWcuanNvblwiO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEltcG9ydCBjb25maWcsIG9yIGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5jb25maWdGaWxlKSkge1xuICAgICAgY29uc3QgY29uZmlnU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuY29uZmlnRmlsZSwgXCJ1dGYtOFwiKTtcbiAgICAgIHRoaXMuY2lkckJsb2NrID0gSlNPTi5wYXJzZShjb25maWdTdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNpZHJCbG9jayA9IHt9O1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMjU1OyBpKyspIHtcbiAgICAgICAgdGhpcy5jaWRyQmxvY2tbYCR7aX0uMC4wLjAvOGBdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpZ1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2lkckJsb2NrLCBudWxsLCAyKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5jb25maWdGaWxlLCBjb25maWdTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlU3RhdGUoKSB7XG4gICAgLy8gSlNPTi1pZnkgY29uZmlnIGFuZCB3cml0ZSB0byBmaWxlXG4gICAgY29uc3QgY29uZmlnU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jaWRyQmxvY2ssIG51bGwsIDIpO1xuICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5jb25maWdGaWxlLCBjb25maWdTdHJpbmcpO1xuICB9XG5cbiAgZ2V0Q2lkckJsb2NrKCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY2lkckJsb2NrKSB7XG4gICAgICBpZiAodGhpcy5jaWRyQmxvY2tba2V5XSkge1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCIwLjAuMC4wLzhcIjtcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKGNpZHJCbG9jazogc3RyaW5nLCBzdGF0dXM6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNpZHJCbG9ja1tjaWRyQmxvY2tdID0gc3RhdHVzO1xuICAgIHRoaXMud3JpdGVTdGF0ZSgpO1xuICB9XG59XG4iXX0=