cdk-cost-analyzer 0.1.30 → 0.1.32
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/.cdk-cost-analyzer-cache/metadata.json +8 -8
- package/dist/config/types.d.ts +28 -0
- package/dist/config/types.js +1 -1
- package/dist/pricing/PricingService.js +5 -1
- package/dist/pricing/calculators/SNSCalculator.d.ts +54 -0
- package/dist/pricing/calculators/SNSCalculator.js +308 -0
- package/dist/pricing/calculators/SQSCalculator.d.ts +16 -0
- package/dist/pricing/calculators/SQSCalculator.js +124 -0
- package/dist/pricing/index.d.ts +2 -0
- package/dist/pricing/index.js +6 -2
- package/dist/releasetag.txt +1 -1
- package/docs/CALCULATORS.md +128 -2
- package/package.json +1 -1
|
@@ -2,35 +2,35 @@
|
|
|
2
2
|
"entries": {
|
|
3
3
|
"AmazonS3:US East (N. Virginia):storageClass:General Purpose|volumeType:Standard": {
|
|
4
4
|
"price": 0.023,
|
|
5
|
-
"timestamp":
|
|
5
|
+
"timestamp": 1770972967203
|
|
6
6
|
},
|
|
7
7
|
"AmazonDynamoDB:US East (N. Virginia):group:DDB-ReadUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
|
|
8
8
|
"price": 0.023,
|
|
9
|
-
"timestamp":
|
|
9
|
+
"timestamp": 1770972967209
|
|
10
10
|
},
|
|
11
11
|
"AmazonDynamoDB:US East (N. Virginia):group:DDB-WriteUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
|
|
12
12
|
"price": 0.023,
|
|
13
|
-
"timestamp":
|
|
13
|
+
"timestamp": 1770972967210
|
|
14
14
|
},
|
|
15
15
|
"AmazonEC2:US East (N. Virginia):capacitystatus:Used|instanceType:t3.micro|operatingSystem:Linux|preInstalledSw:NA|tenancy:Shared": {
|
|
16
16
|
"price": 0.023,
|
|
17
|
-
"timestamp":
|
|
17
|
+
"timestamp": 1770972967219
|
|
18
18
|
},
|
|
19
19
|
"AWSLambda:US East (N. Virginia):group:AWS-Lambda-Requests": {
|
|
20
20
|
"price": 0.023,
|
|
21
|
-
"timestamp":
|
|
21
|
+
"timestamp": 1770972967229
|
|
22
22
|
},
|
|
23
23
|
"AWSLambda:US East (N. Virginia):group:AWS-Lambda-Duration": {
|
|
24
24
|
"price": 0.023,
|
|
25
|
-
"timestamp":
|
|
25
|
+
"timestamp": 1770972967229
|
|
26
26
|
},
|
|
27
27
|
"AmazonS3:EU (Frankfurt):storageClass:General Purpose|volumeType:Standard": {
|
|
28
28
|
"price": 0.023,
|
|
29
|
-
"timestamp":
|
|
29
|
+
"timestamp": 1770972974708
|
|
30
30
|
},
|
|
31
31
|
"AmazonS3:invalid-region-123:storageClass:General Purpose|volumeType:Standard": {
|
|
32
32
|
"price": 0.023,
|
|
33
|
-
"timestamp":
|
|
33
|
+
"timestamp": 1770972974758
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -62,6 +62,34 @@ export interface UsageAssumptionsConfig {
|
|
|
62
62
|
vpcEndpoint?: {
|
|
63
63
|
dataProcessedGB?: number;
|
|
64
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* SNS (Simple Notification Service) usage assumptions.
|
|
67
|
+
* These values are used to estimate monthly costs for SNS topics.
|
|
68
|
+
*
|
|
69
|
+
* @see https://aws.amazon.com/sns/pricing/
|
|
70
|
+
*/
|
|
71
|
+
sns?: {
|
|
72
|
+
/** Number of publish requests per month (default: 1,000,000) */
|
|
73
|
+
monthlyPublishes?: number;
|
|
74
|
+
/** Number of HTTP/S deliveries per month (default: 1,000,000) */
|
|
75
|
+
httpDeliveries?: number;
|
|
76
|
+
/** Number of email deliveries per month (default: 0) */
|
|
77
|
+
emailDeliveries?: number;
|
|
78
|
+
/** Number of SMS deliveries per month (default: 0) */
|
|
79
|
+
smsDeliveries?: number;
|
|
80
|
+
/** Number of mobile push deliveries per month (default: 0) */
|
|
81
|
+
mobilePushDeliveries?: number;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* SQS usage assumptions for cost estimation.
|
|
85
|
+
* Applies to both Standard and FIFO queues.
|
|
86
|
+
*
|
|
87
|
+
* @see https://aws.amazon.com/sqs/pricing/
|
|
88
|
+
*/
|
|
89
|
+
sqs?: {
|
|
90
|
+
/** Number of requests per month (default: 1,000,000) */
|
|
91
|
+
monthlyRequests?: number;
|
|
92
|
+
};
|
|
65
93
|
/**
|
|
66
94
|
* Step Functions usage assumptions for cost estimation.
|
|
67
95
|
*
|
package/dist/config/types.js
CHANGED
|
@@ -12,4 +12,4 @@ class ConfigurationError extends Error {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
exports.ConfigurationError = ConfigurationError;
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXVJQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlc2hvbGRDb25maWcge1xuICBkZWZhdWx0PzogVGhyZXNob2xkTGV2ZWxzO1xuICBlbnZpcm9ubWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBUaHJlc2hvbGRMZXZlbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZExldmVscyB7XG4gIHdhcm5pbmc/OiBudW1iZXI7XG4gIGVycm9yPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlQXNzdW1wdGlvbnNDb25maWcge1xuICBzMz86IHtcbiAgICBzdG9yYWdlR0I/OiBudW1iZXI7XG4gICAgZ2V0UmVxdWVzdHM/OiBudW1iZXI7XG4gICAgcHV0UmVxdWVzdHM/OiBudW1iZXI7XG4gIH07XG4gIGxhbWJkYT86IHtcbiAgICBpbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyO1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogRHluYW1vREIgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIG9uLWRlbWFuZCAocGF5LXBlci1yZXF1ZXN0KSBiaWxsaW5nIG1vZGUuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBEeW5hbW9EQiB0YWJsZXNcbiAgICogY29uZmlndXJlZCB3aXRoIEJpbGxpbmdNb2RlOiBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEZvciBwcm92aXNpb25lZCBiaWxsaW5nIG1vZGUsIGNvc3RzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZVxuICAgKiBSZWFkQ2FwYWNpdHlVbml0cyBhbmQgV3JpdGVDYXBhY2l0eVVuaXRzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9keW5hbW9kYi9wcmljaW5nL1xuICAgKi9cbiAgZHluYW1vZGI/OiB7XG4gICAgLyoqIE51bWJlciBvZiByZWFkIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwLDAwMCkgKi9cbiAgICByZWFkUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIHdyaXRlUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgfTtcbiAgbmF0R2F0ZXdheT86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIGFsYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBubGI/OiB7XG4gICAgbmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQ/OiBudW1iZXI7XG4gICAgYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGU/OiBudW1iZXI7XG4gICAgcHJvY2Vzc2VkQnl0ZXNHQj86IG51bWJlcjtcbiAgfTtcbiAgY2xvdWRmcm9udD86IHtcbiAgICBkYXRhVHJhbnNmZXJHQj86IG51bWJlcjtcbiAgICByZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgYXBpR2F0ZXdheT86IHtcbiAgICByZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICB9O1xuICB2cGNFbmRwb2ludD86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTTlMgKFNpbXBsZSBOb3RpZmljYXRpb24gU2VydmljZSkgdXNhZ2UgYXNzdW1wdGlvbnMuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBTTlMgdG9waWNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vc25zL3ByaWNpbmcvXG4gICAqL1xuICBzbnM/OiB7XG4gICAgLyoqIE51bWJlciBvZiBwdWJsaXNoIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIG1vbnRobHlQdWJsaXNoZXM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBIVFRQL1MgZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDEsMDAwLDAwMCkgKi9cbiAgICBodHRwRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIGVtYWlsIGRlbGl2ZXJpZXMgcGVyIG1vbnRoIChkZWZhdWx0OiAwKSAqL1xuICAgIGVtYWlsRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIFNNUyBkZWxpdmVyaWVzIHBlciBtb250aCAoZGVmYXVsdDogMCkgKi9cbiAgICBzbXNEZWxpdmVyaWVzPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgbW9iaWxlIHB1c2ggZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDApICovXG4gICAgbW9iaWxlUHVzaERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTUVMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICogQXBwbGllcyB0byBib3RoIFN0YW5kYXJkIGFuZCBGSUZPIHF1ZXVlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3Nxcy9wcmljaW5nL1xuICAgKi9cbiAgc3FzPzoge1xuICAgIC8qKiBOdW1iZXIgb2YgcmVxdWVzdHMgcGVyIG1vbnRoIChkZWZhdWx0OiAxLDAwMCwwMDApICovXG4gICAgbW9udGhseVJlcXVlc3RzPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU3RlcCBGdW5jdGlvbnMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICpcbiAgICogU3RhbmRhcmQgd29ya2Zsb3dzIGFyZSBjaGFyZ2VkIHBlciBzdGF0ZSB0cmFuc2l0aW9uLlxuICAgKiBFeHByZXNzIHdvcmtmbG93cyBhcmUgY2hhcmdlZCBwZXIgcmVxdWVzdCBhbmQgcGVyIEdCLXNlY29uZCBvZiBkdXJhdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3N0ZXAtZnVuY3Rpb25zL3ByaWNpbmcvXG4gICAqL1xuICBzdGVwRnVuY3Rpb25zPzoge1xuICAgIC8qKiBOdW1iZXIgb2Ygd29ya2Zsb3cgZXhlY3V0aW9ucyBwZXIgbW9udGggKGRlZmF1bHQ6IDEwLDAwMCkgKi9cbiAgICBtb250aGx5RXhlY3V0aW9ucz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHN0YXRlIHRyYW5zaXRpb25zIHBlciBleGVjdXRpb24gKGRlZmF1bHQ6IDEwLCBmb3IgU3RhbmRhcmQgd29ya2Zsb3dzKSAqL1xuICAgIHN0YXRlVHJhbnNpdGlvbnNQZXJFeGVjdXRpb24/OiBudW1iZXI7XG4gICAgLyoqIEF2ZXJhZ2UgZXhlY3V0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMTAwMCwgZm9yIEV4cHJlc3Mgd29ya2Zsb3dzKSAqL1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoZXNpc0NvbmZpZyB7XG4gIGFwcFBhdGg/OiBzdHJpbmc7XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIGN1c3RvbUNvbW1hbmQ/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2x1c2lvbnNDb25maWcge1xuICByZXNvdXJjZVR5cGVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgZHVyYXRpb25Ib3Vycz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgdmFsaWQ6IGJvb2xlYW47XG4gIGVycm9yczogc3RyaW5nW107XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyBjb25maWdQYXRoOiBzdHJpbmcsXG4gICAgcHVibGljIHZhbGlkYXRpb25FcnJvcnM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29uZmlndXJhdGlvbkVycm9yJztcbiAgfVxufVxuIl19
|
|
@@ -16,6 +16,8 @@ const NatGatewayCalculator_1 = require("./calculators/NatGatewayCalculator");
|
|
|
16
16
|
const NLBCalculator_1 = require("./calculators/NLBCalculator");
|
|
17
17
|
const RDSCalculator_1 = require("./calculators/RDSCalculator");
|
|
18
18
|
const S3Calculator_1 = require("./calculators/S3Calculator");
|
|
19
|
+
const SNSCalculator_1 = require("./calculators/SNSCalculator");
|
|
20
|
+
const SQSCalculator_1 = require("./calculators/SQSCalculator");
|
|
19
21
|
const StepFunctionsCalculator_1 = require("./calculators/StepFunctionsCalculator");
|
|
20
22
|
const VPCEndpointCalculator_1 = require("./calculators/VPCEndpointCalculator");
|
|
21
23
|
const PricingClient_1 = require("./PricingClient");
|
|
@@ -56,6 +58,8 @@ class PricingService {
|
|
|
56
58
|
new ElastiCacheCalculator_1.ElastiCacheCalculator(),
|
|
57
59
|
new AutoScalingGroupCalculator_1.AutoScalingGroupCalculator(),
|
|
58
60
|
new LaunchTemplateCalculator_1.LaunchTemplateCalculator(),
|
|
61
|
+
new SNSCalculator_1.SNSCalculator(usageAssumptions?.sns?.monthlyPublishes, usageAssumptions?.sns?.httpDeliveries, usageAssumptions?.sns?.emailDeliveries, usageAssumptions?.sns?.smsDeliveries, usageAssumptions?.sns?.mobilePushDeliveries),
|
|
62
|
+
new SQSCalculator_1.SQSCalculator(config),
|
|
59
63
|
new StepFunctionsCalculator_1.StepFunctionsCalculator(usageAssumptions?.stepFunctions?.monthlyExecutions, usageAssumptions?.stepFunctions?.stateTransitionsPerExecution, usageAssumptions?.stepFunctions?.averageDurationMs),
|
|
60
64
|
];
|
|
61
65
|
}
|
|
@@ -170,4 +174,4 @@ class PricingService {
|
|
|
170
174
|
}
|
|
171
175
|
}
|
|
172
176
|
exports.PricingService = PricingService;
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpY2luZ1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9QcmljaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBOEM7QUFDOUMsK0RBQTREO0FBQzVELDZFQUEwRTtBQUMxRSx5RkFBc0Y7QUFDdEYsNkVBQTBFO0FBQzFFLHlFQUFzRTtBQUN0RSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELCtFQUE0RTtBQUM1RSxxRUFBa0U7QUFDbEUscUZBQWtGO0FBQ2xGLDZFQUEwRTtBQUMxRSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELDZEQUEwRDtBQUMxRCxtRkFBZ0Y7QUFDaEYsK0VBQTRFO0FBQzVFLG1EQUFnRDtBQVVoRCxNQUFhLGNBQWM7SUFDakIsV0FBVyxDQUEyQjtJQUN0QyxhQUFhLENBQWdCO0lBQzdCLHFCQUFxQixDQUFjO0lBRTNDLFlBQ0UsU0FBaUIsV0FBVyxFQUM1QixnQkFBeUMsRUFDekMscUJBQWdDLEVBQ2hDLFdBQXlCLEVBQ3pCLGFBQTZCO1FBRTdCLGtEQUFrRDtRQUNsRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04saURBQWlEO1lBQ2pELElBQUksWUFBc0MsQ0FBQztZQUMzQyxJQUFJLFdBQVcsRUFBRSxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sYUFBYSxHQUFHLFdBQVcsRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDO2dCQUN2RCxZQUFZLEdBQUcsSUFBSSwyQkFBWSxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksNkJBQWEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELElBQUksQ0FBQyxxQkFB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TUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbEYsTUFBTSxVQUFVLEdBQUcsY0FBYyxHQUFHLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO1FBRTFFLE9BQU87WUFDTCxVQUFVO1lBQ1YsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVO1lBQ1YsWUFBWTtZQUNaLGFBQWE7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBcE1ELHdDQW9NQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gJy4vQ2FjaGVNYW5hZ2VyJztcbmltcG9ydCB7IEFMQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0FMQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgQVBJR2F0ZXdheUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0FQSUdhdGV3YXlDYWxjdWxhdG9yJztcbmltcG9ydCB7IEF1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9BdXRvU2NhbGluZ0dyb3VwQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBDbG91ZEZyb250Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQ2xvdWRGcm9udENhbGN1bGF0b3InO1xuaW1wb3J0IHsgRHluYW1vREJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9EeW5hbW9EQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgRUMyQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRUMyQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFQ1NDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQ1NDYWxjdWxhdG9yJztcbmltcG9ydCB7IEVsYXN0aUNhY2hlQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRWxhc3RpQ2FjaGVDYWxjdWxhdG9yJztcbmltcG9ydCB7IExhbWJkYUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9MYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTmF0R2F0ZXdheUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05hdEdhdGV3YXlDYWxjdWxhdG9yJztcbmltcG9ydCB7IE5MQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05MQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgUkRTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUkRTQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTM0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1MzQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTdGVwRnVuY3Rpb25zQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgVlBDRW5kcG9pbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9WUENFbmRwb2ludENhbGN1bGF0b3InO1xuaW1wb3J0IHsgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4vUHJpY2luZ0NsaWVudCc7XG5pbXBvcnQge1xuICBQcmljaW5nU2VydmljZSBhcyBJUHJpY2luZ1NlcnZpY2UsXG4gIE1vbnRobHlDb3N0LFxuICBDb3N0RGVsdGEsXG4gIFJlc291cmNlQ29zdENhbGN1bGF0b3IsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZywgQ2FjaGVDb25maWcsIENvc3RBbmFseXplckNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCwgUmVzb3VyY2VEaWZmIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBQcmljaW5nU2VydmljZSBpbXBsZW1lbnRzIElQcmljaW5nU2VydmljZSB7XG4gIHByaXZhdGUgY2FsY3VsYXRvcnM6IFJlc291cmNlQ29zdENhbGN1bGF0b3JbXTtcbiAgcHJpdmF0ZSBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50O1xuICBwcml2YXRlIGV4Y2x1ZGVkUmVzb3VyY2VUeXBlczogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVnaW9uOiBzdHJpbmcgPSAndXMtZWFzdC0xJyxcbiAgICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZyxcbiAgICBleGNsdWRlZFJlc291cmNlVHlwZXM/OiBzdHJpbmdbXSxcbiAgICBjYWNoZUNvbmZpZz86IENhY2hlQ29uZmlnLFxuICAgIHByaWNpbmdDbGllbnQ/OiBQcmljaW5nQ2xpZW50LFxuICApIHtcbiAgICAvLyBVc2UgcHJvdmlkZWQgcHJpY2luZyBjbGllbnQgb3IgY3JlYXRlIGEgbmV3IG9uZVxuICAgIGlmIChwcmljaW5nQ2xpZW50KSB7XG4gICAgICB0aGlzLnByaWNpbmdDbGllbnQgPSBwcmljaW5nQ2xpZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbml0aWFsaXplIGNhY2hlIG1hbmFnZXIgaWYgY2FjaGluZyBpcyBlbmFibGVkXG4gICAgICBsZXQgY2FjaGVNYW5hZ2VyOiBDYWNoZU1hbmFnZXIgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGVDb25maWc/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlRHVyYXRpb24gPSBjYWNoZUNvbmZpZz8uZHVyYXRpb25Ib3VycyA/PyAyNDtcbiAgICAgICAgY2FjaGVNYW5hZ2VyID0gbmV3IENhY2hlTWFuYWdlcignLmNkay1jb3N0LWFuYWx5emVyLWNhY2hlJywgY2FjaGVEdXJhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJpY2luZ0NsaWVudCA9IG5ldyBQcmljaW5nQ2xpZW50KHJlZ2lvbiwgY2FjaGVNYW5hZ2VyKTtcbiAgICB9XG4gICAgdGhpcy5leGNsdWRlZFJlc291cmNlVHlwZXMgPSBuZXcgU2V0KGV4Y2x1ZGVkUmVzb3VyY2VUeXBlcyB8fCBbXSk7XG4gICAgXG4gICAgLy8gQnVpbGQgY29uZmlnIG9iamVjdCBmb3IgY2FsY3VsYXRvcnMgdGhhdCBuZWVkIGl0XG4gICAgY29uc3QgY29uZmlnOiBDb3N0QW5hbHl6ZXJDb25maWcgfCB1bmRlZmluZWQgPSB1c2FnZUFzc3VtcHRpb25zID8geyB1c2FnZUFzc3VtcHRpb25zIH0gOiB1bmRlZmluZWQ7XG4gICAgXG4gICAgdGhpcy5jYWxjdWxhdG9ycyA9IFtcbiAgICAgIG5ldyBFQzJDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgUzNDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTGFtYmRhQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubGFtYmRhPy5pbnZvY2F0aW9uc1Blck1vbnRoLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5sYW1iZGE/LmF2ZXJhZ2VEdXJhdGlvbk1zLFxuICAgICAgKSxcbiAgICAgIG5ldyBSRFNDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgRHluYW1vREJDYWxjdWxhdG9yKGNvbmZpZyksXG4gICAgICBuZXcgRUNTQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IEFQSUdhdGV3YXlDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTmF0R2F0ZXdheUNhbGN1bGF0b3IodXNhZ2VBc3N1bXB0aW9ucz8ubmF0R2F0ZXdheT8uZGF0YVByb2Nlc3NlZEdCKSxcbiAgICAgIG5ldyBBTEJDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/Lm5ld0Nvbm5lY3Rpb25zUGVyU2Vjb25kLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/LmFjdGl2ZUNvbm5lY3Rpb25zUGVyTWludXRlLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/LnByb2Nlc3NlZEJ5dGVzR0IsXG4gICAgICApLFxuICAgICAgbmV3IE5MQkNhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8ubmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8uYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGUsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8ucHJvY2Vzc2VkQnl0ZXNHQixcbiAgICAgICksXG4gICAgICBuZXcgVlBDRW5kcG9pbnRDYWxjdWxhdG9yKHVzYWdlQXNzdW1wdGlvbnM/LnZwY0VuZHBvaW50Py5kYXRhUHJvY2Vzc2VkR0IpLFxuICAgICAgbmV3IENsb3VkRnJvbnRDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5jbG91ZGZyb250Py5kYXRhVHJhbnNmZXJHQixcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uY2xvdWRmcm9udD8ucmVxdWVzdHMsXG4gICAgICApLFxuICAgICAgbmV3IEVsYXN0aUNhY2hlQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IEF1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LnN0ZXBGdW5jdGlvbnM/Lm1vbnRobHlFeGVjdXRpb25zLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5zdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5hdmVyYWdlRHVyYXRpb25NcyxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlc291cmNlQ29zdChyZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsIHJlZ2lvbjogc3RyaW5nLCB0ZW1wbGF0ZVJlc291cmNlcz86IFJlc291cmNlV2l0aElkW10pOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgLy8gQ2hlY2sgaWYgcmVzb3VyY2UgdHlwZSBpcyBleGNsdWRlZFxuICAgIGlmICh0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMocmVzb3VyY2UudHlwZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnaGlnaCcsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYFJlc291cmNlIHR5cGUgJHtyZXNvdXJjZS50eXBlfSBpcyBleGNsdWRlZCBmcm9tIGNvc3QgYW5hbHlzaXNgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCBjYWxjdWxhdG9yIHVzaW5nIGNhbkNhbGN1bGF0ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gc3VwcG9ydHNcbiAgICBjb25zdCBjYWxjdWxhdG9yID0gdGhpcy5jYWxjdWxhdG9ycy5maW5kKGNhbGMgPT4ge1xuICAgICAgaWYgKGNhbGMuY2FuQ2FsY3VsYXRlKSB7XG4gICAgICAgIHJldHVybiBjYWxjLmNhbkNhbGN1bGF0ZShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsYy5zdXBwb3J0cyhyZXNvdXJjZS50eXBlKTtcbiAgICB9KTtcblxuICAgIGlmICghY2FsY3VsYXRvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgUmVzb3VyY2UgdHlwZSAke3Jlc291cmNlLnR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxjdWxhdG9yLmNhbGN1bGF0ZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgdGhpcy5wcmljaW5nQ2xpZW50LCB0ZW1wbGF0ZVJlc291cmNlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBjYWxjdWxhdGUgY29zdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvc3REZWx0YShkaWZmOiBSZXNvdXJjZURpZmYsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb3N0RGVsdGE+IHtcbiAgICAvLyBGaWx0ZXIgb3V0IGV4Y2x1ZGVkIHJlc291cmNlcyBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IGZpbHRlcmVkQWRkZWQgPSBkaWZmLmFkZGVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRSZW1vdmVkID0gZGlmZi5yZW1vdmVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRNb2RpZmllZCA9IGRpZmYubW9kaWZpZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcblxuICAgIC8vIEJ1aWxkIHRlbXBsYXRlIHJlc291cmNlIGNvbnRleHQgZnJvbSBhbGwgcmVzb3VyY2VzIGluIHRoZSBkaWZmXG4gICAgY29uc3QgYWxsUmVzb3VyY2VzOiBSZXNvdXJjZVdpdGhJZFtdID0gW1xuICAgICAgLi4uZGlmZi5hZGRlZCxcbiAgICAgIC4uLmRpZmYucmVtb3ZlZCxcbiAgICAgIC4uLmRpZmYubW9kaWZpZWQubWFwKHIgPT4gKHtcbiAgICAgICAgbG9naWNhbElkOiByLmxvZ2ljYWxJZCxcbiAgICAgICAgdHlwZTogci50eXBlLFxuICAgICAgICBwcm9wZXJ0aWVzOiByLm5ld1Byb3BlcnRpZXMsXG4gICAgICB9KSksXG4gICAgXTtcblxuICAgIGNvbnN0IGFkZGVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkQWRkZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlLCByZWdpb24sIGFsbFJlc291cmNlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBtb250aGx5Q29zdCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCByZW1vdmVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkUmVtb3ZlZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGlmaWVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkTW9kaWZpZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5vbGRQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5uZXdQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9sZE1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3Qob2xkUmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChuZXdSZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICBjb25zdCBjb3N0RGVsdGEgPSBuZXdNb250aGx5Q29zdC5hbW91bnQgLSBvbGRNb250aGx5Q29zdC5hbW91bnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0OiBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBvbGRNb250aGx5Q29zdCxcbiAgICAgICAgICBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBjb3N0RGVsdGEsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgdG90YWxBZGRlZENvc3QgPSBhZGRlZENvc3RzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxSZW1vdmVkQ29zdCA9IHJlbW92ZWRDb3N0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5tb250aGx5Q29zdC5hbW91bnQsIDApO1xuICAgIGNvbnN0IHRvdGFsTW9kaWZpZWREZWx0YSA9IG1vZGlmaWVkQ29zdHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIuY29zdERlbHRhLCAwKTtcblxuICAgIGNvbnN0IHRvdGFsRGVsdGEgPSB0b3RhbEFkZGVkQ29zdCAtIHRvdGFsUmVtb3ZlZENvc3QgKyB0b3RhbE1vZGlmaWVkRGVsdGE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxEZWx0YSxcbiAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgIGFkZGVkQ29zdHMsXG4gICAgICByZW1vdmVkQ29zdHMsXG4gICAgICBtb2RpZmllZENvc3RzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb3VyY2VzIGFuZCBjb25uZWN0aW9uc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnByaWNpbmdDbGllbnQuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpY2luZ1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9QcmljaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBOEM7QUFDOUMsK0RBQTREO0FBQzVELDZFQUEwRTtBQUMxRSx5RkFBc0Y7QUFDdEYsNkVBQTBFO0FBQzFFLHlFQUFzRTtBQUN0RSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELCtFQUE0RTtBQUM1RSxxRUFBa0U7QUFDbEUscUZBQWtGO0FBQ2xGLDZFQUEwRTtBQUMxRSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELDZEQUEwRDtBQUMxRCwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELG1GQUFnRjtBQUNoRiwrRUFBNEU7QUFDNUUsbURBQWdEO0FBVWhELE1BQWEsY0FBYztJQUNqQixXQUFXLENBQTJCO0lBQ3RDLGFBQWEsQ0FBZ0I7SUFDN0IscUJBQXFCLENBQWM7SUFFM0MsWUFDRSxTQUFpQixXQUFXLEVBQzVCLGdCQUF5QyxFQUN6QyxxQkFBZ0MsRUFDaEMsV0FBeUIsRUFDekIsYUFBNkI7UUFFN0Isa0RBQWtEO1FBQ2xELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixpREFBaUQ7WUFDakQsSUFBSSxZQUFzQyxDQUFDO1lBQzNDLElBQUksV0FBVyxFQUFFLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxhQUFhLEdBQUcsV0FBVyxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELFlBQVksR0FBRyxJQUFJLDJCQUFZLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMv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QUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RixNQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVsRixNQUFNLFVBQVUsR0FBRyxjQUFjLEdBQUcsZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7UUFFMUUsT0FBTztZQUNMLFVBQVU7WUFDVixRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVU7WUFDVixZQUFZO1lBQ1osYUFBYTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUE1TUQsd0NBNE1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSAnLi9DYWNoZU1hbmFnZXInO1xuaW1wb3J0IHsgQUxCQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQUxCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBBUElHYXRld2F5Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQVBJR2F0ZXdheUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0F1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yJztcbmltcG9ydCB7IENsb3VkRnJvbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9DbG91ZEZyb250Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBEeW5hbW9EQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0R5bmFtb0RCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFQzJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQzJDYWxjdWxhdG9yJztcbmltcG9ydCB7IEVDU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VDU0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FbGFzdGlDYWNoZUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTGFtYmRhQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTGFtYmRhQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBMYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBOYXRHYXRld2F5Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTmF0R2F0ZXdheUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTkxCQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTkxCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBSRFNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9SRFNDYWxjdWxhdG9yJztcbmltcG9ydCB7IFMzQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUzNDYWxjdWxhdG9yJztcbmltcG9ydCB7IFNOU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1NOU0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgU1FTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU1FTQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTdGVwRnVuY3Rpb25zQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgVlBDRW5kcG9pbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9WUENFbmRwb2ludENhbGN1bGF0b3InO1xuaW1wb3J0IHsgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4vUHJpY2luZ0NsaWVudCc7XG5pbXBvcnQge1xuICBQcmljaW5nU2VydmljZSBhcyBJUHJpY2luZ1NlcnZpY2UsXG4gIE1vbnRobHlDb3N0LFxuICBDb3N0RGVsdGEsXG4gIFJlc291cmNlQ29zdENhbGN1bGF0b3IsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZywgQ2FjaGVDb25maWcsIENvc3RBbmFseXplckNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCwgUmVzb3VyY2VEaWZmIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBQcmljaW5nU2VydmljZSBpbXBsZW1lbnRzIElQcmljaW5nU2VydmljZSB7XG4gIHByaXZhdGUgY2FsY3VsYXRvcnM6IFJlc291cmNlQ29zdENhbGN1bGF0b3JbXTtcbiAgcHJpdmF0ZSBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50O1xuICBwcml2YXRlIGV4Y2x1ZGVkUmVzb3VyY2VUeXBlczogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVnaW9uOiBzdHJpbmcgPSAndXMtZWFzdC0xJyxcbiAgICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZyxcbiAgICBleGNsdWRlZFJlc291cmNlVHlwZXM/OiBzdHJpbmdbXSxcbiAgICBjYWNoZUNvbmZpZz86IENhY2hlQ29uZmlnLFxuICAgIHByaWNpbmdDbGllbnQ/OiBQcmljaW5nQ2xpZW50LFxuICApIHtcbiAgICAvLyBVc2UgcHJvdmlkZWQgcHJpY2luZyBjbGllbnQgb3IgY3JlYXRlIGEgbmV3IG9uZVxuICAgIGlmIChwcmljaW5nQ2xpZW50KSB7XG4gICAgICB0aGlzLnByaWNpbmdDbGllbnQgPSBwcmljaW5nQ2xpZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbml0aWFsaXplIGNhY2hlIG1hbmFnZXIgaWYgY2FjaGluZyBpcyBlbmFibGVkXG4gICAgICBsZXQgY2FjaGVNYW5hZ2VyOiBDYWNoZU1hbmFnZXIgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGVDb25maWc/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlRHVyYXRpb24gPSBjYWNoZUNvbmZpZz8uZHVyYXRpb25Ib3VycyA/PyAyNDtcbiAgICAgICAgY2FjaGVNYW5hZ2VyID0gbmV3IENhY2hlTWFuYWdlcignLmNkay1jb3N0LWFuYWx5emVyLWNhY2hlJywgY2FjaGVEdXJhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJpY2luZ0NsaWVudCA9IG5ldyBQcmljaW5nQ2xpZW50KHJlZ2lvbiwgY2FjaGVNYW5hZ2VyKTtcbiAgICB9XG4gICAgdGhpcy5leGNsdWRlZFJlc291cmNlVHlwZXMgPSBuZXcgU2V0KGV4Y2x1ZGVkUmVzb3VyY2VUeXBlcyB8fCBbXSk7XG4gICAgXG4gICAgLy8gQnVpbGQgY29uZmlnIG9iamVjdCBmb3IgY2FsY3VsYXRvcnMgdGhhdCBuZWVkIGl0XG4gICAgY29uc3QgY29uZmlnOiBDb3N0QW5hbHl6ZXJDb25maWcgfCB1bmRlZmluZWQgPSB1c2FnZUFzc3VtcHRpb25zID8geyB1c2FnZUFzc3VtcHRpb25zIH0gOiB1bmRlZmluZWQ7XG4gICAgXG4gICAgdGhpcy5jYWxjdWxhdG9ycyA9IFtcbiAgICAgIG5ldyBFQzJDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgUzNDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTGFtYmRhQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubGFtYmRhPy5pbnZvY2F0aW9uc1Blck1vbnRoLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5sYW1iZGE/LmF2ZXJhZ2VEdXJhdGlvbk1zLFxuICAgICAgKSxcbiAgICAgIG5ldyBSRFNDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgRHluYW1vREJDYWxjdWxhdG9yKGNvbmZpZyksXG4gICAgICBuZXcgRUNTQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IEFQSUdhdGV3YXlDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTmF0R2F0ZXdheUNhbGN1bGF0b3IodXNhZ2VBc3N1bXB0aW9ucz8ubmF0R2F0ZXdheT8uZGF0YVByb2Nlc3NlZEdCKSxcbiAgICAgIG5ldyBBTEJDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/Lm5ld0Nvbm5lY3Rpb25zUGVyU2Vjb25kLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/LmFjdGl2ZUNvbm5lY3Rpb25zUGVyTWludXRlLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/LnByb2Nlc3NlZEJ5dGVzR0IsXG4gICAgICApLFxuICAgICAgbmV3IE5MQkNhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8ubmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8uYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGUsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8ucHJvY2Vzc2VkQnl0ZXNHQixcbiAgICAgICksXG4gICAgICBuZXcgVlBDRW5kcG9pbnRDYWxjdWxhdG9yKHVzYWdlQXNzdW1wdGlvbnM/LnZwY0VuZHBvaW50Py5kYXRhUHJvY2Vzc2VkR0IpLFxuICAgICAgbmV3IENsb3VkRnJvbnRDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5jbG91ZGZyb250Py5kYXRhVHJhbnNmZXJHQixcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uY2xvdWRmcm9udD8ucmVxdWVzdHMsXG4gICAgICApLFxuICAgICAgbmV3IEVsYXN0aUNhY2hlQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IEF1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgU05TQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5tb250aGx5UHVibGlzaGVzLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zbnM/Lmh0dHBEZWxpdmVyaWVzLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zbnM/LmVtYWlsRGVsaXZlcmllcyxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5zbXNEZWxpdmVyaWVzLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zbnM/Lm1vYmlsZVB1c2hEZWxpdmVyaWVzLFxuICAgICAgKSxcbiAgICAgIG5ldyBTUVNDYWxjdWxhdG9yKGNvbmZpZyksXG4gICAgICBuZXcgU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LnN0ZXBGdW5jdGlvbnM/Lm1vbnRobHlFeGVjdXRpb25zLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5zdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5hdmVyYWdlRHVyYXRpb25NcyxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlc291cmNlQ29zdChyZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsIHJlZ2lvbjogc3RyaW5nLCB0ZW1wbGF0ZVJlc291cmNlcz86IFJlc291cmNlV2l0aElkW10pOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgLy8gQ2hlY2sgaWYgcmVzb3VyY2UgdHlwZSBpcyBleGNsdWRlZFxuICAgIGlmICh0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMocmVzb3VyY2UudHlwZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnaGlnaCcsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYFJlc291cmNlIHR5cGUgJHtyZXNvdXJjZS50eXBlfSBpcyBleGNsdWRlZCBmcm9tIGNvc3QgYW5hbHlzaXNgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCBjYWxjdWxhdG9yIHVzaW5nIGNhbkNhbGN1bGF0ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gc3VwcG9ydHNcbiAgICBjb25zdCBjYWxjdWxhdG9yID0gdGhpcy5jYWxjdWxhdG9ycy5maW5kKGNhbGMgPT4ge1xuICAgICAgaWYgKGNhbGMuY2FuQ2FsY3VsYXRlKSB7XG4gICAgICAgIHJldHVybiBjYWxjLmNhbkNhbGN1bGF0ZShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsYy5zdXBwb3J0cyhyZXNvdXJjZS50eXBlKTtcbiAgICB9KTtcblxuICAgIGlmICghY2FsY3VsYXRvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgUmVzb3VyY2UgdHlwZSAke3Jlc291cmNlLnR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxjdWxhdG9yLmNhbGN1bGF0ZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgdGhpcy5wcmljaW5nQ2xpZW50LCB0ZW1wbGF0ZVJlc291cmNlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBjYWxjdWxhdGUgY29zdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvc3REZWx0YShkaWZmOiBSZXNvdXJjZURpZmYsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb3N0RGVsdGE+IHtcbiAgICAvLyBGaWx0ZXIgb3V0IGV4Y2x1ZGVkIHJlc291cmNlcyBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IGZpbHRlcmVkQWRkZWQgPSBkaWZmLmFkZGVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRSZW1vdmVkID0gZGlmZi5yZW1vdmVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRNb2RpZmllZCA9IGRpZmYubW9kaWZpZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcblxuICAgIC8vIEJ1aWxkIHRlbXBsYXRlIHJlc291cmNlIGNvbnRleHQgZnJvbSBhbGwgcmVzb3VyY2VzIGluIHRoZSBkaWZmXG4gICAgY29uc3QgYWxsUmVzb3VyY2VzOiBSZXNvdXJjZVdpdGhJZFtdID0gW1xuICAgICAgLi4uZGlmZi5hZGRlZCxcbiAgICAgIC4uLmRpZmYucmVtb3ZlZCxcbiAgICAgIC4uLmRpZmYubW9kaWZpZWQubWFwKHIgPT4gKHtcbiAgICAgICAgbG9naWNhbElkOiByLmxvZ2ljYWxJZCxcbiAgICAgICAgdHlwZTogci50eXBlLFxuICAgICAgICBwcm9wZXJ0aWVzOiByLm5ld1Byb3BlcnRpZXMsXG4gICAgICB9KSksXG4gICAgXTtcblxuICAgIGNvbnN0IGFkZGVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkQWRkZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlLCByZWdpb24sIGFsbFJlc291cmNlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBtb250aGx5Q29zdCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCByZW1vdmVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkUmVtb3ZlZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGlmaWVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkTW9kaWZpZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5vbGRQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5uZXdQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9sZE1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3Qob2xkUmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChuZXdSZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICBjb25zdCBjb3N0RGVsdGEgPSBuZXdNb250aGx5Q29zdC5hbW91bnQgLSBvbGRNb250aGx5Q29zdC5hbW91bnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0OiBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBvbGRNb250aGx5Q29zdCxcbiAgICAgICAgICBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBjb3N0RGVsdGEsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgdG90YWxBZGRlZENvc3QgPSBhZGRlZENvc3RzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxSZW1vdmVkQ29zdCA9IHJlbW92ZWRDb3N0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5tb250aGx5Q29zdC5hbW91bnQsIDApO1xuICAgIGNvbnN0IHRvdGFsTW9kaWZpZWREZWx0YSA9IG1vZGlmaWVkQ29zdHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIuY29zdERlbHRhLCAwKTtcblxuICAgIGNvbnN0IHRvdGFsRGVsdGEgPSB0b3RhbEFkZGVkQ29zdCAtIHRvdGFsUmVtb3ZlZENvc3QgKyB0b3RhbE1vZGlmaWVkRGVsdGE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxEZWx0YSxcbiAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgIGFkZGVkQ29zdHMsXG4gICAgICByZW1vdmVkQ29zdHMsXG4gICAgICBtb2RpZmllZENvc3RzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb3VyY2VzIGFuZCBjb25uZWN0aW9uc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnByaWNpbmdDbGllbnQuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ResourceWithId } from '../../diff/types';
|
|
2
|
+
import { ResourceCostCalculator, MonthlyCost, PricingClient } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Cost breakdown for SNS pricing components
|
|
5
|
+
*/
|
|
6
|
+
export interface SNSCostBreakdown {
|
|
7
|
+
publishCost: number;
|
|
8
|
+
httpDeliveryCost: number;
|
|
9
|
+
emailDeliveryCost: number;
|
|
10
|
+
smsDeliveryCost: number;
|
|
11
|
+
mobilePushDeliveryCost: number;
|
|
12
|
+
totalCost: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Calculator for AWS::SNS::Topic resources.
|
|
16
|
+
*
|
|
17
|
+
* SNS Pricing Model (as of 2024):
|
|
18
|
+
* - Publishes: $0.50 per million requests (first 1M free)
|
|
19
|
+
* - HTTP/S deliveries: $0.60 per million
|
|
20
|
+
* - Email deliveries: $2.00 per 100,000
|
|
21
|
+
* - SMS: Varies by country (using US rate as default)
|
|
22
|
+
* - Mobile push: $0.50 per million
|
|
23
|
+
*
|
|
24
|
+
* @see https://aws.amazon.com/sns/pricing/
|
|
25
|
+
*/
|
|
26
|
+
export declare class SNSCalculator implements ResourceCostCalculator {
|
|
27
|
+
private readonly customMonthlyPublishes?;
|
|
28
|
+
private readonly customHttpDeliveries?;
|
|
29
|
+
private readonly customEmailDeliveries?;
|
|
30
|
+
private readonly customSmsDeliveries?;
|
|
31
|
+
private readonly customMobilePushDeliveries?;
|
|
32
|
+
private readonly DEFAULT_MONTHLY_PUBLISHES;
|
|
33
|
+
private readonly DEFAULT_HTTP_DELIVERIES;
|
|
34
|
+
private readonly DEFAULT_EMAIL_DELIVERIES;
|
|
35
|
+
private readonly DEFAULT_SMS_DELIVERIES;
|
|
36
|
+
private readonly DEFAULT_MOBILE_PUSH_DELIVERIES;
|
|
37
|
+
private readonly FALLBACK_PUBLISH_PRICE_PER_MILLION;
|
|
38
|
+
private readonly FALLBACK_HTTP_DELIVERY_PRICE_PER_MILLION;
|
|
39
|
+
private readonly FALLBACK_EMAIL_DELIVERY_PRICE_PER_100K;
|
|
40
|
+
private readonly FALLBACK_SMS_PRICE_PER_MESSAGE;
|
|
41
|
+
private readonly FALLBACK_MOBILE_PUSH_PRICE_PER_MILLION;
|
|
42
|
+
private readonly FREE_TIER_PUBLISHES;
|
|
43
|
+
constructor(customMonthlyPublishes?: number | undefined, customHttpDeliveries?: number | undefined, customEmailDeliveries?: number | undefined, customSmsDeliveries?: number | undefined, customMobilePushDeliveries?: number | undefined);
|
|
44
|
+
supports(resourceType: string): boolean;
|
|
45
|
+
calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
|
|
46
|
+
private getPublishPrice;
|
|
47
|
+
private getHttpDeliveryPrice;
|
|
48
|
+
private getEmailDeliveryPrice;
|
|
49
|
+
private getSmsPrice;
|
|
50
|
+
private getMobilePushPrice;
|
|
51
|
+
private calculateCostBreakdown;
|
|
52
|
+
private buildAssumptions;
|
|
53
|
+
private hasCustomAssumptions;
|
|
54
|
+
}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SNSCalculator = void 0;
|
|
4
|
+
const RegionMapper_1 = require("../RegionMapper");
|
|
5
|
+
const Logger_1 = require("../../utils/Logger");
|
|
6
|
+
/**
|
|
7
|
+
* Calculator for AWS::SNS::Topic resources.
|
|
8
|
+
*
|
|
9
|
+
* SNS Pricing Model (as of 2024):
|
|
10
|
+
* - Publishes: $0.50 per million requests (first 1M free)
|
|
11
|
+
* - HTTP/S deliveries: $0.60 per million
|
|
12
|
+
* - Email deliveries: $2.00 per 100,000
|
|
13
|
+
* - SMS: Varies by country (using US rate as default)
|
|
14
|
+
* - Mobile push: $0.50 per million
|
|
15
|
+
*
|
|
16
|
+
* @see https://aws.amazon.com/sns/pricing/
|
|
17
|
+
*/
|
|
18
|
+
class SNSCalculator {
|
|
19
|
+
customMonthlyPublishes;
|
|
20
|
+
customHttpDeliveries;
|
|
21
|
+
customEmailDeliveries;
|
|
22
|
+
customSmsDeliveries;
|
|
23
|
+
customMobilePushDeliveries;
|
|
24
|
+
// Default usage assumptions
|
|
25
|
+
DEFAULT_MONTHLY_PUBLISHES = 1_000_000;
|
|
26
|
+
DEFAULT_HTTP_DELIVERIES = 1_000_000;
|
|
27
|
+
DEFAULT_EMAIL_DELIVERIES = 0;
|
|
28
|
+
DEFAULT_SMS_DELIVERIES = 0;
|
|
29
|
+
DEFAULT_MOBILE_PUSH_DELIVERIES = 0;
|
|
30
|
+
// Fallback pricing rates (AWS SNS us-east-1 pricing as of 2024)
|
|
31
|
+
FALLBACK_PUBLISH_PRICE_PER_MILLION = 0.50;
|
|
32
|
+
FALLBACK_HTTP_DELIVERY_PRICE_PER_MILLION = 0.60;
|
|
33
|
+
FALLBACK_EMAIL_DELIVERY_PRICE_PER_100K = 2.00;
|
|
34
|
+
FALLBACK_SMS_PRICE_PER_MESSAGE = 0.00645; // US rate
|
|
35
|
+
FALLBACK_MOBILE_PUSH_PRICE_PER_MILLION = 0.50;
|
|
36
|
+
// Free tier thresholds
|
|
37
|
+
FREE_TIER_PUBLISHES = 1_000_000;
|
|
38
|
+
constructor(customMonthlyPublishes, customHttpDeliveries, customEmailDeliveries, customSmsDeliveries, customMobilePushDeliveries) {
|
|
39
|
+
this.customMonthlyPublishes = customMonthlyPublishes;
|
|
40
|
+
this.customHttpDeliveries = customHttpDeliveries;
|
|
41
|
+
this.customEmailDeliveries = customEmailDeliveries;
|
|
42
|
+
this.customSmsDeliveries = customSmsDeliveries;
|
|
43
|
+
this.customMobilePushDeliveries = customMobilePushDeliveries;
|
|
44
|
+
}
|
|
45
|
+
supports(resourceType) {
|
|
46
|
+
return resourceType === 'AWS::SNS::Topic';
|
|
47
|
+
}
|
|
48
|
+
async calculateCost(resource, region, pricingClient) {
|
|
49
|
+
const monthlyPublishes = this.customMonthlyPublishes ?? this.DEFAULT_MONTHLY_PUBLISHES;
|
|
50
|
+
const httpDeliveries = this.customHttpDeliveries ?? this.DEFAULT_HTTP_DELIVERIES;
|
|
51
|
+
const emailDeliveries = this.customEmailDeliveries ?? this.DEFAULT_EMAIL_DELIVERIES;
|
|
52
|
+
const smsDeliveries = this.customSmsDeliveries ?? this.DEFAULT_SMS_DELIVERIES;
|
|
53
|
+
const mobilePushDeliveries = this.customMobilePushDeliveries ?? this.DEFAULT_MOBILE_PUSH_DELIVERIES;
|
|
54
|
+
Logger_1.Logger.debug('SNS pricing calculation started', {
|
|
55
|
+
region,
|
|
56
|
+
logicalId: resource.logicalId,
|
|
57
|
+
monthlyPublishes,
|
|
58
|
+
httpDeliveries,
|
|
59
|
+
emailDeliveries,
|
|
60
|
+
smsDeliveries,
|
|
61
|
+
mobilePushDeliveries,
|
|
62
|
+
});
|
|
63
|
+
try {
|
|
64
|
+
const regionPrefix = (0, RegionMapper_1.getRegionPrefix)(region);
|
|
65
|
+
const normalizedRegion = (0, RegionMapper_1.normalizeRegion)(region);
|
|
66
|
+
// Fetch pricing data from AWS Pricing API
|
|
67
|
+
const publishPrice = await this.getPublishPrice(pricingClient, normalizedRegion, regionPrefix);
|
|
68
|
+
const httpDeliveryPrice = await this.getHttpDeliveryPrice(pricingClient, normalizedRegion, regionPrefix);
|
|
69
|
+
const emailDeliveryPrice = await this.getEmailDeliveryPrice(pricingClient, normalizedRegion, regionPrefix);
|
|
70
|
+
const smsPrice = await this.getSmsPrice(pricingClient, normalizedRegion, regionPrefix);
|
|
71
|
+
const mobilePushPrice = await this.getMobilePushPrice(pricingClient, normalizedRegion, regionPrefix);
|
|
72
|
+
const hasCustomAssumptions = this.hasCustomAssumptions();
|
|
73
|
+
const allPricesAvailable = publishPrice !== null &&
|
|
74
|
+
httpDeliveryPrice !== null &&
|
|
75
|
+
emailDeliveryPrice !== null &&
|
|
76
|
+
smsPrice !== null &&
|
|
77
|
+
mobilePushPrice !== null;
|
|
78
|
+
// Calculate costs using API prices or fallbacks
|
|
79
|
+
const costBreakdown = this.calculateCostBreakdown(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, publishPrice, httpDeliveryPrice, emailDeliveryPrice, smsPrice, mobilePushPrice);
|
|
80
|
+
Logger_1.Logger.debug('SNS cost calculated', {
|
|
81
|
+
costBreakdown,
|
|
82
|
+
allPricesAvailable,
|
|
83
|
+
});
|
|
84
|
+
const assumptions = this.buildAssumptions(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, costBreakdown, allPricesAvailable, publishPrice, httpDeliveryPrice, emailDeliveryPrice, smsPrice, mobilePushPrice);
|
|
85
|
+
// Determine confidence level
|
|
86
|
+
let confidence;
|
|
87
|
+
if (!allPricesAvailable && !hasCustomAssumptions) {
|
|
88
|
+
confidence = 'unknown';
|
|
89
|
+
}
|
|
90
|
+
else if (!allPricesAvailable && hasCustomAssumptions) {
|
|
91
|
+
confidence = 'low';
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
confidence = 'medium';
|
|
95
|
+
}
|
|
96
|
+
// If all prices are unavailable and no custom assumptions, return zero cost
|
|
97
|
+
if (!allPricesAvailable && !hasCustomAssumptions) {
|
|
98
|
+
return {
|
|
99
|
+
amount: 0,
|
|
100
|
+
currency: 'USD',
|
|
101
|
+
confidence: 'unknown',
|
|
102
|
+
assumptions: [
|
|
103
|
+
`Pricing data not available for SNS in region ${region}`,
|
|
104
|
+
...assumptions,
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
amount: costBreakdown.totalCost,
|
|
110
|
+
currency: 'USD',
|
|
111
|
+
confidence,
|
|
112
|
+
assumptions,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
Logger_1.Logger.debug('SNS pricing calculation failed', {
|
|
117
|
+
error: error instanceof Error ? error.message : String(error),
|
|
118
|
+
region,
|
|
119
|
+
});
|
|
120
|
+
// If user provided custom assumptions, use fallback pricing
|
|
121
|
+
if (this.hasCustomAssumptions()) {
|
|
122
|
+
const costBreakdown = this.calculateCostBreakdown(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, null, null, null, null, null);
|
|
123
|
+
return {
|
|
124
|
+
amount: costBreakdown.totalCost,
|
|
125
|
+
currency: 'USD',
|
|
126
|
+
confidence: 'low',
|
|
127
|
+
assumptions: [
|
|
128
|
+
'Using fallback pricing (API error)',
|
|
129
|
+
`Assumes ${monthlyPublishes.toLocaleString()} publishes per month`,
|
|
130
|
+
`Assumes ${httpDeliveries.toLocaleString()} HTTP/S deliveries per month`,
|
|
131
|
+
],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
amount: 0,
|
|
136
|
+
currency: 'USD',
|
|
137
|
+
confidence: 'unknown',
|
|
138
|
+
assumptions: [`Failed to fetch pricing: ${error instanceof Error ? error.message : String(error)}`],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async getPublishPrice(pricingClient, normalizedRegion, regionPrefix) {
|
|
143
|
+
const usageType = regionPrefix ? `${regionPrefix}-PublishRequests` : 'PublishRequests';
|
|
144
|
+
return pricingClient.getPrice({
|
|
145
|
+
serviceCode: 'AmazonSNS',
|
|
146
|
+
region: normalizedRegion,
|
|
147
|
+
filters: [
|
|
148
|
+
{ field: 'productFamily', value: 'Notification' },
|
|
149
|
+
{ field: 'usagetype', value: usageType },
|
|
150
|
+
],
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async getHttpDeliveryPrice(pricingClient, normalizedRegion, regionPrefix) {
|
|
154
|
+
const usageType = regionPrefix ? `${regionPrefix}-DeliveryAttempts-HTTP` : 'DeliveryAttempts-HTTP';
|
|
155
|
+
return pricingClient.getPrice({
|
|
156
|
+
serviceCode: 'AmazonSNS',
|
|
157
|
+
region: normalizedRegion,
|
|
158
|
+
filters: [
|
|
159
|
+
{ field: 'productFamily', value: 'Notification' },
|
|
160
|
+
{ field: 'usagetype', value: usageType },
|
|
161
|
+
],
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async getEmailDeliveryPrice(pricingClient, normalizedRegion, regionPrefix) {
|
|
165
|
+
const usageType = regionPrefix ? `${regionPrefix}-DeliveryAttempts-EMAIL` : 'DeliveryAttempts-EMAIL';
|
|
166
|
+
return pricingClient.getPrice({
|
|
167
|
+
serviceCode: 'AmazonSNS',
|
|
168
|
+
region: normalizedRegion,
|
|
169
|
+
filters: [
|
|
170
|
+
{ field: 'productFamily', value: 'Notification' },
|
|
171
|
+
{ field: 'usagetype', value: usageType },
|
|
172
|
+
],
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
async getSmsPrice(pricingClient, normalizedRegion, regionPrefix) {
|
|
176
|
+
const usageType = regionPrefix ? `${regionPrefix}-DeliveryAttempts-SMS` : 'DeliveryAttempts-SMS';
|
|
177
|
+
return pricingClient.getPrice({
|
|
178
|
+
serviceCode: 'AmazonSNS',
|
|
179
|
+
region: normalizedRegion,
|
|
180
|
+
filters: [
|
|
181
|
+
{ field: 'productFamily', value: 'SMS' },
|
|
182
|
+
{ field: 'usagetype', value: usageType },
|
|
183
|
+
],
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async getMobilePushPrice(pricingClient, normalizedRegion, regionPrefix) {
|
|
187
|
+
const usageType = regionPrefix ? `${regionPrefix}-DeliveryAttempts-APNS` : 'DeliveryAttempts-APNS';
|
|
188
|
+
return pricingClient.getPrice({
|
|
189
|
+
serviceCode: 'AmazonSNS',
|
|
190
|
+
region: normalizedRegion,
|
|
191
|
+
filters: [
|
|
192
|
+
{ field: 'productFamily', value: 'Mobile Push Notification' },
|
|
193
|
+
{ field: 'usagetype', value: usageType },
|
|
194
|
+
],
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
calculateCostBreakdown(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, publishPrice, httpDeliveryPrice, emailDeliveryPrice, smsPrice, mobilePushPrice) {
|
|
198
|
+
// Use API prices if available, otherwise fallback
|
|
199
|
+
const effectivePublishPrice = publishPrice ?? this.FALLBACK_PUBLISH_PRICE_PER_MILLION;
|
|
200
|
+
const effectiveHttpDeliveryPrice = httpDeliveryPrice ?? this.FALLBACK_HTTP_DELIVERY_PRICE_PER_MILLION;
|
|
201
|
+
const effectiveEmailDeliveryPrice = emailDeliveryPrice ?? this.FALLBACK_EMAIL_DELIVERY_PRICE_PER_100K;
|
|
202
|
+
const effectiveSmsPrice = smsPrice ?? this.FALLBACK_SMS_PRICE_PER_MESSAGE;
|
|
203
|
+
const effectiveMobilePushPrice = mobilePushPrice ?? this.FALLBACK_MOBILE_PUSH_PRICE_PER_MILLION;
|
|
204
|
+
// Calculate publish cost (first 1M free)
|
|
205
|
+
const billablePublishes = Math.max(0, monthlyPublishes - this.FREE_TIER_PUBLISHES);
|
|
206
|
+
const publishCost = (billablePublishes / 1_000_000) * effectivePublishPrice;
|
|
207
|
+
// HTTP/S delivery cost: $X per million
|
|
208
|
+
const httpDeliveryCost = (httpDeliveries / 1_000_000) * effectiveHttpDeliveryPrice;
|
|
209
|
+
// Email delivery cost: $X per 100,000
|
|
210
|
+
const emailDeliveryCost = (emailDeliveries / 100_000) * effectiveEmailDeliveryPrice;
|
|
211
|
+
// SMS delivery cost: $X per message (varies by country, using US rate)
|
|
212
|
+
const smsDeliveryCost = smsDeliveries * effectiveSmsPrice;
|
|
213
|
+
// Mobile push delivery cost: $X per million
|
|
214
|
+
const mobilePushDeliveryCost = (mobilePushDeliveries / 1_000_000) * effectiveMobilePushPrice;
|
|
215
|
+
const totalCost = publishCost + httpDeliveryCost + emailDeliveryCost + smsDeliveryCost + mobilePushDeliveryCost;
|
|
216
|
+
return {
|
|
217
|
+
publishCost,
|
|
218
|
+
httpDeliveryCost,
|
|
219
|
+
emailDeliveryCost,
|
|
220
|
+
smsDeliveryCost,
|
|
221
|
+
mobilePushDeliveryCost,
|
|
222
|
+
totalCost,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
buildAssumptions(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, costBreakdown, allPricesAvailable, publishPrice, httpDeliveryPrice, emailDeliveryPrice, smsPrice, mobilePushPrice) {
|
|
226
|
+
const assumptions = [];
|
|
227
|
+
// Add usage assumptions
|
|
228
|
+
assumptions.push(`Assumes ${monthlyPublishes.toLocaleString()} publishes per month`);
|
|
229
|
+
assumptions.push(`Assumes ${httpDeliveries.toLocaleString()} HTTP/S deliveries per month`);
|
|
230
|
+
if (emailDeliveries > 0) {
|
|
231
|
+
assumptions.push(`Assumes ${emailDeliveries.toLocaleString()} email deliveries per month`);
|
|
232
|
+
}
|
|
233
|
+
if (smsDeliveries > 0) {
|
|
234
|
+
assumptions.push(`Assumes ${smsDeliveries.toLocaleString()} SMS deliveries per month (using US rate)`);
|
|
235
|
+
}
|
|
236
|
+
if (mobilePushDeliveries > 0) {
|
|
237
|
+
assumptions.push(`Assumes ${mobilePushDeliveries.toLocaleString()} mobile push deliveries per month`);
|
|
238
|
+
}
|
|
239
|
+
// Add free tier information
|
|
240
|
+
if (monthlyPublishes <= this.FREE_TIER_PUBLISHES) {
|
|
241
|
+
assumptions.push(`First ${this.FREE_TIER_PUBLISHES.toLocaleString()} publishes are free`);
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
const billablePublishes = monthlyPublishes - this.FREE_TIER_PUBLISHES;
|
|
245
|
+
assumptions.push(`${this.FREE_TIER_PUBLISHES.toLocaleString()} free tier publishes applied, ${billablePublishes.toLocaleString()} billable`);
|
|
246
|
+
}
|
|
247
|
+
// Add cost breakdown
|
|
248
|
+
if (costBreakdown.publishCost > 0) {
|
|
249
|
+
assumptions.push(`Publish cost: $${costBreakdown.publishCost.toFixed(2)}`);
|
|
250
|
+
}
|
|
251
|
+
if (costBreakdown.httpDeliveryCost > 0) {
|
|
252
|
+
assumptions.push(`HTTP/S delivery cost: $${costBreakdown.httpDeliveryCost.toFixed(2)}`);
|
|
253
|
+
}
|
|
254
|
+
if (costBreakdown.emailDeliveryCost > 0) {
|
|
255
|
+
assumptions.push(`Email delivery cost: $${costBreakdown.emailDeliveryCost.toFixed(2)}`);
|
|
256
|
+
}
|
|
257
|
+
if (costBreakdown.smsDeliveryCost > 0) {
|
|
258
|
+
assumptions.push(`SMS delivery cost: $${costBreakdown.smsDeliveryCost.toFixed(2)}`);
|
|
259
|
+
}
|
|
260
|
+
if (costBreakdown.mobilePushDeliveryCost > 0) {
|
|
261
|
+
assumptions.push(`Mobile push delivery cost: $${costBreakdown.mobilePushDeliveryCost.toFixed(2)}`);
|
|
262
|
+
}
|
|
263
|
+
// Add fallback pricing notes
|
|
264
|
+
if (!allPricesAvailable) {
|
|
265
|
+
if (publishPrice === null) {
|
|
266
|
+
assumptions.push('Using fallback publish pricing (API unavailable)');
|
|
267
|
+
}
|
|
268
|
+
if (httpDeliveryPrice === null) {
|
|
269
|
+
assumptions.push('Using fallback HTTP delivery pricing (API unavailable)');
|
|
270
|
+
}
|
|
271
|
+
if (emailDeliveryPrice === null && emailDeliveries > 0) {
|
|
272
|
+
assumptions.push('Using fallback email delivery pricing (API unavailable)');
|
|
273
|
+
}
|
|
274
|
+
if (smsPrice === null && smsDeliveries > 0) {
|
|
275
|
+
assumptions.push('Using fallback SMS pricing (API unavailable)');
|
|
276
|
+
}
|
|
277
|
+
if (mobilePushPrice === null && mobilePushDeliveries > 0) {
|
|
278
|
+
assumptions.push('Using fallback mobile push pricing (API unavailable)');
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Add custom assumption notes
|
|
282
|
+
if (this.customMonthlyPublishes !== undefined) {
|
|
283
|
+
assumptions.push('Using custom publish count from configuration');
|
|
284
|
+
}
|
|
285
|
+
if (this.customHttpDeliveries !== undefined) {
|
|
286
|
+
assumptions.push('Using custom HTTP delivery count from configuration');
|
|
287
|
+
}
|
|
288
|
+
if (this.customEmailDeliveries !== undefined) {
|
|
289
|
+
assumptions.push('Using custom email delivery count from configuration');
|
|
290
|
+
}
|
|
291
|
+
if (this.customSmsDeliveries !== undefined) {
|
|
292
|
+
assumptions.push('Using custom SMS delivery count from configuration');
|
|
293
|
+
}
|
|
294
|
+
if (this.customMobilePushDeliveries !== undefined) {
|
|
295
|
+
assumptions.push('Using custom mobile push delivery count from configuration');
|
|
296
|
+
}
|
|
297
|
+
return assumptions;
|
|
298
|
+
}
|
|
299
|
+
hasCustomAssumptions() {
|
|
300
|
+
return (this.customMonthlyPublishes !== undefined ||
|
|
301
|
+
this.customHttpDeliveries !== undefined ||
|
|
302
|
+
this.customEmailDeliveries !== undefined ||
|
|
303
|
+
this.customSmsDeliveries !== undefined ||
|
|
304
|
+
this.customMobilePushDeliveries !== undefined);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
exports.SNSCalculator = SNSCalculator;
|
|
308
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU05TQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL1NOU0NhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQW1FO0FBQ25FLCtDQUE0QztBQWM1Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEsYUFBYTtJQW1CTDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBdEJuQiw0QkFBNEI7SUFDWCx5QkFBeUIsR0FBRyxTQUFTLENBQUM7SUFDdEMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLHdCQUF3QixHQUFHLENBQUMsQ0FBQztJQUM3QixzQkFBc0IsR0FBRyxDQUFDLENBQUM7SUFDM0IsOEJBQThCLEdBQUcsQ0FBQyxDQUFDO0lBRXBELGdFQUFnRTtJQUMvQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7SUFDMUMsd0NBQXdDLEdBQUcsSUFBSSxDQUFDO0lBQ2hELHNDQUFzQyxHQUFHLElBQUksQ0FBQztJQUM5Qyw4QkFBOEIsR0FBRyxPQUFPLENBQUMsQ0FBQyxVQUFVO0lBQ3BELHNDQUFzQyxHQUFHLElBQUksQ0FBQztJQUUvRCx1QkFBdUI7SUFDTixtQkFBbUIsR0FBRyxTQUFTLENBQUM7SUFFakQsWUFDbUIsc0JBQStCLEVBQy9CLG9CQUE2QixFQUM3QixxQkFBOEIsRUFDOUIsbUJBQTRCLEVBQzVCLDBCQUFtQztRQUpuQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQVM7UUFDL0IseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFTO1FBQzdCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBUztRQUM5Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQVM7UUFDNUIsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUFTO0lBQ25ELENBQUM7SUFFSixRQUFRLENBQUMsWUFBb0I7UUFDM0IsT0FBTyxZQUFZLEtBQUssaUJBQWlCLENBQUM7SUFDNUMsQ0FBQztJQUVELEtBQUss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b0JBQW9CLEtBQUssU0FBUztZQUN2QyxJQUFJLENBQUMscUJBQXFCLEtBQUssU0FBUztZQUN4QyxJQUFJLENBQUMsbUJBQW1CLEtBQUssU0FBUztZQUN0QyxJQUFJLENBQUMsMEJBQTBCLEtBQUssU0FBUyxDQUM5QyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBcFpELHNDQW9aQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yLCBNb250aGx5Q29zdCwgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlZ2lvbiwgZ2V0UmVnaW9uUHJlZml4IH0gZnJvbSAnLi4vUmVnaW9uTWFwcGVyJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL0xvZ2dlcic7XG5cbi8qKlxuICogQ29zdCBicmVha2Rvd24gZm9yIFNOUyBwcmljaW5nIGNvbXBvbmVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTTlNDb3N0QnJlYWtkb3duIHtcbiAgcHVibGlzaENvc3Q6IG51bWJlcjtcbiAgaHR0cERlbGl2ZXJ5Q29zdDogbnVtYmVyO1xuICBlbWFpbERlbGl2ZXJ5Q29zdDogbnVtYmVyO1xuICBzbXNEZWxpdmVyeUNvc3Q6IG51bWJlcjtcbiAgbW9iaWxlUHVzaERlbGl2ZXJ5Q29zdDogbnVtYmVyO1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdG9yIGZvciBBV1M6OlNOUzo6VG9waWMgcmVzb3VyY2VzLlxuICpcbiAqIFNOUyBQcmljaW5nIE1vZGVsIChhcyBvZiAyMDI0KTpcbiAqIC0gUHVibGlzaGVzOiAkMC41MCBwZXIgbWlsbGlvbiByZXF1ZXN0cyAoZmlyc3QgMU0gZnJlZSlcbiAqIC0gSFRUUC9TIGRlbGl2ZXJpZXM6ICQwLjYwIHBlciBtaWxsaW9uXG4gKiAtIEVtYWlsIGRlbGl2ZXJpZXM6ICQyLjAwIHBlciAxMDAsMDAwXG4gKiAtIFNNUzogVmFyaWVzIGJ5IGNvdW50cnkgKHVzaW5nIFVTIHJhdGUgYXMgZGVmYXVsdClcbiAqIC0gTW9iaWxlIHB1c2g6ICQwLjUwIHBlciBtaWxsaW9uXG4gKlxuICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3Nucy9wcmljaW5nL1xuICovXG5leHBvcnQgY2xhc3MgU05TQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFJlc291cmNlQ29zdENhbGN1bGF0b3Ige1xuICAvLyBEZWZhdWx0IHVzYWdlIGFzc3VtcHRpb25zXG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9NT05USExZX1BVQkxJU0hFUyA9IDFfMDAwXzAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0hUVFBfREVMSVZFUklFUyA9IDFfMDAwXzAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0VNQUlMX0RFTElWRVJJRVMgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfU01TX0RFTElWRVJJRVMgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTU9CSUxFX1BVU0hfREVMSVZFUklFUyA9IDA7XG5cbiAgLy8gRmFsbGJhY2sgcHJpY2luZyByYXRlcyAoQVdTIFNOUyB1cy1lYXN0LTEgcHJpY2luZyBhcyBvZiAyMDI0KVxuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX1BVQkxJU0hfUFJJQ0VfUEVSX01JTExJT04gPSAwLjUwO1xuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX0hUVFBfREVMSVZFUllfUFJJQ0VfUEVSX01JTExJT04gPSAwLjYwO1xuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX0VNQUlMX0RFTElWRVJZX1BSSUNFX1BFUl8xMDBLID0gMi4wMDtcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19TTVNfUFJJQ0VfUEVSX01FU1NBR0UgPSAwLjAwNjQ1OyAvLyBVUyByYXRlXG4gIHByaXZhdGUgcmVhZG9ubHkgRkFMTEJBQ0tfTU9CSUxFX1BVU0hfUFJJQ0VfUEVSX01JTExJT04gPSAwLjUwO1xuXG4gIC8vIEZyZWUgdGllciB0aHJlc2hvbGRzXG4gIHByaXZhdGUgcmVhZG9ubHkgRlJFRV9USUVSX1BVQkxJU0hFUyA9IDFfMDAwXzAwMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbU1vbnRobHlQdWJsaXNoZXM/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21IdHRwRGVsaXZlcmllcz86IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbUVtYWlsRGVsaXZlcmllcz86IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbVNtc0RlbGl2ZXJpZXM/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21Nb2JpbGVQdXNoRGVsaXZlcmllcz86IG51bWJlcixcbiAgKSB7fVxuXG4gIHN1cHBvcnRzKHJlc291cmNlVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc291cmNlVHlwZSA9PT0gJ0FXUzo6U05TOjpUb3BpYyc7XG4gIH1cblxuICBhc3luYyBjYWxjdWxhdGVDb3N0KFxuICAgIHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50LFxuICApOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgY29uc3QgbW9udGhseVB1Ymxpc2hlcyA9IHRoaXMuY3VzdG9tTW9udGhseVB1Ymxpc2hlcyA/PyB0aGlzLkRFRkFVTFRfTU9OVEhMWV9QVUJMSVNIRVM7XG4gICAgY29uc3QgaHR0cERlbGl2ZXJpZXMgPSB0aGlzLmN1c3RvbUh0dHBEZWxpdmVyaWVzID8/IHRoaXMuREVGQVVMVF9IVFRQX0RFTElWRVJJRVM7XG4gICAgY29uc3QgZW1haWxEZWxpdmVyaWVzID0gdGhpcy5jdXN0b21FbWFpbERlbGl2ZXJpZXMgPz8gdGhpcy5ERUZBVUxUX0VNQUlMX0RFTElWRVJJRVM7XG4gICAgY29uc3Qgc21zRGVsaXZlcmllcyA9IHRoaXMuY3VzdG9tU21zRGVsaXZlcmllcyA/PyB0aGlzLkRFRkFVTFRfU01TX0RFTElWRVJJRVM7XG4gICAgY29uc3QgbW9iaWxlUHVzaERlbGl2ZXJpZXMgPSB0aGlzLmN1c3RvbU1vYmlsZVB1c2hEZWxpdmVyaWVzID8/IHRoaXMuREVGQVVMVF9NT0JJTEVfUFVTSF9ERUxJVkVSSUVTO1xuXG4gICAgTG9nZ2VyLmRlYnVnKCdTTlMgcHJpY2luZyBjYWxjdWxhdGlvbiBzdGFydGVkJywge1xuICAgICAgcmVnaW9uLFxuICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICBtb250aGx5UHVibGlzaGVzLFxuICAgICAgaHR0cERlbGl2ZXJpZXMsXG4gICAgICBlbWFpbERlbGl2ZXJpZXMsXG4gICAgICBzbXNEZWxpdmVyaWVzLFxuICAgICAgbW9iaWxlUHVzaERlbGl2ZXJpZXMsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVnaW9uUHJlZml4ID0gZ2V0UmVnaW9uUHJlZml4KHJlZ2lvbik7XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVnaW9uID0gbm9ybWFsaXplUmVnaW9uKHJlZ2lvbik7XG5cbiAgICAgIC8vIEZldGNoIHByaWNpbmcgZGF0YSBmcm9tIEFXUyBQcmljaW5nIEFQSVxuICAgICAgY29uc3QgcHVibGlzaFByaWNlID0gYXdhaXQgdGhpcy5nZXRQdWJsaXNoUHJpY2UocHJpY2luZ0NsaWVudCwgbm9ybWFsaXplZFJlZ2lvbiwgcmVnaW9uUHJlZml4KTtcbiAgICAgIGNvbnN0IGh0dHBEZWxpdmVyeVByaWNlID0gYXdhaXQgdGhpcy5nZXRIdHRwRGVsaXZlcnlQcmljZShwcmljaW5nQ2xpZW50LCBub3JtYWxpemVkUmVnaW9uLCByZWdpb25QcmVmaXgpO1xuICAgICAgY29uc3QgZW1haWxEZWxpdmVyeVByaWNlID0gYXdhaXQgdGhpcy5nZXRFbWFpbERlbGl2ZXJ5UHJpY2UocHJpY2luZ0NsaWVudCwgbm9ybWFsaXplZFJlZ2lvbiwgcmVnaW9uUHJlZml4KTtcbiAgICAgIGNvbnN0IHNtc1ByaWNlID0gYXdhaXQgdGhpcy5nZXRTbXNQcmljZShwcmljaW5nQ2xpZW50LCBub3JtYWxpemVkUmVnaW9uLCByZWdpb25QcmVmaXgpO1xuICAgICAgY29uc3QgbW9iaWxlUHVzaFByaWNlID0gYXdhaXQgdGhpcy5nZXRNb2JpbGVQdXNoUHJpY2UocHJpY2luZ0NsaWVudCwgbm9ybWFsaXplZFJlZ2lvbiwgcmVnaW9uUHJlZml4KTtcblxuICAgICAgY29uc3QgaGFzQ3VzdG9tQXNzdW1wdGlvbnMgPSB0aGlzLmhhc0N1c3RvbUFzc3VtcHRpb25zKCk7XG4gICAgICBjb25zdCBhbGxQcmljZXNBdmFpbGFibGUgPSBwdWJsaXNoUHJpY2UgIT09IG51bGwgJiZcbiAgICAgICAgaHR0cERlbGl2ZXJ5UHJpY2UgIT09IG51bGwgJiZcbiAgICAgICAgZW1haWxEZWxpdmVyeVByaWNlICE9PSBudWxsICYmXG4gICAgICAgIHNtc1ByaWNlICE9PSBudWxsICYmXG4gICAgICAgIG1vYmlsZVB1c2hQcmljZSAhPT0gbnVsbDtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGNvc3RzIHVzaW5nIEFQSSBwcmljZXMgb3IgZmFsbGJhY2tzXG4gICAgICBjb25zdCBjb3N0QnJlYWtkb3duID0gdGhpcy5jYWxjdWxhdGVDb3N0QnJlYWtkb3duKFxuICAgICAgICBtb250aGx5UHVibGlzaGVzLFxuICAgICAgICBodHRwRGVsaXZlcmllcyxcbiAgICAgICAgZW1haWxEZWxpdmVyaWVzLFxuICAgICAgICBzbXNEZWxpdmVyaWVzLFxuICAgICAgICBtb2JpbGVQdXNoRGVsaXZlcmllcyxcbiAgICAgICAgcHVibGlzaFByaWNlLFxuICAgICAgICBodHRwRGVsaXZlcnlQcmljZSxcbiAgICAgICAgZW1haWxEZWxpdmVyeVByaWNlLFxuICAgICAgICBzbXNQcmljZSxcbiAgICAgICAgbW9iaWxlUHVzaFByaWNlLFxuICAgICAgKTtcblxuICAgICAgTG9nZ2VyLmRlYnVnKCdTTlMgY29zdCBjYWxjdWxhdGVkJywge1xuICAgICAgICBjb3N0QnJlYWtkb3duLFxuICAgICAgICBhbGxQcmljZXNBdmFpbGFibGUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSB0aGlzLmJ1aWxkQXNzdW1wdGlvbnMoXG4gICAgICAgIG1vbnRobHlQdWJsaXNoZXMsXG4gICAgICAgIGh0dHBEZWxpdmVyaWVzLFxuICAgICAgICBlbWFpbERlbGl2ZXJpZXMsXG4gICAgICAgIHNtc0RlbGl2ZXJpZXMsXG4gICAgICAgIG1vYmlsZVB1c2hEZWxpdmVyaWVzLFxuICAgICAgICBjb3N0QnJlYWtkb3duLFxuICAgICAgICBhbGxQcmljZXNBdmFpbGFibGUsXG4gICAgICAgIHB1Ymxpc2hQcmljZSxcbiAgICAgICAgaHR0cERlbGl2ZXJ5UHJpY2UsXG4gICAgICAgIGVtYWlsRGVsaXZlcnlQcmljZSxcbiAgICAgICAgc21zUHJpY2UsXG4gICAgICAgIG1vYmlsZVB1c2hQcmljZSxcbiAgICAgICk7XG5cbiAgICAgIC8vIERldGVybWluZSBjb25maWRlbmNlIGxldmVsXG4gICAgICBsZXQgY29uZmlkZW5jZTogJ2hpZ2gnIHwgJ21lZGl1bScgfCAnbG93JyB8ICd1bmtub3duJztcbiAgICAgIGlmICghYWxsUHJpY2VzQXZhaWxhYmxlICYmICFoYXNDdXN0b21Bc3N1bXB0aW9ucykge1xuICAgICAgICBjb25maWRlbmNlID0gJ3Vua25vd24nO1xuICAgICAgfSBlbHNlIGlmICghYWxsUHJpY2VzQXZhaWxhYmxlICYmIGhhc0N1c3RvbUFzc3VtcHRpb25zKSB7XG4gICAgICAgIGNvbmZpZGVuY2UgPSAnbG93JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbmZpZGVuY2UgPSAnbWVkaXVtJztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYWxsIHByaWNlcyBhcmUgdW5hdmFpbGFibGUgYW5kIG5vIGN1c3RvbSBhc3N1bXB0aW9ucywgcmV0dXJuIHplcm8gY29zdFxuICAgICAgaWYgKCFhbGxQcmljZXNBdmFpbGFibGUgJiYgIWhhc0N1c3RvbUFzc3VtcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICAgIGBQcmljaW5nIGRhdGEgbm90IGF2YWlsYWJsZSBmb3IgU05TIGluIHJlZ2lvbiAke3JlZ2lvbn1gLFxuICAgICAgICAgICAgLi4uYXNzdW1wdGlvbnMsXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiBjb3N0QnJlYWtkb3duLnRvdGFsQ29zdCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlLFxuICAgICAgICBhc3N1bXB0aW9ucyxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIExvZ2dlci5kZWJ1ZygnU05TIHByaWNpbmcgY2FsY3VsYXRpb24gZmFpbGVkJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICByZWdpb24sXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdXNlciBwcm92aWRlZCBjdXN0b20gYXNzdW1wdGlvbnMsIHVzZSBmYWxsYmFjayBwcmljaW5nXG4gICAgICBpZiAodGhpcy5oYXNDdXN0b21Bc3N1bXB0aW9ucygpKSB7XG4gICAgICAgIGNvbnN0IGNvc3RCcmVha2Rvd24gPSB0aGlzLmNhbGN1bGF0ZUNvc3RCcmVha2Rvd24oXG4gICAgICAgICAgbW9udGhseVB1Ymxpc2hlcyxcbiAgICAgICAgICBodHRwRGVsaXZlcmllcyxcbiAgICAgICAgICBlbWFpbERlbGl2ZXJpZXMsXG4gICAgICAgICAgc21zRGVsaXZlcmllcyxcbiAgICAgICAgICBtb2JpbGVQdXNoRGVsaXZlcmllcyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbW91bnQ6IGNvc3RCcmVha2Rvd24udG90YWxDb3N0LFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAnbG93JyxcbiAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgJ1VzaW5nIGZhbGxiYWNrIHByaWNpbmcgKEFQSSBlcnJvciknLFxuICAgICAgICAgICAgYEFzc3VtZXMgJHttb250aGx5UHVibGlzaGVzLnRvTG9jYWxlU3RyaW5nKCl9IHB1Ymxpc2hlcyBwZXIgbW9udGhgLFxuICAgICAgICAgICAgYEFzc3VtZXMgJHtodHRwRGVsaXZlcmllcy50b0xvY2FsZVN0cmluZygpfSBIVFRQL1MgZGVsaXZlcmllcyBwZXIgbW9udGhgLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBmZXRjaCBwcmljaW5nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRQdWJsaXNoUHJpY2UoXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgICBub3JtYWxpemVkUmVnaW9uOiBzdHJpbmcsXG4gICAgcmVnaW9uUHJlZml4OiBzdHJpbmcsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCA/IGAke3JlZ2lvblByZWZpeH0tUHVibGlzaFJlcXVlc3RzYCA6ICdQdWJsaXNoUmVxdWVzdHMnO1xuICAgIHJldHVybiBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgIHNlcnZpY2VDb2RlOiAnQW1hem9uU05TJyxcbiAgICAgIHJlZ2lvbjogbm9ybWFsaXplZFJlZ2lvbixcbiAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ05vdGlmaWNhdGlvbicgfSxcbiAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiB1c2FnZVR5cGUgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEh0dHBEZWxpdmVyeVByaWNlKFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICAgbm9ybWFsaXplZFJlZ2lvbjogc3RyaW5nLFxuICAgIHJlZ2lvblByZWZpeDogc3RyaW5nLFxuICApOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCB1c2FnZVR5cGUgPSByZWdpb25QcmVmaXggPyBgJHtyZWdpb25QcmVmaXh9LURlbGl2ZXJ5QXR0ZW1wdHMtSFRUUGAgOiAnRGVsaXZlcnlBdHRlbXB0cy1IVFRQJztcbiAgICByZXR1cm4gcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICBzZXJ2aWNlQ29kZTogJ0FtYXpvblNOUycsXG4gICAgICByZWdpb246IG5vcm1hbGl6ZWRSZWdpb24sXG4gICAgICBmaWx0ZXJzOiBbXG4gICAgICAgIHsgZmllbGQ6ICdwcm9kdWN0RmFtaWx5JywgdmFsdWU6ICdOb3RpZmljYXRpb24nIH0sXG4gICAgICAgIHsgZmllbGQ6ICd1c2FnZXR5cGUnLCB2YWx1ZTogdXNhZ2VUeXBlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRFbWFpbERlbGl2ZXJ5UHJpY2UoXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgICBub3JtYWxpemVkUmVnaW9uOiBzdHJpbmcsXG4gICAgcmVnaW9uUHJlZml4OiBzdHJpbmcsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCA/IGAke3JlZ2lvblByZWZpeH0tRGVsaXZlcnlBdHRlbXB0cy1FTUFJTGAgOiAnRGVsaXZlcnlBdHRlbXB0cy1FTUFJTCc7XG4gICAgcmV0dXJuIHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgc2VydmljZUNvZGU6ICdBbWF6b25TTlMnLFxuICAgICAgcmVnaW9uOiBub3JtYWxpemVkUmVnaW9uLFxuICAgICAgZmlsdGVyczogW1xuICAgICAgICB7IGZpZWxkOiAncHJvZHVjdEZhbWlseScsIHZhbHVlOiAnTm90aWZpY2F0aW9uJyB9LFxuICAgICAgICB7IGZpZWxkOiAndXNhZ2V0eXBlJywgdmFsdWU6IHVzYWdlVHlwZSB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0U21zUHJpY2UoXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgICBub3JtYWxpemVkUmVnaW9uOiBzdHJpbmcsXG4gICAgcmVnaW9uUHJlZml4OiBzdHJpbmcsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCA/IGAke3JlZ2lvblByZWZpeH0tRGVsaXZlcnlBdHRlbXB0cy1TTVNgIDogJ0RlbGl2ZXJ5QXR0ZW1wdHMtU01TJztcbiAgICByZXR1cm4gcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICBzZXJ2aWNlQ29kZTogJ0FtYXpvblNOUycsXG4gICAgICByZWdpb246IG5vcm1hbGl6ZWRSZWdpb24sXG4gICAgICBmaWx0ZXJzOiBbXG4gICAgICAgIHsgZmllbGQ6ICdwcm9kdWN0RmFtaWx5JywgdmFsdWU6ICdTTVMnIH0sXG4gICAgICAgIHsgZmllbGQ6ICd1c2FnZXR5cGUnLCB2YWx1ZTogdXNhZ2VUeXBlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRNb2JpbGVQdXNoUHJpY2UoXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgICBub3JtYWxpemVkUmVnaW9uOiBzdHJpbmcsXG4gICAgcmVnaW9uUHJlZml4OiBzdHJpbmcsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCA/IGAke3JlZ2lvblByZWZpeH0tRGVsaXZlcnlBdHRlbXB0cy1BUE5TYCA6ICdEZWxpdmVyeUF0dGVtcHRzLUFQTlMnO1xuICAgIHJldHVybiBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgIHNlcnZpY2VDb2RlOiAnQW1hem9uU05TJyxcbiAgICAgIHJlZ2lvbjogbm9ybWFsaXplZFJlZ2lvbixcbiAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ01vYmlsZSBQdXNoIE5vdGlmaWNhdGlvbicgfSxcbiAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiB1c2FnZVR5cGUgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUNvc3RCcmVha2Rvd24oXG4gICAgbW9udGhseVB1Ymxpc2hlczogbnVtYmVyLFxuICAgIGh0dHBEZWxpdmVyaWVzOiBudW1iZXIsXG4gICAgZW1haWxEZWxpdmVyaWVzOiBudW1iZXIsXG4gICAgc21zRGVsaXZlcmllczogbnVtYmVyLFxuICAgIG1vYmlsZVB1c2hEZWxpdmVyaWVzOiBudW1iZXIsXG4gICAgcHVibGlzaFByaWNlOiBudW1iZXIgfCBudWxsLFxuICAgIGh0dHBEZWxpdmVyeVByaWNlOiBudW1iZXIgfCBudWxsLFxuICAgIGVtYWlsRGVsaXZlcnlQcmljZTogbnVtYmVyIHwgbnVsbCxcbiAgICBzbXNQcmljZTogbnVtYmVyIHwgbnVsbCxcbiAgICBtb2JpbGVQdXNoUHJpY2U6IG51bWJlciB8IG51bGwsXG4gICk6IFNOU0Nvc3RCcmVha2Rvd24ge1xuICAgIC8vIFVzZSBBUEkgcHJpY2VzIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxiYWNrXG4gICAgY29uc3QgZWZmZWN0aXZlUHVibGlzaFByaWNlID0gcHVibGlzaFByaWNlID8/IHRoaXMuRkFMTEJBQ0tfUFVCTElTSF9QUklDRV9QRVJfTUlMTElPTjtcbiAgICBjb25zdCBlZmZlY3RpdmVIdHRwRGVsaXZlcnlQcmljZSA9IGh0dHBEZWxpdmVyeVByaWNlID8/IHRoaXMuRkFMTEJBQ0tfSFRUUF9ERUxJVkVSWV9QUklDRV9QRVJfTUlMTElPTjtcbiAgICBjb25zdCBlZmZlY3RpdmVFbWFpbERlbGl2ZXJ5UHJpY2UgPSBlbWFpbERlbGl2ZXJ5UHJpY2UgPz8gdGhpcy5GQUxMQkFDS19FTUFJTF9ERUxJVkVSWV9QUklDRV9QRVJfMTAwSztcbiAgICBjb25zdCBlZmZlY3RpdmVTbXNQcmljZSA9IHNtc1ByaWNlID8/IHRoaXMuRkFMTEJBQ0tfU01TX1BSSUNFX1BFUl9NRVNTQUdFO1xuICAgIGNvbnN0IGVmZmVjdGl2ZU1vYmlsZVB1c2hQcmljZSA9IG1vYmlsZVB1c2hQcmljZSA/PyB0aGlzLkZBTExCQUNLX01PQklMRV9QVVNIX1BSSUNFX1BFUl9NSUxMSU9OO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHB1Ymxpc2ggY29zdCAoZmlyc3QgMU0gZnJlZSlcbiAgICBjb25zdCBiaWxsYWJsZVB1Ymxpc2hlcyA9IE1hdGgubWF4KDAsIG1vbnRobHlQdWJsaXNoZXMgLSB0aGlzLkZSRUVfVElFUl9QVUJMSVNIRVMpO1xuICAgIGNvbnN0IHB1Ymxpc2hDb3N0ID0gKGJpbGxhYmxlUHVibGlzaGVzIC8gMV8wMDBfMDAwKSAqIGVmZmVjdGl2ZVB1Ymxpc2hQcmljZTtcblxuICAgIC8vIEhUVFAvUyBkZWxpdmVyeSBjb3N0OiAkWCBwZXIgbWlsbGlvblxuICAgIGNvbnN0IGh0dHBEZWxpdmVyeUNvc3QgPSAoaHR0cERlbGl2ZXJpZXMgLyAxXzAwMF8wMDApICogZWZmZWN0aXZlSHR0cERlbGl2ZXJ5UHJpY2U7XG5cbiAgICAvLyBFbWFpbCBkZWxpdmVyeSBjb3N0OiAkWCBwZXIgMTAwLDAwMFxuICAgIGNvbnN0IGVtYWlsRGVsaXZlcnlDb3N0ID0gKGVtYWlsRGVsaXZlcmllcyAvIDEwMF8wMDApICogZWZmZWN0aXZlRW1haWxEZWxpdmVyeVByaWNlO1xuXG4gICAgLy8gU01TIGRlbGl2ZXJ5IGNvc3Q6ICRYIHBlciBtZXNzYWdlICh2YXJpZXMgYnkgY291bnRyeSwgdXNpbmcgVVMgcmF0ZSlcbiAgICBjb25zdCBzbXNEZWxpdmVyeUNvc3QgPSBzbXNEZWxpdmVyaWVzICogZWZmZWN0aXZlU21zUHJpY2U7XG5cbiAgICAvLyBNb2JpbGUgcHVzaCBkZWxpdmVyeSBjb3N0OiAkWCBwZXIgbWlsbGlvblxuICAgIGNvbnN0IG1vYmlsZVB1c2hEZWxpdmVyeUNvc3QgPSAobW9iaWxlUHVzaERlbGl2ZXJpZXMgLyAxXzAwMF8wMDApICogZWZmZWN0aXZlTW9iaWxlUHVzaFByaWNlO1xuXG4gICAgY29uc3QgdG90YWxDb3N0ID0gcHVibGlzaENvc3QgKyBodHRwRGVsaXZlcnlDb3N0ICsgZW1haWxEZWxpdmVyeUNvc3QgKyBzbXNEZWxpdmVyeUNvc3QgKyBtb2JpbGVQdXNoRGVsaXZlcnlDb3N0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Ymxpc2hDb3N0LFxuICAgICAgaHR0cERlbGl2ZXJ5Q29zdCxcbiAgICAgIGVtYWlsRGVsaXZlcnlDb3N0LFxuICAgICAgc21zRGVsaXZlcnlDb3N0LFxuICAgICAgbW9iaWxlUHVzaERlbGl2ZXJ5Q29zdCxcbiAgICAgIHRvdGFsQ29zdCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEFzc3VtcHRpb25zKFxuICAgIG1vbnRobHlQdWJsaXNoZXM6IG51bWJlcixcbiAgICBodHRwRGVsaXZlcmllczogbnVtYmVyLFxuICAgIGVtYWlsRGVsaXZlcmllczogbnVtYmVyLFxuICAgIHNtc0RlbGl2ZXJpZXM6IG51bWJlcixcbiAgICBtb2JpbGVQdXNoRGVsaXZlcmllczogbnVtYmVyLFxuICAgIGNvc3RCcmVha2Rvd246IFNOU0Nvc3RCcmVha2Rvd24sXG4gICAgYWxsUHJpY2VzQXZhaWxhYmxlOiBib29sZWFuLFxuICAgIHB1Ymxpc2hQcmljZTogbnVtYmVyIHwgbnVsbCxcbiAgICBodHRwRGVsaXZlcnlQcmljZTogbnVtYmVyIHwgbnVsbCxcbiAgICBlbWFpbERlbGl2ZXJ5UHJpY2U6IG51bWJlciB8IG51bGwsXG4gICAgc21zUHJpY2U6IG51bWJlciB8IG51bGwsXG4gICAgbW9iaWxlUHVzaFByaWNlOiBudW1iZXIgfCBudWxsLFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBBZGQgdXNhZ2UgYXNzdW1wdGlvbnNcbiAgICBhc3N1bXB0aW9ucy5wdXNoKGBBc3N1bWVzICR7bW9udGhseVB1Ymxpc2hlcy50b0xvY2FsZVN0cmluZygpfSBwdWJsaXNoZXMgcGVyIG1vbnRoYCk7XG4gICAgYXNzdW1wdGlvbnMucHVzaChgQXNzdW1lcyAke2h0dHBEZWxpdmVyaWVzLnRvTG9jYWxlU3RyaW5nKCl9IEhUVFAvUyBkZWxpdmVyaWVzIHBlciBtb250aGApO1xuXG4gICAgaWYgKGVtYWlsRGVsaXZlcmllcyA+IDApIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYEFzc3VtZXMgJHtlbWFpbERlbGl2ZXJpZXMudG9Mb2NhbGVTdHJpbmcoKX0gZW1haWwgZGVsaXZlcmllcyBwZXIgbW9udGhgKTtcbiAgICB9XG4gICAgaWYgKHNtc0RlbGl2ZXJpZXMgPiAwKSB7XG4gICAgICBhc3N1bXB0aW9ucy5wdXNoKGBBc3N1bWVzICR7c21zRGVsaXZlcmllcy50b0xvY2FsZVN0cmluZygpfSBTTVMgZGVsaXZlcmllcyBwZXIgbW9udGggKHVzaW5nIFVTIHJhdGUpYCk7XG4gICAgfVxuICAgIGlmIChtb2JpbGVQdXNoRGVsaXZlcmllcyA+IDApIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYEFzc3VtZXMgJHttb2JpbGVQdXNoRGVsaXZlcmllcy50b0xvY2FsZVN0cmluZygpfSBtb2JpbGUgcHVzaCBkZWxpdmVyaWVzIHBlciBtb250aGApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmcmVlIHRpZXIgaW5mb3JtYXRpb25cbiAgICBpZiAobW9udGhseVB1Ymxpc2hlcyA8PSB0aGlzLkZSRUVfVElFUl9QVUJMSVNIRVMpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYEZpcnN0ICR7dGhpcy5GUkVFX1RJRVJfUFVCTElTSEVTLnRvTG9jYWxlU3RyaW5nKCl9IHB1Ymxpc2hlcyBhcmUgZnJlZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBiaWxsYWJsZVB1Ymxpc2hlcyA9IG1vbnRobHlQdWJsaXNoZXMgLSB0aGlzLkZSRUVfVElFUl9QVUJMSVNIRVM7XG4gICAgICBhc3N1bXB0aW9ucy5wdXNoKGAke3RoaXMuRlJFRV9USUVSX1BVQkxJU0hFUy50b0xvY2FsZVN0cmluZygpfSBmcmVlIHRpZXIgcHVibGlzaGVzIGFwcGxpZWQsICR7YmlsbGFibGVQdWJsaXNoZXMudG9Mb2NhbGVTdHJpbmcoKX0gYmlsbGFibGVgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY29zdCBicmVha2Rvd25cbiAgICBpZiAoY29zdEJyZWFrZG93bi5wdWJsaXNoQ29zdCA+IDApIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYFB1Ymxpc2ggY29zdDogJCR7Y29zdEJyZWFrZG93bi5wdWJsaXNoQ29zdC50b0ZpeGVkKDIpfWApO1xuICAgIH1cbiAgICBpZiAoY29zdEJyZWFrZG93bi5odHRwRGVsaXZlcnlDb3N0ID4gMCkge1xuICAgICAgYXNzdW1wdGlvbnMucHVzaChgSFRUUC9TIGRlbGl2ZXJ5IGNvc3Q6ICQke2Nvc3RCcmVha2Rvd24uaHR0cERlbGl2ZXJ5Q29zdC50b0ZpeGVkKDIpfWApO1xuICAgIH1cbiAgICBpZiAoY29zdEJyZWFrZG93bi5lbWFpbERlbGl2ZXJ5Q29zdCA+IDApIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYEVtYWlsIGRlbGl2ZXJ5IGNvc3Q6ICQke2Nvc3RCcmVha2Rvd24uZW1haWxEZWxpdmVyeUNvc3QudG9GaXhlZCgyKX1gKTtcbiAgICB9XG4gICAgaWYgKGNvc3RCcmVha2Rvd24uc21zRGVsaXZlcnlDb3N0ID4gMCkge1xuICAgICAgYXNzdW1wdGlvbnMucHVzaChgU01TIGRlbGl2ZXJ5IGNvc3Q6ICQke2Nvc3RCcmVha2Rvd24uc21zRGVsaXZlcnlDb3N0LnRvRml4ZWQoMil9YCk7XG4gICAgfVxuICAgIGlmIChjb3N0QnJlYWtkb3duLm1vYmlsZVB1c2hEZWxpdmVyeUNvc3QgPiAwKSB7XG4gICAgICBhc3N1bXB0aW9ucy5wdXNoKGBNb2JpbGUgcHVzaCBkZWxpdmVyeSBjb3N0OiAkJHtjb3N0QnJlYWtkb3duLm1vYmlsZVB1c2hEZWxpdmVyeUNvc3QudG9GaXhlZCgyKX1gKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZmFsbGJhY2sgcHJpY2luZyBub3Rlc1xuICAgIGlmICghYWxsUHJpY2VzQXZhaWxhYmxlKSB7XG4gICAgICBpZiAocHVibGlzaFByaWNlID09PSBudWxsKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGZhbGxiYWNrIHB1Ymxpc2ggcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScpO1xuICAgICAgfVxuICAgICAgaWYgKGh0dHBEZWxpdmVyeVByaWNlID09PSBudWxsKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGZhbGxiYWNrIEhUVFAgZGVsaXZlcnkgcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScpO1xuICAgICAgfVxuICAgICAgaWYgKGVtYWlsRGVsaXZlcnlQcmljZSA9PT0gbnVsbCAmJiBlbWFpbERlbGl2ZXJpZXMgPiAwKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGZhbGxiYWNrIGVtYWlsIGRlbGl2ZXJ5IHByaWNpbmcgKEFQSSB1bmF2YWlsYWJsZSknKTtcbiAgICAgIH1cbiAgICAgIGlmIChzbXNQcmljZSA9PT0gbnVsbCAmJiBzbXNEZWxpdmVyaWVzID4gMCkge1xuICAgICAgICBhc3N1bXB0aW9ucy5wdXNoKCdVc2luZyBmYWxsYmFjayBTTVMgcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScpO1xuICAgICAgfVxuICAgICAgaWYgKG1vYmlsZVB1c2hQcmljZSA9PT0gbnVsbCAmJiBtb2JpbGVQdXNoRGVsaXZlcmllcyA+IDApIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgZmFsbGJhY2sgbW9iaWxlIHB1c2ggcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBjdXN0b20gYXNzdW1wdGlvbiBub3Rlc1xuICAgIGlmICh0aGlzLmN1c3RvbU1vbnRobHlQdWJsaXNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIHB1Ymxpc2ggY291bnQgZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1c3RvbUh0dHBEZWxpdmVyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBIVFRQIGRlbGl2ZXJ5IGNvdW50IGZyb20gY29uZmlndXJhdGlvbicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXN0b21FbWFpbERlbGl2ZXJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGVtYWlsIGRlbGl2ZXJ5IGNvdW50IGZyb20gY29uZmlndXJhdGlvbicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXN0b21TbXNEZWxpdmVyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBTTVMgZGVsaXZlcnkgY291bnQgZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1c3RvbU1vYmlsZVB1c2hEZWxpdmVyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBtb2JpbGUgcHVzaCBkZWxpdmVyeSBjb3VudCBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGhhc0N1c3RvbUFzc3VtcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmN1c3RvbU1vbnRobHlQdWJsaXNoZXMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5jdXN0b21IdHRwRGVsaXZlcmllcyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmN1c3RvbUVtYWlsRGVsaXZlcmllcyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmN1c3RvbVNtc0RlbGl2ZXJpZXMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5jdXN0b21Nb2JpbGVQdXNoRGVsaXZlcmllcyAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ResourceWithId } from '../../diff/types';
|
|
2
|
+
import { ResourceCostCalculator, MonthlyCost, PricingClient } from '../types';
|
|
3
|
+
import { CostAnalyzerConfig } from '../../config/types';
|
|
4
|
+
export declare class SQSCalculator implements ResourceCostCalculator {
|
|
5
|
+
private readonly DEFAULT_MONTHLY_REQUESTS;
|
|
6
|
+
private readonly FALLBACK_STANDARD_PRICE_PER_MILLION;
|
|
7
|
+
private readonly FALLBACK_FIFO_PRICE_PER_MILLION;
|
|
8
|
+
private config?;
|
|
9
|
+
constructor(config?: CostAnalyzerConfig);
|
|
10
|
+
supports(resourceType: string): boolean;
|
|
11
|
+
calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
|
|
12
|
+
private isFifoQueue;
|
|
13
|
+
private getMonthlyRequests;
|
|
14
|
+
private buildAssumptions;
|
|
15
|
+
private getPricePerMillion;
|
|
16
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SQSCalculator = void 0;
|
|
4
|
+
const RegionMapper_1 = require("../RegionMapper");
|
|
5
|
+
class SQSCalculator {
|
|
6
|
+
DEFAULT_MONTHLY_REQUESTS = 1_000_000;
|
|
7
|
+
// Fallback pricing rates (AWS SQS us-east-1 pricing as of 2024)
|
|
8
|
+
// Used when API pricing is unavailable but user provided usage assumptions
|
|
9
|
+
FALLBACK_STANDARD_PRICE_PER_MILLION = 0.40;
|
|
10
|
+
FALLBACK_FIFO_PRICE_PER_MILLION = 0.50;
|
|
11
|
+
config;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
}
|
|
15
|
+
supports(resourceType) {
|
|
16
|
+
return resourceType === 'AWS::SQS::Queue';
|
|
17
|
+
}
|
|
18
|
+
async calculateCost(resource, region, pricingClient) {
|
|
19
|
+
const isFifo = this.isFifoQueue(resource);
|
|
20
|
+
const monthlyRequests = this.getMonthlyRequests();
|
|
21
|
+
try {
|
|
22
|
+
const pricePerMillion = await this.getPricePerMillion(region, isFifo, pricingClient);
|
|
23
|
+
const assumptions = this.buildAssumptions(monthlyRequests, isFifo);
|
|
24
|
+
if (pricePerMillion === null) {
|
|
25
|
+
const hasCustomAssumptions = this.config?.usageAssumptions?.sqs?.monthlyRequests !== undefined;
|
|
26
|
+
if (hasCustomAssumptions) {
|
|
27
|
+
const fallbackPrice = isFifo
|
|
28
|
+
? this.FALLBACK_FIFO_PRICE_PER_MILLION
|
|
29
|
+
: this.FALLBACK_STANDARD_PRICE_PER_MILLION;
|
|
30
|
+
const monthlyCost = (monthlyRequests / 1_000_000) * fallbackPrice;
|
|
31
|
+
return {
|
|
32
|
+
amount: monthlyCost,
|
|
33
|
+
currency: 'USD',
|
|
34
|
+
confidence: 'low',
|
|
35
|
+
assumptions: [
|
|
36
|
+
'Using fallback pricing (API unavailable)',
|
|
37
|
+
...assumptions,
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
amount: 0,
|
|
43
|
+
currency: 'USD',
|
|
44
|
+
confidence: 'unknown',
|
|
45
|
+
assumptions: [
|
|
46
|
+
`Pricing data not available for SQS in region ${region}`,
|
|
47
|
+
...assumptions,
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const monthlyCost = (monthlyRequests / 1_000_000) * pricePerMillion;
|
|
52
|
+
return {
|
|
53
|
+
amount: monthlyCost,
|
|
54
|
+
currency: 'USD',
|
|
55
|
+
confidence: 'medium',
|
|
56
|
+
assumptions,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const assumptions = this.buildAssumptions(monthlyRequests, isFifo);
|
|
61
|
+
const hasCustomAssumptions = this.config?.usageAssumptions?.sqs?.monthlyRequests !== undefined;
|
|
62
|
+
if (hasCustomAssumptions) {
|
|
63
|
+
const fallbackPrice = isFifo
|
|
64
|
+
? this.FALLBACK_FIFO_PRICE_PER_MILLION
|
|
65
|
+
: this.FALLBACK_STANDARD_PRICE_PER_MILLION;
|
|
66
|
+
const monthlyCost = (monthlyRequests / 1_000_000) * fallbackPrice;
|
|
67
|
+
return {
|
|
68
|
+
amount: monthlyCost,
|
|
69
|
+
currency: 'USD',
|
|
70
|
+
confidence: 'low',
|
|
71
|
+
assumptions: [
|
|
72
|
+
'Using fallback pricing (API error)',
|
|
73
|
+
...assumptions,
|
|
74
|
+
],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
amount: 0,
|
|
79
|
+
currency: 'USD',
|
|
80
|
+
confidence: 'unknown',
|
|
81
|
+
assumptions: [
|
|
82
|
+
`Failed to fetch pricing: ${error instanceof Error ? error.message : String(error)}`,
|
|
83
|
+
...assumptions,
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
isFifoQueue(resource) {
|
|
89
|
+
return resource.properties.FifoQueue === true ||
|
|
90
|
+
resource.properties.FifoQueue === 'true';
|
|
91
|
+
}
|
|
92
|
+
getMonthlyRequests() {
|
|
93
|
+
return this.config?.usageAssumptions?.sqs?.monthlyRequests ?? this.DEFAULT_MONTHLY_REQUESTS;
|
|
94
|
+
}
|
|
95
|
+
buildAssumptions(monthlyRequests, isFifo) {
|
|
96
|
+
const assumptions = [
|
|
97
|
+
`Assumes ${monthlyRequests.toLocaleString()} requests per month`,
|
|
98
|
+
isFifo ? 'FIFO queue' : 'Standard queue',
|
|
99
|
+
'Does not include data transfer costs',
|
|
100
|
+
];
|
|
101
|
+
if (this.config?.usageAssumptions?.sqs?.monthlyRequests !== undefined) {
|
|
102
|
+
assumptions.push('Using custom monthly requests assumption from configuration');
|
|
103
|
+
}
|
|
104
|
+
return assumptions;
|
|
105
|
+
}
|
|
106
|
+
async getPricePerMillion(region, isFifo, pricingClient) {
|
|
107
|
+
const normalizedRegion = (0, RegionMapper_1.normalizeRegion)(region);
|
|
108
|
+
const regionPrefix = (0, RegionMapper_1.getRegionPrefix)(region);
|
|
109
|
+
// Standard queue usagetype: USE1-Requests (or just Requests for us-east-1)
|
|
110
|
+
// FIFO queue usagetype: USE1-Requests-FIFO (or just Requests-FIFO for us-east-1)
|
|
111
|
+
const baseUsageType = isFifo ? 'Requests-FIFO' : 'Requests';
|
|
112
|
+
const usageType = regionPrefix ? `${regionPrefix}-${baseUsageType}` : baseUsageType;
|
|
113
|
+
return pricingClient.getPrice({
|
|
114
|
+
serviceCode: 'AWSQueueService',
|
|
115
|
+
region: normalizedRegion,
|
|
116
|
+
filters: [
|
|
117
|
+
{ field: 'productFamily', value: 'Queue' },
|
|
118
|
+
{ field: 'usagetype', value: usageType },
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.SQSCalculator = SQSCalculator;
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1FTQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL1NRU0NhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQW1FO0FBR25FLE1BQWEsYUFBYTtJQUNQLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztJQUV0RCxnRUFBZ0U7SUFDaEUsMkVBQTJFO0lBQzFELG1DQUFtQyxHQUFHLElBQUksQ0FBQztJQUMzQywrQkFBK0IsR0FBRyxJQUFJLENBQUM7SUFFaEQsTUFBTSxDQUFzQjtJQUVwQyxZQUFZLE1BQTJCO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxRQUFRLENBQUMsWUFBb0I7UUFDM0IsT0FBTyxZQUFZLEtBQUssaUJBQWlCLENBQUM7SUFDNUMsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQ2pCLFFBQXdCLEVBQ3hCLE1BQWMsRUFDZCxhQUE0QjtRQUU1QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRWxELElBQUksQ0FBQztZQUNILE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFckYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVuRSxJQUFJLGVBQWUsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxlQUFlLEtBQUssU0FBUyxDQUFDO2dCQUUvRixJQUFJLG9CQUFvQixFQUFFLENB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UUFFRixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0RSxXQUFXLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxLQUFLLENBQUMsa0JBQWtCLENBQzlCLE1BQWMsRUFDZCxNQUFlLEVBQ2YsYUFBNEI7UUFFNUIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDhCQUFlLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsTUFBTSxZQUFZLEdBQUcsSUFBQSw4QkFBZSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdDLDJFQUEyRTtRQUMzRSxpRkFBaUY7UUFDakYsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUM1RCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxJQUFJLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFFcEYsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQzVCLFdBQVcsRUFBRSxpQkFBaUI7WUFDOUIsTUFBTSxFQUFFLGdCQUFnQjtZQUN4QixPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7Z0JBQzFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2FBQ3pDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBcEpELHNDQW9KQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yLCBNb250aGx5Q29zdCwgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlZ2lvbiwgZ2V0UmVnaW9uUHJlZml4IH0gZnJvbSAnLi4vUmVnaW9uTWFwcGVyJztcbmltcG9ydCB7IENvc3RBbmFseXplckNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZy90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBTUVNDYWxjdWxhdG9yIGltcGxlbWVudHMgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9NT05USExZX1JFUVVFU1RTID0gMV8wMDBfMDAwO1xuXG4gIC8vIEZhbGxiYWNrIHByaWNpbmcgcmF0ZXMgKEFXUyBTUVMgdXMtZWFzdC0xIHByaWNpbmcgYXMgb2YgMjAyNClcbiAgLy8gVXNlZCB3aGVuIEFQSSBwcmljaW5nIGlzIHVuYXZhaWxhYmxlIGJ1dCB1c2VyIHByb3ZpZGVkIHVzYWdlIGFzc3VtcHRpb25zXG4gIHByaXZhdGUgcmVhZG9ubHkgRkFMTEJBQ0tfU1RBTkRBUkRfUFJJQ0VfUEVSX01JTExJT04gPSAwLjQwO1xuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX0ZJRk9fUFJJQ0VfUEVSX01JTExJT04gPSAwLjUwO1xuXG4gIHByaXZhdGUgY29uZmlnPzogQ29zdEFuYWx5emVyQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IENvc3RBbmFseXplckNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgc3VwcG9ydHMocmVzb3VyY2VUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb3VyY2VUeXBlID09PSAnQVdTOjpTUVM6OlF1ZXVlJztcbiAgfVxuXG4gIGFzeW5jIGNhbGN1bGF0ZUNvc3QoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICk6IFByb21pc2U8TW9udGhseUNvc3Q+IHtcbiAgICBjb25zdCBpc0ZpZm8gPSB0aGlzLmlzRmlmb1F1ZXVlKHJlc291cmNlKTtcbiAgICBjb25zdCBtb250aGx5UmVxdWVzdHMgPSB0aGlzLmdldE1vbnRobHlSZXF1ZXN0cygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByaWNlUGVyTWlsbGlvbiA9IGF3YWl0IHRoaXMuZ2V0UHJpY2VQZXJNaWxsaW9uKHJlZ2lvbiwgaXNGaWZvLCBwcmljaW5nQ2xpZW50KTtcblxuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSB0aGlzLmJ1aWxkQXNzdW1wdGlvbnMobW9udGhseVJlcXVlc3RzLCBpc0ZpZm8pO1xuXG4gICAgICBpZiAocHJpY2VQZXJNaWxsaW9uID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGhhc0N1c3RvbUFzc3VtcHRpb25zID0gdGhpcy5jb25maWc/LnVzYWdlQXNzdW1wdGlvbnM/LnNxcz8ubW9udGhseVJlcXVlc3RzICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGhhc0N1c3RvbUFzc3VtcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgZmFsbGJhY2tQcmljZSA9IGlzRmlmb1xuICAgICAgICAgICAgPyB0aGlzLkZBTExCQUNLX0ZJRk9fUFJJQ0VfUEVSX01JTExJT05cbiAgICAgICAgICAgIDogdGhpcy5GQUxMQkFDS19TVEFOREFSRF9QUklDRV9QRVJfTUlMTElPTjtcbiAgICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IChtb250aGx5UmVxdWVzdHMgLyAxXzAwMF8wMDApICogZmFsbGJhY2tQcmljZTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbW91bnQ6IG1vbnRobHlDb3N0LFxuICAgICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICAgICAgY29uZmlkZW5jZTogJ2xvdycsXG4gICAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgICAnVXNpbmcgZmFsbGJhY2sgcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScsXG4gICAgICAgICAgICAgIC4uLmFzc3VtcHRpb25zLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgYFByaWNpbmcgZGF0YSBub3QgYXZhaWxhYmxlIGZvciBTUVMgaW4gcmVnaW9uICR7cmVnaW9ufWAsXG4gICAgICAgICAgICAuLi5hc3N1bXB0aW9ucyxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtb250aGx5Q29zdCA9IChtb250aGx5UmVxdWVzdHMgLyAxXzAwMF8wMDApICogcHJpY2VQZXJNaWxsaW9uO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IG1vbnRobHlDb3N0LFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICdtZWRpdW0nLFxuICAgICAgICBhc3N1bXB0aW9ucyxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGFzc3VtcHRpb25zID0gdGhpcy5idWlsZEFzc3VtcHRpb25zKG1vbnRobHlSZXF1ZXN0cywgaXNGaWZvKTtcbiAgICAgIGNvbnN0IGhhc0N1c3RvbUFzc3VtcHRpb25zID0gdGhpcy5jb25maWc/LnVzYWdlQXNzdW1wdGlvbnM/LnNxcz8ubW9udGhseVJlcXVlc3RzICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChoYXNDdXN0b21Bc3N1bXB0aW9ucykge1xuICAgICAgICBjb25zdCBmYWxsYmFja1ByaWNlID0gaXNGaWZvXG4gICAgICAgICAgPyB0aGlzLkZBTExCQUNLX0ZJRk9fUFJJQ0VfUEVSX01JTExJT05cbiAgICAgICAgICA6IHRoaXMuRkFMTEJBQ0tfU1RBTkRBUkRfUFJJQ0VfUEVSX01JTExJT047XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gKG1vbnRobHlSZXF1ZXN0cyAvIDFfMDAwXzAwMCkgKiBmYWxsYmFja1ByaWNlO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYW1vdW50OiBtb250aGx5Q29zdCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgICAgY29uZmlkZW5jZTogJ2xvdycsXG4gICAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICAgICdVc2luZyBmYWxsYmFjayBwcmljaW5nIChBUEkgZXJyb3IpJyxcbiAgICAgICAgICAgIC4uLmFzc3VtcHRpb25zLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCBwcmljaW5nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICAgIC4uLmFzc3VtcHRpb25zLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRmlmb1F1ZXVlKHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNvdXJjZS5wcm9wZXJ0aWVzLkZpZm9RdWV1ZSA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICByZXNvdXJjZS5wcm9wZXJ0aWVzLkZpZm9RdWV1ZSA9PT0gJ3RydWUnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNb250aGx5UmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LnVzYWdlQXNzdW1wdGlvbnM/LnNxcz8ubW9udGhseVJlcXVlc3RzID8/IHRoaXMuREVGQVVMVF9NT05USExZX1JFUVVFU1RTO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEFzc3VtcHRpb25zKG1vbnRobHlSZXF1ZXN0czogbnVtYmVyLCBpc0ZpZm86IGJvb2xlYW4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbnMgPSBbXG4gICAgICBgQXNzdW1lcyAke21vbnRobHlSZXF1ZXN0cy50b0xvY2FsZVN0cmluZygpfSByZXF1ZXN0cyBwZXIgbW9udGhgLFxuICAgICAgaXNGaWZvID8gJ0ZJRk8gcXVldWUnIDogJ1N0YW5kYXJkIHF1ZXVlJyxcbiAgICAgICdEb2VzIG5vdCBpbmNsdWRlIGRhdGEgdHJhbnNmZXIgY29zdHMnLFxuICAgIF07XG5cbiAgICBpZiAodGhpcy5jb25maWc/LnVzYWdlQXNzdW1wdGlvbnM/LnNxcz8ubW9udGhseVJlcXVlc3RzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBtb250aGx5IHJlcXVlc3RzIGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRQcmljZVBlck1pbGxpb24oXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgaXNGaWZvOiBib29sZWFuLFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWdpb24gPSBub3JtYWxpemVSZWdpb24ocmVnaW9uKTtcbiAgICBjb25zdCByZWdpb25QcmVmaXggPSBnZXRSZWdpb25QcmVmaXgocmVnaW9uKTtcblxuICAgIC8vIFN0YW5kYXJkIHF1ZXVlIHVzYWdldHlwZTogVVNFMS1SZXF1ZXN0cyAob3IganVzdCBSZXF1ZXN0cyBmb3IgdXMtZWFzdC0xKVxuICAgIC8vIEZJRk8gcXVldWUgdXNhZ2V0eXBlOiBVU0UxLVJlcXVlc3RzLUZJRk8gKG9yIGp1c3QgUmVxdWVzdHMtRklGTyBmb3IgdXMtZWFzdC0xKVxuICAgIGNvbnN0IGJhc2VVc2FnZVR5cGUgPSBpc0ZpZm8gPyAnUmVxdWVzdHMtRklGTycgOiAnUmVxdWVzdHMnO1xuICAgIGNvbnN0IHVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCA/IGAke3JlZ2lvblByZWZpeH0tJHtiYXNlVXNhZ2VUeXBlfWAgOiBiYXNlVXNhZ2VUeXBlO1xuXG4gICAgcmV0dXJuIHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgc2VydmljZUNvZGU6ICdBV1NRdWV1ZVNlcnZpY2UnLFxuICAgICAgcmVnaW9uOiBub3JtYWxpemVkUmVnaW9uLFxuICAgICAgZmlsdGVyczogW1xuICAgICAgICB7IGZpZWxkOiAncHJvZHVjdEZhbWlseScsIHZhbHVlOiAnUXVldWUnIH0sXG4gICAgICAgIHsgZmllbGQ6ICd1c2FnZXR5cGUnLCB2YWx1ZTogdXNhZ2VUeXBlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
package/dist/pricing/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export { LambdaCalculator } from './calculators/LambdaCalculator';
|
|
|
7
7
|
export { RDSCalculator } from './calculators/RDSCalculator';
|
|
8
8
|
export { CloudFrontCalculator } from './calculators/CloudFrontCalculator';
|
|
9
9
|
export { ElastiCacheCalculator } from './calculators/ElastiCacheCalculator';
|
|
10
|
+
export { SNSCalculator, SNSCostBreakdown } from './calculators/SNSCalculator';
|
|
11
|
+
export { SQSCalculator } from './calculators/SQSCalculator';
|
|
10
12
|
export { LaunchTemplateCalculator, LaunchTemplateConfig, EbsVolumeConfig, } from './calculators/LaunchTemplateCalculator';
|
|
11
13
|
export { StepFunctionsCalculator, StepFunctionsWorkflowType, } from './calculators/StepFunctionsCalculator';
|
|
12
14
|
export * from './types';
|
package/dist/pricing/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.StepFunctionsCalculator = exports.LaunchTemplateCalculator = exports.ElastiCacheCalculator = exports.CloudFrontCalculator = exports.RDSCalculator = exports.LambdaCalculator = exports.S3Calculator = exports.EC2Calculator = exports.CacheManager = exports.PricingClient = exports.PricingService = void 0;
|
|
17
|
+
exports.StepFunctionsCalculator = exports.LaunchTemplateCalculator = exports.SQSCalculator = exports.SNSCalculator = exports.ElastiCacheCalculator = exports.CloudFrontCalculator = exports.RDSCalculator = exports.LambdaCalculator = exports.S3Calculator = exports.EC2Calculator = exports.CacheManager = exports.PricingClient = exports.PricingService = void 0;
|
|
18
18
|
var PricingService_1 = require("./PricingService");
|
|
19
19
|
Object.defineProperty(exports, "PricingService", { enumerable: true, get: function () { return PricingService_1.PricingService; } });
|
|
20
20
|
var PricingClient_1 = require("./PricingClient");
|
|
@@ -33,9 +33,13 @@ var CloudFrontCalculator_1 = require("./calculators/CloudFrontCalculator");
|
|
|
33
33
|
Object.defineProperty(exports, "CloudFrontCalculator", { enumerable: true, get: function () { return CloudFrontCalculator_1.CloudFrontCalculator; } });
|
|
34
34
|
var ElastiCacheCalculator_1 = require("./calculators/ElastiCacheCalculator");
|
|
35
35
|
Object.defineProperty(exports, "ElastiCacheCalculator", { enumerable: true, get: function () { return ElastiCacheCalculator_1.ElastiCacheCalculator; } });
|
|
36
|
+
var SNSCalculator_1 = require("./calculators/SNSCalculator");
|
|
37
|
+
Object.defineProperty(exports, "SNSCalculator", { enumerable: true, get: function () { return SNSCalculator_1.SNSCalculator; } });
|
|
38
|
+
var SQSCalculator_1 = require("./calculators/SQSCalculator");
|
|
39
|
+
Object.defineProperty(exports, "SQSCalculator", { enumerable: true, get: function () { return SQSCalculator_1.SQSCalculator; } });
|
|
36
40
|
var LaunchTemplateCalculator_1 = require("./calculators/LaunchTemplateCalculator");
|
|
37
41
|
Object.defineProperty(exports, "LaunchTemplateCalculator", { enumerable: true, get: function () { return LaunchTemplateCalculator_1.LaunchTemplateCalculator; } });
|
|
38
42
|
var StepFunctionsCalculator_1 = require("./calculators/StepFunctionsCalculator");
|
|
39
43
|
Object.defineProperty(exports, "StepFunctionsCalculator", { enumerable: true, get: function () { return StepFunctionsCalculator_1.StepFunctionsCalculator; } });
|
|
40
44
|
__exportStar(require("./types"), exports);
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwrQ0FBOEM7QUFBckMsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLDZEQUE0RDtBQUFuRCw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsMkRBQTBEO0FBQWpELDRHQUFBLFlBQVksT0FBQTtBQUNyQixtRUFBa0U7QUFBekQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwyRUFBMEU7QUFBakUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNkVBQTRFO0FBQW5FLDhIQUFBLHFCQUFxQixPQUFBO0FBQzlCLDZEQUE4RTtBQUFyRSw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QixtRkFJZ0Q7QUFIOUMsb0lBQUEsd0JBQXdCLE9BQUE7QUFJMUIsaUZBRytDO0FBRjdDLGtJQUFBLHVCQUF1QixPQUFBO0FBR3pCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFByaWNpbmdTZXJ2aWNlIH0gZnJvbSAnLi9QcmljaW5nU2VydmljZSc7XG5leHBvcnQgeyBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi9QcmljaW5nQ2xpZW50JztcbmV4cG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gJy4vQ2FjaGVNYW5hZ2VyJztcbmV4cG9ydCB7IEVDMkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VDMkNhbGN1bGF0b3InO1xuZXhwb3J0IHsgUzNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TM0NhbGN1bGF0b3InO1xuZXhwb3J0IHsgTGFtYmRhQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTGFtYmRhQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBSRFNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9SRFNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IENsb3VkRnJvbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9DbG91ZEZyb250Q2FsY3VsYXRvcic7XG5leHBvcnQgeyBFbGFzdGlDYWNoZUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VsYXN0aUNhY2hlQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBTTlNDYWxjdWxhdG9yLCBTTlNDb3N0QnJlYWtkb3duIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TTlNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IFNRU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1NRU0NhbGN1bGF0b3InO1xuZXhwb3J0IHtcbiAgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yLFxuICBMYXVuY2hUZW1wbGF0ZUNvbmZpZyxcbiAgRWJzVm9sdW1lQ29uZmlnLFxufSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvcic7XG5leHBvcnQge1xuICBTdGVwRnVuY3Rpb25zQ2FsY3VsYXRvcixcbiAgU3RlcEZ1bmN0aW9uc1dvcmtmbG93VHlwZSxcbn0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TdGVwRnVuY3Rpb25zQ2FsY3VsYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
|
package/dist/releasetag.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v0.1.
|
|
1
|
+
v0.1.32
|
package/docs/CALCULATORS.md
CHANGED
|
@@ -9,6 +9,7 @@ This document provides detailed information about all supported AWS resource typ
|
|
|
9
9
|
- [Storage Resources](#storage-resources)
|
|
10
10
|
- [Database Resources](#database-resources)
|
|
11
11
|
- [Networking Resources](#networking-resources)
|
|
12
|
+
- [Messaging Resources](#messaging-resources)
|
|
12
13
|
- [Content Delivery Resources](#content-delivery-resources)
|
|
13
14
|
- [Serverless Resources](#serverless-resources)
|
|
14
15
|
- [Container Resources](#container-resources)
|
|
@@ -386,6 +387,54 @@ Monthly Cost: $0.00 (no charge)
|
|
|
386
387
|
- Each endpoint per AZ incurs separate charges
|
|
387
388
|
- Data transfer within same region not charged
|
|
388
389
|
|
|
390
|
+
## Messaging Resources
|
|
391
|
+
|
|
392
|
+
### AWS::SQS::Queue
|
|
393
|
+
|
|
394
|
+
**Description:** Amazon Simple Queue Service for message queuing
|
|
395
|
+
|
|
396
|
+
**Cost Components:**
|
|
397
|
+
- Request pricing: Per million requests
|
|
398
|
+
|
|
399
|
+
**Queue Types:**
|
|
400
|
+
- **Standard Queue**: $0.40 per million requests (first 1 million free)
|
|
401
|
+
- **FIFO Queue**: $0.50 per million requests (first 1 million free)
|
|
402
|
+
|
|
403
|
+
**Default Assumptions:**
|
|
404
|
+
- 1 million requests per month
|
|
405
|
+
- Standard queue (unless FifoQueue property is true)
|
|
406
|
+
|
|
407
|
+
**Configuration:**
|
|
408
|
+
```yaml
|
|
409
|
+
usageAssumptions:
|
|
410
|
+
sqs:
|
|
411
|
+
monthlyRequests: 1000000
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
**Example (Standard Queue):**
|
|
415
|
+
```
|
|
416
|
+
Requests: 1M × $0.40/1M = $0.40
|
|
417
|
+
Total: $0.40/month
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**Example (FIFO Queue):**
|
|
421
|
+
```
|
|
422
|
+
Requests: 1M × $0.50/1M = $0.50
|
|
423
|
+
Total: $0.50/month
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
**Detection:**
|
|
427
|
+
- Queue type is detected from the `FifoQueue` CloudFormation property
|
|
428
|
+
- If `FifoQueue: true` is set, FIFO pricing is applied
|
|
429
|
+
- Otherwise, standard queue pricing is used
|
|
430
|
+
|
|
431
|
+
**Notes:**
|
|
432
|
+
- First 1 million requests free per month (not factored into estimates)
|
|
433
|
+
- FIFO queues provide exactly-once processing
|
|
434
|
+
- Data transfer costs not included
|
|
435
|
+
- Long polling and batch operations count as single requests
|
|
436
|
+
- Dead-letter queue costs calculated separately
|
|
437
|
+
|
|
389
438
|
## Content Delivery Resources
|
|
390
439
|
|
|
391
440
|
### AWS::CloudFront::Distribution
|
|
@@ -583,6 +632,71 @@ Total: $1.03/month
|
|
|
583
632
|
- WebSocket connections billed per minute
|
|
584
633
|
- Message size up to 128 KB
|
|
585
634
|
|
|
635
|
+
### AWS::SNS::Topic
|
|
636
|
+
|
|
637
|
+
**Description:** Simple Notification Service for pub/sub messaging
|
|
638
|
+
|
|
639
|
+
**Cost Components:**
|
|
640
|
+
- Publish requests: Per million requests (first 1M free)
|
|
641
|
+
- HTTP/S deliveries: Per million deliveries
|
|
642
|
+
- Email deliveries: Per 100,000 deliveries
|
|
643
|
+
- SMS deliveries: Per message (varies by country)
|
|
644
|
+
- Mobile push deliveries: Per million deliveries
|
|
645
|
+
|
|
646
|
+
**Default Assumptions:**
|
|
647
|
+
- 1 million publish requests per month
|
|
648
|
+
- 1 million HTTP/S deliveries per month
|
|
649
|
+
- 0 email deliveries per month
|
|
650
|
+
- 0 SMS deliveries per month
|
|
651
|
+
- 0 mobile push deliveries per month
|
|
652
|
+
|
|
653
|
+
**Configuration:**
|
|
654
|
+
```yaml
|
|
655
|
+
usageAssumptions:
|
|
656
|
+
sns:
|
|
657
|
+
monthlyPublishes: 1000000
|
|
658
|
+
httpDeliveries: 1000000
|
|
659
|
+
emailDeliveries: 0
|
|
660
|
+
smsDeliveries: 0
|
|
661
|
+
mobilePushDeliveries: 0
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
**Example:**
|
|
665
|
+
```
|
|
666
|
+
Publish requests: 2M publishes - 1M free = 1M × $0.50/1M = $0.50
|
|
667
|
+
HTTP/S deliveries: 1M × $0.60/1M = $0.60
|
|
668
|
+
Total: $1.10/month
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
**Example with multiple delivery types:**
|
|
672
|
+
```yaml
|
|
673
|
+
usageAssumptions:
|
|
674
|
+
sns:
|
|
675
|
+
monthlyPublishes: 5000000
|
|
676
|
+
httpDeliveries: 2000000
|
|
677
|
+
emailDeliveries: 100000
|
|
678
|
+
smsDeliveries: 10000
|
|
679
|
+
mobilePushDeliveries: 500000
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
```
|
|
683
|
+
Publish requests: 5M - 1M free = 4M × $0.50/1M = $2.00
|
|
684
|
+
HTTP/S deliveries: 2M × $0.60/1M = $1.20
|
|
685
|
+
Email deliveries: 100K × $2.00/100K = $2.00
|
|
686
|
+
SMS deliveries: 10K × $0.00645 = $64.50 (US rate)
|
|
687
|
+
Mobile push: 500K × $0.50/1M = $0.25
|
|
688
|
+
Total: $69.95/month
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
**Notes:**
|
|
692
|
+
- First 1 million publish requests free per month
|
|
693
|
+
- SMS pricing varies significantly by destination country
|
|
694
|
+
- US SMS rate used as fallback ($0.00645/message)
|
|
695
|
+
- Mobile push includes APNS (iOS), GCM/FCM (Android), ADM (Amazon)
|
|
696
|
+
- Data transfer costs not included
|
|
697
|
+
- SNS FIFO topics may have different pricing
|
|
698
|
+
- Large message payloads (>64KB) count as multiple requests
|
|
699
|
+
|
|
586
700
|
### AWS::StepFunctions::StateMachine
|
|
587
701
|
|
|
588
702
|
**Description:** AWS Step Functions state machine for serverless workflow orchestration
|
|
@@ -737,6 +851,10 @@ usageAssumptions:
|
|
|
737
851
|
vpcEndpoint:
|
|
738
852
|
dataProcessedGB: 200
|
|
739
853
|
|
|
854
|
+
# Messaging
|
|
855
|
+
sqs:
|
|
856
|
+
monthlyRequests: 5000000
|
|
857
|
+
|
|
740
858
|
# Content Delivery
|
|
741
859
|
cloudFront:
|
|
742
860
|
dataTransferGB: 1000
|
|
@@ -759,12 +877,20 @@ usageAssumptions:
|
|
|
759
877
|
websocket:
|
|
760
878
|
messagesPerMonth: 5000000
|
|
761
879
|
connectionMinutes: 500000
|
|
762
|
-
|
|
880
|
+
|
|
881
|
+
# Messaging
|
|
882
|
+
sns:
|
|
883
|
+
monthlyPublishes: 5000000
|
|
884
|
+
httpDeliveries: 2000000
|
|
885
|
+
emailDeliveries: 100000
|
|
886
|
+
smsDeliveries: 10000
|
|
887
|
+
mobilePushDeliveries: 500000
|
|
888
|
+
|
|
763
889
|
stepFunctions:
|
|
764
890
|
monthlyExecutions: 50000 # Executions per month
|
|
765
891
|
stateTransitionsPerExecution: 15 # State transitions per execution (Standard)
|
|
766
892
|
averageDurationMs: 2000 # Average duration in ms (Express)
|
|
767
|
-
|
|
893
|
+
|
|
768
894
|
# Containers
|
|
769
895
|
ecs:
|
|
770
896
|
fargate:
|