cdk-cost-analyzer 0.1.41 → 0.1.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/.cdk-cost-analyzer-cache/metadata.json +8 -8
  2. package/dist/action/api/index.d.ts +1 -0
  3. package/dist/action/api/single-template-types.d.ts +4 -0
  4. package/dist/action/api/types.d.ts +3 -0
  5. package/dist/action/config/types.d.ts +2 -0
  6. package/dist/action/optimization/OptimizationEngine.d.ts +11 -0
  7. package/dist/action/optimization/analyzers/GravitonMigrationAnalyzer.d.ts +17 -0
  8. package/dist/action/optimization/analyzers/NATGatewayOptimizationAnalyzer.d.ts +13 -0
  9. package/dist/action/optimization/analyzers/ReservedInstanceAnalyzer.d.ts +13 -0
  10. package/dist/action/optimization/analyzers/RightSizingAnalyzer.d.ts +13 -0
  11. package/dist/action/optimization/analyzers/SavingsPlansAnalyzer.d.ts +11 -0
  12. package/dist/action/optimization/analyzers/SpotInstanceAnalyzer.d.ts +12 -0
  13. package/dist/action/optimization/analyzers/StorageOptimizationAnalyzer.d.ts +14 -0
  14. package/dist/action/optimization/defaults.d.ts +2 -0
  15. package/dist/action/optimization/index.d.ts +10 -0
  16. package/dist/action/optimization/types.d.ts +35 -0
  17. package/dist/action/reporter/RecommendationReporter.d.ts +3 -0
  18. package/dist/analysis/SingleTemplateAnalyzer.js +12 -1
  19. package/dist/api/index.d.ts +1 -0
  20. package/dist/api/index.js +2 -1
  21. package/dist/api/single-template-types.d.ts +4 -0
  22. package/dist/api/single-template-types.js +1 -1
  23. package/dist/api/types.d.ts +3 -0
  24. package/dist/api/types.js +1 -1
  25. package/dist/cli/index.js +13 -2
  26. package/dist/config/types.d.ts +2 -0
  27. package/dist/config/types.js +1 -1
  28. package/dist/optimization/OptimizationEngine.d.ts +11 -0
  29. package/dist/optimization/OptimizationEngine.js +51 -0
  30. package/dist/optimization/analyzers/GravitonMigrationAnalyzer.d.ts +17 -0
  31. package/dist/optimization/analyzers/GravitonMigrationAnalyzer.js +209 -0
  32. package/dist/optimization/analyzers/NATGatewayOptimizationAnalyzer.d.ts +13 -0
  33. package/dist/optimization/analyzers/NATGatewayOptimizationAnalyzer.js +142 -0
  34. package/dist/optimization/analyzers/ReservedInstanceAnalyzer.d.ts +13 -0
  35. package/dist/optimization/analyzers/ReservedInstanceAnalyzer.js +102 -0
  36. package/dist/optimization/analyzers/RightSizingAnalyzer.d.ts +13 -0
  37. package/dist/optimization/analyzers/RightSizingAnalyzer.js +109 -0
  38. package/dist/optimization/analyzers/SavingsPlansAnalyzer.d.ts +11 -0
  39. package/dist/optimization/analyzers/SavingsPlansAnalyzer.js +102 -0
  40. package/dist/optimization/analyzers/SpotInstanceAnalyzer.d.ts +12 -0
  41. package/dist/optimization/analyzers/SpotInstanceAnalyzer.js +113 -0
  42. package/dist/optimization/analyzers/StorageOptimizationAnalyzer.d.ts +14 -0
  43. package/dist/optimization/analyzers/StorageOptimizationAnalyzer.js +142 -0
  44. package/dist/optimization/defaults.d.ts +2 -0
  45. package/dist/optimization/defaults.js +22 -0
  46. package/dist/optimization/index.d.ts +10 -0
  47. package/dist/optimization/index.js +22 -0
  48. package/dist/optimization/types.d.ts +35 -0
  49. package/dist/optimization/types.js +3 -0
  50. package/dist/releasetag.txt +1 -1
  51. package/dist/reporter/RecommendationReporter.d.ts +3 -0
  52. package/dist/reporter/RecommendationReporter.js +133 -0
  53. package/dist/reporter/SingleTemplateReporter.js +11 -1
  54. package/docs/CALCULATORS.md +374 -8
  55. package/docs/README.md +3 -2
  56. package/docs/RECOMMENDATIONS.md +466 -0
  57. package/docs/SINGLE-TEMPLATE-ANALYSIS.md +59 -16
  58. package/docs/index.md +38 -8
  59. package/examples/recommendations-demo.json +74 -0
  60. package/package.json +1 -1
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SingleTemplateReporter = void 0;
4
4
  const markdownUtils_1 = require("./markdownUtils");
5
+ const RecommendationReporter_1 = require("./RecommendationReporter");
5
6
  /**
6
7
  * Reporter for generating formatted output for single template cost analysis
7
8
  */
@@ -101,6 +102,10 @@ class SingleTemplateReporter {
101
102
  report += '-'.repeat(80) + '\n';
102
103
  report += 'Legend: ✓ High confidence ~ Medium confidence ? Low confidence ✗ Unknown/Unsupported\n';
103
104
  report += '='.repeat(80) + '\n';
105
+ // Recommendations
106
+ if (result.recommendations) {
107
+ report += (0, RecommendationReporter_1.formatRecommendationsText)(result.recommendations);
108
+ }
104
109
  return report;
105
110
  }
106
111
  /**
@@ -186,6 +191,11 @@ class SingleTemplateReporter {
186
191
  }
187
192
  report += '\n</details>\n\n';
188
193
  }
194
+ // Recommendations
195
+ if (result.recommendations) {
196
+ report += (0, RecommendationReporter_1.formatRecommendationsMarkdown)(result.recommendations);
197
+ report += '\n';
198
+ }
189
199
  // Footer
190
200
  report += '---\n\n';
191
201
  report += '*Powered by [cdk-cost-analyzer](https://github.com/buildinginthecloud/cdk-cost-analyzer) | Confidence levels: ✅ high, ⚠️ medium, ❓ low, ❌ unknown*\n';
@@ -211,4 +221,4 @@ class SingleTemplateReporter {
211
221
  }
212
222
  }
213
223
  exports.SingleTemplateReporter = SingleTemplateReporter;
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luZ2xlVGVtcGxhdGVSZXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9TaW5nbGVUZW1wbGF0ZVJlcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLG1EQUF3RTtBQUV4RTs7R0FFRztBQUNILE1BQWEsc0JBQXNCO0lBQ2pDOzs7Ozs7O09BT0c7SUFDSCxjQUFjLENBQ1osTUFBZ0MsRUFDaEMsTUFBb0MsRUFDcEMsT0FBcUM7UUFFckMsTUFBTSxJQUFJLEdBQUc7WUFDWCxhQUFhLEVBQUUsSUFBSTtZQUNuQixlQUFlLEVBQUUsSUFBSTtZQUNyQixXQUFXLEVBQUUsSUFBSTtZQUNqQixNQUFNLEVBQUUsTUFBa0M7WUFDMUMsR0FBRyxPQUFPO1NBQ1gsQ0FBQztRQUVGLFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDZixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuRCxLQUFLLE1BQU0sQ0FBQztZQUNaO2dCQUNFLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsTUFBZ0M7UUFDekQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQ3hCLE1BQWdDLEVBQ2hDLE9BQThDO1FBRTlDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQixTQUFTO1FBQ1QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcs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Q2YsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuRSxNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBOVBELHdEQThQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zLFxufSBmcm9tICcuLi9hcGkvc2luZ2xlLXRlbXBsYXRlLXR5cGVzJztcbmltcG9ydCB7IGdldFRyZW5kSW5kaWNhdG9yLCBleHRyYWN0U2VydmljZU5hbWUgfSBmcm9tICcuL21hcmtkb3duVXRpbHMnO1xuXG4vKipcbiAqIFJlcG9ydGVyIGZvciBnZW5lcmF0aW5nIGZvcm1hdHRlZCBvdXRwdXQgZm9yIHNpbmdsZSB0ZW1wbGF0ZSBjb3N0IGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW5nbGVUZW1wbGF0ZVJlcG9ydGVyIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgZm9ybWF0dGVkIHJlcG9ydCBmcm9tIHNpbmdsZSB0ZW1wbGF0ZSBhbmFseXNpcyByZXN1bHRcbiAgICogXG4gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgYW5hbHlzaXMgcmVzdWx0XG4gICAqIEBwYXJhbSBmb3JtYXQgLSBPdXRwdXQgZm9ybWF0ICh0ZXh0LCBqc29uLCBvciBtYXJrZG93bilcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBmb3JtYXR0aW5nIHByZWZlcmVuY2VzXG4gICAqIEByZXR1cm5zIEZvcm1hdHRlZCByZXBvcnQgc3RyaW5nXG4gICAqL1xuICBnZW5lcmF0ZVJlcG9ydChcbiAgICByZXN1bHQ6IFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgICBmb3JtYXQ6ICd0ZXh0JyB8ICdqc29uJyB8ICdtYXJrZG93bicsXG4gICAgb3B0aW9ucz86IFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgc2hvd0JyZWFrZG93bjogdHJ1ZSxcbiAgICAgIHNob3dBc3N1bXB0aW9uczogdHJ1ZSxcbiAgICAgIGdyb3VwQnlUeXBlOiB0cnVlLFxuICAgICAgc29ydEJ5OiAnY29zdCcgYXMgJ2Nvc3QnIHwgJ25hbWUnIHwgJ3R5cGUnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUpzb25SZXBvcnQocmVzdWx0KTtcbiAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVNYXJrZG93blJlcG9ydChyZXN1bHQsIG9wdHMpO1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVRleHRSZXBvcnQocmVzdWx0LCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgSlNPTiBmb3JtYXQgcmVwb3J0XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlSnNvblJlcG9ydChyZXN1bHQ6IFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGV4dCBmb3JtYXQgcmVwb3J0XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlVGV4dFJlcG9ydChcbiAgICByZXN1bHQ6IFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgICBvcHRpb25zOiBSZXF1aXJlZDxTaW5nbGVUZW1wbGF0ZVJlcG9ydE9wdGlvbnM+LFxuICApOiBzdHJpbmcge1xuICAgIGxldCByZXBvcnQgPSAnJztcblxuICAgIC8vIEhlYWRlclxuICAgIHJlcG9ydCArPSAnPScucmVwZWF0KDgwKSArICdcXG4nO1xuICAgIHJlcG9ydCArPSAnU2luZ2xlIFRlbXBsYXRlIENvc3QgQW5hbHlzaXNcXG4nO1xuICAgIHJlcG9ydCArPSAnPScucmVwZWF0KDgwKSArICdcXG5cXG4nO1xuXG4gICAgLy8gU3VtbWFyeVxuICAgIHJlcG9ydCArPSBgVG90YWwgTW9udGhseSBDb3N0OiAkJHtyZXN1bHQudG90YWxNb250aGx5Q29zdC50b0ZpeGVkKDIpfSAke3Jlc3VsdC5jdXJyZW5jeX1cXG5gO1xuICAgIHJlcG9ydCArPSBgQW5hbHlzaXMgRGF0ZTogJHtyZXN1bHQubWV0YWRhdGEuYW5hbHl6ZWRBdC50b0lTT1N0cmluZygpfVxcbmA7XG4gICAgcmVwb3J0ICs9IGBSZWdpb246ICR7cmVzdWx0Lm1ldGFkYXRhLnJlZ2lvbn1cXG5gO1xuICAgIHJlcG9ydCArPSBgVGVtcGxhdGUgSGFzaDogJHtyZXN1bHQubWV0YWRhdGEudGVtcGxhdGVIYXNofVxcblxcbmA7XG5cbiAgICAvLyBSZXNvdXJjZSBjb3VudHNcbiAgICByZXBvcnQgKz0gYFRvdGFsIFJlc291cmNlczogJHtyZXN1bHQubWV0YWRhdGEucmVzb3VyY2VDb3VudH1cXG5gO1xuICAgIHJlcG9ydCArPSBgU3VwcG9ydGVkIFJlc291cmNlczogJHtyZXN1bHQubWV0YWRhdGEuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH1cXG5gO1xuICAgIHJlcG9ydCArPSBgVW5zdXBwb3J0ZWQgUmVzb3VyY2VzOiAke3Jlc3VsdC5tZXRhZGF0YS51bnN1cHBvcnRlZFJlc291cmNlQ291bnR9XFxuXFxuYDtcblxuICAgIC8vIENvc3QgYnJlYWtkb3duIGJ5IGNvbmZpZGVuY2VcbiAgICBpZiAocmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwubGVuZ3RoID4gMCkge1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgICByZXBvcnQgKz0gJ0Nvc3QgQ29uZmlkZW5jZSBCcmVha2Rvd25cXG4nO1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcblxcbic7XG5cbiAgICAgIGZvciAoY29uc3QgY29uZiBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieUNvbmZpZGVuY2VMZXZlbCkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKChjb25mLnRvdGFsQ29zdCAvIHJlc3VsdC50b3RhbE1vbnRobHlDb3N0KSAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICAgICAgcmVwb3J0ICs9IGAke2NvbmYuY29uZmlkZW5jZS50b1VwcGVyQ2FzZSgpLnBhZEVuZCgxMCl9ICR7Y29uZi5jb3VudH0gcmVzb3VyY2VzICAkJHtjb25mLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpXFxuYDtcbiAgICAgIH1cbiAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBSZXNvdXJjZSBicmVha2Rvd25cbiAgICBpZiAob3B0aW9ucy5zaG93QnJlYWtkb3duICYmIG9wdGlvbnMuZ3JvdXBCeVR5cGUpIHtcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG4nO1xuICAgICAgcmVwb3J0ICs9ICdDb3N0IEJyZWFrZG93biBieSBSZXNvdXJjZSBUeXBlXFxuJztcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGVHcm91cCBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieVJlc291cmNlVHlwZSkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKCh0eXBlR3JvdXAudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCR7dHlwZUdyb3VwLnJlc291cmNlVHlwZX1cXG5gO1xuICAgICAgICByZXBvcnQgKz0gYCAgQ291bnQ6ICR7dHlwZUdyb3VwLmNvdW50fVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgICBUb3RhbCBDb3N0OiAkJHt0eXBlR3JvdXAudG90YWxDb3N0LnRvRml4ZWQoMil9ICgke3BlcmNlbnRhZ2V9JSlcXG5gO1xuXG4gICAgICAgIC8vIFNob3cgaW5kaXZpZHVhbCByZXNvdXJjZXNcbiAgICAgICAgY29uc3Qgc29ydGVkUmVzb3VyY2VzID0gdGhpcy5zb3J0UmVzb3VyY2VzKHR5cGVHcm91cC5yZXNvdXJjZXMsIG9wdGlvbnMuc29ydEJ5KTtcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZXNvdXJjZXMpIHtcbiAgICAgICAgICBjb25zdCBjb25mID0gcmVzb3VyY2UubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgICAgICBjb25zdCBjb25mSW5kaWNhdG9yID0gY29uZiA9PT0gJ2hpZ2gnID8gJ+KckycgOiBjb25mID09PSAnbWVkaXVtJyA/ICd+JyA6IGNvbmYgPT09ICdsb3cnID8gJz8nIDogJ+Kclyc7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICAgJHtjb25mSW5kaWNhdG9yfSAke3Jlc291cmNlLmxvZ2ljYWxJZC5wYWRFbmQoNDApfSAkJHtyZXNvdXJjZS5tb250aGx5Q29zdC5hbW91bnQudG9GaXhlZCgyKX1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBc3N1bXB0aW9uc1xuICAgIGlmIChvcHRpb25zLnNob3dBc3N1bXB0aW9ucyAmJiByZXN1bHQuY29zdEJyZWFrZG93bi5hc3N1bXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuJztcbiAgICAgIHJlcG9ydCArPSAnQ29zdCBDYWxjdWxhdGlvbiBBc3N1bXB0aW9uc1xcbic7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuXFxuJztcblxuICAgICAgZm9yIChjb25zdCBhc3N1bXB0aW9uIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmFzc3VtcHRpb25zKSB7XG4gICAgICAgIHJlcG9ydCArPSBgICDigKIgJHthc3N1bXB0aW9ufVxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gTGVnZW5kXG4gICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgcmVwb3J0ICs9ICdMZWdlbmQ6IOKckyBIaWdoIGNvbmZpZGVuY2UgIH4gTWVkaXVtIGNvbmZpZGVuY2UgID8gTG93IGNvbmZpZGVuY2UgIOKclyBVbmtub3duL1Vuc3VwcG9ydGVkXFxuJztcbiAgICByZXBvcnQgKz0gJz0nLnJlcGVhdCg4MCkgKyAnXFxuJztcblxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbWFya2Rvd24gZm9ybWF0IHJlcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1hcmtkb3duUmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucz4sXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcG9ydCA9ICcnO1xuXG4gICAgLy8gSGVhZGVyXG4gICAgcmVwb3J0ICs9ICcjIPCfkrAgU2luZ2xlIFRlbXBsYXRlIENvc3QgQW5hbHlzaXNcXG5cXG4nO1xuXG4gICAgLy8gU3VtbWFyeVxuICAgIHJlcG9ydCArPSAnIyMgU3VtbWFyeVxcblxcbic7XG4gICAgcmVwb3J0ICs9IGAqKlRvdGFsIE1vbnRobHkgQ29zdDoqKiAkJHtyZXN1bHQudG90YWxNb250aGx5Q29zdC50b0ZpeGVkKDIpfSAke3Jlc3VsdC5jdXJyZW5jeX1cXG5cXG5gO1xuICAgIHJlcG9ydCArPSAnfCBNZXRyaWMgfCBWYWx1ZSB8XFxuJztcbiAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IEFuYWx5c2lzIERhdGUgfCAke3Jlc3VsdC5tZXRhZGF0YS5hbmFseXplZEF0LnRvSVNPU3RyaW5nKCl9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBSZWdpb24gfCAke3Jlc3VsdC5tZXRhZGF0YS5yZWdpb259IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBUZW1wbGF0ZSBIYXNoIHwgXFxgJHtyZXN1bHQubWV0YWRhdGEudGVtcGxhdGVIYXNofVxcYCB8XFxuXFxuYDtcblxuICAgIC8vIFJlc291cmNlIGNvdW50c1xuICAgIHJlcG9ydCArPSAnIyMg8J+TiiBSZXNvdXJjZSBPdmVydmlld1xcblxcbic7XG4gICAgcmVwb3J0ICs9ICd8IENhdGVnb3J5IHwgQ291bnQgfFxcbic7XG4gICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IFRvdGFsIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnJlc291cmNlQ291bnR9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBTdXBwb3J0ZWQgUmVzb3VyY2VzIHwgJHtyZXN1bHQubWV0YWRhdGEuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcbmA7XG4gICAgcmVwb3J0ICs9IGB8IFVuc3VwcG9ydGVkIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcblxcbmA7XG5cbiAgICAvLyBDb3N0IGJyZWFrZG93biBieSBjb25maWRlbmNlXG4gICAgaWYgKHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5Q29uZmlkZW5jZUxldmVsLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydCArPSAnIyMg8J+OryBDb3N0IENvbmZpZGVuY2UgQnJlYWtkb3duXFxuXFxuJztcbiAgICAgIHJlcG9ydCArPSAnfCBDb25maWRlbmNlIHwgUmVzb3VyY2VzIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfFxcbic7XG4gICAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLXxcXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbmYgb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoY29uZi50b3RhbENvc3QgLyByZXN1bHQudG90YWxNb250aGx5Q29zdCkgKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgICAgIGNvbnN0IGVtb2ppID0gY29uZi5jb25maWRlbmNlID09PSAnaGlnaCcgPyAn4pyFJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ2xvdycgPyAn4p2TJyA6ICfinYwnO1xuICAgICAgICByZXBvcnQgKz0gYHwgJHtlbW9qaX0gJHtjb25mLmNvbmZpZGVuY2V9IHwgJHtjb25mLmNvdW50fSB8ICQke2NvbmYudG90YWxDb3N0LnRvRml4ZWQoMil9IHwgJHtwZXJjZW50YWdlfSUgfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gQ29zdCBicmVha2Rvd24gYnkgc2VydmljZVxuICAgIGlmIChvcHRpb25zLnNob3dCcmVha2Rvd24gJiYgb3B0aW9ucy5ncm91cEJ5VHlwZSkge1xuICAgICAgcmVwb3J0ICs9ICcjIyDwn5OIIENvc3QgQnJlYWtkb3duIGJ5IFNlcnZpY2VcXG5cXG4nO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgdG90YWxDb3N0OiBudW1iZXI7IHJlc291cmNlczogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+IH0+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZUdyb3VwIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5UmVzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSBleHRyYWN0U2VydmljZU5hbWUodHlwZUdyb3VwLnJlc291cmNlVHlwZSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gc2VydmljZU1hcC5nZXQoc2VydmljZSkgfHwgeyB0b3RhbENvc3Q6IDAsIHJlc291cmNlczogW10gfTtcbiAgICAgICAgZXhpc3RpbmcudG90YWxDb3N0ICs9IHR5cGVHcm91cC50b3RhbENvc3Q7XG4gICAgICAgIGV4aXN0aW5nLnJlc291cmNlcy5wdXNoKC4uLnR5cGVHcm91cC5yZXNvdXJjZXMpO1xuICAgICAgICBzZXJ2aWNlTWFwLnNldChzZXJ2aWNlLCBleGlzdGluZyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuZnJvbShzZXJ2aWNlTWFwLmVudHJpZXMoKSlcbiAgICAgICAgLm1hcCgoW3NlcnZpY2UsIGRhdGFdKSA9PiAoeyBzZXJ2aWNlLCAuLi5kYXRhIH0pKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYi50b3RhbENvc3QgLSBhLnRvdGFsQ29zdCk7XG5cbiAgICAgIHJlcG9ydCArPSAnfCBTZXJ2aWNlIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfCBUcmVuZCB8XFxuJztcbiAgICAgIHJlcG9ydCArPSAnfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS18XFxuJztcblxuICAgICAgZm9yIChjb25zdCBzdmMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoc3ZjLnRvdGFsQ29zdCAvIHJlc3VsdC50b3RhbE1vbnRobHlDb3N0KSAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICAgICAgY29uc3QgdHJlbmQgPSBnZXRUcmVuZEluZGljYXRvcihzdmMudG90YWxDb3N0KTtcbiAgICAgICAgcmVwb3J0ICs9IGB8ICR7c3ZjLnNlcnZpY2V9IHwgJCR7c3ZjLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSB8ICR7cGVyY2VudGFnZX0lIHwgJHt0cmVuZH0gfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG5cbiAgICAgIC8vIERldGFpbGVkIGJyZWFrZG93biBieSByZXNvdXJjZSB0eXBlXG4gICAgICByZXBvcnQgKz0gJyMjIyBEZXRhaWxlZCBSZXNvdXJjZSBCcmVha2Rvd25cXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGVHcm91cCBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieVJlc291cmNlVHlwZSkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKCh0eXBlR3JvdXAudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCMjIyMgXFxgJHt0eXBlR3JvdXAucmVzb3VyY2VUeXBlfVxcYFxcblxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKkNvdW50OioqICR7dHlwZUdyb3VwLmNvdW50fVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKlRvdGFsIENvc3Q6KiogJCR7dHlwZUdyb3VwLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpXFxuXFxuYDtcblxuICAgICAgICByZXBvcnQgKz0gJ3wgUmVzb3VyY2UgfCBDb3N0IHwgQ29uZmlkZW5jZSB8XFxuJztcbiAgICAgICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfFxcbic7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkUmVzb3VyY2VzID0gdGhpcy5zb3J0UmVzb3VyY2VzKHR5cGVHcm91cC5yZXNvdXJjZXMsIG9wdGlvbnMuc29ydEJ5KTtcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZXNvdXJjZXMpIHtcbiAgICAgICAgICBjb25zdCBjb25mID0gcmVzb3VyY2UubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgICAgICBjb25zdCBlbW9qaSA9IGNvbmYgPT09ICdoaWdoJyA/ICfinIUnIDogY29uZiA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYgPT09ICdsb3cnID8gJ+KdkycgOiAn4p2MJztcbiAgICAgICAgICByZXBvcnQgKz0gYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgJCR7cmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LnRvRml4ZWQoMil9IHwgJHtlbW9qaX0gJHtjb25mfSB8XFxuYDtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXNzdW1wdGlvbnMgKGNvbGxhcHNpYmxlKVxuICAgIGlmIChvcHRpb25zLnNob3dBc3N1bXB0aW9ucyAmJiByZXN1bHQuY29zdEJyZWFrZG93bi5hc3N1bXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJzxkZXRhaWxzPlxcbic7XG4gICAgICByZXBvcnQgKz0gJzxzdW1tYXJ5PjxzdHJvbmc+8J+TiyBDb3N0IENhbGN1bGF0aW9uIEFzc3VtcHRpb25zPC9zdHJvbmc+PC9zdW1tYXJ5Plxcblxcbic7XG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgcmVwb3J0ICs9IGAtICR7YXNzdW1wdGlvbn1cXG5gO1xuICAgICAgfVxuICAgICAgcmVwb3J0ICs9ICdcXG48L2RldGFpbHM+XFxuXFxuJztcbiAgICB9XG5cbiAgICAvLyBGb290ZXJcbiAgICByZXBvcnQgKz0gJy0tLVxcblxcbic7XG4gICAgcmVwb3J0ICs9ICcqUG93ZXJlZCBieSBbY2RrLWNvc3QtYW5hbHl6ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWlsZGluZ2ludGhlY2xvdWQvY2RrLWNvc3QtYW5hbHl6ZXIpIHwgQ29uZmlkZW5jZSBsZXZlbHM6IOKchSBoaWdoLCDimqDvuI8gbWVkaXVtLCDinZMgbG93LCDinYwgdW5rbm93bipcXG4nO1xuXG4gICAgcmV0dXJuIHJlcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0IHJlc291cmNlcyBiYXNlZCBvbiBzcGVjaWZpZWQgY3JpdGVyaWFcbiAgICovXG4gIHByaXZhdGUgc29ydFJlc291cmNlcyhcbiAgICByZXNvdXJjZXM6IEFycmF5PHsgbG9naWNhbElkOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgbW9udGhseUNvc3Q6IGFueSB9PixcbiAgICBzb3J0Qnk6ICdjb3N0JyB8ICduYW1lJyB8ICd0eXBlJyxcbiAgKTogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+IHtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucmVzb3VyY2VzXTtcblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlICdjb3N0JzpcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IGIubW9udGhseUNvc3QuYW1vdW50IC0gYS5tb250aGx5Q29zdC5hbW91bnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYS5sb2dpY2FsSWQubG9jYWxlQ29tcGFyZShiLmxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYS50eXBlLmxvY2FsZUNvbXBhcmUoYi50eXBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0ZWQ7XG4gIH1cbn1cbiJdfQ==
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luZ2xlVGVtcGxhdGVSZXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9TaW5nbGVUZW1wbGF0ZVJlcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLG1EQUF3RTtBQUN4RSxxRUFHa0M7QUFFbEM7O0dBRUc7QUFDSCxNQUFhLHNCQUFzQjtJQUNqQzs7Ozs7OztPQU9HO0lBQ0gsY0FBYyxDQUNaLE1BQWdDLEVBQ2hDLE1BQW9DLEVBQ3BDLE9BQXFDO1FBRXJDLE1BQU0sSUFBSSxHQUFHO1lBQ1gsYUFBYSxFQUFFLElBQUk7WUFDbkIsZUFBZSxFQUFFLElBQUk7WUFDckIsV0FBVyxFQUFFLElBQUk7WUFDakIsTUFBTSxFQUFFLE1BQWtDO1lBQzFDLEdBQUcsT0FBTztTQUNYLENBQUM7UUFFRixRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLEtBQUssVUFBVTtnQkFDYixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkQsS0FBSyxNQUFNLENBQUM7WUFDWjtnQkFDRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLE1BQWdDO1FBQ3pELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUN4QixNQUFnQyxFQUNoQyxPQUE4QztRQUU5QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFaEIsU0FBUztRQUNULE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEVB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TSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDakIsQ0FBQztRQUVELFNBQVM7UUFDVCxNQUFNLElBQUksU0FBUyxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxzSkFBc0osQ0FBQztRQUVqSyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQ25CLFNBQXVFLEVBQ3ZFLE1BQWdDO1FBRWhDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUU5QixRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuRSxNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBelFELHdEQXlRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zLFxufSBmcm9tICcuLi9hcGkvc2luZ2xlLXRlbXBsYXRlLXR5cGVzJztcbmltcG9ydCB7IGdldFRyZW5kSW5kaWNhdG9yLCBleHRyYWN0U2VydmljZU5hbWUgfSBmcm9tICcuL21hcmtkb3duVXRpbHMnO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVjb21tZW5kYXRpb25zVGV4dCxcbiAgZm9ybWF0UmVjb21tZW5kYXRpb25zTWFya2Rvd24sXG59IGZyb20gJy4vUmVjb21tZW5kYXRpb25SZXBvcnRlcic7XG5cbi8qKlxuICogUmVwb3J0ZXIgZm9yIGdlbmVyYXRpbmcgZm9ybWF0dGVkIG91dHB1dCBmb3Igc2luZ2xlIHRlbXBsYXRlIGNvc3QgYW5hbHlzaXNcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZVRlbXBsYXRlUmVwb3J0ZXIge1xuICAvKipcbiAgICogR2VuZXJhdGUgYSBmb3JtYXR0ZWQgcmVwb3J0IGZyb20gc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzIHJlc3VsdFxuICAgKiBcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSBhbmFseXNpcyByZXN1bHRcbiAgICogQHBhcmFtIGZvcm1hdCAtIE91dHB1dCBmb3JtYXQgKHRleHQsIGpzb24sIG9yIG1hcmtkb3duKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGZvcm1hdHRpbmcgcHJlZmVyZW5jZXNcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIHJlcG9ydCBzdHJpbmdcbiAgICovXG4gIGdlbmVyYXRlUmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIGZvcm1hdDogJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICBvcHRpb25zPzogU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBzaG93QnJlYWtkb3duOiB0cnVlLFxuICAgICAgc2hvd0Fzc3VtcHRpb25zOiB0cnVlLFxuICAgICAgZ3JvdXBCeVR5cGU6IHRydWUsXG4gICAgICBzb3J0Qnk6ICdjb3N0JyBhcyAnY29zdCcgfCAnbmFtZScgfCAndHlwZScsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSnNvblJlcG9ydChyZXN1bHQpO1xuICAgICAgY2FzZSAnbWFya2Rvd24nOlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZU1hcmtkb3duUmVwb3J0KHJlc3VsdCwgb3B0cyk7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlVGV4dFJlcG9ydChyZXN1bHQsIG9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBKU09OIGZvcm1hdCByZXBvcnRcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVKc29uUmVwb3J0KHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0ZXh0IGZvcm1hdCByZXBvcnRcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVUZXh0UmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucz4sXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcG9ydCA9ICcnO1xuXG4gICAgLy8gSGVhZGVyXG4gICAgcmVwb3J0ICs9ICc9Jy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgcmVwb3J0ICs9ICdTaW5nbGUgVGVtcGxhdGUgQ29zdCBBbmFseXNpc1xcbic7XG4gICAgcmVwb3J0ICs9ICc9Jy5yZXBlYXQoODApICsgJ1xcblxcbic7XG5cbiAgICAvLyBTdW1tYXJ5XG4gICAgcmVwb3J0ICs9IGBUb3RhbCBNb250aGx5IENvc3Q6ICQke3Jlc3VsdC50b3RhbE1vbnRobHlDb3N0LnRvRml4ZWQoMil9ICR7cmVzdWx0LmN1cnJlbmN5fVxcbmA7XG4gICAgcmVwb3J0ICs9IGBBbmFseXNpcyBEYXRlOiAke3Jlc3VsdC5tZXRhZGF0YS5hbmFseXplZEF0LnRvSVNPU3RyaW5nKCl9XFxuYDtcbiAgICByZXBvcnQgKz0gYFJlZ2lvbjogJHtyZXN1bHQubWV0YWRhdGEucmVnaW9ufVxcbmA7XG4gICAgcmVwb3J0ICs9IGBUZW1wbGF0ZSBIYXNoOiAke3Jlc3VsdC5tZXRhZGF0YS50ZW1wbGF0ZUhhc2h9XFxuXFxuYDtcblxuICAgIC8vIFJlc291cmNlIGNvdW50c1xuICAgIHJlcG9ydCArPSBgVG90YWwgUmVzb3VyY2VzOiAke3Jlc3VsdC5tZXRhZGF0YS5yZXNvdXJjZUNvdW50fVxcbmA7XG4gICAgcmVwb3J0ICs9IGBTdXBwb3J0ZWQgUmVzb3VyY2VzOiAke3Jlc3VsdC5tZXRhZGF0YS5zdXBwb3J0ZWRSZXNvdXJjZUNvdW50fVxcbmA7XG4gICAgcmVwb3J0ICs9IGBVbnN1cHBvcnRlZCBSZXNvdXJjZXM6ICR7cmVzdWx0Lm1ldGFkYXRhLnVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH1cXG5cXG5gO1xuXG4gICAgLy8gQ29zdCBicmVha2Rvd24gYnkgY29uZmlkZW5jZVxuICAgIGlmIChyZXN1bHQuY29zdEJyZWFrZG93bi5ieUNvbmZpZGVuY2VMZXZlbC5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuJztcbiAgICAgIHJlcG9ydCArPSAnQ29zdCBDb25maWRlbmNlIEJyZWFrZG93blxcbic7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuXFxuJztcblxuICAgICAgZm9yIChjb25zdCBjb25mIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5Q29uZmlkZW5jZUxldmVsKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoKGNvbmYudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCR7Y29uZi5jb25maWRlbmNlLnRvVXBwZXJDYXNlKCkucGFkRW5kKDEwKX0gJHtjb25mLmNvdW50fSByZXNvdXJjZXMgICQke2NvbmYudG90YWxDb3N0LnRvRml4ZWQoMil9ICgke3BlcmNlbnRhZ2V9JSlcXG5gO1xuICAgICAgfVxuICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlIGJyZWFrZG93blxuICAgIGlmIChvcHRpb25zLnNob3dCcmVha2Rvd24gJiYgb3B0aW9ucy5ncm91cEJ5VHlwZSkge1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgICByZXBvcnQgKz0gJ0Nvc3QgQnJlYWtkb3duIGJ5IFJlc291cmNlIFR5cGVcXG4nO1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcblxcbic7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZUdyb3VwIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5UmVzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoKHR5cGVHcm91cC50b3RhbENvc3QgLyByZXN1bHQudG90YWxNb250aGx5Q29zdCkgKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgICAgIHJlcG9ydCArPSBgJHt0eXBlR3JvdXAucmVzb3VyY2VUeXBlfVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgICBDb3VudDogJHt0eXBlR3JvdXAuY291bnR9XFxuYDtcbiAgICAgICAgcmVwb3J0ICs9IGAgIFRvdGFsIENvc3Q6ICQke3R5cGVHcm91cC50b3RhbENvc3QudG9GaXhlZCgyKX0gKCR7cGVyY2VudGFnZX0lKVxcbmA7XG5cbiAgICAgICAgLy8gU2hvdyBpbmRpdmlkdWFsIHJlc291cmNlc1xuICAgICAgICBjb25zdCBzb3J0ZWRSZXNvdXJjZXMgPSB0aGlzLnNvcnRSZXNvdXJjZXModHlwZUdyb3VwLnJlc291cmNlcywgb3B0aW9ucy5zb3J0QnkpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZFJlc291cmNlcykge1xuICAgICAgICAgIGNvbnN0IGNvbmYgPSByZXNvdXJjZS5tb250aGx5Q29zdC5jb25maWRlbmNlO1xuICAgICAgICAgIGNvbnN0IGNvbmZJbmRpY2F0b3IgPSBjb25mID09PSAnaGlnaCcgPyAn4pyTJyA6IGNvbmYgPT09ICdtZWRpdW0nID8gJ34nIDogY29uZiA9PT0gJ2xvdycgPyAnPycgOiAn4pyXJztcbiAgICAgICAgICByZXBvcnQgKz0gYCAgICAke2NvbmZJbmRpY2F0b3J9ICR7cmVzb3VyY2UubG9naWNhbElkLnBhZEVuZCg0MCl9ICQke3Jlc291cmNlLm1vbnRobHlDb3N0LmFtb3VudC50b0ZpeGVkKDIpfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFzc3VtcHRpb25zXG4gICAgaWYgKG9wdGlvbnMuc2hvd0Fzc3VtcHRpb25zICYmIHJlc3VsdC5jb3N0QnJlYWtkb3duLmFzc3VtcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG4nO1xuICAgICAgcmVwb3J0ICs9ICdDb3N0IENhbGN1bGF0aW9uIEFzc3VtcHRpb25zXFxuJztcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgcmVwb3J0ICs9IGAgIOKAoiAke2Fzc3VtcHRpb259XFxuYDtcbiAgICAgIH1cbiAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBMZWdlbmRcbiAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuJztcbiAgICByZXBvcnQgKz0gJ0xlZ2VuZDog4pyTIEhpZ2ggY29uZmlkZW5jZSAgfiBNZWRpdW0gY29uZmlkZW5jZSAgPyBMb3cgY29uZmlkZW5jZSAg4pyXIFVua25vd24vVW5zdXBwb3J0ZWRcXG4nO1xuICAgIHJlcG9ydCArPSAnPScucmVwZWF0KDgwKSArICdcXG4nO1xuXG4gICAgLy8gUmVjb21tZW5kYXRpb25zXG4gICAgaWYgKHJlc3VsdC5yZWNvbW1lbmRhdGlvbnMpIHtcbiAgICAgIHJlcG9ydCArPSBmb3JtYXRSZWNvbW1lbmRhdGlvbnNUZXh0KHJlc3VsdC5yZWNvbW1lbmRhdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbWFya2Rvd24gZm9ybWF0IHJlcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1hcmtkb3duUmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucz4sXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcG9ydCA9ICcnO1xuXG4gICAgLy8gSGVhZGVyXG4gICAgcmVwb3J0ICs9ICcjIPCfkrAgU2luZ2xlIFRlbXBsYXRlIENvc3QgQW5hbHlzaXNcXG5cXG4nO1xuXG4gICAgLy8gU3VtbWFyeVxuICAgIHJlcG9ydCArPSAnIyMgU3VtbWFyeVxcblxcbic7XG4gICAgcmVwb3J0ICs9IGAqKlRvdGFsIE1vbnRobHkgQ29zdDoqKiAkJHtyZXN1bHQudG90YWxNb250aGx5Q29zdC50b0ZpeGVkKDIpfSAke3Jlc3VsdC5jdXJyZW5jeX1cXG5cXG5gO1xuICAgIHJlcG9ydCArPSAnfCBNZXRyaWMgfCBWYWx1ZSB8XFxuJztcbiAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IEFuYWx5c2lzIERhdGUgfCAke3Jlc3VsdC5tZXRhZGF0YS5hbmFseXplZEF0LnRvSVNPU3RyaW5nKCl9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBSZWdpb24gfCAke3Jlc3VsdC5tZXRhZGF0YS5yZWdpb259IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBUZW1wbGF0ZSBIYXNoIHwgXFxgJHtyZXN1bHQubWV0YWRhdGEudGVtcGxhdGVIYXNofVxcYCB8XFxuXFxuYDtcblxuICAgIC8vIFJlc291cmNlIGNvdW50c1xuICAgIHJlcG9ydCArPSAnIyMg8J+TiiBSZXNvdXJjZSBPdmVydmlld1xcblxcbic7XG4gICAgcmVwb3J0ICs9ICd8IENhdGVnb3J5IHwgQ291bnQgfFxcbic7XG4gICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IFRvdGFsIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnJlc291cmNlQ291bnR9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBTdXBwb3J0ZWQgUmVzb3VyY2VzIHwgJHtyZXN1bHQubWV0YWRhdGEuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcbmA7XG4gICAgcmVwb3J0ICs9IGB8IFVuc3VwcG9ydGVkIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcblxcbmA7XG5cbiAgICAvLyBDb3N0IGJyZWFrZG93biBieSBjb25maWRlbmNlXG4gICAgaWYgKHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5Q29uZmlkZW5jZUxldmVsLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydCArPSAnIyMg8J+OryBDb3N0IENvbmZpZGVuY2UgQnJlYWtkb3duXFxuXFxuJztcbiAgICAgIHJlcG9ydCArPSAnfCBDb25maWRlbmNlIHwgUmVzb3VyY2VzIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfFxcbic7XG4gICAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLXxcXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbmYgb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoY29uZi50b3RhbENvc3QgLyByZXN1bHQudG90YWxNb250aGx5Q29zdCkgKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgICAgIGNvbnN0IGVtb2ppID0gY29uZi5jb25maWRlbmNlID09PSAnaGlnaCcgPyAn4pyFJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ2xvdycgPyAn4p2TJyA6ICfinYwnO1xuICAgICAgICByZXBvcnQgKz0gYHwgJHtlbW9qaX0gJHtjb25mLmNvbmZpZGVuY2V9IHwgJHtjb25mLmNvdW50fSB8ICQke2NvbmYudG90YWxDb3N0LnRvRml4ZWQoMil9IHwgJHtwZXJjZW50YWdlfSUgfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gQ29zdCBicmVha2Rvd24gYnkgc2VydmljZVxuICAgIGlmIChvcHRpb25zLnNob3dCcmVha2Rvd24gJiYgb3B0aW9ucy5ncm91cEJ5VHlwZSkge1xuICAgICAgcmVwb3J0ICs9ICcjIyDwn5OIIENvc3QgQnJlYWtkb3duIGJ5IFNlcnZpY2VcXG5cXG4nO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgdG90YWxDb3N0OiBudW1iZXI7IHJlc291cmNlczogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+IH0+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZUdyb3VwIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5UmVzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSBleHRyYWN0U2VydmljZU5hbWUodHlwZUdyb3VwLnJlc291cmNlVHlwZSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gc2VydmljZU1hcC5nZXQoc2VydmljZSkgfHwgeyB0b3RhbENvc3Q6IDAsIHJlc291cmNlczogW10gfTtcbiAgICAgICAgZXhpc3RpbmcudG90YWxDb3N0ICs9IHR5cGVHcm91cC50b3RhbENvc3Q7XG4gICAgICAgIGV4aXN0aW5nLnJlc291cmNlcy5wdXNoKC4uLnR5cGVHcm91cC5yZXNvdXJjZXMpO1xuICAgICAgICBzZXJ2aWNlTWFwLnNldChzZXJ2aWNlLCBleGlzdGluZyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuZnJvbShzZXJ2aWNlTWFwLmVudHJpZXMoKSlcbiAgICAgICAgLm1hcCgoW3NlcnZpY2UsIGRhdGFdKSA9PiAoeyBzZXJ2aWNlLCAuLi5kYXRhIH0pKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYi50b3RhbENvc3QgLSBhLnRvdGFsQ29zdCk7XG5cbiAgICAgIHJlcG9ydCArPSAnfCBTZXJ2aWNlIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfCBUcmVuZCB8XFxuJztcbiAgICAgIHJlcG9ydCArPSAnfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS18XFxuJztcblxuICAgICAgZm9yIChjb25zdCBzdmMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoc3ZjLnRvdGFsQ29zdCAvIHJlc3VsdC50b3RhbE1vbnRobHlDb3N0KSAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICAgICAgY29uc3QgdHJlbmQgPSBnZXRUcmVuZEluZGljYXRvcihzdmMudG90YWxDb3N0KTtcbiAgICAgICAgcmVwb3J0ICs9IGB8ICR7c3ZjLnNlcnZpY2V9IHwgJCR7c3ZjLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSB8ICR7cGVyY2VudGFnZX0lIHwgJHt0cmVuZH0gfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG5cbiAgICAgIC8vIERldGFpbGVkIGJyZWFrZG93biBieSByZXNvdXJjZSB0eXBlXG4gICAgICByZXBvcnQgKz0gJyMjIyBEZXRhaWxlZCBSZXNvdXJjZSBCcmVha2Rvd25cXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGVHcm91cCBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieVJlc291cmNlVHlwZSkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKCh0eXBlR3JvdXAudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCMjIyMgXFxgJHt0eXBlR3JvdXAucmVzb3VyY2VUeXBlfVxcYFxcblxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKkNvdW50OioqICR7dHlwZUdyb3VwLmNvdW50fVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKlRvdGFsIENvc3Q6KiogJCR7dHlwZUdyb3VwLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpXFxuXFxuYDtcblxuICAgICAgICByZXBvcnQgKz0gJ3wgUmVzb3VyY2UgfCBDb3N0IHwgQ29uZmlkZW5jZSB8XFxuJztcbiAgICAgICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfFxcbic7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkUmVzb3VyY2VzID0gdGhpcy5zb3J0UmVzb3VyY2VzKHR5cGVHcm91cC5yZXNvdXJjZXMsIG9wdGlvbnMuc29ydEJ5KTtcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZXNvdXJjZXMpIHtcbiAgICAgICAgICBjb25zdCBjb25mID0gcmVzb3VyY2UubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgICAgICBjb25zdCBlbW9qaSA9IGNvbmYgPT09ICdoaWdoJyA/ICfinIUnIDogY29uZiA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYgPT09ICdsb3cnID8gJ+KdkycgOiAn4p2MJztcbiAgICAgICAgICByZXBvcnQgKz0gYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgJCR7cmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LnRvRml4ZWQoMil9IHwgJHtlbW9qaX0gJHtjb25mfSB8XFxuYDtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXNzdW1wdGlvbnMgKGNvbGxhcHNpYmxlKVxuICAgIGlmIChvcHRpb25zLnNob3dBc3N1bXB0aW9ucyAmJiByZXN1bHQuY29zdEJyZWFrZG93bi5hc3N1bXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJzxkZXRhaWxzPlxcbic7XG4gICAgICByZXBvcnQgKz0gJzxzdW1tYXJ5PjxzdHJvbmc+8J+TiyBDb3N0IENhbGN1bGF0aW9uIEFzc3VtcHRpb25zPC9zdHJvbmc+PC9zdW1tYXJ5Plxcblxcbic7XG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgcmVwb3J0ICs9IGAtICR7YXNzdW1wdGlvbn1cXG5gO1xuICAgICAgfVxuICAgICAgcmVwb3J0ICs9ICdcXG48L2RldGFpbHM+XFxuXFxuJztcbiAgICB9XG5cbiAgICAvLyBSZWNvbW1lbmRhdGlvbnNcbiAgICBpZiAocmVzdWx0LnJlY29tbWVuZGF0aW9ucykge1xuICAgICAgcmVwb3J0ICs9IGZvcm1hdFJlY29tbWVuZGF0aW9uc01hcmtkb3duKHJlc3VsdC5yZWNvbW1lbmRhdGlvbnMpO1xuICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIEZvb3RlclxuICAgIHJlcG9ydCArPSAnLS0tXFxuXFxuJztcbiAgICByZXBvcnQgKz0gJypQb3dlcmVkIGJ5IFtjZGstY29zdC1hbmFseXplcl0oaHR0cHM6Ly9naXRodWIuY29tL2J1aWxkaW5naW50aGVjbG91ZC9jZGstY29zdC1hbmFseXplcikgfCBDb25maWRlbmNlIGxldmVsczog4pyFIGhpZ2gsIOKaoO+4jyBtZWRpdW0sIOKdkyBsb3csIOKdjCB1bmtub3duKlxcbic7XG5cbiAgICByZXR1cm4gcmVwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnQgcmVzb3VyY2VzIGJhc2VkIG9uIHNwZWNpZmllZCBjcml0ZXJpYVxuICAgKi9cbiAgcHJpdmF0ZSBzb3J0UmVzb3VyY2VzKFxuICAgIHJlc291cmNlczogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+LFxuICAgIHNvcnRCeTogJ2Nvc3QnIHwgJ25hbWUnIHwgJ3R5cGUnLFxuICApOiBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IG1vbnRobHlDb3N0OiBhbnkgfT4ge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5yZXNvdXJjZXNdO1xuXG4gICAgc3dpdGNoIChzb3J0QnkpIHtcbiAgICAgIGNhc2UgJ2Nvc3QnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYi5tb250aGx5Q29zdC5hbW91bnQgLSBhLm1vbnRobHlDb3N0LmFtb3VudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgIHNvcnRlZC5zb3J0KChhLCBiKSA9PiBhLmxvZ2ljYWxJZC5sb2NhbGVDb21wYXJlKGIubG9naWNhbElkKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHlwZSc6XG4gICAgICAgIHNvcnRlZC5zb3J0KChhLCBiKSA9PiBhLnR5cGUubG9jYWxlQ29tcGFyZShiLnR5cGUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRlZDtcbiAgfVxufVxuIl19
@@ -5,14 +5,17 @@ This document provides detailed information about all supported AWS resource typ
5
5
  ## Table of Contents
6
6
 
7
7
  - [Overview](#overview)
8
- - [Compute Resources](#compute-resources)
9
- - [Storage Resources](#storage-resources)
10
- - [Database Resources](#database-resources)
11
- - [Networking Resources](#networking-resources)
12
- - [Messaging Resources](#messaging-resources)
13
- - [Content Delivery Resources](#content-delivery-resources)
14
- - [Serverless Resources](#serverless-resources)
15
- - [Container Resources](#container-resources)
8
+ - [Compute Resources](#compute-resources) - EC2, AutoScaling, LaunchTemplate, EKS
9
+ - [Storage Resources](#storage-resources) - S3, EFS
10
+ - [Database Resources](#database-resources) - RDS, DynamoDB, Aurora Serverless
11
+ - [Networking Resources](#networking-resources) - NAT Gateway, ALB, NLB, VPC Endpoint, Transit Gateway
12
+ - [DNS and Routing Resources](#dns-and-routing-resources) - Route 53
13
+ - [Messaging Resources](#messaging-resources) - SQS, SNS
14
+ - [Content Delivery Resources](#content-delivery-resources) - CloudFront, ElastiCache
15
+ - [Analytics Resources](#analytics-resources) - Kinesis Streams, Firehose, Analytics
16
+ - [Security Resources](#security-resources) - Secrets Manager
17
+ - [Serverless Resources](#serverless-resources) - Lambda, API Gateway, Step Functions
18
+ - [Container Resources](#container-resources) - ECS
16
19
  - [Customizing Assumptions](#customizing-assumptions)
17
20
 
18
21
  ## Overview
@@ -902,6 +905,97 @@ Total: $0.65/month
902
905
  - Deletion protection can prevent accidental secret deletion
903
906
  - Secrets can be rotated automatically using Lambda functions (Lambda costs separate)
904
907
 
908
+ ## Compute Resources (continued)
909
+
910
+ ### AWS::AutoScaling::AutoScalingGroup
911
+
912
+ **Description:** Auto Scaling Group for managing fleets of EC2 instances
913
+
914
+ **Cost Components:**
915
+ - EC2 instance hourly rate x desired capacity x 730 hours/month
916
+
917
+ **Default Assumptions:**
918
+ - Desired capacity: 1 (if not specified in template)
919
+ - Instance type resolved from associated LaunchConfiguration or LaunchTemplate
920
+ - 730 hours/month (always running)
921
+ - Linux operating system, shared tenancy
922
+ - On-demand pricing
923
+
924
+ **Detection Logic:**
925
+ - Resolves instance type from LaunchConfigurationName, LaunchTemplate, or MixedInstancesPolicy
926
+ - Handles CloudFormation `{ Ref: 'LogicalId' }` references by searching template resources
927
+
928
+ **Example:**
929
+ ```
930
+ Instance Type: t3.medium (from LaunchTemplate)
931
+ Desired Capacity: 4
932
+ Hourly Rate: $0.0416
933
+ Monthly Cost: $0.0416 × 730 × 4 = $121.47
934
+ ```
935
+
936
+ **Notes:**
937
+ - Cost equals desired capacity multiplied by per-instance cost
938
+ - EBS volumes from LaunchTemplate not included
939
+ - Scaling events (min/max capacity) not factored in
940
+ - Spot pricing not calculated (see Recommendations for Spot suggestions)
941
+
942
+ ### AWS::EC2::LaunchTemplate
943
+
944
+ **Description:** Launch Template defining EC2 instance configuration
945
+
946
+ **Cost Components:**
947
+ - Instance hourly rate x 730 hours/month (per instance)
948
+ - EBS storage from BlockDeviceMappings
949
+
950
+ **Default Assumptions:**
951
+ - 730 hours/month (always running)
952
+ - Linux operating system, shared tenancy
953
+ - Default volume: 8 GB gp3 (if no block device mappings specified)
954
+ - On-demand pricing
955
+
956
+ **Detection Logic:**
957
+ - Instance type from `LaunchTemplateData.InstanceType`
958
+ - EBS volumes from `LaunchTemplateData.BlockDeviceMappings`
959
+ - Volume type defaults to gp3 if not specified
960
+ - Volume size defaults to 8 GB if not specified
961
+
962
+ **Example:**
963
+ ```
964
+ Instance Type: m5.large
965
+ Hourly Rate: $0.096
966
+ Instance Cost: $0.096 × 730 = $70.08
967
+ EBS Storage: 100 GB gp3 × $0.08/GB = $8.00
968
+ Total: $78.08/month (per instance)
969
+ ```
970
+
971
+ **Notes:**
972
+ - Launch Templates have no direct cost; this calculates per-instance reference cost
973
+ - Provisioned IOPS (io1/io2) detailed costs excluded
974
+ - Additional gp3 throughput beyond 125 MB/s baseline excluded
975
+ - Confidence level is low (template defines potential instances, not running ones)
976
+
977
+ ### AWS::EKS::Cluster
978
+
979
+ **Description:** Amazon EKS Kubernetes control plane
980
+
981
+ **Cost Components:**
982
+ - Control plane hourly rate x 730 hours/month
983
+
984
+ **Default Assumptions:**
985
+ - 730 hours/month (always running)
986
+ - Fallback price: $0.10/hour if API unavailable
987
+
988
+ **Example:**
989
+ ```
990
+ Control Plane Rate: $0.10/hour
991
+ Monthly Cost: $0.10 × 730 = $73.00
992
+ ```
993
+
994
+ **Notes:**
995
+ - Worker node costs are not included (calculated separately as EC2 or Fargate)
996
+ - EKS add-ons and managed node groups not calculated
997
+ - One cluster = one control plane charge
998
+
905
999
  ## Container Resources
906
1000
 
907
1001
  ### AWS::ECS::Service
@@ -946,6 +1040,278 @@ Total: $9.01/month per task
946
1040
  - EC2 launch type uses EC2 pricing
947
1041
  - Data transfer costs not included
948
1042
 
1043
+ ## Analytics Resources
1044
+
1045
+ ### AWS::Kinesis::Stream
1046
+
1047
+ **Description:** Amazon Kinesis Data Streams for real-time data streaming
1048
+
1049
+ **Cost Components:**
1050
+
1051
+ **Provisioned Mode:**
1052
+ - Shard hours: shard count x hourly rate x 730 hours/month
1053
+
1054
+ **On-Demand Mode:**
1055
+ - Data ingestion: GB ingested x rate
1056
+ - Data retrieval: GB retrieved x rate
1057
+
1058
+ **Default Assumptions (Provisioned):**
1059
+ - 2 shards
1060
+ - Fallback price: $0.015/shard-hour
1061
+
1062
+ **Default Assumptions (On-Demand):**
1063
+ - 1,000 GB data ingested per month
1064
+ - 2,000 GB data retrieved per month
1065
+ - Fallback ingestion price: $0.040/GB
1066
+ - Fallback retrieval price: $0.015/GB
1067
+
1068
+ **Detection Logic:**
1069
+ - Stream mode from `StreamModeDetails.StreamMode` (defaults to PROVISIONED)
1070
+ - Shard count from `ShardCount` property
1071
+
1072
+ **Example (Provisioned):**
1073
+ ```
1074
+ Shards: 2
1075
+ Shard Rate: $0.015/hour
1076
+ Monthly Cost: 2 × $0.015 × 730 = $21.90
1077
+ ```
1078
+
1079
+ **Example (On-Demand):**
1080
+ ```
1081
+ Ingestion: 1,000 GB × $0.040 = $40.00
1082
+ Retrieval: 2,000 GB × $0.015 = $30.00
1083
+ Total: $70.00/month
1084
+ ```
1085
+
1086
+ **Notes:**
1087
+ - Extended data retention costs not included
1088
+ - Enhanced fan-out consumer costs not included
1089
+
1090
+ ### AWS::KinesisFirehose::DeliveryStream
1091
+
1092
+ **Description:** Amazon Kinesis Data Firehose for data delivery
1093
+
1094
+ **Cost Components:**
1095
+ - Data ingestion: GB ingested x rate
1096
+
1097
+ **Default Assumptions:**
1098
+ - 1,000 GB data ingested per month
1099
+ - Fallback price: $0.029/GB
1100
+
1101
+ **Example:**
1102
+ ```
1103
+ Data Ingestion: 1,000 GB × $0.029 = $29.00/month
1104
+ ```
1105
+
1106
+ **Notes:**
1107
+ - Format conversion and data transformation costs not included
1108
+ - Destination-specific costs (S3, Redshift) calculated separately
1109
+
1110
+ ### AWS::KinesisAnalyticsV2::Application
1111
+
1112
+ **Description:** Amazon Kinesis Data Analytics for stream processing
1113
+
1114
+ **Cost Components:**
1115
+ - KPU-hours: KPU count x hourly rate x 730 hours/month
1116
+
1117
+ **Default Assumptions:**
1118
+ - 2 KPUs (Kinesis Processing Units)
1119
+ - Fallback price: $0.11/KPU-hour
1120
+
1121
+ **Example:**
1122
+ ```
1123
+ KPUs: 2
1124
+ KPU Rate: $0.11/hour
1125
+ Monthly Cost: 2 × $0.11 × 730 = $160.60
1126
+ ```
1127
+
1128
+ **Notes:**
1129
+ - Running application storage and durable application backup costs not included
1130
+ - Orchestration overhead KPU not included
1131
+
1132
+ ## DNS and Routing Resources
1133
+
1134
+ ### AWS::Route53::HostedZone
1135
+
1136
+ **Description:** Amazon Route 53 DNS hosted zone
1137
+
1138
+ **Cost Components:**
1139
+ - Fixed monthly charge per hosted zone
1140
+
1141
+ **Pricing:**
1142
+ - $0.50/month per hosted zone
1143
+
1144
+ **Example:**
1145
+ ```
1146
+ Monthly Cost: $0.50
1147
+ ```
1148
+
1149
+ **Notes:**
1150
+ - First 25 hosted zones: $0.50/month each
1151
+ - Additional hosted zones: $0.10/month each (volume pricing not calculated)
1152
+ - DNS query costs are calculated on RecordSet resources
1153
+
1154
+ ### AWS::Route53::HealthCheck
1155
+
1156
+ **Description:** Amazon Route 53 health check for endpoint monitoring
1157
+
1158
+ **Cost Components:**
1159
+ - Fixed monthly charge per health check
1160
+
1161
+ **Pricing:**
1162
+
1163
+ | Health Check Type | Monthly Cost |
1164
+ |-------------------|-------------|
1165
+ | Basic (HTTP, TCP) | $0.50 |
1166
+ | Advanced (HTTPS, HTTP_STR_MATCH, HTTPS_STR_MATCH) | $1.00 |
1167
+
1168
+ **Detection Logic:**
1169
+ - Health check type from `HealthCheckConfig.Type` (defaults to HTTP)
1170
+
1171
+ **Example (Basic):**
1172
+ ```
1173
+ Health Check Type: HTTP
1174
+ Monthly Cost: $0.50
1175
+ ```
1176
+
1177
+ **Example (Advanced):**
1178
+ ```
1179
+ Health Check Type: HTTPS_STR_MATCH
1180
+ Monthly Cost: $1.00
1181
+ ```
1182
+
1183
+ ### AWS::Route53::RecordSet
1184
+
1185
+ **Description:** Amazon Route 53 DNS record
1186
+
1187
+ **Cost Components:**
1188
+ - DNS query charges per million queries
1189
+
1190
+ **Default Assumptions:**
1191
+ - 1,000,000 queries per month
1192
+
1193
+ **Pricing by Routing Type:**
1194
+
1195
+ | Routing Type | Price per Million Queries |
1196
+ |-------------|------------------------|
1197
+ | Standard | $0.40 |
1198
+ | Latency-based | $0.60 |
1199
+ | Geolocation | $0.70 |
1200
+ | Alias | $0.00 (free) |
1201
+
1202
+ **Detection Logic:**
1203
+ - Alias records: `AliasTarget` property present (free, no query charges)
1204
+ - Latency routing: `Region` property present
1205
+ - Geolocation routing: `GeoLocation` property present
1206
+ - Standard routing: default
1207
+
1208
+ **Example (Standard):**
1209
+ ```
1210
+ Queries: 1,000,000 × $0.40/1M = $0.40/month
1211
+ ```
1212
+
1213
+ **Example (Alias):**
1214
+ ```
1215
+ Monthly Cost: $0.00 (alias queries are free)
1216
+ ```
1217
+
1218
+ ## Networking Resources (continued)
1219
+
1220
+ ### AWS::EC2::TransitGateway
1221
+
1222
+ **Description:** AWS Transit Gateway for connecting VPCs and on-premises networks
1223
+
1224
+ **Cost Components:**
1225
+ - Attachment hourly fees x number of attachments x 730 hours/month
1226
+ - Data processing: GB processed x rate
1227
+
1228
+ **Default Assumptions:**
1229
+ - 3 attachments
1230
+ - 1,000 GB data processed per month
1231
+ - Fallback attachment price: $0.05/hour
1232
+ - Fallback data processing price: $0.02/GB
1233
+
1234
+ **Example:**
1235
+ ```
1236
+ Attachments: 3 × $0.05/hour × 730 = $109.50
1237
+ Data Processing: 1,000 GB × $0.02 = $20.00
1238
+ Total: $129.50/month
1239
+ ```
1240
+
1241
+ **Notes:**
1242
+ - VPN and Direct Connect attachments have additional costs
1243
+ - Cross-region peering attachments priced separately
1244
+
1245
+ ### AWS::EC2::TransitGatewayAttachment
1246
+
1247
+ **Description:** Transit Gateway VPC attachment
1248
+
1249
+ **Cost Components:**
1250
+ - Attachment hourly fee x 730 hours/month
1251
+
1252
+ **Default Assumptions:**
1253
+ - Fallback price: $0.05/hour
1254
+
1255
+ **Example:**
1256
+ ```
1257
+ Attachment Rate: $0.05/hour
1258
+ Monthly Cost: $0.05 × 730 = $36.50
1259
+ ```
1260
+
1261
+ **Notes:**
1262
+ - Data processing costs tracked on the parent Transit Gateway resource
1263
+
1264
+ ## Database Resources (continued)
1265
+
1266
+ ### AWS::RDS::DBCluster (Aurora Serverless)
1267
+
1268
+ **Description:** Amazon Aurora Serverless for auto-scaling relational databases
1269
+
1270
+ **Cost Components:**
1271
+ 1. Compute: ACU-hours (Aurora Capacity Units)
1272
+ 2. Storage: GB-month
1273
+ 3. I/O requests (Serverless v2 only)
1274
+
1275
+ **Default Assumptions:**
1276
+ - Minimum ACUs: 0.5
1277
+ - Maximum ACUs: 16
1278
+ - Storage: 100 GB
1279
+ - I/O requests: 100,000,000/month (v2 only)
1280
+ - Fallback ACU price: $0.12/ACU-hour (v2), $0.06/ACU-hour (v1)
1281
+ - Storage price: $0.10/GB-month
1282
+ - I/O price: $0.20/million requests
1283
+
1284
+ **Detection Logic:**
1285
+ - Serverless v2: `ServerlessV2ScalingConfiguration` property present
1286
+ - Serverless v1: `EngineMode` === "serverless"
1287
+ - ACU min/max from `ServerlessV2ScalingConfiguration.MinCapacity` and `MaxCapacity`
1288
+
1289
+ **Pricing Model:**
1290
+ - Compute uses average of min and max ACU: `(minACU + maxACU) / 2 × hourly rate × 730`
1291
+
1292
+ **Example (Serverless v2):**
1293
+ ```
1294
+ Average ACUs: (0.5 + 16) / 2 = 8.25
1295
+ Compute: 8.25 × $0.12 × 730 = $722.70
1296
+ Storage: 100 GB × $0.10 = $10.00
1297
+ I/O: 100M / 1M × $0.20 = $20.00
1298
+ Total: $752.70/month
1299
+ ```
1300
+
1301
+ **Example (Serverless v1):**
1302
+ ```
1303
+ Average ACUs: (0.5 + 16) / 2 = 8.25
1304
+ Compute: 8.25 × $0.06 × 730 = $361.35
1305
+ Storage: 100 GB × $0.10 = $10.00
1306
+ Total: $371.35/month
1307
+ ```
1308
+
1309
+ **Notes:**
1310
+ - Actual ACU usage varies with workload; estimate uses midpoint
1311
+ - Aurora Serverless v1 does not charge for I/O
1312
+ - Backup storage costs not included
1313
+ - Data transfer costs not included
1314
+
949
1315
  ## Customizing Assumptions
950
1316
 
951
1317
  ### Configuration File
package/docs/README.md CHANGED
@@ -7,11 +7,12 @@ This directory contains the documentation for CDK Cost Analyzer, published to Gi
7
7
  - **index.md** - Homepage with overview and quick start
8
8
  - **CONFIGURATION.md** - Configuration guide for thresholds, usage assumptions, and exclusions
9
9
  - **CI_CD.md** - CI/CD integration guide for GitHub Actions and GitLab CI
10
- - **CALCULATORS.md** - Resource calculator reference with cost calculation methods
10
+ - **CALCULATORS.md** - Resource calculator reference with cost calculation methods (25+ resource types)
11
+ - **RECOMMENDATIONS.md** - Cost optimization recommendations engine (7 analyzer categories)
11
12
  - **TROUBLESHOOTING.md** - Common issues and solutions
12
13
  - **DEVELOPMENT.md** - Local development, testing, and architecture
13
14
  - **RELEASE.md** - Release process documentation
14
- - **SINGLE-TEMPLATE-ANALYSIS.md** - Single template analysis guide
15
+ - **SINGLE-TEMPLATE-ANALYSIS.md** - Single template analysis guide with recommendations
15
16
  - **NAT_GATEWAY_TESTING.md** - NAT Gateway testing and debugging guide
16
17
 
17
18
  ## GitHub Pages Setup