@grnsft/if 0.0.5 → 0.1.0

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 (146) hide show
  1. package/.examples/ompls/azure.yml +205 -0
  2. package/.github/workflows/nodejs-ci.yml +0 -8
  3. package/README.md +48 -9
  4. package/build/config/config.d.ts +0 -23
  5. package/build/config/config.js +1 -24
  6. package/build/index.js +3 -4
  7. package/build/lib/models-universe.js +95 -0
  8. package/build/lib/observatory.js +31 -0
  9. package/build/lib/supercomputer.js +109 -0
  10. package/examples/impls/test/azure.yml +8 -8
  11. package/examples/impls/test/ccf.yml +5 -3
  12. package/examples/impls/test/if-demo.yml +19 -9
  13. package/examples/impls/test/metadata.yml +3 -2
  14. package/examples/impls/test/nesting.yml +10 -13
  15. package/examples/impls/test/sci-e.yml +1 -1
  16. package/examples/impls/test/sci-m.yml +2 -2
  17. package/examples/impls/test/sci-o.yml +2 -4
  18. package/examples/impls/test/sci.yml +1 -2
  19. package/examples/impls/test/shell.yml +2 -1
  20. package/examples/impls/{tdp-finder-test.yml → test/tdp-finder.yml} +8 -8
  21. package/examples/ompls/ccf.yml +3 -1
  22. package/examples/ompls/if-demo.yml +46 -22
  23. package/package.json +12 -5
  24. package/tsconfig.build.json +7 -0
  25. package/tsconfig.build.tsbuildinfo +1 -0
  26. package/build/__mocks__/azure/index.d.ts +0 -11
  27. package/build/__mocks__/azure/index.js +0 -132
  28. package/build/__mocks__/boavizta/countries.json +0 -138
  29. package/build/__mocks__/boavizta/instance_types.json +0 -625
  30. package/build/__mocks__/boavizta/providers.json +0 -1
  31. package/build/__mocks__/fs/index.d.ts +0 -3
  32. package/build/__mocks__/fs/index.js +0 -56
  33. package/build/__mocks__/model-universe/index.d.ts +0 -31
  34. package/build/__mocks__/model-universe/index.js +0 -64
  35. package/build/__mocks__/watt-time/data.json +0 -119
  36. package/build/__tests__/integration/ompl/index.test.d.ts +0 -1
  37. package/build/__tests__/integration/ompl/index.test.js +0 -61
  38. package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +0 -1
  39. package/build/__tests__/unit/lib/azure-importer/index.test.js +0 -152
  40. package/build/__tests__/unit/lib/boavizta/index.test.d.ts +0 -1
  41. package/build/__tests__/unit/lib/boavizta/index.test.js +0 -579
  42. package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +0 -1
  43. package/build/__tests__/unit/lib/case-studies/aveva.test.js +0 -36
  44. package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +0 -1
  45. package/build/__tests__/unit/lib/case-studies/emem.test.js +0 -108
  46. package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +0 -1
  47. package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +0 -53
  48. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +0 -1
  49. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +0 -23
  50. package/build/__tests__/unit/lib/ccf/index.test.d.ts +0 -1
  51. package/build/__tests__/unit/lib/ccf/index.test.js +0 -223
  52. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +0 -1
  53. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +0 -73
  54. package/build/__tests__/unit/lib/sci/index.test.d.ts +0 -1
  55. package/build/__tests__/unit/lib/sci/index.test.js +0 -106
  56. package/build/__tests__/unit/lib/sci-e/index.test.d.ts +0 -1
  57. package/build/__tests__/unit/lib/sci-e/index.test.js +0 -30
  58. package/build/__tests__/unit/lib/sci-m/index.test.d.ts +0 -1
  59. package/build/__tests__/unit/lib/sci-m/index.test.js +0 -58
  60. package/build/__tests__/unit/lib/sci-o/index.test.d.ts +0 -1
  61. package/build/__tests__/unit/lib/sci-o/index.test.js +0 -42
  62. package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +0 -1
  63. package/build/__tests__/unit/lib/shell-imp/index.test.js +0 -21
  64. package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +0 -1
  65. package/build/__tests__/unit/lib/tdp-finder/index.test.js +0 -62
  66. package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +0 -1
  67. package/build/__tests__/unit/lib/teads-aws/index.test.js +0 -170
  68. package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +0 -1
  69. package/build/__tests__/unit/lib/teads-curve/index.test.js +0 -146
  70. package/build/__tests__/unit/lib/watt-time/index.test.d.ts +0 -1
  71. package/build/__tests__/unit/lib/watt-time/index.test.js +0 -106
  72. package/build/__tests__/unit/util/args.test.d.ts +0 -1
  73. package/build/__tests__/unit/util/args.test.js +0 -92
  74. package/build/__tests__/unit/util/models-universe.test.d.ts +0 -1
  75. package/build/__tests__/unit/util/models-universe.test.js +0 -193
  76. package/build/__tests__/unit/util/observatory.test.d.ts +0 -1
  77. package/build/__tests__/unit/util/observatory.test.js +0 -99
  78. package/build/__tests__/unit/util/supercomputer.test.d.ts +0 -1
  79. package/build/__tests__/unit/util/supercomputer.test.js +0 -231
  80. package/build/__tests__/unit/util/yaml.test.d.ts +0 -1
  81. package/build/__tests__/unit/util/yaml.test.js +0 -59
  82. package/build/lib/azure-importer/index.d.ts +0 -55
  83. package/build/lib/azure-importer/index.js +0 -314
  84. package/build/lib/boavizta/index.d.ts +0 -53
  85. package/build/lib/boavizta/index.js +0 -254
  86. package/build/lib/case-studies/aveva-model.d.ts +0 -29
  87. package/build/lib/case-studies/aveva-model.js +0 -53
  88. package/build/lib/case-studies/emem-model.d.ts +0 -42
  89. package/build/lib/case-studies/emem-model.js +0 -93
  90. package/build/lib/case-studies/eshoppen-model.d.ts +0 -24
  91. package/build/lib/case-studies/eshoppen-model.js +0 -123
  92. package/build/lib/case-studies/index.d.ts +0 -4
  93. package/build/lib/case-studies/index.js +0 -21
  94. package/build/lib/case-studies/sci-accenture-model.d.ts +0 -10
  95. package/build/lib/case-studies/sci-accenture-model.js +0 -37
  96. package/build/lib/ccf/aws-embodied.json +0 -5591
  97. package/build/lib/ccf/aws-instances.json +0 -21116
  98. package/build/lib/ccf/aws-use.json +0 -79
  99. package/build/lib/ccf/azure-embodied.json +0 -6547
  100. package/build/lib/ccf/azure-instances.json +0 -8332
  101. package/build/lib/ccf/azure-use.json +0 -58
  102. package/build/lib/ccf/gcp-embodied.json +0 -3049
  103. package/build/lib/ccf/gcp-instances.json +0 -3880
  104. package/build/lib/ccf/gcp-use.json +0 -58
  105. package/build/lib/ccf/index.d.ts +0 -63
  106. package/build/lib/ccf/index.js +0 -338
  107. package/build/lib/cloud-instance-metadata/aws-instances.json +0 -1
  108. package/build/lib/cloud-instance-metadata/azure-instances.json +0 -1
  109. package/build/lib/cloud-instance-metadata/index.d.ts +0 -15
  110. package/build/lib/cloud-instance-metadata/index.js +0 -104
  111. package/build/lib/index.d.ts +0 -14
  112. package/build/lib/index.js +0 -32
  113. package/build/lib/interfaces/ccf.d.ts +0 -19
  114. package/build/lib/interfaces/ccf.js +0 -3
  115. package/build/lib/interfaces/index.d.ts +0 -7
  116. package/build/lib/interfaces/index.js +0 -18
  117. package/build/lib/sci/index.d.ts +0 -13
  118. package/build/lib/sci/index.js +0 -131
  119. package/build/lib/sci-e/index.d.ts +0 -38
  120. package/build/lib/sci-e/index.js +0 -85
  121. package/build/lib/sci-m/index.d.ts +0 -10
  122. package/build/lib/sci-m/index.js +0 -124
  123. package/build/lib/sci-o/index.d.ts +0 -17
  124. package/build/lib/sci-o/index.js +0 -52
  125. package/build/lib/shell-imp/index.d.ts +0 -32
  126. package/build/lib/shell-imp/index.js +0 -82
  127. package/build/lib/tdp-finder/index.d.ts +0 -19
  128. package/build/lib/tdp-finder/index.js +0 -98
  129. package/build/lib/teads-aws/aws-embodied.json +0 -1
  130. package/build/lib/teads-aws/aws-instances.json +0 -1
  131. package/build/lib/teads-aws/index.d.ts +0 -58
  132. package/build/lib/teads-aws/index.js +0 -208
  133. package/build/lib/teads-curve/index.d.ts +0 -52
  134. package/build/lib/teads-curve/index.js +0 -158
  135. package/build/lib/watt-time/index.d.ts +0 -18
  136. package/build/lib/watt-time/index.js +0 -204
  137. package/build/util/models-universe.js +0 -95
  138. package/build/util/observatory.js +0 -31
  139. package/build/util/supercomputer.js +0 -109
  140. package/docs/implementations/tdp-finder.md +0 -36
  141. package/examples/impls/test/complex-pipeline.yml +0 -67
  142. package/examples/impls/test/toto.yaml +0 -22
  143. package/tsconfig.tsbuildinfo +0 -1
  144. /package/build/{util → lib}/models-universe.d.ts +0 -0
  145. /package/build/{util → lib}/observatory.d.ts +0 -0
  146. /package/build/{util → lib}/supercomputer.d.ts +0 -0
@@ -1,58 +0,0 @@
1
- import { IOutputModelInterface } from '../interfaces';
2
- export declare class TeadsAWS implements IOutputModelInterface {
3
- authParams: object | undefined;
4
- name: string | undefined;
5
- private computeInstances;
6
- private instanceType;
7
- private expectedLifespan;
8
- private interpolation;
9
- constructor();
10
- /**
11
- * Defined for compatibility. Not used in TEADS.
12
- */
13
- authenticate(authParams: object): void;
14
- /**
15
- * Configures the TEADS Plugin for IEF
16
- * @param {string} name name of the resource
17
- * @param {Object} staticParams static parameters for the resource
18
- * @param {string} staticParams.instance-type instance type from the list of supported instances
19
- * @param {number} staticParams.expected-lifespan expected lifespan of the instance in years
20
- * @param {Interpolation} staticParams.interpolation expected lifespan of the instance in years
21
- */
22
- configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
23
- /**
24
- * Calculate the total emissions for a list of inputs
25
- *
26
- * Each input require:
27
- * @param {Object[]} inputs ISO 8601 timestamp string
28
- * @param {string} inputs[].timestamp ISO 8601 timestamp string
29
- * @param {number} inputs[].duration input duration in seconds
30
- * @param {number} inputs[].cpu-util percentage cpu usage
31
- */
32
- execute(inputs: object | object[] | undefined): Promise<any[]>;
33
- /**
34
- * Returns model identifier
35
- */
36
- modelIdentifier(): string;
37
- /**
38
- * Standardize the instance metrics for all the vendors
39
- *
40
- * Maps the instance metrics to a standard format (min, max, idle, 10%, 50%, 100%) for all the vendors
41
- */
42
- standardizeInstanceMetrics(): void;
43
- /**
44
- * Calculates the energy consumption for a single input
45
- * requires
46
- *
47
- * duration: duration of the input in seconds
48
- * cpu-util: cpu usage in percentage
49
- * timestamp: RFC3339 timestamp string
50
- *
51
- * Uses a spline method for AWS and linear interpolation for GCP and Azure
52
- */
53
- private calculateEnergy;
54
- /**
55
- * Calculates the embodied emissions for a given input
56
- */
57
- private embodiedEmissions;
58
- }
@@ -1,208 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TeadsAWS = void 0;
4
- const typescript_cubic_spline_1 = require("typescript-cubic-spline");
5
- const AWS_INSTANCES = require("./aws-instances.json");
6
- const AWS_EMBODIED = require("./aws-embodied.json");
7
- const config_1 = require("../../config");
8
- const common_1 = require("../../types/common");
9
- const { MODEL_IDS } = config_1.CONFIG;
10
- const { TEADS_AWS } = MODEL_IDS;
11
- class TeadsAWS {
12
- constructor() {
13
- // compute instances grouped by the vendor with usage data
14
- this.computeInstances = {};
15
- // list of all the by Architecture
16
- this.instanceType = '';
17
- this.expectedLifespan = 4 * 365 * 24 * 3600;
18
- this.interpolation = common_1.Interpolation.LINEAR;
19
- this.standardizeInstanceMetrics();
20
- }
21
- /**
22
- * Defined for compatibility. Not used in TEADS.
23
- */
24
- authenticate(authParams) {
25
- this.authParams = authParams;
26
- }
27
- /**
28
- * Configures the TEADS Plugin for IEF
29
- * @param {string} name name of the resource
30
- * @param {Object} staticParams static parameters for the resource
31
- * @param {string} staticParams.instance-type instance type from the list of supported instances
32
- * @param {number} staticParams.expected-lifespan expected lifespan of the instance in years
33
- * @param {Interpolation} staticParams.interpolation expected lifespan of the instance in years
34
- */
35
- async configure(name, staticParams = undefined) {
36
- this.name = name;
37
- if (staticParams === undefined) {
38
- throw new Error('Required Parameters not provided');
39
- }
40
- if ('instance-type' in staticParams) {
41
- const instanceType = staticParams['instance-type'];
42
- if (instanceType in this.computeInstances) {
43
- this.instanceType = instanceType;
44
- }
45
- else {
46
- throw new Error('Instance Type not supported');
47
- }
48
- }
49
- else if (this.instanceType === '') {
50
- throw new Error('Instance Type not provided');
51
- }
52
- if ('expected-lifespan' in staticParams) {
53
- this.expectedLifespan = staticParams['expected-lifespan'];
54
- }
55
- if ('interpolation' in staticParams) {
56
- this.interpolation = staticParams?.interpolation;
57
- }
58
- return this;
59
- }
60
- /**
61
- * Calculate the total emissions for a list of inputs
62
- *
63
- * Each input require:
64
- * @param {Object[]} inputs ISO 8601 timestamp string
65
- * @param {string} inputs[].timestamp ISO 8601 timestamp string
66
- * @param {number} inputs[].duration input duration in seconds
67
- * @param {number} inputs[].cpu-util percentage cpu usage
68
- */
69
- async execute(inputs) {
70
- if (inputs === undefined) {
71
- throw new Error('Required Parameters not provided');
72
- }
73
- if (!Array.isArray(inputs)) {
74
- throw new Error('inputs should be an array');
75
- }
76
- if (this.instanceType === '') {
77
- throw new Error('Configuration is incomplete');
78
- }
79
- return inputs.map((input) => {
80
- this.configure(this.name, input);
81
- const e = this.calculateEnergy(input);
82
- const m = this.embodiedEmissions(input);
83
- input['energy'] = e;
84
- input['embodied-carbon'] = m;
85
- return input;
86
- });
87
- }
88
- /**
89
- * Returns model identifier
90
- */
91
- modelIdentifier() {
92
- return TEADS_AWS;
93
- }
94
- /**
95
- * Standardize the instance metrics for all the vendors
96
- *
97
- * Maps the instance metrics to a standard format (min, max, idle, 10%, 50%, 100%) for all the vendors
98
- */
99
- standardizeInstanceMetrics() {
100
- AWS_INSTANCES.forEach((instance) => {
101
- const cpus = parseInt(instance['Instance vCPU'], 10);
102
- this.computeInstances[instance['Instance type']] = {
103
- consumption: {
104
- idle: parseFloat(instance['Instance @ Idle'].replace(',', '.')),
105
- tenPercent: parseFloat(instance['Instance @ 10%'].replace(',', '.')),
106
- fiftyPercent: parseFloat(instance['Instance @ 50%'].replace(',', '.')),
107
- hundredPercent: parseFloat(instance['Instance @ 100%'].replace(',', '.')),
108
- },
109
- vCPUs: cpus,
110
- maxvCPUs: parseInt(instance['Platform Total Number of vCPU'], 10),
111
- name: instance['Instance type'],
112
- };
113
- });
114
- AWS_EMBODIED.forEach((instance) => {
115
- this.computeInstances[instance['type']].embodiedEmission =
116
- instance['total'];
117
- });
118
- }
119
- /**
120
- * Calculates the energy consumption for a single input
121
- * requires
122
- *
123
- * duration: duration of the input in seconds
124
- * cpu-util: cpu usage in percentage
125
- * timestamp: RFC3339 timestamp string
126
- *
127
- * Uses a spline method for AWS and linear interpolation for GCP and Azure
128
- */
129
- calculateEnergy(input) {
130
- if (!('duration' in input) ||
131
- !('cpu-util' in input) ||
132
- !('timestamp' in input)) {
133
- throw new Error('Required Parameters duration,cpu-util,timestamp not provided for input');
134
- }
135
- const duration = input['duration']; // Duration is in seconds.
136
- const cpu = input['cpu-util']; // Convert cpu usage to percentage.
137
- const x = [0, 10, 50, 100]; // Get the wattage for the instance type.
138
- const y = [
139
- this.computeInstances[this.instanceType].consumption.idle ?? 0,
140
- this.computeInstances[this.instanceType].consumption.tenPercent ?? 0,
141
- this.computeInstances[this.instanceType].consumption.fiftyPercent ?? 0,
142
- this.computeInstances[this.instanceType].consumption.hundredPercent ?? 0,
143
- ];
144
- const spline = new typescript_cubic_spline_1.default(x, y);
145
- let wattage = 0.0;
146
- if (this.interpolation === common_1.Interpolation.SPLINE) {
147
- wattage = spline.at(cpu);
148
- }
149
- else if (this.interpolation === common_1.Interpolation.LINEAR) {
150
- // base rate is from which level of cpu linear interpolation is applied at
151
- let base_rate = 0;
152
- let base_cpu = 0;
153
- let ratio = 0;
154
- // find the base rate and ratio
155
- for (let i = 0; i < x.length; i++) {
156
- if (cpu === x[i]) {
157
- base_rate = y[i];
158
- base_cpu = x[i];
159
- break;
160
- }
161
- else if (cpu > x[i] && cpu < x[i + 1]) {
162
- base_rate = y[i];
163
- base_cpu = x[i];
164
- ratio = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
165
- break;
166
- }
167
- }
168
- // sum of base_rate + (cpu - base_cpu) * ratio = total rate of cpu usage
169
- wattage = base_rate + (cpu - base_cpu) * ratio;
170
- }
171
- // duration is in seconds
172
- // wattage is in watts
173
- // eg: 30W x 300s = 9000 J
174
- // 1 Wh = 3600 J
175
- // 9000 J / 3600 = 2.5 Wh
176
- // J / 3600 = Wh
177
- // 2.5 Wh / 1000 = 0.0025 kWh
178
- // Wh / 1000 = kWh
179
- // (wattage * duration) / (seconds in an hour) / 1000 = kWh
180
- return (wattage * duration) / 3600 / 1000;
181
- }
182
- /**
183
- * Calculates the embodied emissions for a given input
184
- */
185
- embodiedEmissions(input) {
186
- // duration
187
- const durationInHours = input['duration'] / 3600;
188
- // M = TE * (TR/EL) * (RR/TR)
189
- // Where:
190
- // TE = Total Embodied Emissions, the sum of Life Cycle Assessment(LCA) emissions for all hardware components
191
- // TR = Time Reserved, the length of time the hardware is reserved for use by the software
192
- // EL = Expected Lifespan, the anticipated time that the equipment will be installed
193
- // RR = Resources Reserved, the number of resources reserved for use by the software.
194
- // TR = Total Resources, the total number of resources available.
195
- const totalEmissions = this.computeInstances[this.instanceType].embodiedEmission ?? 0;
196
- const timeReserved = durationInHours;
197
- const expectedLifespan = this.expectedLifespan / 3600;
198
- const reservedResources = this.computeInstances[this.instanceType].vCPUs ?? 1.0;
199
- const totalResources = this.computeInstances[this.instanceType].maxVCPUs ?? 1.0;
200
- // Multiply totalEmissions by 1000 to convert from kgCO2e to gCO2e
201
- return (totalEmissions *
202
- 1000 *
203
- (timeReserved / expectedLifespan) *
204
- (reservedResources / totalResources));
205
- }
206
- }
207
- exports.TeadsAWS = TeadsAWS;
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RlYWRzLWF3cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNkM7QUFFN0Msc0RBQXNEO0FBQ3RELG9EQUFvRDtBQUlwRCx5Q0FBb0M7QUFFcEMsK0NBQStEO0FBRS9ELE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDM0IsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUU5QixNQUFhLFFBQVE7SUFhbkI7UUFWQSwwREFBMEQ7UUFDbEQscUJBQWdCLEdBRXBCLEVBQUUsQ0FBQztRQUVQLGtDQUFrQztRQUMxQixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixxQkFBZ0IsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDdkMsa0JBQWEsR0FBRyxzQkFBYSxDQUFDLE1BQU0sQ0FBQztRQUczQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsVUFBa0I7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUNiLElBQVksRUFDWixlQUFtQyxTQUFTO1FBRTVDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWpCLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDckQ7UUFFRCxJQUFJLGVBQWUsSUFBSSxZQUFZLEVBQUU7WUFDbkMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBVyxDQUFDO1lBQzdELElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDekMsSUFBSSxD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QUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDO1FBQzNELGtFQUFrRTtRQUNsRSxPQUFPLENBQ0wsY0FBYztZQUNkLElBQUk7WUFDSixDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztZQUNqQyxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxDQUNyQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdk9ELDRCQXVPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTcGxpbmUgZnJvbSAndHlwZXNjcmlwdC1jdWJpYy1zcGxpbmUnO1xuXG5pbXBvcnQgKiBhcyBBV1NfSU5TVEFOQ0VTIGZyb20gJy4vYXdzLWluc3RhbmNlcy5qc29uJztcbmltcG9ydCAqIGFzIEFXU19FTUJPRElFRCBmcm9tICcuL2F3cy1lbWJvZGllZC5qc29uJztcblxuaW1wb3J0IHtJT3V0cHV0TW9kZWxJbnRlcmZhY2V9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQge0NPTkZJR30gZnJvbSAnLi4vLi4vY29uZmlnJztcblxuaW1wb3J0IHtLZXlWYWx1ZVBhaXIsIEludGVycG9sYXRpb259IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1vbic7XG5cbmNvbnN0IHtNT0RFTF9JRFN9ID0gQ09ORklHO1xuY29uc3Qge1RFQURTX0FXU30gPSBNT0RFTF9JRFM7XG5cbmV4cG9ydCBjbGFzcyBUZWFkc0FXUyBpbXBsZW1lbnRzIElPdXRwdXRNb2RlbEludGVyZmFjZSB7XG4gIGF1dGhQYXJhbXM6IG9iamVjdCB8IHVuZGVmaW5lZDsgLy8gRGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4gTm90IHVzZWQgaW4gVEVBRFMuXG4gIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDsgLy8gbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2VcbiAgLy8gY29tcHV0ZSBpbnN0YW5jZXMgZ3JvdXBlZCBieSB0aGUgdmVuZG9yIHdpdGggdXNhZ2UgZGF0YVxuICBwcml2YXRlIGNvbXB1dGVJbnN0YW5jZXM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBLZXlWYWx1ZVBhaXI7XG4gIH0gPSB7fTtcblxuICAvLyBsaXN0IG9mIGFsbCB0aGUgYnkgQXJjaGl0ZWN0dXJlXG4gIHByaXZhdGUgaW5zdGFuY2VUeXBlID0gJyc7XG4gIHByaXZhdGUgZXhwZWN0ZWRMaWZlc3BhbiA9IDQgKiAzNjUgKiAyNCAqIDM2MDA7XG4gIHByaXZhdGUgaW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRpb24uTElORUFSO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RhbmRhcmRpemVJbnN0YW5jZU1ldHJpY3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiBURUFEUy5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhQYXJhbXMgPSBhdXRoUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqICBDb25maWd1cmVzIHRoZSBURUFEUyBQbHVnaW4gZm9yIElFRlxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgcmVzb3VyY2VcbiAgICogIEBwYXJhbSB7T2JqZWN0fSBzdGF0aWNQYXJhbXMgc3RhdGljIHBhcmFtZXRlcnMgZm9yIHRoZSByZXNvdXJjZVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHN0YXRpY1BhcmFtcy5pbnN0YW5jZS10eXBlIGluc3RhbmNlIHR5cGUgZnJvbSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgaW5zdGFuY2VzXG4gICAqICBAcGFyYW0ge251bWJlcn0gc3RhdGljUGFyYW1zLmV4cGVjdGVkLWxpZmVzcGFuIGV4cGVjdGVkIGxpZmVzcGFuIG9mIHRoZSBpbnN0YW5jZSBpbiB5ZWFyc1xuICAgKiAgQHBhcmFtIHtJbnRlcnBvbGF0aW9ufSBzdGF0aWNQYXJhbXMuaW50ZXJwb2xhdGlvbiBleHBlY3RlZCBsaWZlc3BhbiBvZiB0aGUgaW5zdGFuY2UgaW4geWVhcnNcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgaWYgKHN0YXRpY1BhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIFBhcmFtZXRlcnMgbm90IHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCdpbnN0YW5jZS10eXBlJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IHN0YXRpY1BhcmFtc1snaW5zdGFuY2UtdHlwZSddIGFzIHN0cmluZztcbiAgICAgIGlmIChpbnN0YW5jZVR5cGUgaW4gdGhpcy5jb21wdXRlSW5zdGFuY2VzKSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VUeXBlID0gaW5zdGFuY2VUeXBlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN0YW5jZSBUeXBlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5zdGFuY2VUeXBlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN0YW5jZSBUeXBlIG5vdCBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmICgnZXhwZWN0ZWQtbGlmZXNwYW4nIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy5leHBlY3RlZExpZmVzcGFuID0gc3RhdGljUGFyYW1zWydleHBlY3RlZC1saWZlc3BhbiddIGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBpZiAoJ2ludGVycG9sYXRpb24nIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gc3RhdGljUGFyYW1zPy5pbnRlcnBvbGF0aW9uIGFzIEludGVycG9sYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBlbWlzc2lvbnMgZm9yIGEgbGlzdCBvZiBpbnB1dHNcbiAgICpcbiAgICogRWFjaCBpbnB1dCByZXF1aXJlOlxuICAgKiAgQHBhcmFtIHtPYmplY3RbXX0gaW5wdXRzICBJU08gODYwMSB0aW1lc3RhbXAgc3RyaW5nXG4gICAqICBAcGFyYW0ge3N0cmluZ30gaW5wdXRzW10udGltZXN0YW1wIElTTyA4NjAxIHRpbWVzdGFtcCBzdHJpbmdcbiAgICogIEBwYXJhbSB7bnVtYmVyfSBpbnB1dHNbXS5kdXJhdGlvbiBpbnB1dCBkdXJhdGlvbiBpbiBzZWNvbmRzXG4gICAqICBAcGFyYW0ge251bWJlcn0gaW5wdXRzW10uY3B1LXV0aWwgcGVyY2VudGFnZSBjcHUgdXNhZ2VcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXRzOiBvYmplY3QgfCBvYmplY3RbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoaW5wdXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgUGFyYW1ldGVycyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIHNob3VsZCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmluc3RhbmNlVHlwZSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJhdGlvbiBpcyBpbmNvbXBsZXRlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0cy5tYXAoKGlucHV0OiBLZXlWYWx1ZVBhaXIpID0+IHtcbiAgICAgIHRoaXMuY29uZmlndXJlKHRoaXMubmFtZSEsIGlucHV0KTtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmNhbGN1bGF0ZUVuZXJneShpbnB1dCk7XG4gICAgICBjb25zdCBtID0gdGhpcy5lbWJvZGllZEVtaXNzaW9ucyhpbnB1dCk7XG4gICAgICBpbnB1dFsnZW5lcmd5J10gPSBlO1xuICAgICAgaW5wdXRbJ2VtYm9kaWVkLWNhcmJvbiddID0gbTtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1vZGVsIGlkZW50aWZpZXJcbiAgICovXG4gIG1vZGVsSWRlbnRpZmllcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBURUFEU19BV1M7XG4gIH1cblxuICAvKipcbiAgICogU3RhbmRhcmRpemUgdGhlIGluc3RhbmNlIG1ldHJpY3MgZm9yIGFsbCB0aGUgdmVuZG9yc1xuICAgKlxuICAgKiBNYXBzIHRoZSBpbnN0YW5jZSBtZXRyaWNzIHRvIGEgc3RhbmRhcmQgZm9ybWF0IChtaW4sIG1heCwgaWRsZSwgMTAlLCA1MCUsIDEwMCUpIGZvciBhbGwgdGhlIHZlbmRvcnNcbiAgICovXG4gIHN0YW5kYXJkaXplSW5zdGFuY2VNZXRyaWNzKCkge1xuICAgIEFXU19JTlNUQU5DRVMuZm9yRWFjaCgoaW5zdGFuY2U6IEtleVZhbHVlUGFpcikgPT4ge1xuICAgICAgY29uc3QgY3B1cyA9IHBhcnNlSW50KGluc3RhbmNlWydJbnN0YW5jZSB2Q1BVJ10sIDEwKTtcbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1tpbnN0YW5jZVsnSW5zdGFuY2UgdHlwZSddXSA9IHtcbiAgICAgICAgY29uc3VtcHRpb246IHtcbiAgICAgICAgICBpZGxlOiBwYXJzZUZsb2F0KGluc3RhbmNlWydJbnN0YW5jZSBAIElkbGUnXS5yZXBsYWNlKCcsJywgJy4nKSksXG4gICAgICAgICAgdGVuUGVyY2VudDogcGFyc2VGbG9hdChpbnN0YW5jZVsnSW5zdGFuY2UgQCAxMCUnXS5yZXBsYWNlKCcsJywgJy4nKSksXG4gICAgICAgICAgZmlmdHlQZXJjZW50OiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgaW5zdGFuY2VbJ0luc3RhbmNlIEAgNTAlJ10ucmVwbGFjZSgnLCcsICcuJylcbiAgICAgICAgICApLFxuICAgICAgICAgIGh1bmRyZWRQZXJjZW50OiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgaW5zdGFuY2VbJ0luc3RhbmNlIEAgMTAwJSddLnJlcGxhY2UoJywnLCAnLicpXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgdkNQVXM6IGNwdXMsXG4gICAgICAgIG1heHZDUFVzOiBwYXJzZUludChpbnN0YW5jZVsnUGxhdGZvcm0gVG90YWwgTnVtYmVyIG9mIHZDUFUnXSwgMTApLFxuICAgICAgICBuYW1lOiBpbnN0YW5jZVsnSW5zdGFuY2UgdHlwZSddLFxuICAgICAgfSBhcyBLZXlWYWx1ZVBhaXI7XG4gICAgfSk7XG4gICAgQVdTX0VNQk9ESUVELmZvckVhY2goKGluc3RhbmNlOiBLZXlWYWx1ZVBhaXIpID0+IHtcbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1tpbnN0YW5jZVsndHlwZSddXS5lbWJvZGllZEVtaXNzaW9uID1cbiAgICAgICAgaW5zdGFuY2VbJ3RvdGFsJ107XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZW5lcmd5IGNvbnN1bXB0aW9uIGZvciBhIHNpbmdsZSBpbnB1dFxuICAgKiByZXF1aXJlc1xuICAgKlxuICAgKiBkdXJhdGlvbjogZHVyYXRpb24gb2YgdGhlIGlucHV0IGluIHNlY29uZHNcbiAgICogY3B1LXV0aWw6IGNwdSB1c2FnZSBpbiBwZXJjZW50YWdlXG4gICAqIHRpbWVzdGFtcDogUkZDMzMzOSB0aW1lc3RhbXAgc3RyaW5nXG4gICAqXG4gICAqIFVzZXMgYSBzcGxpbmUgbWV0aG9kIGZvciBBV1MgYW5kIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZvciBHQ1AgYW5kIEF6dXJlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUVuZXJneShpbnB1dDogS2V5VmFsdWVQYWlyKSB7XG4gICAgaWYgKFxuICAgICAgISgnZHVyYXRpb24nIGluIGlucHV0KSB8fFxuICAgICAgISgnY3B1LXV0aWwnIGluIGlucHV0KSB8fFxuICAgICAgISgndGltZXN0YW1wJyBpbiBpbnB1dClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVpcmVkIFBhcmFtZXRlcnMgZHVyYXRpb24sY3B1LXV0aWwsdGltZXN0YW1wIG5vdCBwcm92aWRlZCBmb3IgaW5wdXQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gaW5wdXRbJ2R1cmF0aW9uJ107IC8vIER1cmF0aW9uIGlzIGluIHNlY29uZHMuXG4gICAgY29uc3QgY3B1ID0gaW5wdXRbJ2NwdS11dGlsJ107IC8vIENvbnZlcnQgY3B1IHVzYWdlIHRvIHBlcmNlbnRhZ2UuXG5cbiAgICBjb25zdCB4ID0gWzAsIDEwLCA1MCwgMTAwXTsgLy8gR2V0IHRoZSB3YXR0YWdlIGZvciB0aGUgaW5zdGFuY2UgdHlwZS5cbiAgICBjb25zdCB5OiBudW1iZXJbXSA9IFtcbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1t0aGlzLmluc3RhbmNlVHlwZV0uY29uc3VtcHRpb24uaWRsZSA/PyAwLFxuICAgICAgdGhpcy5jb21wdXRlSW5zdGFuY2VzW3RoaXMuaW5zdGFuY2VUeXBlXS5jb25zdW1wdGlvbi50ZW5QZXJjZW50ID8/IDAsXG4gICAgICB0aGlzLmNvbXB1dGVJbnN0YW5jZXNbdGhpcy5pbnN0YW5jZVR5cGVdLmNvbnN1bXB0aW9uLmZpZnR5UGVyY2VudCA/PyAwLFxuICAgICAgdGhpcy5jb21wdXRlSW5zdGFuY2VzW3RoaXMuaW5zdGFuY2VUeXBlXS5jb25zdW1wdGlvbi5odW5kcmVkUGVyY2VudCA/PyAwLFxuICAgIF07XG5cbiAgICBjb25zdCBzcGxpbmUgPSBuZXcgU3BsaW5lKHgsIHkpO1xuXG4gICAgbGV0IHdhdHRhZ2UgPSAwLjA7XG4gICAgaWYgKHRoaXMuaW50ZXJwb2xhdGlvbiA9PT0gSW50ZXJwb2xhdGlvbi5TUExJTkUpIHtcbiAgICAgIHdhdHRhZ2UgPSBzcGxpbmUuYXQoY3B1KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW50ZXJwb2xhdGlvbiA9PT0gSW50ZXJwb2xhdGlvbi5MSU5FQVIpIHtcbiAgICAgIC8vIGJhc2UgcmF0ZSBpcyBmcm9tIHdoaWNoIGxldmVsIG9mIGNwdSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpcyBhcHBsaWVkIGF0XG4gICAgICBsZXQgYmFzZV9yYXRlID0gMDtcbiAgICAgIGxldCBiYXNlX2NwdSA9IDA7XG4gICAgICBsZXQgcmF0aW8gPSAwO1xuICAgICAgLy8gZmluZCB0aGUgYmFzZSByYXRlIGFuZCByYXRpb1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjcHUgPT09IHhbaV0pIHtcbiAgICAgICAgICBiYXNlX3JhdGUgPSB5W2ldO1xuICAgICAgICAgIGJhc2VfY3B1ID0geFtpXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChjcHUgPiB4W2ldICYmIGNwdSA8IHhbaSArIDFdKSB7XG4gICAgICAgICAgYmFzZV9yYXRlID0geVtpXTtcbiAgICAgICAgICBiYXNlX2NwdSA9IHhbaV07XG4gICAgICAgICAgcmF0aW8gPSAoeVtpICsgMV0gLSB5W2ldKSAvICh4W2kgKyAxXSAtIHhbaV0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBzdW0gb2YgYmFzZV9yYXRlICsgKGNwdSAtIGJhc2VfY3B1KSAqIHJhdGlvID0gdG90YWwgcmF0ZSBvZiBjcHUgdXNhZ2VcbiAgICAgIHdhdHRhZ2UgPSBiYXNlX3JhdGUgKyAoY3B1IC0gYmFzZV9jcHUpICogcmF0aW87XG4gICAgfVxuICAgIC8vICBkdXJhdGlvbiBpcyBpbiBzZWNvbmRzXG4gICAgLy8gIHdhdHRhZ2UgaXMgaW4gd2F0dHNcbiAgICAvLyAgZWc6IDMwVyB4IDMwMHMgPSA5MDAwIEpcbiAgICAvLyAgMSBXaCA9IDM2MDAgSlxuICAgIC8vICA5MDAwIEogLyAzNjAwID0gMi41IFdoXG4gICAgLy8gIEogLyAzNjAwID0gV2hcbiAgICAvLyAgMi41IFdoIC8gMTAwMCA9IDAuMDAyNSBrV2hcbiAgICAvLyAgV2ggLyAxMDAwID0ga1doXG4gICAgLy8gKHdhdHRhZ2UgKiBkdXJhdGlvbikgLyAoc2Vjb25kcyBpbiBhbiBob3VyKSAvIDEwMDAgPSBrV2hcbiAgICByZXR1cm4gKHdhdHRhZ2UgKiBkdXJhdGlvbikgLyAzNjAwIC8gMTAwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBlbWJvZGllZCBlbWlzc2lvbnMgZm9yIGEgZ2l2ZW4gaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZW1ib2RpZWRFbWlzc2lvbnMoaW5wdXQ6IEtleVZhbHVlUGFpcik6IG51bWJlciB7XG4gICAgLy8gZHVyYXRpb25cbiAgICBjb25zdCBkdXJhdGlvbkluSG91cnMgPSBpbnB1dFsnZHVyYXRpb24nXSAvIDM2MDA7XG4gICAgLy8gTSA9IFRFICogKFRSL0VMKSAqIChSUi9UUilcbiAgICAvLyBXaGVyZTpcbiAgICAvLyBURSA9IFRvdGFsIEVtYm9kaWVkIEVtaXNzaW9ucywgdGhlIHN1bSBvZiBMaWZlIEN5Y2xlIEFzc2Vzc21lbnQoTENBKSBlbWlzc2lvbnMgZm9yIGFsbCBoYXJkd2FyZSBjb21wb25lbnRzXG4gICAgLy8gVFIgPSBUaW1lIFJlc2VydmVkLCB0aGUgbGVuZ3RoIG9mIHRpbWUgdGhlIGhhcmR3YXJlIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHNvZnR3YXJlXG4gICAgLy8gRUwgPSBFeHBlY3RlZCBMaWZlc3BhbiwgdGhlIGFudGljaXBhdGVkIHRpbWUgdGhhdCB0aGUgZXF1aXBtZW50IHdpbGwgYmUgaW5zdGFsbGVkXG4gICAgLy8gUlIgPSBSZXNvdXJjZXMgUmVzZXJ2ZWQsIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHNvZnR3YXJlLlxuICAgIC8vIFRSID0gVG90YWwgUmVzb3VyY2VzLCB0aGUgdG90YWwgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUuXG4gICAgY29uc3QgdG90YWxFbWlzc2lvbnMgPVxuICAgICAgdGhpcy5jb21wdXRlSW5zdGFuY2VzW3RoaXMuaW5zdGFuY2VUeXBlXS5lbWJvZGllZEVtaXNzaW9uID8/IDA7XG4gICAgY29uc3QgdGltZVJlc2VydmVkID0gZHVyYXRpb25JbkhvdXJzO1xuICAgIGNvbnN0IGV4cGVjdGVkTGlmZXNwYW4gPSB0aGlzLmV4cGVjdGVkTGlmZXNwYW4gLyAzNjAwO1xuICAgIGNvbnN0IHJlc2VydmVkUmVzb3VyY2VzID1cbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1t0aGlzLmluc3RhbmNlVHlwZV0udkNQVXMgPz8gMS4wO1xuICAgIGNvbnN0IHRvdGFsUmVzb3VyY2VzID1cbiAgICAgIHRoaXMuY29tcHV0ZUluc3RhbmNlc1t0aGlzLmluc3RhbmNlVHlwZV0ubWF4VkNQVXMgPz8gMS4wO1xuICAgIC8vIE11bHRpcGx5IHRvdGFsRW1pc3Npb25zIGJ5IDEwMDAgdG8gY29udmVydCBmcm9tIGtnQ08yZSB0byBnQ08yZVxuICAgIHJldHVybiAoXG4gICAgICB0b3RhbEVtaXNzaW9ucyAqXG4gICAgICAxMDAwICpcbiAgICAgICh0aW1lUmVzZXJ2ZWQgLyBleHBlY3RlZExpZmVzcGFuKSAqXG4gICAgICAocmVzZXJ2ZWRSZXNvdXJjZXMgLyB0b3RhbFJlc291cmNlcylcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -1,52 +0,0 @@
1
- import { IOutputModelInterface } from '../interfaces';
2
- import { Interpolation } from '../../types/common';
3
- export declare class TeadsCurveModel implements IOutputModelInterface {
4
- authParams: object | undefined;
5
- name: string | undefined;
6
- tdp: number;
7
- curve: number[];
8
- points: number[];
9
- spline: any;
10
- interpolation: Interpolation;
11
- /**
12
- * Defined for compatibility. Not used in TEADS.
13
- */
14
- authenticate(authParams: object): void;
15
- /**
16
- * Configures the TEADS Plugin for IEF
17
- * @param {string} name name of the resource
18
- * @param {Object} staticParams static parameters for the resource
19
- * @param {number} staticParams.tdp Thermal Design Power in Watts
20
- * @param {Interpolation} staticParams.interpolation Interpolation method
21
- */
22
- configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
23
- /**
24
- * Calculate the total emissions for a list of inputs
25
- *
26
- * Each input require:
27
- * @param {Object[]} inputs
28
- * @param {string} inputs[].timestamp RFC3339 timestamp string
29
- * @param {number} inputs[].duration input duration in seconds
30
- * @param {number} inputs[].cpu-util percentage cpu usage
31
- */
32
- execute(inputs: object | object[] | undefined): Promise<any[]>;
33
- /**
34
- * Returns model identifier
35
- */
36
- modelIdentifier(): string;
37
- /**
38
- * Calculates the energy consumption for a single input
39
- * requires
40
- *
41
- * duration: duration of the input in seconds
42
- * cpu-util: cpu usage in percentage
43
- * timestamp: RFC3339 timestamp string
44
- *
45
- * Uses a spline method on the teads cpu wattage data
46
- */
47
- private calculateEnergy;
48
- }
49
- /**
50
- * For JSII.
51
- */
52
- export { KeyValuePair, Interpolation } from '../../types/common';
@@ -1,158 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Interpolation = exports.TeadsCurveModel = void 0;
4
- const typescript_cubic_spline_1 = require("typescript-cubic-spline");
5
- const config_1 = require("../../config");
6
- const common_1 = require("../../types/common");
7
- const { MODEL_IDS } = config_1.CONFIG;
8
- const { TEADS_CURVE } = MODEL_IDS;
9
- class TeadsCurveModel {
10
- constructor() {
11
- this.tdp = 0; // `tdp` of the chip being measured.
12
- this.curve = [0.12, 0.32, 0.75, 1.02]; // Default power curve provided by the Teads Team.
13
- this.points = [0, 10, 50, 100]; // Default percentage points.
14
- this.spline = new typescript_cubic_spline_1.default(this.points, this.curve); // Spline interpolation of the power curve.
15
- this.interpolation = common_1.Interpolation.SPLINE; // Interpolation method.
16
- }
17
- /**
18
- * Defined for compatibility. Not used in TEADS.
19
- */
20
- authenticate(authParams) {
21
- this.authParams = authParams;
22
- }
23
- /**
24
- * Configures the TEADS Plugin for IEF
25
- * @param {string} name name of the resource
26
- * @param {Object} staticParams static parameters for the resource
27
- * @param {number} staticParams.tdp Thermal Design Power in Watts
28
- * @param {Interpolation} staticParams.interpolation Interpolation method
29
- */
30
- async configure(name, staticParams = undefined) {
31
- this.name = name;
32
- if (staticParams === undefined) {
33
- throw new Error('Required Parameters not provided');
34
- }
35
- if ('thermal-design-power' in staticParams) {
36
- this.tdp = staticParams['thermal-design-power'];
37
- }
38
- // if ('curve' in staticParams && 'points' in staticParams) {
39
- // this.curve = staticParams?.curve as number[];
40
- // this.points = staticParams?.points as number[];
41
- // if (this.curve.length !== this.points.length) {
42
- // throw new Error(
43
- // 'Number of points and curve values must be the same length'
44
- // );
45
- // }
46
- // this.spline = new Spline(this.points, this.curve);
47
- // }
48
- if ('interpolation' in staticParams) {
49
- this.interpolation = staticParams?.interpolation;
50
- }
51
- return this;
52
- }
53
- /**
54
- * Calculate the total emissions for a list of inputs
55
- *
56
- * Each input require:
57
- * @param {Object[]} inputs
58
- * @param {string} inputs[].timestamp RFC3339 timestamp string
59
- * @param {number} inputs[].duration input duration in seconds
60
- * @param {number} inputs[].cpu-util percentage cpu usage
61
- */
62
- async execute(inputs) {
63
- if (inputs === undefined) {
64
- throw new Error('Required Parameters not provided');
65
- }
66
- else if (!Array.isArray(inputs)) {
67
- throw new Error('inputs must be an array');
68
- }
69
- return inputs.map((input) => {
70
- this.configure(this.name, input);
71
- input['energy-cpu'] = this.calculateEnergy(input);
72
- return input;
73
- });
74
- }
75
- /**
76
- * Returns model identifier
77
- */
78
- modelIdentifier() {
79
- return TEADS_CURVE;
80
- }
81
- /**
82
- * Calculates the energy consumption for a single input
83
- * requires
84
- *
85
- * duration: duration of the input in seconds
86
- * cpu-util: cpu usage in percentage
87
- * timestamp: RFC3339 timestamp string
88
- *
89
- * Uses a spline method on the teads cpu wattage data
90
- */
91
- calculateEnergy(input) {
92
- if (!('duration' in input) ||
93
- !('cpu-util' in input) ||
94
- !('timestamp' in input)) {
95
- throw new Error('Required Parameters duration,cpu-util,timestamp not provided for input');
96
- }
97
- // duration is in seconds
98
- const duration = input['duration'];
99
- // convert cpu usage to percentage
100
- const cpu = input['cpu-util'];
101
- if (cpu < 0 || cpu > 100) {
102
- throw new Error('cpu usage must be between 0 and 100');
103
- }
104
- let tdp = this.tdp;
105
- if ('thermal-design-power' in input) {
106
- tdp = input['thermal-design-power'];
107
- }
108
- if (tdp === 0) {
109
- throw new Error('`thermal-design-power` not provided. Can not compute energy.');
110
- }
111
- let wattage = 0.0;
112
- if (this.interpolation === common_1.Interpolation.SPLINE) {
113
- wattage = this.spline.at(cpu) * tdp;
114
- }
115
- else if (this.interpolation === common_1.Interpolation.LINEAR) {
116
- const x = this.points;
117
- const y = this.curve;
118
- // base rate is from which level of cpu linear interpolation is applied at
119
- let base_rate = 0;
120
- let base_cpu = 0;
121
- let ratio = 0;
122
- // find the base rate and ratio
123
- for (let i = 0; i < x.length; i++) {
124
- if (cpu === x[i]) {
125
- base_rate = y[i];
126
- base_cpu = x[i];
127
- break;
128
- }
129
- else if (cpu > x[i] && cpu < x[i + 1]) {
130
- base_rate = y[i];
131
- base_cpu = x[i];
132
- ratio = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
133
- break;
134
- }
135
- }
136
- // sum of base_rate + (cpu - base_cpu) * ratio = total rate of cpu usage
137
- // total rate * tdp = wattage
138
- wattage = (base_rate + (cpu - base_cpu) * ratio) * tdp;
139
- }
140
- // duration is in seconds
141
- // wattage is in watts
142
- // eg: 30W x 300s = 9000 J
143
- // 1 Wh = 3600 J
144
- // 9000 J / 3600 = 2.5 Wh
145
- // J / 3600 = Wh
146
- // 2.5 Wh / 1000 = 0.0025 kWh
147
- // Wh / 1000 = kWh
148
- // (wattage * duration) / (seconds in an hour) / 1000 = kWh
149
- return (wattage * duration) / 3600 / 1000;
150
- }
151
- }
152
- exports.TeadsCurveModel = TeadsCurveModel;
153
- /**
154
- * For JSII.
155
- */
156
- var common_2 = require("../../types/common");
157
- Object.defineProperty(exports, "Interpolation", { enumerable: true, get: function () { return common_2.Interpolation; } });
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RlYWRzLWN1cnZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE2QztBQUk3Qyx5Q0FBb0M7QUFFcEMsK0NBQStEO0FBRS9ELE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDM0IsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUVoQyxNQUFhLGVBQWU7SUFBNUI7UUFHRSxRQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0NBQW9DO1FBQzdDLFVBQUssR0FBYSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsa0RBQWtEO1FBQzlGLFdBQU0sR0FBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1FBQ2xFLFdBQU0sR0FBUSxJQUFJLGlDQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7UUFDOUYsa0JBQWEsR0FBa0Isc0JBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyx3QkFBd0I7SUE0Si9FLENBQUM7SUExSkM7O09BRUc7SUFDSCxZQUFZLENBQUMsVUFBa0I7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksc0JBQXNCLElBQUksWUFBWSxFQUFF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QUFHLElBQUksQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFuS0QsMENBbUtDO0FBRUQ7O0dBRUc7QUFDSCw2Q0FBK0Q7QUFBekMsdUdBQUEsYUFBYSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNwbGluZSBmcm9tICd0eXBlc2NyaXB0LWN1YmljLXNwbGluZSc7XG5cbmltcG9ydCB7SU91dHB1dE1vZGVsSW50ZXJmYWNlfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuaW1wb3J0IHtDT05GSUd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5cbmltcG9ydCB7S2V5VmFsdWVQYWlyLCBJbnRlcnBvbGF0aW9ufSBmcm9tICcuLi8uLi90eXBlcy9jb21tb24nO1xuXG5jb25zdCB7TU9ERUxfSURTfSA9IENPTkZJRztcbmNvbnN0IHtURUFEU19DVVJWRX0gPSBNT0RFTF9JRFM7XG5cbmV4cG9ydCBjbGFzcyBUZWFkc0N1cnZlTW9kZWwgaW1wbGVtZW50cyBJT3V0cHV0TW9kZWxJbnRlcmZhY2Uge1xuICBhdXRoUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQ7IC8vIERlZmluZWQgZm9yIGNvbXBhdGliaWxpdHkuIE5vdCB1c2VkIGluIFRFQURTLlxuICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vIE5hbWUgb2YgdGhlIGRhdGEgc291cmNlLlxuICB0ZHAgPSAwOyAvLyBgdGRwYCBvZiB0aGUgY2hpcCBiZWluZyBtZWFzdXJlZC5cbiAgY3VydmU6IG51bWJlcltdID0gWzAuMTIsIDAuMzIsIDAuNzUsIDEuMDJdOyAvLyBEZWZhdWx0IHBvd2VyIGN1cnZlIHByb3ZpZGVkIGJ5IHRoZSBUZWFkcyBUZWFtLlxuICBwb2ludHM6IG51bWJlcltdID0gWzAsIDEwLCA1MCwgMTAwXTsgLy8gRGVmYXVsdCBwZXJjZW50YWdlIHBvaW50cy5cbiAgc3BsaW5lOiBhbnkgPSBuZXcgU3BsaW5lKHRoaXMucG9pbnRzLCB0aGlzLmN1cnZlKTsgLy8gU3BsaW5lIGludGVycG9sYXRpb24gb2YgdGhlIHBvd2VyIGN1cnZlLlxuICBpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uID0gSW50ZXJwb2xhdGlvbi5TUExJTkU7IC8vIEludGVycG9sYXRpb24gbWV0aG9kLlxuXG4gIC8qKlxuICAgKiBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiBURUFEUy5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhQYXJhbXMgPSBhdXRoUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIFRFQURTIFBsdWdpbiBmb3IgSUVGXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0aWNQYXJhbXMgc3RhdGljIHBhcmFtZXRlcnMgZm9yIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdGljUGFyYW1zLnRkcCBUaGVybWFsIERlc2lnbiBQb3dlciBpbiBXYXR0c1xuICAgKiBAcGFyYW0ge0ludGVycG9sYXRpb259IHN0YXRpY1BhcmFtcy5pbnRlcnBvbGF0aW9uIEludGVycG9sYXRpb24gbWV0aG9kXG4gICAqL1xuICBhc3luYyBjb25maWd1cmUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YXRpY1BhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG4gICk6IFByb21pc2U8SU91dHB1dE1vZGVsSW50ZXJmYWNlPiB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcblxuICAgIGlmIChzdGF0aWNQYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBQYXJhbWV0ZXJzIG5vdCBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmICgndGhlcm1hbC1kZXNpZ24tcG93ZXInIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy50ZHAgPSBzdGF0aWNQYXJhbXNbJ3RoZXJtYWwtZGVzaWduLXBvd2VyJ10gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIC8vIGlmICgnY3VydmUnIGluIHN0YXRpY1BhcmFtcyAmJiAncG9pbnRzJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAvLyAgIHRoaXMuY3VydmUgPSBzdGF0aWNQYXJhbXM/LmN1cnZlIGFzIG51bWJlcltdO1xuICAgIC8vICAgdGhpcy5wb2ludHMgPSBzdGF0aWNQYXJhbXM/LnBvaW50cyBhcyBudW1iZXJbXTtcbiAgICAvLyAgIGlmICh0aGlzLmN1cnZlLmxlbmd0aCAhPT0gdGhpcy5wb2ludHMubGVuZ3RoKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAvLyAgICAgICAnTnVtYmVyIG9mIHBvaW50cyBhbmQgY3VydmUgdmFsdWVzIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoJ1xuICAgIC8vICAgICApO1xuICAgIC8vICAgfVxuICAgIC8vICAgdGhpcy5zcGxpbmUgPSBuZXcgU3BsaW5lKHRoaXMucG9pbnRzLCB0aGlzLmN1cnZlKTtcbiAgICAvLyB9XG5cbiAgICBpZiAoJ2ludGVycG9sYXRpb24nIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gc3RhdGljUGFyYW1zPy5pbnRlcnBvbGF0aW9uIGFzIEludGVycG9sYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBlbWlzc2lvbnMgZm9yIGEgbGlzdCBvZiBpbnB1dHNcbiAgICpcbiAgICogRWFjaCBpbnB1dCByZXF1aXJlOlxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBpbnB1dHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0c1tdLnRpbWVzdGFtcCBSRkMzMzM5IHRpbWVzdGFtcCBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlucHV0c1tdLmR1cmF0aW9uIGlucHV0IGR1cmF0aW9uIGluIHNlY29uZHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlucHV0c1tdLmNwdS11dGlsIHBlcmNlbnRhZ2UgY3B1IHVzYWdlXG4gICAqL1xuICBhc3luYyBleGVjdXRlKGlucHV0czogb2JqZWN0IHwgb2JqZWN0W10gfCB1bmRlZmluZWQpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgaWYgKGlucHV0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIFBhcmFtZXRlcnMgbm90IHByb3ZpZGVkJyk7XG4gICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShpbnB1dHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dDogS2V5VmFsdWVQYWlyKSA9PiB7XG4gICAgICB0aGlzLmNvbmZpZ3VyZSh0aGlzLm5hbWUhLCBpbnB1dCk7XG4gICAgICBpbnB1dFsnZW5lcmd5LWNwdSddID0gdGhpcy5jYWxjdWxhdGVFbmVyZ3koaW5wdXQpO1xuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbW9kZWwgaWRlbnRpZmllclxuICAgKi9cbiAgbW9kZWxJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFRFQURTX0NVUlZFO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGVuZXJneSBjb25zdW1wdGlvbiBmb3IgYSBzaW5nbGUgaW5wdXRcbiAgICogcmVxdWlyZXNcbiAgICpcbiAgICogZHVyYXRpb246IGR1cmF0aW9uIG9mIHRoZSBpbnB1dCBpbiBzZWNvbmRzXG4gICAqIGNwdS11dGlsOiBjcHUgdXNhZ2UgaW4gcGVyY2VudGFnZVxuICAgKiB0aW1lc3RhbXA6IFJGQzMzMzkgdGltZXN0YW1wIHN0cmluZ1xuICAgKlxuICAgKiBVc2VzIGEgc3BsaW5lIG1ldGhvZCBvbiB0aGUgdGVhZHMgY3B1IHdhdHRhZ2UgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVFbmVyZ3koaW5wdXQ6IEtleVZhbHVlUGFpcikge1xuICAgIGlmIChcbiAgICAgICEoJ2R1cmF0aW9uJyBpbiBpbnB1dCkgfHxcbiAgICAgICEoJ2NwdS11dGlsJyBpbiBpbnB1dCkgfHxcbiAgICAgICEoJ3RpbWVzdGFtcCcgaW4gaW5wdXQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSZXF1aXJlZCBQYXJhbWV0ZXJzIGR1cmF0aW9uLGNwdS11dGlsLHRpbWVzdGFtcCBub3QgcHJvdmlkZWQgZm9yIGlucHV0J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAgICBkdXJhdGlvbiBpcyBpbiBzZWNvbmRzXG4gICAgY29uc3QgZHVyYXRpb24gPSBpbnB1dFsnZHVyYXRpb24nXTtcblxuICAgIC8vICAgIGNvbnZlcnQgY3B1IHVzYWdlIHRvIHBlcmNlbnRhZ2VcbiAgICBjb25zdCBjcHUgPSBpbnB1dFsnY3B1LXV0aWwnXTtcbiAgICBpZiAoY3B1IDwgMCB8fCBjcHUgPiAxMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3B1IHVzYWdlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAnKTtcbiAgICB9XG5cbiAgICBsZXQgdGRwID0gdGhpcy50ZHA7XG5cbiAgICBpZiAoJ3RoZXJtYWwtZGVzaWduLXBvd2VyJyBpbiBpbnB1dCkge1xuICAgICAgdGRwID0gaW5wdXRbJ3RoZXJtYWwtZGVzaWduLXBvd2VyJ10gYXMgbnVtYmVyO1xuICAgIH1cbiAgICBpZiAodGRwID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgdGhlcm1hbC1kZXNpZ24tcG93ZXJgIG5vdCBwcm92aWRlZC4gQ2FuIG5vdCBjb21wdXRlIGVuZXJneS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCB3YXR0YWdlID0gMC4wO1xuICAgIGlmICh0aGlzLmludGVycG9sYXRpb24gPT09IEludGVycG9sYXRpb24uU1BMSU5FKSB7XG4gICAgICB3YXR0YWdlID0gdGhpcy5zcGxpbmUuYXQoY3B1KSAqIHRkcDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW50ZXJwb2xhdGlvbiA9PT0gSW50ZXJwb2xhdGlvbi5MSU5FQVIpIHtcbiAgICAgIGNvbnN0IHggPSB0aGlzLnBvaW50cztcbiAgICAgIGNvbnN0IHkgPSB0aGlzLmN1cnZlO1xuICAgICAgLy8gYmFzZSByYXRlIGlzIGZyb20gd2hpY2ggbGV2ZWwgb2YgY3B1IGxpbmVhciBpbnRlcnBvbGF0aW9uIGlzIGFwcGxpZWQgYXRcbiAgICAgIGxldCBiYXNlX3JhdGUgPSAwO1xuICAgICAgbGV0IGJhc2VfY3B1ID0gMDtcbiAgICAgIGxldCByYXRpbyA9IDA7XG4gICAgICAvLyBmaW5kIHRoZSBiYXNlIHJhdGUgYW5kIHJhdGlvXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNwdSA9PT0geFtpXSkge1xuICAgICAgICAgIGJhc2VfcmF0ZSA9IHlbaV07XG4gICAgICAgICAgYmFzZV9jcHUgPSB4W2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGNwdSA+IHhbaV0gJiYgY3B1IDwgeFtpICsgMV0pIHtcbiAgICAgICAgICBiYXNlX3JhdGUgPSB5W2ldO1xuICAgICAgICAgIGJhc2VfY3B1ID0geFtpXTtcbiAgICAgICAgICByYXRpbyA9ICh5W2kgKyAxXSAtIHlbaV0pIC8gKHhbaSArIDFdIC0geFtpXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHN1bSBvZiBiYXNlX3JhdGUgKyAoY3B1IC0gYmFzZV9jcHUpICogcmF0aW8gPSB0b3RhbCByYXRlIG9mIGNwdSB1c2FnZVxuICAgICAgLy8gdG90YWwgcmF0ZSAqIHRkcCA9IHdhdHRhZ2VcbiAgICAgIHdhdHRhZ2UgPSAoYmFzZV9yYXRlICsgKGNwdSAtIGJhc2VfY3B1KSAqIHJhdGlvKSAqIHRkcDtcbiAgICB9XG4gICAgLy8gIGR1cmF0aW9uIGlzIGluIHNlY29uZHNcbiAgICAvLyAgd2F0dGFnZSBpcyBpbiB3YXR0c1xuICAgIC8vICBlZzogMzBXIHggMzAwcyA9IDkwMDAgSlxuICAgIC8vICAxIFdoID0gMzYwMCBKXG4gICAgLy8gIDkwMDAgSiAvIDM2MDAgPSAyLjUgV2hcbiAgICAvLyAgSiAvIDM2MDAgPSBXaFxuICAgIC8vICAyLjUgV2ggLyAxMDAwID0gMC4wMDI1IGtXaFxuICAgIC8vICBXaCAvIDEwMDAgPSBrV2hcbiAgICAvLyAod2F0dGFnZSAqIGR1cmF0aW9uKSAvIChzZWNvbmRzIGluIGFuIGhvdXIpIC8gMTAwMCA9IGtXaFxuICAgIHJldHVybiAod2F0dGFnZSAqIGR1cmF0aW9uKSAvIDM2MDAgLyAxMDAwO1xuICB9XG59XG5cbi8qKlxuICogRm9yIEpTSUkuXG4gKi9cbmV4cG9ydCB7S2V5VmFsdWVQYWlyLCBJbnRlcnBvbGF0aW9ufSBmcm9tICcuLi8uLi90eXBlcy9jb21tb24nO1xuIl19
@@ -1,18 +0,0 @@
1
- import { IOutputModelInterface } from '../interfaces';
2
- import { KeyValuePair } from '../../types/common';
3
- export declare class WattTimeGridEmissions implements IOutputModelInterface {
4
- authParams: object | undefined;
5
- token: string;
6
- staticParams: object | undefined;
7
- name: string | undefined;
8
- baseUrl: string;
9
- authenticate(authParams: object): Promise<void>;
10
- execute(inputs: object | object[] | undefined): Promise<any[]>;
11
- private getWattTimeDataForDuration;
12
- private validateinputs;
13
- private getLatitudeLongitudeFrominput;
14
- private determineinputStartEnd;
15
- fetchData(input: KeyValuePair): Promise<KeyValuePair[]>;
16
- configure(name: string, staticParams: object | undefined): Promise<IOutputModelInterface>;
17
- modelIdentifier(): string;
18
- }