@grnsft/if 0.0.2

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 (285) hide show
  1. package/.devcontainer/devcontainer.json +38 -0
  2. package/.editorconfig +8 -0
  3. package/.env.example +9 -0
  4. package/.eslintignore +4 -0
  5. package/.eslintrc.json +8 -0
  6. package/.github/ISSUE_TEMPLATE/agenda.md +36 -0
  7. package/.github/ISSUE_TEMPLATE/blank-issue.md +10 -0
  8. package/.github/ISSUE_TEMPLATE/feedback.md +42 -0
  9. package/.github/ISSUE_TEMPLATE/model-plugin.md +63 -0
  10. package/.github/ISSUE_TEMPLATE/user-story.md +10 -0
  11. package/.github/PULL_REQUEST_TEMPLATE.md +21 -0
  12. package/.github/workflows/nodejs-ci.yml +34 -0
  13. package/.gitmodules +3 -0
  14. package/.prettierrc.js +3 -0
  15. package/CONTRIBUTING.md +194 -0
  16. package/LICENSE +21 -0
  17. package/Makefile +16 -0
  18. package/README.md +67 -0
  19. package/build/__mocks__/azure/index.d.ts +11 -0
  20. package/build/__mocks__/azure/index.js +132 -0
  21. package/build/__mocks__/boavizta/countries.json +138 -0
  22. package/build/__mocks__/boavizta/instance_types.json +625 -0
  23. package/build/__mocks__/boavizta/providers.json +1 -0
  24. package/build/__mocks__/fs/index.d.ts +3 -0
  25. package/build/__mocks__/fs/index.js +56 -0
  26. package/build/__mocks__/model-universe/index.d.ts +33 -0
  27. package/build/__mocks__/model-universe/index.js +68 -0
  28. package/build/__mocks__/watt-time/data.json +119 -0
  29. package/build/__tests__/integration/ompl/index.test.d.ts +1 -0
  30. package/build/__tests__/integration/ompl/index.test.js +61 -0
  31. package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +1 -0
  32. package/build/__tests__/unit/lib/azure-importer/index.test.js +152 -0
  33. package/build/__tests__/unit/lib/boavizta/index.test.d.ts +1 -0
  34. package/build/__tests__/unit/lib/boavizta/index.test.js +579 -0
  35. package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +1 -0
  36. package/build/__tests__/unit/lib/case-studies/aveva.test.js +36 -0
  37. package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +1 -0
  38. package/build/__tests__/unit/lib/case-studies/emem.test.js +108 -0
  39. package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +1 -0
  40. package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +53 -0
  41. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +1 -0
  42. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +23 -0
  43. package/build/__tests__/unit/lib/ccf/index.test.d.ts +1 -0
  44. package/build/__tests__/unit/lib/ccf/index.test.js +223 -0
  45. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +1 -0
  46. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +73 -0
  47. package/build/__tests__/unit/lib/sci/index.test.d.ts +1 -0
  48. package/build/__tests__/unit/lib/sci/index.test.js +106 -0
  49. package/build/__tests__/unit/lib/sci-e/index.test.d.ts +1 -0
  50. package/build/__tests__/unit/lib/sci-e/index.test.js +30 -0
  51. package/build/__tests__/unit/lib/sci-m/index.test.d.ts +1 -0
  52. package/build/__tests__/unit/lib/sci-m/index.test.js +58 -0
  53. package/build/__tests__/unit/lib/sci-o/index.test.d.ts +1 -0
  54. package/build/__tests__/unit/lib/sci-o/index.test.js +42 -0
  55. package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +1 -0
  56. package/build/__tests__/unit/lib/shell-imp/index.test.js +21 -0
  57. package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +1 -0
  58. package/build/__tests__/unit/lib/tdp-finder/index.test.js +62 -0
  59. package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +1 -0
  60. package/build/__tests__/unit/lib/teads-aws/index.test.js +170 -0
  61. package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +1 -0
  62. package/build/__tests__/unit/lib/teads-curve/index.test.js +146 -0
  63. package/build/__tests__/unit/lib/watt-time/index.test.d.ts +1 -0
  64. package/build/__tests__/unit/lib/watt-time/index.test.js +106 -0
  65. package/build/__tests__/unit/util/args.test.d.ts +1 -0
  66. package/build/__tests__/unit/util/args.test.js +92 -0
  67. package/build/__tests__/unit/util/models-universe.test.d.ts +1 -0
  68. package/build/__tests__/unit/util/models-universe.test.js +211 -0
  69. package/build/__tests__/unit/util/observatory.test.d.ts +1 -0
  70. package/build/__tests__/unit/util/observatory.test.js +91 -0
  71. package/build/__tests__/unit/util/supercomputer.test.d.ts +1 -0
  72. package/build/__tests__/unit/util/supercomputer.test.js +231 -0
  73. package/build/__tests__/unit/util/yaml.test.d.ts +1 -0
  74. package/build/__tests__/unit/util/yaml.test.js +59 -0
  75. package/build/config/config.d.ts +32 -0
  76. package/build/config/config.js +74 -0
  77. package/build/config/index.d.ts +2 -0
  78. package/build/config/index.js +8 -0
  79. package/build/config/strings.d.ts +14 -0
  80. package/build/config/strings.js +30 -0
  81. package/build/index.d.ts +1 -0
  82. package/build/index.js +46 -0
  83. package/build/lib/azure-importer/index.d.ts +55 -0
  84. package/build/lib/azure-importer/index.js +314 -0
  85. package/build/lib/boavizta/index.d.ts +53 -0
  86. package/build/lib/boavizta/index.js +254 -0
  87. package/build/lib/case-studies/aveva-model.d.ts +29 -0
  88. package/build/lib/case-studies/aveva-model.js +53 -0
  89. package/build/lib/case-studies/emem-model.d.ts +42 -0
  90. package/build/lib/case-studies/emem-model.js +93 -0
  91. package/build/lib/case-studies/eshoppen-model.d.ts +24 -0
  92. package/build/lib/case-studies/eshoppen-model.js +123 -0
  93. package/build/lib/case-studies/index.d.ts +4 -0
  94. package/build/lib/case-studies/index.js +21 -0
  95. package/build/lib/case-studies/sci-accenture-model.d.ts +10 -0
  96. package/build/lib/case-studies/sci-accenture-model.js +37 -0
  97. package/build/lib/ccf/aws-embodied.json +5591 -0
  98. package/build/lib/ccf/aws-instances.json +21116 -0
  99. package/build/lib/ccf/aws-use.json +79 -0
  100. package/build/lib/ccf/azure-embodied.json +6547 -0
  101. package/build/lib/ccf/azure-instances.json +8332 -0
  102. package/build/lib/ccf/azure-use.json +58 -0
  103. package/build/lib/ccf/gcp-embodied.json +3049 -0
  104. package/build/lib/ccf/gcp-instances.json +3880 -0
  105. package/build/lib/ccf/gcp-use.json +58 -0
  106. package/build/lib/ccf/index.d.ts +63 -0
  107. package/build/lib/ccf/index.js +338 -0
  108. package/build/lib/cloud-instance-metadata/aws-instances.json +1 -0
  109. package/build/lib/cloud-instance-metadata/azure-instances.json +1 -0
  110. package/build/lib/cloud-instance-metadata/index.d.ts +15 -0
  111. package/build/lib/cloud-instance-metadata/index.js +104 -0
  112. package/build/lib/index.d.ts +15 -0
  113. package/build/lib/index.js +32 -0
  114. package/build/lib/interfaces/ccf.d.ts +19 -0
  115. package/build/lib/interfaces/ccf.js +3 -0
  116. package/build/lib/interfaces/index.d.ts +7 -0
  117. package/build/lib/interfaces/index.js +18 -0
  118. package/build/lib/sci/index.d.ts +13 -0
  119. package/build/lib/sci/index.js +131 -0
  120. package/build/lib/sci-e/index.d.ts +38 -0
  121. package/build/lib/sci-e/index.js +85 -0
  122. package/build/lib/sci-m/index.d.ts +10 -0
  123. package/build/lib/sci-m/index.js +124 -0
  124. package/build/lib/sci-o/index.d.ts +17 -0
  125. package/build/lib/sci-o/index.js +52 -0
  126. package/build/lib/shell-imp/index.d.ts +32 -0
  127. package/build/lib/shell-imp/index.js +82 -0
  128. package/build/lib/tdp-finder/index.d.ts +19 -0
  129. package/build/lib/tdp-finder/index.js +98 -0
  130. package/build/lib/teads-aws/aws-embodied.json +1 -0
  131. package/build/lib/teads-aws/aws-instances.json +1 -0
  132. package/build/lib/teads-aws/index.d.ts +58 -0
  133. package/build/lib/teads-aws/index.js +208 -0
  134. package/build/lib/teads-curve/index.d.ts +52 -0
  135. package/build/lib/teads-curve/index.js +158 -0
  136. package/build/lib/watt-time/index.d.ts +18 -0
  137. package/build/lib/watt-time/index.js +204 -0
  138. package/build/types/azure-importer.d.ts +29 -0
  139. package/build/types/azure-importer.js +3 -0
  140. package/build/types/boavizta.d.ts +7 -0
  141. package/build/types/boavizta.js +3 -0
  142. package/build/types/common.d.ts +7 -0
  143. package/build/types/common.js +9 -0
  144. package/build/types/impl.d.ts +40 -0
  145. package/build/types/impl.js +3 -0
  146. package/build/types/models-universe.d.ts +24 -0
  147. package/build/types/models-universe.js +3 -0
  148. package/build/types/process-args.d.ts +7 -0
  149. package/build/types/process-args.js +3 -0
  150. package/build/types/supercomputer.d.ts +4 -0
  151. package/build/types/supercomputer.js +3 -0
  152. package/build/util/args.d.ts +8 -0
  153. package/build/util/args.js +48 -0
  154. package/build/util/errors.d.ts +6 -0
  155. package/build/util/errors.js +22 -0
  156. package/build/util/helpers.d.ts +4 -0
  157. package/build/util/helpers.js +18 -0
  158. package/build/util/models-universe.d.ts +28 -0
  159. package/build/util/models-universe.js +95 -0
  160. package/build/util/observatory.d.ts +20 -0
  161. package/build/util/observatory.js +31 -0
  162. package/build/util/supercomputer.d.ts +30 -0
  163. package/build/util/supercomputer.js +109 -0
  164. package/build/util/validations.d.ts +25 -0
  165. package/build/util/validations.js +52 -0
  166. package/build/util/yaml.d.ts +13 -0
  167. package/build/util/yaml.js +36 -0
  168. package/coverage/clover.xml +1172 -0
  169. package/coverage/coverage-final.json +27 -0
  170. package/coverage/lcov-report/base.css +224 -0
  171. package/coverage/lcov-report/block-navigation.js +87 -0
  172. package/coverage/lcov-report/config/config.ts.html +310 -0
  173. package/coverage/lcov-report/config/index.html +146 -0
  174. package/coverage/lcov-report/config/index.ts.html +91 -0
  175. package/coverage/lcov-report/config/strings.ts.html +118 -0
  176. package/coverage/lcov-report/favicon.png +0 -0
  177. package/coverage/lcov-report/index.html +341 -0
  178. package/coverage/lcov-report/lib/boavizta/index.html +116 -0
  179. package/coverage/lcov-report/lib/boavizta/index.ts.html +1171 -0
  180. package/coverage/lcov-report/lib/case-studies/aveva-model.ts.html +277 -0
  181. package/coverage/lcov-report/lib/case-studies/emem-model.ts.html +439 -0
  182. package/coverage/lcov-report/lib/case-studies/eshoppen-model.ts.html +550 -0
  183. package/coverage/lcov-report/lib/case-studies/index.html +176 -0
  184. package/coverage/lcov-report/lib/case-studies/index.ts.html +97 -0
  185. package/coverage/lcov-report/lib/case-studies/sci-accenture-model.ts.html +232 -0
  186. package/coverage/lcov-report/lib/ccf/index.html +116 -0
  187. package/coverage/lcov-report/lib/ccf/index.ts.html +1339 -0
  188. package/coverage/lcov-report/lib/cloud-instance-metadata/index.html +116 -0
  189. package/coverage/lcov-report/lib/cloud-instance-metadata/index.ts.html +370 -0
  190. package/coverage/lcov-report/lib/index.html +116 -0
  191. package/coverage/lcov-report/lib/index.ts.html +121 -0
  192. package/coverage/lcov-report/lib/sci/index.html +116 -0
  193. package/coverage/lcov-report/lib/sci/index.ts.html +571 -0
  194. package/coverage/lcov-report/lib/sci-e/index.html +116 -0
  195. package/coverage/lcov-report/lib/sci-e/index.ts.html +403 -0
  196. package/coverage/lcov-report/lib/sci-m/index.html +116 -0
  197. package/coverage/lcov-report/lib/sci-m/index.ts.html +487 -0
  198. package/coverage/lcov-report/lib/sci-o/index.html +116 -0
  199. package/coverage/lcov-report/lib/sci-o/index.ts.html +265 -0
  200. package/coverage/lcov-report/lib/shell-imp/index.html +116 -0
  201. package/coverage/lcov-report/lib/shell-imp/index.ts.html +376 -0
  202. package/coverage/lcov-report/lib/teads-aws/index.html +116 -0
  203. package/coverage/lcov-report/lib/teads-aws/index.ts.html +823 -0
  204. package/coverage/lcov-report/lib/teads-curve/index.html +116 -0
  205. package/coverage/lcov-report/lib/teads-curve/index.ts.html +625 -0
  206. package/coverage/lcov-report/lib/watt-time/index.html +116 -0
  207. package/coverage/lcov-report/lib/watt-time/index.ts.html +829 -0
  208. package/coverage/lcov-report/prettify.css +1 -0
  209. package/coverage/lcov-report/prettify.js +2 -0
  210. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  211. package/coverage/lcov-report/sorter.js +196 -0
  212. package/coverage/lcov-report/types/common.ts.html +109 -0
  213. package/coverage/lcov-report/types/index.html +116 -0
  214. package/coverage/lcov-report/util/args.ts.html +244 -0
  215. package/coverage/lcov-report/util/index.html +176 -0
  216. package/coverage/lcov-report/util/models-universe.ts.html +679 -0
  217. package/coverage/lcov-report/util/observatory.ts.html +229 -0
  218. package/coverage/lcov-report/util/supercomputer.ts.html +466 -0
  219. package/coverage/lcov-report/util/yaml.ts.html +193 -0
  220. package/coverage/lcov.info +2094 -0
  221. package/docs/implementations/tdp-finder.md +36 -0
  222. package/examples/impls/case-studies/accenture.yml +155 -0
  223. package/examples/impls/case-studies/aveva.yaml +48 -0
  224. package/examples/impls/case-studies/azure-yassine.yaml +67 -0
  225. package/examples/impls/case-studies/boavizta.yml +26 -0
  226. package/examples/impls/case-studies/dow_msft.yml +173 -0
  227. package/examples/impls/case-studies/farm-insights.yaml +35 -0
  228. package/examples/impls/case-studies/gsf-website.yaml +93 -0
  229. package/examples/impls/case-studies/msft-eshoppen.yaml +162 -0
  230. package/examples/impls/case-studies/msft-green-ai.yaml +58 -0
  231. package/examples/impls/case-studies/ntt-data-on-premise.yaml +201 -0
  232. package/examples/impls/tdp-finder-test.yml +19 -0
  233. package/examples/impls/test/azure.yml +26 -0
  234. package/examples/impls/test/ccf.yml +19 -0
  235. package/examples/impls/test/complex-pipeline.yml +67 -0
  236. package/examples/impls/test/if-demo.yml +51 -0
  237. package/examples/impls/test/metadata.yml +20 -0
  238. package/examples/impls/test/nesting.yml +65 -0
  239. package/examples/impls/test/sci-e.yml +21 -0
  240. package/examples/impls/test/sci-m.yml +24 -0
  241. package/examples/impls/test/sci-o.yml +28 -0
  242. package/examples/impls/test/sci.yml +27 -0
  243. package/examples/impls/test/shell.yml +18 -0
  244. package/examples/impls/test/toto.yaml +22 -0
  245. package/examples/ompls/azure.yml +145 -0
  246. package/examples/ompls/ccf.yml +27 -0
  247. package/examples/ompls/complex-pipeline.yml +105 -0
  248. package/examples/ompls/full-sci.yml +64 -0
  249. package/examples/ompls/if-demo.yml +493 -0
  250. package/examples/ompls/metadata.yml +29 -0
  251. package/examples/ompls/nesting.yml +107 -0
  252. package/examples/ompls/sci-e.yml +23 -0
  253. package/examples/ompls/sci-m.yml +33 -0
  254. package/examples/ompls/sci-o.yml +29 -0
  255. package/examples/ompls/sci.yml +36 -0
  256. package/examples/ompls/shell.yml +23 -0
  257. package/jest.config.js +14 -0
  258. package/package.json +71 -0
  259. package/scripts/impact-test.sh +12 -0
  260. package/src/__mocks__/boavizta/countries.json +138 -0
  261. package/src/__mocks__/boavizta/instance_types.json +625 -0
  262. package/src/__mocks__/boavizta/providers.json +1 -0
  263. package/src/__mocks__/watt-time/data.json +119 -0
  264. package/src/config/units.yaml +125 -0
  265. package/src/lib/ccf/aws-embodied.json +5591 -0
  266. package/src/lib/ccf/aws-instances.json +21116 -0
  267. package/src/lib/ccf/aws-use.json +79 -0
  268. package/src/lib/ccf/azure-embodied.json +6547 -0
  269. package/src/lib/ccf/azure-instances.json +8332 -0
  270. package/src/lib/ccf/azure-use.json +58 -0
  271. package/src/lib/ccf/gcp-embodied.json +3049 -0
  272. package/src/lib/ccf/gcp-instances.json +3880 -0
  273. package/src/lib/ccf/gcp-use.json +58 -0
  274. package/src/lib/cloud-instance-metadata/aws-instances.json +1 -0
  275. package/src/lib/cloud-instance-metadata/azure-instances.json +1 -0
  276. package/src/lib/shell-imp/sampler +30 -0
  277. package/src/lib/tdp-finder/README.md +7 -0
  278. package/src/lib/tdp-finder/boavizta_data.csv +1768 -0
  279. package/src/lib/tdp-finder/data.csv +4460 -0
  280. package/src/lib/tdp-finder/data2.csv +2162 -0
  281. package/src/lib/teads-aws/aws-embodied.json +1 -0
  282. package/src/lib/teads-aws/aws-instances.json +1 -0
  283. package/tsconfig.test.json +39 -0
  284. package/tsconfig.tsbuildinfo +1 -0
  285. package/yarn-error.log +5854 -0
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BoaviztaCloudOutputModel = exports.BoaviztaCpuOutputModel = void 0;
4
+ const axios_1 = require("axios");
5
+ const config_1 = require("../../config");
6
+ const { MODEL_IDS } = config_1.CONFIG;
7
+ const { BOAVIZTA_CPU, BOAVIZTA_CLOUD } = MODEL_IDS;
8
+ class BoaviztaOutputModel {
9
+ constructor() {
10
+ this.sharedParams = undefined;
11
+ this.metricType = 'cpu-util';
12
+ this.expectedLifespan = 4 * 365 * 24 * 60 * 60;
13
+ }
14
+ async authenticate(authParams) {
15
+ this.authCredentials = authParams;
16
+ }
17
+ async configure(name, staticParams = undefined) {
18
+ this.name = name;
19
+ this.sharedParams = await this.captureStaticParams(staticParams ?? {});
20
+ return this;
21
+ }
22
+ // list of supported locations by the model
23
+ async supportedLocations() {
24
+ const countries = await axios_1.default.get('https://api.boavizta.org/v1/utils/country_code');
25
+ return Object.values(countries.data);
26
+ }
27
+ // converts the usage from IMPL input to the format required by Boavizta API.
28
+ transformToBoaviztaUsage(duration, metric) {
29
+ // duration is in seconds, convert to hours
30
+ // metric is between 0 and 1, convert to percentage
31
+ let usageInput = {
32
+ hours_use_time: duration / 3600.0,
33
+ time_workload: metric,
34
+ };
35
+ // convert expected lifespan from seconds to years
36
+ usageInput['years_life_time'] =
37
+ this.expectedLifespan / (365.0 * 24.0 * 60.0 * 60.0);
38
+ usageInput = this.addLocationToUsage(usageInput);
39
+ return usageInput;
40
+ }
41
+ // Calculates the output of the given usage
42
+ async execute(inputs = undefined) {
43
+ if (Array.isArray(inputs)) {
44
+ const results = [];
45
+ for (const input of inputs) {
46
+ const usageResult = await this.calculateUsageForinput(input);
47
+ results.push(usageResult);
48
+ }
49
+ return results;
50
+ }
51
+ else {
52
+ throw new Error('Parameter Not Given: invalid inputs parameter. Expecting an array of inputs');
53
+ }
54
+ }
55
+ // Adds location to usage if location is defined in sharedParams
56
+ addLocationToUsage(usageRaw) {
57
+ if (this.sharedParams !== undefined && 'location' in this.sharedParams) {
58
+ usageRaw['usage_location'] = this.sharedParams['location'];
59
+ }
60
+ return usageRaw;
61
+ }
62
+ // extracts information from Boavizta API response to return the output in the format required by IMPL
63
+ formatResponse(data) {
64
+ let m = 0;
65
+ let e = 0;
66
+ if ('outputs' in data) {
67
+ // embodied-carbon output is in kgCO2eq, convert to gCO2eq
68
+ m = data['outputs']['gwp']['embedded']['value'] * 1000;
69
+ // use output is in J , convert to kWh.
70
+ // 1,000,000 J / 3600 = 277.7777777777778 Wh.
71
+ // 1 MJ / 3.6 = 0.278 kWh
72
+ e = data['outputs']['pe']['use']['value'] / 3.6;
73
+ }
74
+ else if ('gwp' in data && 'pe' in data) {
75
+ // embodied-carbon output is in kgCO2eq, convert to gCO2eq
76
+ m = data['gwp']['embodied-carbon'] * 1000;
77
+ // use output is in J , convert to kWh.
78
+ // 1,000,000 J / 3600 = 277.7777777777778 Wh.
79
+ // 1 MJ / 3.6 = 0.278 kWh
80
+ e = data['pe']['use'] / 3.6;
81
+ }
82
+ return { 'embodied-carbon': m, energy: e };
83
+ }
84
+ // converts the usage to the format required by Boavizta API.
85
+ async calculateUsageForinput(input) {
86
+ if ('timestamp' in input &&
87
+ 'duration' in input &&
88
+ this.metricType in input) {
89
+ const usageInput = this.transformToBoaviztaUsage(input['duration'], input[this.metricType]);
90
+ const usage = (await this.fetchData(usageInput));
91
+ return usage;
92
+ }
93
+ else {
94
+ throw new Error('Invalid Input: Invalid inputs parameter');
95
+ }
96
+ }
97
+ }
98
+ class BoaviztaCpuOutputModel extends BoaviztaOutputModel {
99
+ constructor() {
100
+ super();
101
+ this.sharedParams = undefined;
102
+ this.verbose = false;
103
+ this.allocation = 'LINEAR';
104
+ this.componentType = 'cpu';
105
+ this.metricType = 'cpu-util';
106
+ this.componentType = 'cpu';
107
+ }
108
+ modelIdentifier() {
109
+ return BOAVIZTA_CPU;
110
+ }
111
+ async fetchData(usageData) {
112
+ if (this.sharedParams === undefined) {
113
+ throw new Error('Improper configure: Missing configuration parameters');
114
+ }
115
+ const dataCast = this.sharedParams;
116
+ dataCast['usage'] = usageData;
117
+ const response = await axios_1.default.post(`https://api.boavizta.org/v1/component/${this.componentType}?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`, dataCast);
118
+ const result = this.formatResponse(response.data);
119
+ // console.log(
120
+ // 'hitting ',
121
+ // `https://api.boavizta.org/v1/component/${this.componentType}?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`,
122
+ // dataCast,
123
+ // JSON.stringify(response.data)
124
+ // );
125
+ return {
126
+ 'e-cpu': result.energy,
127
+ 'embodied-carbon': result['embodied-carbon'],
128
+ };
129
+ }
130
+ async captureStaticParams(staticParams) {
131
+ if ('verbose' in staticParams) {
132
+ this.verbose = staticParams.verbose ?? false;
133
+ staticParams.verbose = undefined;
134
+ }
135
+ if (!('physical-processor' in staticParams)) {
136
+ throw new Error('Improper configure: Missing processor parameter');
137
+ }
138
+ if (!('core-units' in staticParams)) {
139
+ throw new Error('Improper configure: Missing core-units parameter');
140
+ }
141
+ if ('expected-lifespan' in staticParams) {
142
+ this.expectedLifespan = staticParams['expected-lifespan'];
143
+ }
144
+ this.sharedParams = Object.assign({}, staticParams);
145
+ return this.sharedParams;
146
+ }
147
+ }
148
+ exports.BoaviztaCpuOutputModel = BoaviztaCpuOutputModel;
149
+ class BoaviztaCloudOutputModel extends BoaviztaOutputModel {
150
+ constructor() {
151
+ super(...arguments);
152
+ this.sharedParams = undefined;
153
+ this.instanceTypes = {};
154
+ this.verbose = false;
155
+ this.allocation = 'LINEAR';
156
+ }
157
+ modelIdentifier() {
158
+ return BOAVIZTA_CLOUD;
159
+ }
160
+ async validateLocation(staticParamsCast) {
161
+ if ('location' in staticParamsCast) {
162
+ const location = staticParamsCast.location ?? 'USA';
163
+ const countries = await this.supportedLocations();
164
+ if (!countries.includes(location)) {
165
+ throw new Error("Improper configure: Invalid location parameter: '" +
166
+ location +
167
+ "'. Valid values are : " +
168
+ countries.join(', '));
169
+ }
170
+ return staticParamsCast.location;
171
+ }
172
+ }
173
+ async validateInstanceType(staticParamsCast) {
174
+ if (!('provider' in staticParamsCast)) {
175
+ throw new Error('Improper configure: Missing provider parameter');
176
+ }
177
+ if (!('instance-type' in staticParamsCast)) {
178
+ throw new Error("Improper configure: Missing 'instance-type' parameter");
179
+ }
180
+ const provider = staticParamsCast.provider;
181
+ if (this.instanceTypes[provider] === undefined ||
182
+ this.instanceTypes[provider].length === 0) {
183
+ this.instanceTypes[provider] = await this.supportedInstancesList(provider);
184
+ }
185
+ if ('instance-type' in staticParamsCast) {
186
+ if (!this.instanceTypes[provider].includes(staticParamsCast['instance-type'])) {
187
+ throw new Error(`Improper configure: Invalid 'instance-type' parameter: '${staticParamsCast['instance-type']}'. Valid values are : ${this.instanceTypes[provider].join(', ')}`);
188
+ }
189
+ }
190
+ }
191
+ async validateProvider(staticParamsCast) {
192
+ if (!('provider' in staticParamsCast)) {
193
+ throw new Error('Improper configure: Missing provider parameter');
194
+ }
195
+ else {
196
+ const supportedProviders = await this.supportedProvidersList();
197
+ if (!supportedProviders.includes(staticParamsCast.provider)) {
198
+ throw new Error("Improper configure: Invalid provider parameter: '" +
199
+ staticParamsCast.provider +
200
+ "'. Valid values are : " +
201
+ supportedProviders.join(', '));
202
+ }
203
+ }
204
+ }
205
+ async supportedInstancesList(provider) {
206
+ const instances = await axios_1.default.get(`https://api.boavizta.org/v1/cloud/instance/all_instances?provider=${provider}`);
207
+ return instances.data;
208
+ }
209
+ async supportedProvidersList() {
210
+ const providers = await axios_1.default.get('https://api.boavizta.org/v1/cloud/instance/all_providers');
211
+ return Object.values(providers.data);
212
+ }
213
+ async fetchData(usageData) {
214
+ if (this.sharedParams === undefined) {
215
+ throw new Error('Improper configure: Missing configuration parameters');
216
+ }
217
+ const dataCast = this.sharedParams;
218
+ for (const key in dataCast) {
219
+ // replace - with _ in keys
220
+ if (key.includes('-')) {
221
+ const newKey = key.replace(/-/g, '_');
222
+ dataCast[newKey] = dataCast[key];
223
+ delete dataCast[key];
224
+ }
225
+ }
226
+ dataCast['usage'] = usageData;
227
+ const response = await axios_1.default.post(`https://api.boavizta.org/v1/cloud/instance?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`, dataCast);
228
+ // console.log(
229
+ // `https://api.boavizta.org/v1/cloud/instance?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`,
230
+ // JSON.stringify(response.data),
231
+ // dataCast
232
+ // );
233
+ return this.formatResponse(response.data);
234
+ }
235
+ async captureStaticParams(staticParams) {
236
+ if ('verbose' in staticParams) {
237
+ this.verbose = staticParams.verbose ?? false;
238
+ staticParams.verbose = undefined;
239
+ }
240
+ // if no valid provider found, throw error
241
+ await this.validateProvider(staticParams);
242
+ // if no valid 'instance-type' found, throw error
243
+ await this.validateInstanceType(staticParams);
244
+ // if no valid location found, throw error
245
+ await this.validateLocation(staticParams);
246
+ if ('expected-lifespan' in staticParams) {
247
+ this.expectedLifespan = staticParams['expected-lifespan'];
248
+ }
249
+ this.sharedParams = Object.assign({}, staticParams);
250
+ return this.sharedParams;
251
+ }
252
+ }
253
+ exports.BoaviztaCloudOutputModel = BoaviztaCloudOutputModel;
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2JvYXZpenRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUEwQjtBQUcxQix5Q0FBb0M7QUFLcEMsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUMzQixNQUFNLEVBQUMsWUFBWSxFQUFFLGNBQWMsRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUVqRCxNQUFlLG1CQUFtQjtJQUFsQztRQUVFLGlCQUFZLEdBQXVCLFNBQVMsQ0FBQztRQUM3QyxlQUFVLEdBQXlDLFVBQVUsQ0FBQztRQUM5RCxxQkFBZ0IsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBeUg1QyxDQUFDO0lBdEhDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBa0I7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBUUQsMkNBQTJDO0lBQzNDLEtBQUssQ0FBQyxrQkFBa0I7UUFDdEIsTUFBTSxTQUFTLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUMvQixnREFBZ0QsQ0FDakQsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSx3QkFBd0IsQ0FBQyxRQUFnQixFQUFFLE1BQWM7UUFDdkQsMkNBQTJDO1FBQzNDLG1EQUFtRDtRQUNuRCxJQUFJLFVBQVUsR0FBaUI7WUFDN0IsY0FBYyxFQUFFLFFBQVEsR0FBRyxNQUFNO1lBQ2pDLGFBQWEsRUFBRSxNQUFNO1NBQ3RCLENBQUM7UUFDRixrREFBa0Q7UUFDbEQsVUFBVSxDQUFDLGlCQUFpQixDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELDJDQUEyQztJQUMzQyxLQUFLLENBQUMsT0FBTyxDQUNYLFNBQXdDLFNBQVM7UUFFakQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sT0FBTyxHQUFtQixFQUFFLENBQUM7WUFFbkMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7Z0JBQzFCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzNCO1lBRUQsT0FBTyxPQUFPLENBQUM7U0FDaEI7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkVBQTZFLENBQzlFLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsa0JBQWtCLENBQUMsUUFBc0I7UUFDdkMsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0RSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUtELHNHQUFzRztJQUM1RixjQUFjLENBQUMsSUFBa0I7UUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ3JCLDBEQUEwRDtZQUMxRCxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN2RCx1Q0FBdUM7WUFDdkMsNkNBQTZDO1lBQzdDLHlCQUF5QjtZQUN6QixDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztTQUNqRDthQUFNLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3hDLDBEQUEwRDtZQUMxRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFDLHVDQUF1QztZQUN2Qyw2Q0FBNkM7WUFDN0MseUJBQXlCO1lBQ3pCLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQzdCO1FBRUQsT0FBTyxFQUFDLGlCQUFpQixFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELDZEQUE2RDtJQUNuRCxLQUFLLENBQUMsc0JBQXNCLENBQ3BDLEtBQW1CO1FBRW5CLElBQ0UsV0FBVyxJQUFJLEtBQUs7WUFDcEIsVUFBVSxJQUFJLEtBQUs7WUFDbkIsSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLEVBQ3hCO1lBQ0EsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUM5QyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3ZCLENBQUM7WUFDRixNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBc0IsQ0FBQztZQUV0RSxPQUFPLEtBQUssQ0FBQztTQUNkO2FBQU07WUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxNQUFhLHNCQUNYLFNBQVEsbUJBQW1CO0lBUzNCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFQVixpQkFBWSxHQUF1QixTQUFTLENBQUM7UUFFdEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixlQUFVLEdBQUcsUUFBUSxDQUFDO1FBQ1osa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFJckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUE2QjtRQUMzQyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztTQUN6RTtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUE0QixDQUFDO1FBQ25ELFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUM7UUFFOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFLLENBQUMsSUFBSSxDQUMvQix5Q0FBeUMsSUFBSSxDQUFDLGFBQWEsWUFBWSxJQUFJLENBQUMsT0FBTyxhQUFhLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQ3JJLFFBQVEsQ0FDVCxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEQsZUFBZTtRQUNmLGdCQUFnQjtRQUNoQiwySUFBMkk7UUFDM0ksY0FBYztRQUNkLGtDQUFrQztRQUNsQyxLQUFLO1FBQ0wsT0FBTztZQUNMLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUN0QixpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUM7U0FDN0MsQ0FBQztJQUNKLENBQUM7SUFFUyxLQUFLLENBQUMsbUJBQW1CLENBQUMsWUFBb0I7UUFDdEQsSUFBSSxTQUFTLElBQUksWUFBWSxFQUFFO1lBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUksWUFBWSxDQUFDLE9BQW1CLElBQUksS0FBSyxDQUFDO1lBQzFELFlBQVksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxDQUFDLENBQUMsb0JBQW9CLElBQUksWUFBWSxDQUFDLEVBQUU7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1NBQ3BFO1FBRUQsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxFQUFFO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztTQUNyRTtRQUVELElBQUksbUJBQW1CLElBQUksWUFBWSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQVcsQ0FBQztTQUNyRTtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFcEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQXBFRCx3REFvRUM7QUFFRCxNQUFhLHdCQUNYLFNBQVEsbUJBQW1CO0lBRDdCOztRQUlTLGlCQUFZLEdBQXVCLFNBQVMsQ0FBQztRQUM3QyxrQkFBYSxHQUEwQixFQUFFLENBQUM7UUFFMUMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixlQUFVLEdBQUcsUUFBUSxDQUFDO0lBMEkvQixDQUFDO0lBeElDLGVBQWU7UUFDYixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGdCQUF3QjtRQUM3QyxJQUFJLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRTtZQUNsQyxNQUFNLFFBQVEsR0FBSSxnQkFBZ0IsQ0FBQyxRQUFtQixJQUFJLEtBQUssQ0FBQztZQUNoRSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUNiLG1EQUFtRDtvQkFDakQsUUFBUTtvQkFDUix3QkFBd0I7b0JBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3ZCLENBQUM7YUFDSDtZQUNELE9BQU8sZ0JBQWdCLENBQUMsUUFBa0IsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsZ0JBQXdCO1FBQ2pELElBQUksQ0FBQyxDQUFDLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztTQUNuRTtRQUVELElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztTQUMxRTtRQUVELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQWtCLENBQUM7UUFFckQsSUFDRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVM7WUFDMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUN6QztZQUNBLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQzlELFFBQVEsQ0FDVCxDQUFDO1NBQ0g7UUFFRCxJQUFJLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRTtZQUN2QyxJQUNFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQ3BDLGdCQUFnQixDQUFDLGVBQWUsQ0FBVyxDQUM1QyxFQUNEO2dCQUNBLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkRBQ0UsZ0JBQWdCLENBQUMsZUFBZSxDQUNsQyx5QkFBeUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDbkUsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGdCQUF3QjtRQUM3QyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksZ0JBQWdCLENBQUMsRUFBRTtZQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDbkU7YUFBTTtZQUNMLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUUvRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQWtCLENBQUMsRUFBRTtnQkFDckUsTUFBTSxJQUFJLEtBQUssQ0FDYixtREFBbUQ7b0JBQ2pELGdCQUFnQixDQUFDLFFBQVE7b0JBQ3pCLHdCQUF3QjtvQkFDeEIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNoQyxDQUFDO2FBQ0g7U0FDRjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsUUFBZ0I7UUFDM0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUMvQixxRUFBcUUsUUFBUSxFQUFFLENBQ2hGLENBQUM7UUFFRixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVELEtBQUssQ0FBQyxzQkFBc0I7UUFDMUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUMvQiwwREFBMEQsQ0FDM0QsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBNkI7UUFDM0MsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7U0FDekU7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBNEIsQ0FBQztRQUNuRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRTtZQUMxQiw2QkFBNkI7WUFDN0IsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDdEI7U0FDRjtRQUNELFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFLLENBQUMsSUFBSSxDQUMvQixzREFBc0QsSUFBSSxDQUFDLE9BQU8sYUFBYSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUNwSCxRQUFRLENBQ1QsQ0FBQztRQUNGLGVBQWU7UUFDZiwwSEFBMEg7UUFDMUgsbUNBQW1DO1FBQ25DLGFBQWE7UUFDYixLQUFLO1FBRUwsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRVMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFlBQW9CO1FBQ3RELElBQUksU0FBUyxJQUFJLFlBQVksRUFBRTtZQUM3QixJQUFJLENBQUMsT0FBTyxHQUFJLFlBQVksQ0FBQyxPQUFtQixJQUFJLEtBQUssQ0FBQztZQUMxRCxZQUFZLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztTQUNsQztRQUNELDBDQUEwQztRQUMxQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxpREFBaUQ7UUFDakQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsMENBQTBDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTFDLElBQUksbUJBQW1CLElBQUksWUFBWSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQVcsQ0FBQztTQUNyRTtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFcEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQWxKRCw0REFrSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuXG5pbXBvcnQge0lPdXRwdXRNb2RlbEludGVyZmFjZX0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0NPTkZJR30gZnJvbSAnLi4vLi4vY29uZmlnJztcblxuaW1wb3J0IHtCb2F2aXp0YUluc3RhbmNlVHlwZXMsIElCb2F2aXp0YVVzYWdlU0NJfSBmcm9tICcuLi8uLi90eXBlcy9ib2F2aXp0YSc7XG5pbXBvcnQge0tleVZhbHVlUGFpcn0gZnJvbSAnLi4vLi4vdHlwZXMvY29tbW9uJztcblxuY29uc3Qge01PREVMX0lEU30gPSBDT05GSUc7XG5jb25zdCB7Qk9BVklaVEFfQ1BVLCBCT0FWSVpUQV9DTE9VRH0gPSBNT0RFTF9JRFM7XG5cbmFic3RyYWN0IGNsYXNzIEJvYXZpenRhT3V0cHV0TW9kZWwgaW1wbGVtZW50cyBJT3V0cHV0TW9kZWxJbnRlcmZhY2Uge1xuICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNoYXJlZFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBtZXRyaWNUeXBlOiAnY3B1LXV0aWwnIHwgJ2dwdS11dGlsJyB8ICdyYW0tdXRpbCcgPSAnY3B1LXV0aWwnO1xuICBleHBlY3RlZExpZmVzcGFuID0gNCAqIDM2NSAqIDI0ICogNjAgKiA2MDtcbiAgcHJvdGVjdGVkIGF1dGhDcmVkZW50aWFsczogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpIHtcbiAgICB0aGlzLmF1dGhDcmVkZW50aWFscyA9IGF1dGhQYXJhbXM7XG4gIH1cblxuICBhc3luYyBjb25maWd1cmUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YXRpY1BhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG4gICk6IFByb21pc2U8SU91dHB1dE1vZGVsSW50ZXJmYWNlPiB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnNoYXJlZFBhcmFtcyA9IGF3YWl0IHRoaXMuY2FwdHVyZVN0YXRpY1BhcmFtcyhzdGF0aWNQYXJhbXMgPz8ge30pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy9kZWZpbmVzIHRoZSBtb2RlbCBpZGVudGlmaWVyXG4gIGFic3RyYWN0IG1vZGVsSWRlbnRpZmllcigpOiBzdHJpbmc7XG5cbiAgLy9mZXRjaGVzIGRhdGEgZnJvbSBCb2F2aXp0YSBBUEkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpYyBlbmRwb2ludCBvZiB0aGUgbW9kZWxcbiAgYWJzdHJhY3QgZmV0Y2hEYXRhKHVzYWdlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxvYmplY3Q+O1xuXG4gIC8vIGxpc3Qgb2Ygc3VwcG9ydGVkIGxvY2F0aW9ucyBieSB0aGUgbW9kZWxcbiAgYXN5bmMgc3VwcG9ydGVkTG9jYXRpb25zKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBjb3VudHJpZXMgPSBhd2FpdCBheGlvcy5nZXQoXG4gICAgICAnaHR0cHM6Ly9hcGkuYm9hdml6dGEub3JnL3YxL3V0aWxzL2NvdW50cnlfY29kZSdcbiAgICApO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGNvdW50cmllcy5kYXRhKTtcbiAgfVxuXG4gIC8vIGNvbnZlcnRzIHRoZSB1c2FnZSBmcm9tIElNUEwgaW5wdXQgdG8gdGhlIGZvcm1hdCByZXF1aXJlZCBieSBCb2F2aXp0YSBBUEkuXG4gIHRyYW5zZm9ybVRvQm9hdml6dGFVc2FnZShkdXJhdGlvbjogbnVtYmVyLCBtZXRyaWM6IG51bWJlcikge1xuICAgIC8vIGR1cmF0aW9uIGlzIGluIHNlY29uZHMsIGNvbnZlcnQgdG8gaG91cnNcbiAgICAvLyBtZXRyaWMgaXMgYmV0d2VlbiAwIGFuZCAxLCBjb252ZXJ0IHRvIHBlcmNlbnRhZ2VcbiAgICBsZXQgdXNhZ2VJbnB1dDogS2V5VmFsdWVQYWlyID0ge1xuICAgICAgaG91cnNfdXNlX3RpbWU6IGR1cmF0aW9uIC8gMzYwMC4wLFxuICAgICAgdGltZV93b3JrbG9hZDogbWV0cmljLFxuICAgIH07XG4gICAgLy8gY29udmVydCBleHBlY3RlZCBsaWZlc3BhbiBmcm9tIHNlY29uZHMgdG8geWVhcnNcbiAgICB1c2FnZUlucHV0Wyd5ZWFyc19saWZlX3RpbWUnXSA9XG4gICAgICB0aGlzLmV4cGVjdGVkTGlmZXNwYW4gLyAoMzY1LjAgKiAyNC4wICogNjAuMCAqIDYwLjApO1xuICAgIHVzYWdlSW5wdXQgPSB0aGlzLmFkZExvY2F0aW9uVG9Vc2FnZSh1c2FnZUlucHV0KTtcblxuICAgIHJldHVybiB1c2FnZUlucHV0O1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlcyB0aGUgb3V0cHV0IG9mIHRoZSBnaXZlbiB1c2FnZVxuICBhc3luYyBleGVjdXRlKFxuICAgIGlucHV0czogb2JqZWN0IHwgb2JqZWN0W10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHM6IEtleVZhbHVlUGFpcltdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IHVzYWdlUmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxjdWxhdGVVc2FnZUZvcmlucHV0KGlucHV0KTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHVzYWdlUmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1BhcmFtZXRlciBOb3QgR2l2ZW46IGludmFsaWQgaW5wdXRzIHBhcmFtZXRlci4gRXhwZWN0aW5nIGFuIGFycmF5IG9mIGlucHV0cydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkcyBsb2NhdGlvbiB0byB1c2FnZSBpZiBsb2NhdGlvbiBpcyBkZWZpbmVkIGluIHNoYXJlZFBhcmFtc1xuICBhZGRMb2NhdGlvblRvVXNhZ2UodXNhZ2VSYXc6IEtleVZhbHVlUGFpcikge1xuICAgIGlmICh0aGlzLnNoYXJlZFBhcmFtcyAhPT0gdW5kZWZpbmVkICYmICdsb2NhdGlvbicgaW4gdGhpcy5zaGFyZWRQYXJhbXMpIHtcbiAgICAgIHVzYWdlUmF3Wyd1c2FnZV9sb2NhdGlvbiddID0gdGhpcy5zaGFyZWRQYXJhbXNbJ2xvY2F0aW9uJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzYWdlUmF3O1xuICB9XG5cbiAgLy9hYnN0cmFjdCBzdWJzIHRvIG1ha2UgY29tcGF0aWJpbGl0eSB3aXRoIGJhc2UgaW50ZXJmYWNlLiBhbGxvd3MgY29uZmlndXJlIHRvIGJlIGRlZmluZWQgaW4gYmFzZSBjbGFzc1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2FwdHVyZVN0YXRpY1BhcmFtcyhzdGF0aWNQYXJhbXM6IG9iamVjdCk6IG9iamVjdDtcblxuICAvLyBleHRyYWN0cyBpbmZvcm1hdGlvbiBmcm9tIEJvYXZpenRhIEFQSSByZXNwb25zZSB0byByZXR1cm4gdGhlIG91dHB1dCBpbiB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5IElNUExcbiAgcHJvdGVjdGVkIGZvcm1hdFJlc3BvbnNlKGRhdGE6IEtleVZhbHVlUGFpcik6IEtleVZhbHVlUGFpciB7XG4gICAgbGV0IG0gPSAwO1xuICAgIGxldCBlID0gMDtcbiAgICBpZiAoJ291dHB1dHMnIGluIGRhdGEpIHtcbiAgICAgIC8vIGVtYm9kaWVkLWNhcmJvbiBvdXRwdXQgaXMgaW4ga2dDTzJlcSwgY29udmVydCB0byBnQ08yZXFcbiAgICAgIG0gPSBkYXRhWydvdXRwdXRzJ11bJ2d3cCddWydlbWJlZGRlZCddWyd2YWx1ZSddICogMTAwMDtcbiAgICAgIC8vIHVzZSBvdXRwdXQgaXMgaW4gSiAsIGNvbnZlcnQgdG8ga1doLlxuICAgICAgLy8gMSwwMDAsMDAwIEogLyAzNjAwID0gMjc3Ljc3Nzc3Nzc3Nzc3NzggV2guXG4gICAgICAvLyAxIE1KIC8gMy42ID0gMC4yNzgga1doXG4gICAgICBlID0gZGF0YVsnb3V0cHV0cyddWydwZSddWyd1c2UnXVsndmFsdWUnXSAvIDMuNjtcbiAgICB9IGVsc2UgaWYgKCdnd3AnIGluIGRhdGEgJiYgJ3BlJyBpbiBkYXRhKSB7XG4gICAgICAvLyBlbWJvZGllZC1jYXJib24gb3V0cHV0IGlzIGluIGtnQ08yZXEsIGNvbnZlcnQgdG8gZ0NPMmVxXG4gICAgICBtID0gZGF0YVsnZ3dwJ11bJ2VtYm9kaWVkLWNhcmJvbiddICogMTAwMDtcbiAgICAgIC8vIHVzZSBvdXRwdXQgaXMgaW4gSiAsIGNvbnZlcnQgdG8ga1doLlxuICAgICAgLy8gMSwwMDAsMDAwIEogLyAzNjAwID0gMjc3Ljc3Nzc3Nzc3Nzc3NzggV2guXG4gICAgICAvLyAxIE1KIC8gMy42ID0gMC4yNzgga1doXG4gICAgICBlID0gZGF0YVsncGUnXVsndXNlJ10gLyAzLjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsnZW1ib2RpZWQtY2FyYm9uJzogbSwgZW5lcmd5OiBlfTtcbiAgfVxuXG4gIC8vIGNvbnZlcnRzIHRoZSB1c2FnZSB0byB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5IEJvYXZpenRhIEFQSS5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhbGN1bGF0ZVVzYWdlRm9yaW5wdXQoXG4gICAgaW5wdXQ6IEtleVZhbHVlUGFpclxuICApOiBQcm9taXNlPEtleVZhbHVlUGFpcj4ge1xuICAgIGlmIChcbiAgICAgICd0aW1lc3RhbXAnIGluIGlucHV0ICYmXG4gICAgICAnZHVyYXRpb24nIGluIGlucHV0ICYmXG4gICAgICB0aGlzLm1ldHJpY1R5cGUgaW4gaW5wdXRcbiAgICApIHtcbiAgICAgIGNvbnN0IHVzYWdlSW5wdXQgPSB0aGlzLnRyYW5zZm9ybVRvQm9hdml6dGFVc2FnZShcbiAgICAgICAgaW5wdXRbJ2R1cmF0aW9uJ10sXG4gICAgICAgIGlucHV0W3RoaXMubWV0cmljVHlwZV1cbiAgICAgICk7XG4gICAgICBjb25zdCB1c2FnZSA9IChhd2FpdCB0aGlzLmZldGNoRGF0YSh1c2FnZUlucHV0KSkgYXMgSUJvYXZpenRhVXNhZ2VTQ0k7XG5cbiAgICAgIHJldHVybiB1c2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElucHV0OiBJbnZhbGlkIGlucHV0cyBwYXJhbWV0ZXInKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJvYXZpenRhQ3B1T3V0cHV0TW9kZWxcbiAgZXh0ZW5kcyBCb2F2aXp0YU91dHB1dE1vZGVsXG4gIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlXG57XG4gIHNoYXJlZFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgdmVyYm9zZSA9IGZhbHNlO1xuICBwdWJsaWMgYWxsb2NhdGlvbiA9ICdMSU5FQVInO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudFR5cGUgPSAnY3B1JztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWV0cmljVHlwZSA9ICdjcHUtdXRpbCc7XG4gICAgdGhpcy5jb21wb25lbnRUeXBlID0gJ2NwdSc7XG4gIH1cblxuICBtb2RlbElkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQk9BVklaVEFfQ1BVO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKHVzYWdlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBpZiAodGhpcy5zaGFyZWRQYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUNhc3QgPSB0aGlzLnNoYXJlZFBhcmFtcyBhcyBLZXlWYWx1ZVBhaXI7XG4gICAgZGF0YUNhc3RbJ3VzYWdlJ10gPSB1c2FnZURhdGE7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICBgaHR0cHM6Ly9hcGkuYm9hdml6dGEub3JnL3YxL2NvbXBvbmVudC8ke3RoaXMuY29tcG9uZW50VHlwZX0/dmVyYm9zZT0ke3RoaXMudmVyYm9zZX0mZHVyYXRpb249JHtkYXRhQ2FzdFsndXNhZ2UnXVsnaG91cnNfdXNlX3RpbWUnXX1gLFxuICAgICAgZGF0YUNhc3RcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mb3JtYXRSZXNwb25zZShyZXNwb25zZS5kYXRhKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgJ2hpdHRpbmcgJyxcbiAgICAvLyAgIGBodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY29tcG9uZW50LyR7dGhpcy5jb21wb25lbnRUeXBlfT92ZXJib3NlPSR7dGhpcy52ZXJib3NlfSZkdXJhdGlvbj0ke2RhdGFDYXN0Wyd1c2FnZSddWydob3Vyc191c2VfdGltZSddfWAsXG4gICAgLy8gICBkYXRhQ2FzdCxcbiAgICAvLyAgIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLmRhdGEpXG4gICAgLy8gKTtcbiAgICByZXR1cm4ge1xuICAgICAgJ2UtY3B1JzogcmVzdWx0LmVuZXJneSxcbiAgICAgICdlbWJvZGllZC1jYXJib24nOiByZXN1bHRbJ2VtYm9kaWVkLWNhcmJvbiddLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FwdHVyZVN0YXRpY1BhcmFtcyhzdGF0aWNQYXJhbXM6IG9iamVjdCk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgaWYgKCd2ZXJib3NlJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMudmVyYm9zZSA9IChzdGF0aWNQYXJhbXMudmVyYm9zZSBhcyBib29sZWFuKSA/PyBmYWxzZTtcbiAgICAgIHN0YXRpY1BhcmFtcy52ZXJib3NlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghKCdwaHlzaWNhbC1wcm9jZXNzb3InIGluIHN0YXRpY1BhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW1wcm9wZXIgY29uZmlndXJlOiBNaXNzaW5nIHByb2Nlc3NvciBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoISgnY29yZS11bml0cycgaW4gc3RhdGljUGFyYW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29yZS11bml0cyBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoJ2V4cGVjdGVkLWxpZmVzcGFuJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMuZXhwZWN0ZWRMaWZlc3BhbiA9IHN0YXRpY1BhcmFtc1snZXhwZWN0ZWQtbGlmZXNwYW4nXSBhcyBudW1iZXI7XG4gICAgfVxuICAgIHRoaXMuc2hhcmVkUGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGljUGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLnNoYXJlZFBhcmFtcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsXG4gIGV4dGVuZHMgQm9hdml6dGFPdXRwdXRNb2RlbFxuICBpbXBsZW1lbnRzIElPdXRwdXRNb2RlbEludGVyZmFjZVxue1xuICBwdWJsaWMgc2hhcmVkUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBpbnN0YW5jZVR5cGVzOiBCb2F2aXp0YUluc3RhbmNlVHlwZXMgPSB7fTtcbiAgcHVibGljIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHZlcmJvc2UgPSBmYWxzZTtcbiAgcHVibGljIGFsbG9jYXRpb24gPSAnTElORUFSJztcblxuICBtb2RlbElkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQk9BVklaVEFfQ0xPVUQ7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUxvY2F0aW9uKHN0YXRpY1BhcmFtc0Nhc3Q6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nIHwgdm9pZD4ge1xuICAgIGlmICgnbG9jYXRpb24nIGluIHN0YXRpY1BhcmFtc0Nhc3QpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gKHN0YXRpY1BhcmFtc0Nhc3QubG9jYXRpb24gYXMgc3RyaW5nKSA/PyAnVVNBJztcbiAgICAgIGNvbnN0IGNvdW50cmllcyA9IGF3YWl0IHRoaXMuc3VwcG9ydGVkTG9jYXRpb25zKCk7XG4gICAgICBpZiAoIWNvdW50cmllcy5pbmNsdWRlcyhsb2NhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiSW1wcm9wZXIgY29uZmlndXJlOiBJbnZhbGlkIGxvY2F0aW9uIHBhcmFtZXRlcjogJ1wiICtcbiAgICAgICAgICAgIGxvY2F0aW9uICtcbiAgICAgICAgICAgIFwiJy4gVmFsaWQgdmFsdWVzIGFyZSA6IFwiICtcbiAgICAgICAgICAgIGNvdW50cmllcy5qb2luKCcsICcpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGljUGFyYW1zQ2FzdC5sb2NhdGlvbiBhcyBzdHJpbmc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVJbnN0YW5jZVR5cGUoc3RhdGljUGFyYW1zQ2FzdDogb2JqZWN0KSB7XG4gICAgaWYgKCEoJ3Byb3ZpZGVyJyBpbiBzdGF0aWNQYXJhbXNDYXN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgcHJvdmlkZXIgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCEoJ2luc3RhbmNlLXR5cGUnIGluIHN0YXRpY1BhcmFtc0Nhc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgJ2luc3RhbmNlLXR5cGUnIHBhcmFtZXRlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm92aWRlciA9IHN0YXRpY1BhcmFtc0Nhc3QucHJvdmlkZXIgYXMgc3RyaW5nO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pbnN0YW5jZVR5cGVzW3Byb3ZpZGVyXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmluc3RhbmNlVHlwZXNbcHJvdmlkZXJdLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgdGhpcy5pbnN0YW5jZVR5cGVzW3Byb3ZpZGVyXSA9IGF3YWl0IHRoaXMuc3VwcG9ydGVkSW5zdGFuY2VzTGlzdChcbiAgICAgICAgcHJvdmlkZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCdpbnN0YW5jZS10eXBlJyBpbiBzdGF0aWNQYXJhbXNDYXN0KSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmluc3RhbmNlVHlwZXNbcHJvdmlkZXJdLmluY2x1ZGVzKFxuICAgICAgICAgIHN0YXRpY1BhcmFtc0Nhc3RbJ2luc3RhbmNlLXR5cGUnXSBhcyBzdHJpbmdcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW1wcm9wZXIgY29uZmlndXJlOiBJbnZhbGlkICdpbnN0YW5jZS10eXBlJyBwYXJhbWV0ZXI6ICcke1xuICAgICAgICAgICAgc3RhdGljUGFyYW1zQ2FzdFsnaW5zdGFuY2UtdHlwZSddXG4gICAgICAgICAgfScuIFZhbGlkIHZhbHVlcyBhcmUgOiAke3RoaXMuaW5zdGFuY2VUeXBlc1twcm92aWRlcl0uam9pbignLCAnKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVQcm92aWRlcihzdGF0aWNQYXJhbXNDYXN0OiBvYmplY3QpIHtcbiAgICBpZiAoISgncHJvdmlkZXInIGluIHN0YXRpY1BhcmFtc0Nhc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcHJvcGVyIGNvbmZpZ3VyZTogTWlzc2luZyBwcm92aWRlciBwYXJhbWV0ZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3VwcG9ydGVkUHJvdmlkZXJzID0gYXdhaXQgdGhpcy5zdXBwb3J0ZWRQcm92aWRlcnNMaXN0KCk7XG5cbiAgICAgIGlmICghc3VwcG9ydGVkUHJvdmlkZXJzLmluY2x1ZGVzKHN0YXRpY1BhcmFtc0Nhc3QucHJvdmlkZXIgYXMgc3RyaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJJbXByb3BlciBjb25maWd1cmU6IEludmFsaWQgcHJvdmlkZXIgcGFyYW1ldGVyOiAnXCIgK1xuICAgICAgICAgICAgc3RhdGljUGFyYW1zQ2FzdC5wcm92aWRlciArXG4gICAgICAgICAgICBcIicuIFZhbGlkIHZhbHVlcyBhcmUgOiBcIiArXG4gICAgICAgICAgICBzdXBwb3J0ZWRQcm92aWRlcnMuam9pbignLCAnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN1cHBvcnRlZEluc3RhbmNlc0xpc3QocHJvdmlkZXI6IHN0cmluZykge1xuICAgIGNvbnN0IGluc3RhbmNlcyA9IGF3YWl0IGF4aW9zLmdldChcbiAgICAgIGBodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2UvYWxsX2luc3RhbmNlcz9wcm92aWRlcj0ke3Byb3ZpZGVyfWBcbiAgICApO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlcy5kYXRhO1xuICB9XG5cbiAgYXN5bmMgc3VwcG9ydGVkUHJvdmlkZXJzTGlzdCgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgYXhpb3MuZ2V0KFxuICAgICAgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jbG91ZC9pbnN0YW5jZS9hbGxfcHJvdmlkZXJzJ1xuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhwcm92aWRlcnMuZGF0YSk7XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEodXNhZ2VEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGlmICh0aGlzLnNoYXJlZFBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcHJvcGVyIGNvbmZpZ3VyZTogTWlzc2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhQ2FzdCA9IHRoaXMuc2hhcmVkUGFyYW1zIGFzIEtleVZhbHVlUGFpcjtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhQ2FzdCkge1xuICAgICAgLy8gICByZXBsYWNlIC0gd2l0aCBfIGluIGtleXNcbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICBjb25zdCBuZXdLZXkgPSBrZXkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgICAgICBkYXRhQ2FzdFtuZXdLZXldID0gZGF0YUNhc3Rba2V5XTtcbiAgICAgICAgZGVsZXRlIGRhdGFDYXN0W2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIGRhdGFDYXN0Wyd1c2FnZSddID0gdXNhZ2VEYXRhO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICAgIGBodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2U/dmVyYm9zZT0ke3RoaXMudmVyYm9zZX0mZHVyYXRpb249JHtkYXRhQ2FzdFsndXNhZ2UnXVsnaG91cnNfdXNlX3RpbWUnXX1gLFxuICAgICAgZGF0YUNhc3RcbiAgICApO1xuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgYGh0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jbG91ZC9pbnN0YW5jZT92ZXJib3NlPSR7dGhpcy52ZXJib3NlfSZkdXJhdGlvbj0ke2RhdGFDYXN0Wyd1c2FnZSddWydob3Vyc191c2VfdGltZSddfWAsXG4gICAgLy8gICBKU09OLnN0cmluZ2lmeShyZXNwb25zZS5kYXRhKSxcbiAgICAvLyAgIGRhdGFDYXN0XG4gICAgLy8gKTtcblxuICAgIHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlKHJlc3BvbnNlLmRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhcHR1cmVTdGF0aWNQYXJhbXMoc3RhdGljUGFyYW1zOiBvYmplY3QpIHtcbiAgICBpZiAoJ3ZlcmJvc2UnIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy52ZXJib3NlID0gKHN0YXRpY1BhcmFtcy52ZXJib3NlIGFzIGJvb2xlYW4pID8/IGZhbHNlO1xuICAgICAgc3RhdGljUGFyYW1zLnZlcmJvc2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIGlmIG5vIHZhbGlkIHByb3ZpZGVyIGZvdW5kLCB0aHJvdyBlcnJvclxuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVQcm92aWRlcihzdGF0aWNQYXJhbXMpO1xuICAgIC8vIGlmIG5vIHZhbGlkICdpbnN0YW5jZS10eXBlJyBmb3VuZCwgdGhyb3cgZXJyb3JcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlSW5zdGFuY2VUeXBlKHN0YXRpY1BhcmFtcyk7XG4gICAgLy8gaWYgbm8gdmFsaWQgbG9jYXRpb24gZm91bmQsIHRocm93IGVycm9yXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHN0YXRpY1BhcmFtcyk7XG5cbiAgICBpZiAoJ2V4cGVjdGVkLWxpZmVzcGFuJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMuZXhwZWN0ZWRMaWZlc3BhbiA9IHN0YXRpY1BhcmFtc1snZXhwZWN0ZWQtbGlmZXNwYW4nXSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRQYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0aWNQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkUGFyYW1zO1xuICB9XG59XG5cbi8qKlxuICogRm9yIEpTSUkuXG4gKi9cbmV4cG9ydCB7SU91dHB1dE1vZGVsSW50ZXJmYWNlfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmV4cG9ydCB7Qm9hdml6dGFJbnN0YW5jZVR5cGVzLCBJQm9hdml6dGFVc2FnZVNDSX0gZnJvbSAnLi4vLi4vdHlwZXMvYm9hdml6dGEnO1xuZXhwb3J0IHtLZXlWYWx1ZVBhaXJ9IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1vbic7XG4iXX0=
@@ -0,0 +1,29 @@
1
+ import { IOutputModelInterface } from '../interfaces';
2
+ export declare class EAvevaModel implements IOutputModelInterface {
3
+ authParams: object | undefined;
4
+ name: string | undefined;
5
+ staticParams: object | undefined;
6
+ /**
7
+ * Defined for compatibility. Not used here.
8
+ */
9
+ authenticate(authParams: object): void;
10
+ /**
11
+ * Configures the Aveva Plugin for IEF
12
+ * @param {string} name name of the resource
13
+ * @param {Object} staticParams static parameters for the resource
14
+ */
15
+ configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
16
+ /**
17
+ * Calculate the total emissions for a list of inputs.
18
+ * Each input require:
19
+ * @param {Object[]} inputs
20
+ * @param {number} inputs[].time time to normalize to in hours
21
+ * @param {number} inputs[].pb baseline power
22
+ * @param {number} inputs[].pl measured power
23
+ */
24
+ execute(inputs: object | object[] | undefined): Promise<any[]>;
25
+ /**
26
+ * Returns model identifier
27
+ */
28
+ modelIdentifier(): string;
29
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EAvevaModel = void 0;
4
+ const config_1 = require("../../config");
5
+ const { MODEL_IDS } = config_1.CONFIG;
6
+ const { AVEVA } = MODEL_IDS;
7
+ class EAvevaModel {
8
+ /**
9
+ * Defined for compatibility. Not used here.
10
+ */
11
+ authenticate(authParams) {
12
+ this.authParams = authParams;
13
+ }
14
+ /**
15
+ * Configures the Aveva Plugin for IEF
16
+ * @param {string} name name of the resource
17
+ * @param {Object} staticParams static parameters for the resource
18
+ */
19
+ async configure(name, staticParams = undefined) {
20
+ this.name = name;
21
+ this.staticParams = staticParams;
22
+ return this;
23
+ }
24
+ /**
25
+ * Calculate the total emissions for a list of inputs.
26
+ * Each input require:
27
+ * @param {Object[]} inputs
28
+ * @param {number} inputs[].time time to normalize to in hours
29
+ * @param {number} inputs[].pb baseline power
30
+ * @param {number} inputs[].pl measured power
31
+ */
32
+ async execute(inputs) {
33
+ if (inputs === undefined) {
34
+ throw new Error('Required Parameters not provided');
35
+ }
36
+ else if (!Array.isArray(inputs)) {
37
+ throw new Error('inputs must be an array');
38
+ }
39
+ return inputs.map(input => {
40
+ input['energy-cpu'] =
41
+ ((input['pl'] - input['pb']) * input['time']) / 1000;
42
+ return input;
43
+ });
44
+ }
45
+ /**
46
+ * Returns model identifier
47
+ */
48
+ modelIdentifier() {
49
+ return AVEVA;
50
+ }
51
+ }
52
+ exports.EAvevaModel = EAvevaModel;
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZldmEtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2Nhc2Utc3R1ZGllcy9hdmV2YS1tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx5Q0FBb0M7QUFFcEMsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUMzQixNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsU0FBUyxDQUFDO0FBRTFCLE1BQWEsV0FBVztJQUt0Qjs7T0FFRztJQUNILFlBQVksQ0FBQyxVQUFrQjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBcUM7UUFDakQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUNqQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUV2RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBeERELGtDQXdEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SU91dHB1dE1vZGVsSW50ZXJmYWNlfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuaW1wb3J0IHtDT05GSUd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5cbmNvbnN0IHtNT0RFTF9JRFN9ID0gQ09ORklHO1xuY29uc3Qge0FWRVZBfSA9IE1PREVMX0lEUztcblxuZXhwb3J0IGNsYXNzIEVBdmV2YU1vZGVsIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlIHtcbiAgYXV0aFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkOyAvLyBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiBBdmV2YS5cbiAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkOyAvLyBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZVxuICBzdGF0aWNQYXJhbXM6IG9iamVjdCB8IHVuZGVmaW5lZDsgLy8gRGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4gTm90IHVzZWQgaW4gQXZldmEuXG5cbiAgLyoqXG4gICAqIERlZmluZWQgZm9yIGNvbXBhdGliaWxpdHkuIE5vdCB1c2VkIGhlcmUuXG4gICAqL1xuICBhdXRoZW50aWNhdGUoYXV0aFBhcmFtczogb2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5hdXRoUGFyYW1zID0gYXV0aFBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIHRoZSBBdmV2YSBQbHVnaW4gZm9yIElFRlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGljUGFyYW1zIHN0YXRpYyBwYXJhbWV0ZXJzIGZvciB0aGUgcmVzb3VyY2VcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhdGljUGFyYW1zID0gc3RhdGljUGFyYW1zO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBlbWlzc2lvbnMgZm9yIGEgbGlzdCBvZiBpbnB1dHMuXG4gICAqIEVhY2ggaW5wdXQgcmVxdWlyZTpcbiAgICogQHBhcmFtIHtPYmplY3RbXX0gaW5wdXRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dHNbXS50aW1lIHRpbWUgdG8gbm9ybWFsaXplIHRvIGluIGhvdXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dHNbXS5wYiBiYXNlbGluZSBwb3dlclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5wdXRzW10ucGwgbWVhc3VyZWQgcG93ZXJcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXRzOiBvYmplY3QgfCBvYmplY3RbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoaW5wdXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgUGFyYW1ldGVycyBub3QgcHJvdmlkZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgICBpbnB1dFsnZW5lcmd5LWNwdSddID1cbiAgICAgICAgKChpbnB1dFsncGwnXSAtIGlucHV0WydwYiddKSAqIGlucHV0Wyd0aW1lJ10pIC8gMTAwMDtcblxuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbW9kZWwgaWRlbnRpZmllclxuICAgKi9cbiAgbW9kZWxJZGVudGlmaWVyKCkge1xuICAgIHJldHVybiBBVkVWQTtcbiAgfVxufVxuIl19
@@ -0,0 +1,42 @@
1
+ import { IOutputModelInterface } from '../interfaces';
2
+ export declare class EMemModel implements IOutputModelInterface {
3
+ authParams: object | undefined;
4
+ name: string | undefined;
5
+ memoryAllocation: number;
6
+ memoryEnergy: number;
7
+ /**
8
+ * Defined for compatibility. Not used.
9
+ */
10
+ authenticate(authParams: object): void;
11
+ /**
12
+ * Configures the Plugin for IEF
13
+ * @param {string} name name of the resource
14
+ * @param {Object} staticParams static parameters for the resource
15
+ * @param {number} staticParams.thermal-design-power Thermal Design Power in Watts
16
+ * @param {Interpolation} staticParams.interpolation Interpolation method
17
+ */
18
+ configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
19
+ /**
20
+ * Calculate the total emissions for a list of inputs.
21
+ *
22
+ * Each input require:
23
+ * @param {Object[]} inputs
24
+ * @param {string} inputs[].timestamp RFC3339 timestamp string
25
+ * @param {number} inputs[].mem-util percentage mem usage
26
+ */
27
+ execute(inputs: object | object[] | undefined): Promise<any[]>;
28
+ /**
29
+ * Returns model identifier
30
+ */
31
+ modelIdentifier(): string;
32
+ /**
33
+ * Calculates the energy consumption for a single input
34
+ * requires
35
+ *
36
+ * mem-util: ram usage in percentage
37
+ * timestamp: RFC3339 timestamp string
38
+ *
39
+ * multiplies memory used (GB) by a coefficient (wh/GB) and converts to kwh
40
+ */
41
+ private calculateEnergy;
42
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EMemModel = void 0;
4
+ const config_1 = require("../../config");
5
+ const { MODEL_IDS } = config_1.CONFIG;
6
+ const { EMEM } = MODEL_IDS;
7
+ class EMemModel {
8
+ constructor() {
9
+ this.memoryAllocation = 0;
10
+ this.memoryEnergy = 0;
11
+ }
12
+ /**
13
+ * Defined for compatibility. Not used.
14
+ */
15
+ authenticate(authParams) {
16
+ this.authParams = authParams;
17
+ }
18
+ /**
19
+ * Configures the Plugin for IEF
20
+ * @param {string} name name of the resource
21
+ * @param {Object} staticParams static parameters for the resource
22
+ * @param {number} staticParams.thermal-design-power Thermal Design Power in Watts
23
+ * @param {Interpolation} staticParams.interpolation Interpolation method
24
+ */
25
+ async configure(name, staticParams = undefined) {
26
+ this.name = name;
27
+ if (staticParams === undefined) {
28
+ throw new Error('Required Parameters not provided');
29
+ }
30
+ if ('mem-alloc' in staticParams) {
31
+ this.memoryAllocation = staticParams['mem-alloc'];
32
+ }
33
+ if ('mem-energy' in staticParams) {
34
+ this.memoryEnergy = staticParams['mem-energy'];
35
+ }
36
+ return this;
37
+ }
38
+ /**
39
+ * Calculate the total emissions for a list of inputs.
40
+ *
41
+ * Each input require:
42
+ * @param {Object[]} inputs
43
+ * @param {string} inputs[].timestamp RFC3339 timestamp string
44
+ * @param {number} inputs[].mem-util percentage mem usage
45
+ */
46
+ async execute(inputs) {
47
+ if (inputs === undefined) {
48
+ throw new Error('Required Parameters not provided');
49
+ }
50
+ else if (!Array.isArray(inputs)) {
51
+ throw new Error('inputs must be an array');
52
+ }
53
+ return inputs.map((input) => {
54
+ this.configure(this.name, input);
55
+ input['energy-memory'] = this.calculateEnergy(input);
56
+ return input;
57
+ });
58
+ }
59
+ /**
60
+ * Returns model identifier
61
+ */
62
+ modelIdentifier() {
63
+ return EMEM;
64
+ }
65
+ /**
66
+ * Calculates the energy consumption for a single input
67
+ * requires
68
+ *
69
+ * mem-util: ram usage in percentage
70
+ * timestamp: RFC3339 timestamp string
71
+ *
72
+ * multiplies memory used (GB) by a coefficient (wh/GB) and converts to kwh
73
+ */
74
+ calculateEnergy(input) {
75
+ if (!('mem-util' in input) || !('timestamp' in input)) {
76
+ throw new Error('Required Parameters duration,cpu-util,timestamp not provided for input');
77
+ }
78
+ if (this.memoryAllocation === 0) {
79
+ throw new Error('Required Parameter: mem-alloc not provided in configure');
80
+ }
81
+ if (this.memoryEnergy === 0) {
82
+ throw new Error('Required Parameter: mem-energy not provided in configure');
83
+ }
84
+ const mem_alloc = this.memoryAllocation;
85
+ const mem_util = input['mem-util']; // convert cpu usage to percentage
86
+ if (mem_util < 0 || mem_util > 100) {
87
+ throw new Error('cpu usage must be between 0 and 100');
88
+ }
89
+ return (mem_alloc * (mem_util / 100) * this.memoryEnergy) / 1000;
90
+ }
91
+ }
92
+ exports.EMemModel = EMemModel;
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1lbS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY2FzZS1zdHVkaWVzL2VtZW0tbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEseUNBQW9DO0FBSXBDLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDM0IsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUV6QixNQUFhLFNBQVM7SUFBdEI7UUFHRSxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDckIsaUJBQVksR0FBRyxDQUFDLENBQUM7SUF3R25CLENBQUM7SUF0R0M7O09BRUc7SUFDSCxZQUFZLENBQUMsVUFBa0I7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBVyxDQUFDO1NBQzdEO1FBRUQsSUFBSSxZQUFZLElBQUksWUFBWSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBVyxDQUFDO1NBQzFEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBcUM7UUFDakQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFckQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGVBQWUsQ0FBQyxLQUFtQjtRQUN6QyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLHdFQUF3RSxDQUN6RSxDQUFDO1NBQ0g7UUFFRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDYix5REFBeUQsQ0FDMUQsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRTtZQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRCxDQUMzRCxDQUFDO1NBQ0g7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1FBRXRFLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxRQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztTQUN4RDtRQUVELE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNuRSxDQUFDO0NBQ0Y7QUE1R0QsOEJBNEdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJT3V0cHV0TW9kZWxJbnRlcmZhY2V9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQge0NPTkZJR30gZnJvbSAnLi4vLi4vY29uZmlnJztcblxuaW1wb3J0IHtLZXlWYWx1ZVBhaXJ9IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1vbic7XG5cbmNvbnN0IHtNT0RFTF9JRFN9ID0gQ09ORklHO1xuY29uc3Qge0VNRU19ID0gTU9ERUxfSURTO1xuXG5leHBvcnQgY2xhc3MgRU1lbU1vZGVsIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlIHtcbiAgYXV0aFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkOyAvLyBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiB0aGlzLlxuICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlXG4gIG1lbW9yeUFsbG9jYXRpb24gPSAwO1xuICBtZW1vcnlFbmVyZ3kgPSAwO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZC5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhQYXJhbXMgPSBhdXRoUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIFBsdWdpbiBmb3IgSUVGXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0aWNQYXJhbXMgc3RhdGljIHBhcmFtZXRlcnMgZm9yIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdGljUGFyYW1zLnRoZXJtYWwtZGVzaWduLXBvd2VyIFRoZXJtYWwgRGVzaWduIFBvd2VyIGluIFdhdHRzXG4gICAqIEBwYXJhbSB7SW50ZXJwb2xhdGlvbn0gc3RhdGljUGFyYW1zLmludGVycG9sYXRpb24gSW50ZXJwb2xhdGlvbiBtZXRob2RcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgaWYgKHN0YXRpY1BhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIFBhcmFtZXRlcnMgbm90IHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCdtZW0tYWxsb2MnIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy5tZW1vcnlBbGxvY2F0aW9uID0gc3RhdGljUGFyYW1zWydtZW0tYWxsb2MnXSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgaWYgKCdtZW0tZW5lcmd5JyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMubWVtb3J5RW5lcmd5ID0gc3RhdGljUGFyYW1zWydtZW0tZW5lcmd5J10gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgdG90YWwgZW1pc3Npb25zIGZvciBhIGxpc3Qgb2YgaW5wdXRzLlxuICAgKlxuICAgKiBFYWNoIGlucHV0IHJlcXVpcmU6XG4gICAqIEBwYXJhbSB7T2JqZWN0W119IGlucHV0c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRzW10udGltZXN0YW1wIFJGQzMzMzkgdGltZXN0YW1wIHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaW5wdXRzW10ubWVtLXV0aWwgcGVyY2VudGFnZSBtZW0gdXNhZ2VcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXRzOiBvYmplY3QgfCBvYmplY3RbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoaW5wdXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgUGFyYW1ldGVycyBub3QgcHJvdmlkZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQ6IEtleVZhbHVlUGFpcikgPT4ge1xuICAgICAgdGhpcy5jb25maWd1cmUodGhpcy5uYW1lISwgaW5wdXQpO1xuICAgICAgaW5wdXRbJ2VuZXJneS1tZW1vcnknXSA9IHRoaXMuY2FsY3VsYXRlRW5lcmd5KGlucHV0KTtcblxuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbW9kZWwgaWRlbnRpZmllclxuICAgKi9cbiAgbW9kZWxJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVNRU07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZW5lcmd5IGNvbnN1bXB0aW9uIGZvciBhIHNpbmdsZSBpbnB1dFxuICAgKiByZXF1aXJlc1xuICAgKlxuICAgKiBtZW0tdXRpbDogcmFtIHVzYWdlIGluIHBlcmNlbnRhZ2VcbiAgICogdGltZXN0YW1wOiBSRkMzMzM5IHRpbWVzdGFtcCBzdHJpbmdcbiAgICpcbiAgICogbXVsdGlwbGllcyBtZW1vcnkgdXNlZCAoR0IpIGJ5IGEgY29lZmZpY2llbnQgKHdoL0dCKSBhbmQgY29udmVydHMgdG8ga3doXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUVuZXJneShpbnB1dDogS2V5VmFsdWVQYWlyKSB7XG4gICAgaWYgKCEoJ21lbS11dGlsJyBpbiBpbnB1dCkgfHwgISgndGltZXN0YW1wJyBpbiBpbnB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVpcmVkIFBhcmFtZXRlcnMgZHVyYXRpb24sY3B1LXV0aWwsdGltZXN0YW1wIG5vdCBwcm92aWRlZCBmb3IgaW5wdXQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lbW9yeUFsbG9jYXRpb24gPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVpcmVkIFBhcmFtZXRlcjogbWVtLWFsbG9jIG5vdCBwcm92aWRlZCBpbiBjb25maWd1cmUnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lbW9yeUVuZXJneSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmVxdWlyZWQgUGFyYW1ldGVyOiBtZW0tZW5lcmd5IG5vdCBwcm92aWRlZCBpbiBjb25maWd1cmUnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbV9hbGxvYyA9IHRoaXMubWVtb3J5QWxsb2NhdGlvbjtcbiAgICBjb25zdCBtZW1fdXRpbCA9IGlucHV0WydtZW0tdXRpbCddOyAvLyBjb252ZXJ0IGNwdSB1c2FnZSB0byBwZXJjZW50YWdlXG5cbiAgICBpZiAobWVtX3V0aWwgPCAwIHx8IG1lbV91dGlsID4gMTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NwdSB1c2FnZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChtZW1fYWxsb2MgKiAobWVtX3V0aWwgLyAxMDApICogdGhpcy5tZW1vcnlFbmVyZ3kpIC8gMTAwMDtcbiAgfVxufVxuIl19
@@ -0,0 +1,24 @@
1
+ import { IOutputModelInterface } from '../interfaces';
2
+ export { KeyValuePair } from '../../types/common';
3
+ export declare class EshoppenModel implements IOutputModelInterface {
4
+ authParams: object | undefined;
5
+ modelType: 'energy-cpu' | 'energy-memory' | 'energy-network' | 'e-sum';
6
+ staticParams: object | undefined;
7
+ name: string | undefined;
8
+ authenticate(authParams: object): void;
9
+ execute(inputs: object | object[] | undefined): Promise<any[]>;
10
+ configure(name: string, staticParams: object | undefined): Promise<IOutputModelInterface>;
11
+ modelIdentifier(): string;
12
+ }
13
+ export declare class EshoppenCpuModel extends EshoppenModel {
14
+ constructor();
15
+ modelIdentifier(): string;
16
+ }
17
+ export declare class EshoppenMemModel extends EshoppenModel {
18
+ constructor();
19
+ modelIdentifier(): string;
20
+ }
21
+ export declare class EshoppenNetModel extends EshoppenModel {
22
+ constructor();
23
+ modelIdentifier(): string;
24
+ }