@grnsft/if 0.1.9 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.commitlintrc.js +45 -0
- package/.husky/commit-msg +4 -0
- package/.husky/pre-commit +6 -0
- package/CONTRIBUTING.md +82 -109
- package/README.md +16 -12
- package/build/config/config.d.ts +4 -3
- package/build/config/config.js +11 -10
- package/build/config/params.js +17 -17
- package/build/config/strings.d.ts +9 -8
- package/build/config/strings.js +13 -12
- package/build/index.js +19 -69
- package/build/lib/aggregate.d.ts +6 -0
- package/build/lib/aggregate.js +72 -0
- package/build/lib/compute.d.ts +5 -0
- package/build/lib/compute.js +84 -0
- package/build/lib/exhaust.d.ts +6 -0
- package/build/lib/exhaust.js +47 -0
- package/build/lib/initialize.d.ts +6 -0
- package/build/lib/initialize.js +98 -0
- package/build/lib/load.d.ts +6 -0
- package/build/lib/load.js +24 -0
- package/build/lib/parameterize.d.ts +5 -0
- package/build/lib/parameterize.js +49 -0
- package/build/models/export-csv.d.ts +2 -0
- package/build/models/export-csv.js +129 -0
- package/build/models/export-log.d.ts +4 -0
- package/build/models/export-log.js +18 -0
- package/build/models/export-yaml.d.ts +4 -0
- package/build/models/export-yaml.js +24 -0
- package/build/models/group-by.d.ts +11 -0
- package/build/models/group-by.js +56 -0
- package/build/models/index.d.ts +2 -1
- package/build/models/index.js +5 -3
- package/build/models/time-sync.d.ts +2 -57
- package/build/models/time-sync.js +204 -158
- package/build/types/aggregation.js +5 -0
- package/build/types/compute.d.ts +25 -0
- package/build/types/compute.js +3 -0
- package/build/types/exhaust-plugin-interface.d.ts +7 -0
- package/build/types/exhaust-plugin-interface.js +3 -0
- package/build/types/group-by.d.ts +3 -0
- package/build/types/group-by.js +3 -0
- package/build/types/initialize.d.ts +4 -0
- package/build/types/initialize.js +3 -0
- package/build/types/interface.d.ts +8 -0
- package/build/types/interface.js +3 -0
- package/build/types/load.d.ts +7 -0
- package/build/types/load.js +3 -0
- package/build/types/manifest.d.ts +40 -0
- package/build/types/manifest.js +3 -0
- package/build/types/parameters.d.ts +4 -5
- package/build/types/parameters.js +1 -1
- package/build/types/process-args.d.ts +3 -5
- package/build/types/process-args.js +1 -1
- package/build/types/time-sync.d.ts +9 -2
- package/build/types/time-sync.js +1 -1
- package/build/util/aggregation-helper.d.ts +6 -0
- package/build/util/aggregation-helper.js +56 -0
- package/build/util/args.d.ts +6 -3
- package/build/util/args.js +21 -17
- package/build/util/errors.d.ts +1 -1
- package/build/util/errors.js +8 -4
- package/build/util/helpers.d.ts +4 -0
- package/build/util/helpers.js +23 -4
- package/build/util/json.d.ts +4 -0
- package/build/util/json.js +16 -0
- package/build/util/logger.d.ts +5 -0
- package/build/util/logger.js +40 -0
- package/build/util/validations.d.ts +22 -19
- package/build/util/validations.js +41 -34
- package/examples/{impls/test → manifests}/azure-importer.yml +8 -8
- package/examples/manifests/basic-demo.yml +75 -0
- package/examples/manifests/basic.yml +27 -0
- package/examples/manifests/boavizta-pipeline.yml +85 -0
- package/examples/{impls/test → manifests}/boavizta.yml +11 -12
- package/examples/{impls/test → manifests}/ccf.yml +9 -10
- package/examples/manifests/cim.yml +20 -0
- package/examples/manifests/cloud-metadata.yml +41 -0
- package/examples/manifests/co2js.yml +30 -0
- package/examples/manifests/coefficient.yml +23 -0
- package/examples/manifests/csv-export.yml +34 -0
- package/examples/manifests/e-mem.yml +21 -0
- package/examples/{impls/test → manifests}/e-net.yml +9 -8
- package/examples/manifests/generics.yml +71 -0
- package/examples/manifests/group-by.yml +48 -0
- package/examples/manifests/mock-observation.yml +33 -0
- package/examples/manifests/multiply.yml +23 -0
- package/examples/manifests/nesting-demo.yml +89 -0
- package/examples/manifests/nesting.yml +215 -0
- package/examples/manifests/pipeline-demo-1.yml +85 -0
- package/examples/manifests/pipeline-demo-2.yml +149 -0
- package/examples/manifests/pipeline-demo.yml +128 -0
- package/examples/manifests/pipeline-teads-sci.yml +82 -0
- package/examples/manifests/pipeline-with-generics.yml +147 -0
- package/examples/manifests/pipeline-with-mocks.yml +146 -0
- package/examples/{impls/test → manifests}/sci-e.yml +6 -8
- package/examples/manifests/sci-m.yml +23 -0
- package/examples/{impls/test → manifests}/sci-o.yml +10 -10
- package/examples/{impls/test → manifests}/sci.yml +10 -9
- package/examples/manifests/shell.yml +20 -0
- package/examples/manifests/sum.yml +23 -0
- package/examples/{impls/test → manifests}/tdp-finder.yml +6 -7
- package/examples/manifests/teads-aws.yml +22 -0
- package/examples/manifests/teads-curve.yml +20 -0
- package/examples/manifests/time-sync.yml +32 -0
- package/examples/manifests/watt-time.yml +42 -0
- package/jest.config.js +6 -1
- package/package.json +13 -8
- package/src/__tests__/integration/templates/integration.yaml +16 -0
- package/src/models/README.md +6 -6
- package/tsconfig.test.json +1 -1
- package/Makefile +0 -16
- package/build/lib/aggregator.d.ts +0 -7
- package/build/lib/aggregator.js +0 -46
- package/build/lib/models-universe.d.ts +0 -40
- package/build/lib/models-universe.js +0 -145
- package/build/lib/observatory.d.ts +0 -20
- package/build/lib/observatory.js +0 -31
- package/build/lib/supercomputer.d.ts +0 -39
- package/build/lib/supercomputer.js +0 -116
- package/build/types/aggregator.js +0 -5
- package/build/types/impl.d.ts +0 -92
- package/build/types/impl.js +0 -19
- package/build/types/model-interface.d.ts +0 -13
- package/build/types/model-interface.js +0 -3
- package/build/types/models-universe.d.ts +0 -20
- package/build/types/models-universe.js +0 -3
- package/build/types/supercomputer.d.ts +0 -4
- package/build/types/supercomputer.js +0 -3
- package/build/util/param-selectors.d.ts +0 -5
- package/build/util/param-selectors.js +0 -14
- package/examples/impls/case-studies/accenture.yml +0 -155
- package/examples/impls/case-studies/aggregation.yml +0 -97
- package/examples/impls/case-studies/aveva.yaml +0 -48
- package/examples/impls/case-studies/azure-yassine.yaml +0 -67
- package/examples/impls/case-studies/boavizta.yml +0 -26
- package/examples/impls/case-studies/dow_msft.yml +0 -173
- package/examples/impls/case-studies/farm-insights.yaml +0 -35
- package/examples/impls/case-studies/gsf-website.yaml +0 -93
- package/examples/impls/case-studies/msft-eshoppen.yaml +0 -162
- package/examples/impls/case-studies/msft-green-ai.yaml +0 -58
- package/examples/impls/case-studies/ntt-data-on-premise.yaml +0 -201
- package/examples/impls/test/aggregation-test.yml +0 -109
- package/examples/impls/test/aggregation-test2.yml +0 -52
- package/examples/impls/test/cim.yml +0 -19
- package/examples/impls/test/e-mem.yml +0 -19
- package/examples/impls/test/if-demo.yml +0 -59
- package/examples/impls/test/large-impl.yml +0 -257303
- package/examples/impls/test/metadata.yml +0 -21
- package/examples/impls/test/nesting.yml +0 -113
- package/examples/impls/test/new-params-test.yml +0 -35
- package/examples/impls/test/sci-m.yml +0 -24
- package/examples/impls/test/shell.yml +0 -19
- package/examples/impls/test/teads-cpu.yml +0 -18
- package/examples/impls/test/time-sync-avoid-padding.yml +0 -50
- package/examples/impls/test/time-sync.yml +0 -76
- package/examples/ompls/aggregation-test.yml +0 -340
- package/examples/ompls/aggregation-test2.yml +0 -83
- package/examples/ompls/azure-importer.yml +0 -145
- package/examples/ompls/boavizta.yml +0 -32
- package/examples/ompls/ccf.yml +0 -29
- package/examples/ompls/cim.yml +0 -29
- package/examples/ompls/complex-pipeline.yml +0 -105
- package/examples/ompls/e-mem.yml +0 -26
- package/examples/ompls/full-sci.yml +0 -64
- package/examples/ompls/if-demo.yml +0 -517
- package/examples/ompls/metadata.yml +0 -29
- package/examples/ompls/nesting.yml +0 -113
- package/examples/ompls/sci-e.yml +0 -23
- package/examples/ompls/sci-m.yml +0 -33
- package/examples/ompls/sci-o.yml +0 -29
- package/examples/ompls/sci.yml +0 -37
- package/examples/ompls/shell.yml +0 -23
- package/examples/ompls/teads-cpu.yml +0 -24
- package/examples/ompls/time-sync.yml +0 -212
- /package/build/types/{aggregator.d.ts → aggregation.d.ts} +0 -0
package/.commitlintrc.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
extends: ['@commitlint/config-conventional'],
|
|
3
|
+
rules: {
|
|
4
|
+
'type-enum': [
|
|
5
|
+
2,
|
|
6
|
+
'always',
|
|
7
|
+
[
|
|
8
|
+
'feat',
|
|
9
|
+
'fix',
|
|
10
|
+
'docs',
|
|
11
|
+
'chore',
|
|
12
|
+
'style',
|
|
13
|
+
'refactor',
|
|
14
|
+
'ci',
|
|
15
|
+
'test',
|
|
16
|
+
'revert',
|
|
17
|
+
],
|
|
18
|
+
],
|
|
19
|
+
'scope-enum': [
|
|
20
|
+
2,
|
|
21
|
+
'always',
|
|
22
|
+
[
|
|
23
|
+
'util',
|
|
24
|
+
'lib',
|
|
25
|
+
'types',
|
|
26
|
+
'src',
|
|
27
|
+
'package',
|
|
28
|
+
'config',
|
|
29
|
+
'mocks',
|
|
30
|
+
'examples',
|
|
31
|
+
'.github',
|
|
32
|
+
'.husky',
|
|
33
|
+
'scripts',
|
|
34
|
+
'models',
|
|
35
|
+
'plugins',
|
|
36
|
+
'integration',
|
|
37
|
+
'doc'
|
|
38
|
+
]
|
|
39
|
+
],
|
|
40
|
+
'scope-empty': [
|
|
41
|
+
2,
|
|
42
|
+
'never'
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
};
|
package/CONTRIBUTING.md
CHANGED
|
@@ -8,149 +8,132 @@ The following document is a rule set of guidelines for contributing.
|
|
|
8
8
|
## Table of Contents <!-- omit from toc -->
|
|
9
9
|
|
|
10
10
|
- [Code Contributions](#code-contributions)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- [Step 6: Pull Request](#step-6-pull-request)
|
|
17
|
-
- [Commit message guidelines](#commit-message-guidelines)
|
|
11
|
+
- [Step 1: Fork](#step-1-fork)
|
|
12
|
+
- [Step 2: Branch](#step-2-branch)
|
|
13
|
+
- [Step 3: Commit](#step-3-commit)
|
|
14
|
+
- [Step 5: Push](#step-5-push)
|
|
15
|
+
- [Step 6: Pull Request](#step-6-pull-request)
|
|
18
16
|
- [Coding guidelines](#coding-guidelines)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- [Naming patterns](#naming-patterns)
|
|
17
|
+
- [Code structuring patterns](#code-structuring-patterns)
|
|
18
|
+
- [Functional Programming](#functional-programming)
|
|
19
|
+
- [Naming conventions](#naming-conventions)
|
|
23
20
|
- [Documentation](#documentation)
|
|
24
|
-
|
|
21
|
+
- [Writing tests](#writing-tests)
|
|
25
22
|
|
|
26
23
|
## Code Contributions
|
|
27
24
|
|
|
28
|
-
|
|
25
|
+
### Step 1: Fork
|
|
29
26
|
|
|
30
|
-
Fork the project on [GitHub](
|
|
27
|
+
Fork the project on [GitHub](https://github.com/Green-Software-Foundation/if)
|
|
31
28
|
|
|
32
29
|
You then have your own copy of the repository that you can change.
|
|
33
30
|
|
|
34
|
-
|
|
31
|
+
### Step 2: Branch
|
|
35
32
|
|
|
36
33
|
Create new branch in your forked copy of the `if` repository, which will contain your new feature, fix or change.
|
|
37
34
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
```bash
|
|
36
|
+
$ git checkout -b <topic-branch-name>
|
|
37
|
+
```
|
|
41
38
|
|
|
42
|
-
|
|
39
|
+
### Step 3: Commit
|
|
43
40
|
|
|
44
41
|
Make sure git knows your name and email address:
|
|
45
42
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
43
|
+
```bash
|
|
44
|
+
$ git config --global user.name "Example User"
|
|
45
|
+
$ git config --global user.email "user@example.com"
|
|
46
|
+
```
|
|
50
47
|
|
|
51
|
-
|
|
48
|
+
Each commit should cover one change to one resource. You should not add multiple changes to a single commit.
|
|
52
49
|
Commit message should clearly describe on which resource changes are made.
|
|
50
|
+
For the commit message, we adhere to the [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) specification.
|
|
51
|
+
Conventional commits are organized with a type, a scope and a description. The type can be one of:
|
|
52
|
+
|
|
53
|
+
- 'feat',
|
|
54
|
+
- 'fix',
|
|
55
|
+
- 'docs',
|
|
56
|
+
- 'chore',
|
|
57
|
+
- 'style',
|
|
58
|
+
- 'refactor',
|
|
59
|
+
- 'ci',
|
|
60
|
+
- 'test',
|
|
61
|
+
- 'revert',
|
|
62
|
+
- 'package',
|
|
53
63
|
|
|
54
|
-
|
|
64
|
+
The scope is optional but should refer to the part of the codebase you are amending in the commit, e.g. `lib`, `types` etc.
|
|
65
|
+
|
|
66
|
+
Here's an example of a valid commit message:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
feat(lib): initial commit for time-sync logic
|
|
70
|
+
```
|
|
55
71
|
|
|
56
|
-
|
|
57
|
-
$ git add my/changed/files
|
|
58
|
-
$ git commit
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Commit your changes in logical chunks. Please do not push all changes in one commit.
|
|
72
|
+
or
|
|
62
73
|
|
|
63
|
-
|
|
74
|
+
```
|
|
75
|
+
test(lib): in teads-curve add unit test to check that error is raised on missing tdp param
|
|
76
|
+
```
|
|
64
77
|
|
|
65
|
-
|
|
66
|
-
or your code is unlikely be merged into the main project.
|
|
78
|
+
Run `npm run fix` before commiting. If your commit message does not conform to the conventional commit specification or if you have not run `npm run fix` your commit will not satisfy the commitlint check.
|
|
67
79
|
|
|
68
|
-
|
|
80
|
+
Add and commit with your commit message:
|
|
69
81
|
|
|
70
|
-
|
|
82
|
+
```bash
|
|
83
|
+
$ git add my/changed/files
|
|
84
|
+
$ git commit -m "<type-of-commit>(<my-optional-scope>): <my-commit-message>"
|
|
85
|
+
```
|
|
71
86
|
|
|
72
|
-
|
|
73
|
-
$ git pull upstream dev
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
#### Step 5: Push
|
|
87
|
+
### Step 5: Push
|
|
77
88
|
|
|
78
89
|
Push your topic branch to your fork:
|
|
79
90
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
91
|
+
```bash
|
|
92
|
+
$ git push origin <topic-branch-name>
|
|
93
|
+
```
|
|
83
94
|
|
|
84
|
-
|
|
95
|
+
### Step 6: Pull Request
|
|
85
96
|
|
|
86
97
|
Open a Pull Request from your fork of the repository to the `dev` branch of the IF repository with a clear title and description according to [template](.github/PULL_REQUEST_TEMPLATE.md).
|
|
87
98
|
|
|
88
|
-
Pull
|
|
89
|
-
|
|
90
|
-
CI included lint checks, running tests, and etc.
|
|
91
|
-
|
|
92
|
-
## Commit message guidelines
|
|
93
|
-
|
|
94
|
-
The commit message should describe what changed and why.
|
|
95
|
-
|
|
96
|
-
1. The first line should:
|
|
97
|
-
* contain a short description of the change
|
|
98
|
-
* be 60 characters or less
|
|
99
|
-
* be prefixed with the name of the changed subsystem
|
|
100
|
-
* be entirely in lowercase with the exception of proper nouns, acronyms, and the words that refer to code,
|
|
101
|
-
like function/variable names
|
|
102
|
-
|
|
103
|
-
Examples:
|
|
104
|
-
|
|
105
|
-
```
|
|
106
|
-
util: add getInitializedModel method to models.
|
|
107
|
-
deps: add express package to dependencies.
|
|
108
|
-
service: refactor get user.
|
|
109
|
-
```
|
|
110
|
-
2. Keep the second line blank.
|
|
111
|
-
|
|
112
|
-
3. Wrap all other lines at 72 columns:
|
|
113
|
-
* describe each line in logical chunks
|
|
114
|
-
* start each line with: space hyphen space ( - ...)
|
|
115
|
-
* be entirely in lowercase with the exception of proper nouns, acronyms, and the words that refer to code,
|
|
116
|
-
like function/variable names
|
|
117
|
-
|
|
118
|
-
Examples:
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
- remove deprecated logger
|
|
122
|
-
- refactor some method
|
|
123
|
-
- add JSDoc on existing function
|
|
124
|
-
```
|
|
99
|
+
Pull requests will not be reviewed unless they pass all CI. This includes a lint check and running our unit tests.
|
|
100
|
+
|
|
125
101
|
## Coding guidelines
|
|
126
102
|
|
|
127
|
-
|
|
103
|
+
### Code structuring patterns
|
|
128
104
|
|
|
129
105
|
Avoid having functions which are responsible to do multiple things at the same time. Make sure one function/method does one thing, and does it well.
|
|
130
106
|
|
|
131
|
-
|
|
107
|
+
### Functional Programming
|
|
132
108
|
|
|
133
|
-
|
|
109
|
+
We have a preference towards functional programming styles in the IF. This is because it makes it easier for different functions to be developed in isolation, composed in complex ways and executed in parallel.
|
|
134
110
|
|
|
135
|
-
|
|
111
|
+
We recommend starting with these [basic principles and guidelines](https://dev.to/jamesrweb/principles-of-functional-programming-4b7c) for functional programming.
|
|
136
112
|
|
|
137
|
-
When designing module of the application in `Functional Programming` paradigm, the key to follow [basic](https://dev.to/jamesrweb/principles-of-functional-programming-4b7c) principles.
|
|
138
113
|
|
|
139
|
-
|
|
114
|
+
### Naming conventions
|
|
140
115
|
|
|
141
|
-
|
|
116
|
+
We prefer not to use abbreviations of contractions in parameter names.
|
|
142
117
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
118
|
+
Using fully descriptive names makes the code more readable, which in turn helps reviewers and anyone else aiming to understand how the plugin works.
|
|
119
|
+
|
|
120
|
+
It also helps to avoid ambiguity and naming collisions within and across plugins. Your name should describe what an element does as precisely as practically possible.
|
|
121
|
+
|
|
122
|
+
For example, we prefer `functionalUnit` to `funcUnit`, `fUnit`, or any other abbreviation.
|
|
123
|
+
|
|
124
|
+
In Typescript code we use lower Camel case (`likeThis`) for variable and function names and Pascal/Upper Camel case for class, type, enum, and interface names (`LikeThis`).
|
|
125
|
+
|
|
126
|
+
In yaml files, we prefer to use kebab-case (`like-this`) for field names. For example:
|
|
127
|
+
|
|
128
|
+
`energy-network` is the field name for the energy consumed by networking for an application
|
|
129
|
+
`functional-unit` is the unit in which to express an SCI value.
|
|
130
|
+
|
|
131
|
+
Global constants can be given capitalized names, such as `TIME_UNITS_IN_SECONDS`.
|
|
146
132
|
|
|
147
|
-
❌ const a = (txt: string) => console.log(txt)
|
|
148
|
-
✅ const logMessage = (message: string) => console.log(message)
|
|
149
|
-
```
|
|
150
133
|
|
|
151
134
|
#### Documentation
|
|
152
135
|
|
|
153
|
-
Every logical unit (`
|
|
136
|
+
Every logical unit (`function, method`) should be covered with appropriate documentation. For documenting such, multi-line comment style is used.
|
|
154
137
|
|
|
155
138
|
```ts
|
|
156
139
|
❌ const a = (message: string) => console.log(message)
|
|
@@ -162,19 +145,9 @@ Every logical unit (`Class, function, method`) should be covered with appropriat
|
|
|
162
145
|
const logMessage = (message: string) => console.log(message)
|
|
163
146
|
```
|
|
164
147
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
```ts
|
|
168
|
-
class MockClass {
|
|
169
|
-
// this is a mock field
|
|
170
|
-
❌ private mockField: string = "mock-field"
|
|
171
|
-
✅ private mockField: string = "mock-field" // Single line documenting style is used.
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
#### Writing tests
|
|
148
|
+
### Writing tests
|
|
176
149
|
|
|
177
|
-
One test file should be responsible for one module. `describe` blocks should be used for module and function/method description. First `describe` should follow `resource/module: ` pattern. Second describe title should follow `method(): ` pattern. Test units can use
|
|
150
|
+
One test file should be responsible for one module. `describe` blocks should be used for module and function/method description. First `describe` should follow `resource/module: ` pattern. Second describe title should follow `method(): ` pattern. Test units can use `it` blocks whose title should exactly describe behaviour and input argument.
|
|
178
151
|
|
|
179
152
|
See example:
|
|
180
153
|
```ts
|
|
@@ -187,4 +160,4 @@ describe('util/args: ', () => {
|
|
|
187
160
|
})
|
|
188
161
|
```
|
|
189
162
|
|
|
190
|
-
*[⬅️ back to the root](/README.md#ief)*
|
|
163
|
+
*[⬅️ back to the root](/README.md#ief)*
|
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
>
|
|
13
13
|
> CarbonHack is open to all, including software practitioners and those with a passion for Green Software.
|
|
14
14
|
>
|
|
15
|
-
> Find out more about CarbonHack 2024 on the [CarbonHack website](https://grnsft.org/hack/github). Check out the [FAQ on GitHub](https://
|
|
15
|
+
> Find out more about CarbonHack 2024 on the [CarbonHack website](https://grnsft.org/hack/github). Check out the [FAQ on GitHub](https://grnsft.org/hack/faq).
|
|
16
16
|
>
|
|
17
17
|
> Registration opens 15th January!
|
|
18
18
|
----------------------------
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
|
|
35
35
|
Modern applications are composed of many smaller pieces of software (components) running on many different environments, for example, private cloud, public cloud, bare-metal, virtualized, containerized, mobile, laptops, and desktops.
|
|
36
36
|
|
|
37
|
-
Every environment requires a different
|
|
37
|
+
Every environment requires a different plugin of measurement, and there is no single solution you can use to calculate the environmental impacts for all components across all environments.
|
|
38
38
|
|
|
39
39
|
The friction to measuring software emissions isn't that we need to know how, it's that we run software on many things and each thing has several different ways to measure.
|
|
40
40
|
|
|
@@ -43,34 +43,34 @@ Read the [specification and design docs](https://if.greensoftware.foundation) to
|
|
|
43
43
|
|
|
44
44
|
## Get started
|
|
45
45
|
|
|
46
|
-
The first thing to understand is that IF is a framework for running
|
|
46
|
+
The first thing to understand is that IF is a framework for running plugins. This means that in order to do some calculations, you need to load some plugins from some external resource. We provide a [standard library of plugins](https://github.com/Green-Software-Foundation/if-plugins) and a repository of [community plugins](https://github.com/Green-Software-Foundation/if-unofficial-plugins) to get you started.
|
|
47
47
|
|
|
48
48
|
Start by installing framework itself:
|
|
49
49
|
|
|
50
50
|
```sh
|
|
51
51
|
npm install -g "@grnsft/if"
|
|
52
52
|
```
|
|
53
|
-
Then installing some
|
|
53
|
+
Then installing some plugins:
|
|
54
54
|
|
|
55
55
|
```sh
|
|
56
|
-
npm install -g "@grnsft/if-
|
|
56
|
+
npm install -g "@grnsft/if-plugins"
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
Then create
|
|
59
|
+
Then create a `manifest` file that describes your application (see our docs for a detailed explanation).
|
|
60
60
|
|
|
61
|
-
Then, run `
|
|
61
|
+
Then, run `if` using the following command:
|
|
62
62
|
|
|
63
63
|
```sh
|
|
64
|
-
|
|
64
|
+
ie --manifest <path-to-your-manifest-file>
|
|
65
65
|
```
|
|
66
66
|
|
|
67
67
|
You can also add an optional savepath for your output yaml (if you do not provide one, the output will be printed to the console):
|
|
68
68
|
|
|
69
69
|
```sh
|
|
70
|
-
|
|
70
|
+
ie --manifest <path-to-your-manifest-file> --output <your-savepath>
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
The `
|
|
73
|
+
The `ie` CLI tool will configure and run the plugins defined in your input `yaml` (`manifest`) and return the results as an output `yaml` (`output`).
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
## Documentation
|
|
@@ -79,13 +79,17 @@ Please read our documentation at [if.greensoftware.foundation](https://if.greens
|
|
|
79
79
|
|
|
80
80
|
## Video walk-through
|
|
81
81
|
|
|
82
|
-
Watch this video to learn how to create and run
|
|
82
|
+
Watch this video to learn how to create and run a `manifest`.
|
|
83
83
|
|
|
84
84
|
[](https://youtu.be/GW37Qd4AQbU)
|
|
85
85
|
|
|
86
86
|
|
|
87
87
|
## Contributing
|
|
88
88
|
|
|
89
|
-
To contribute to IF, please fork this repository and raise a pull request from your fork.
|
|
89
|
+
To contribute to IF, please fork this repository and raise a pull request from your fork.
|
|
90
|
+
|
|
91
|
+
You can check our issue board for issues tagged `help-wanted`. These are issues that are not currently, actively being worked on by the core team but are well-scoped enough for someone to pick up. We recommend commenting on the issue to start a chat with the core team, then start working on the issue when you have been assigned to it. This process helps to ensure your work is aligned with our roadmap and makes it much more likely that your changes will get merged compared to unsolicited PRs.
|
|
90
92
|
|
|
91
93
|
Please read the full contribution guidelines at [if.greensoftware.foundation](https://if.greensoftware.foundation/Contributing)
|
|
94
|
+
|
|
95
|
+
The same guidelines also apply to `if-docs`, `if-plugins` and `if-unofficial-plugins`.
|
package/build/config/config.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { ArgumentConfig } from 'ts-command-line-args';
|
|
2
|
-
import {
|
|
2
|
+
import { ManifestProcessArgs } from '../types/process-args';
|
|
3
3
|
export declare const CONFIG: {
|
|
4
4
|
impact: {
|
|
5
|
-
ARGS: ArgumentConfig<
|
|
5
|
+
ARGS: ArgumentConfig<ManifestProcessArgs>;
|
|
6
6
|
HELP: string;
|
|
7
7
|
};
|
|
8
8
|
GITHUB_PATH: string;
|
|
9
|
-
|
|
9
|
+
NATIVE_PLUGIN: string;
|
|
10
|
+
AGGREGATION_ADDITIONAL_PARAMS: string[];
|
|
10
11
|
};
|
package/build/config/config.js
CHANGED
|
@@ -4,16 +4,16 @@ exports.CONFIG = void 0;
|
|
|
4
4
|
exports.CONFIG = {
|
|
5
5
|
impact: {
|
|
6
6
|
ARGS: {
|
|
7
|
-
|
|
7
|
+
manifest: {
|
|
8
8
|
type: String,
|
|
9
9
|
optional: true,
|
|
10
10
|
alias: 'i',
|
|
11
|
-
description: 'Path to an input
|
|
11
|
+
description: 'Path to an input manifest file.',
|
|
12
12
|
},
|
|
13
|
-
|
|
13
|
+
output: {
|
|
14
14
|
type: String,
|
|
15
15
|
optional: true,
|
|
16
|
-
description: 'Path to the output
|
|
16
|
+
description: 'Path to the output file where the results as saved, if none is provided it prints to stdout.',
|
|
17
17
|
},
|
|
18
18
|
'override-params': {
|
|
19
19
|
type: String,
|
|
@@ -39,19 +39,20 @@ exports.CONFIG = {
|
|
|
39
39
|
},
|
|
40
40
|
},
|
|
41
41
|
HELP: `impact
|
|
42
|
-
-
|
|
43
|
-
-
|
|
42
|
+
-manifest [path to the input file]
|
|
43
|
+
-output [path to the output file]
|
|
44
44
|
-format [yaml|csv]
|
|
45
45
|
-verbose
|
|
46
46
|
-help
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
manifest: path to an input manifest
|
|
48
|
+
output: path to the output file where the results as saved, if none is provided it prints to stdout.
|
|
49
49
|
format: the output file format. default to yaml but if csv is specified then it formats the outputs as a csv file for loading into another program.
|
|
50
50
|
verbose: how much information to output about the calculation to aid investigation and debugging.
|
|
51
51
|
help: prints out the above help instruction.
|
|
52
52
|
`,
|
|
53
53
|
},
|
|
54
54
|
GITHUB_PATH: 'https://github.com',
|
|
55
|
-
|
|
55
|
+
NATIVE_PLUGIN: 'if-models',
|
|
56
|
+
AGGREGATION_ADDITIONAL_PARAMS: ['timestamp', 'duration'],
|
|
56
57
|
};
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSWEsUUFBQSxNQUFNLEdBQUc7SUFDcEIsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFO1lBQ0osUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxNQUFNO2dCQUNaLFFBQVEsRUFBRSxJQUFJO2dCQUNkLEtBQUssRUFBRSxHQUFHO2dCQUNWLFdBQVcsRUFBRSxpQ0FBaUM7YUFDL0M7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLE1BQU07Z0JBQ1osUUFBUSxFQUFFLElBQUk7Z0JBQ2QsV0FBVyxFQUNULDhGQUE4RjthQUNqRztZQUNELGlCQUFpQixFQUFFO2dCQUNqQixJQUFJLEVBQUUsTUFBTTtnQkFDWixRQUFRLEVBQUUsSUFBSTtnQkFDZCxXQUFXLEVBQUUsdURBQXVEO2FBQ3JFO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxNQUFNO2dCQUNaLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFDVCw2SUFBNkk7Z0JBQy9JLFlBQVksRUFBRSxNQUFNO2FBQ3JCO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFDVCwwRkFBMEY7YUFDN0Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsV0FBVyxFQUFFLDBCQUEwQjthQUN4QztTQUNxQztRQUN4QyxJQUFJLEVBQUU7Ozs7Ozs7Ozs7O0dBV1A7S0FDQTtJQUNELFdBQVcsRUFBRSxvQkFBb0I7SUFDakMsYUFBYSxFQUFFLFdBQVc7SUFDMUIsNkJBQTZCLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO0NBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FyZ3VtZW50Q29uZmlnfSBmcm9tICd0cy1jb21tYW5kLWxpbmUtYXJncyc7XG5cbmltcG9ydCB7TWFuaWZlc3RQcm9jZXNzQXJnc30gZnJvbSAnLi4vdHlwZXMvcHJvY2Vzcy1hcmdzJztcblxuZXhwb3J0IGNvbnN0IENPTkZJRyA9IHtcbiAgaW1wYWN0OiB7XG4gICAgQVJHUzoge1xuICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgYWxpYXM6ICdpJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGFuIGlucHV0IG1hbmlmZXN0IGZpbGUuJyxcbiAgICAgIH0sXG4gICAgICBvdXRwdXQ6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1BhdGggdG8gdGhlIG91dHB1dCBmaWxlIHdoZXJlIHRoZSByZXN1bHRzIGFzIHNhdmVkLCBpZiBub25lIGlzIHByb3ZpZGVkIGl0IHByaW50cyB0byBzdGRvdXQuJyxcbiAgICAgIH0sXG4gICAgICAnb3ZlcnJpZGUtcGFyYW1zJzoge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYSBwYXJhbWV0ZXIgZmlsZSB0aGF0IG92ZXJyaWRlcyBvdXIgZGVmYXVsdHMuJyxcbiAgICAgIH0sXG4gICAgICBmb3JtYXQ6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1RoZSBvdXRwdXQgZmlsZSBmb3JtYXQuIGRlZmF1bHQgdG8geWFtbCBidXQgaWYgY3N2IGlzIHNwZWNpZmllZCB0aGVuIGl0IGZvcm1hdHMgdGhlIG91dHB1dHMgYXMgYSBjc3YgZmlsZSBmb3IgbG9hZGluZyBpbnRvIGFub3RoZXIgcHJvZ3JhbS4nLFxuICAgICAgICBkZWZhdWx0VmFsdWU6ICd5YW1sJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnSG93IG11Y2ggaW5mb3JtYXRpb24gdG8gb3V0cHV0IGFib3V0IHRoZSBjYWxjdWxhdGlvbiB0byBhaWQgaW52ZXN0aWdhdGlvbiBhbmQgZGVidWdnaW5nLicsXG4gICAgICB9LFxuICAgICAgaGVscDoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgYWxpYXM6ICdoJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdQcmludHMgdGhpcyB1c2FnZSBndWlkZS4nLFxuICAgICAgfSxcbiAgICB9IGFzIEFyZ3VtZW50Q29uZmlnPE1hbmlmZXN0UHJvY2Vzc0FyZ3M+LFxuICAgIEhFTFA6IGBpbXBhY3QgXG4gIC1tYW5pZmVzdCBbcGF0aCB0byB0aGUgaW5wdXQgZmlsZV1cbiAgLW91dHB1dCBbcGF0aCB0byB0aGUgb3V0cHV0IGZpbGVdXG4gIC1mb3JtYXQgW3lhbWx8Y3N2XSBcbiAgLXZlcmJvc2VcbiAgLWhlbHAgXG4gIG1hbmlmZXN0OiBwYXRoIHRvIGFuIGlucHV0IG1hbmlmZXN0XG4gIG91dHB1dDogcGF0aCB0byB0aGUgb3V0cHV0IGZpbGUgd2hlcmUgdGhlIHJlc3VsdHMgYXMgc2F2ZWQsIGlmIG5vbmUgaXMgcHJvdmlkZWQgaXQgcHJpbnRzIHRvIHN0ZG91dC5cbiAgZm9ybWF0OiB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0LiBkZWZhdWx0IHRvIHlhbWwgYnV0IGlmIGNzdiBpcyBzcGVjaWZpZWQgdGhlbiBpdCBmb3JtYXRzIHRoZSBvdXRwdXRzIGFzIGEgY3N2IGZpbGUgZm9yIGxvYWRpbmcgaW50byBhbm90aGVyIHByb2dyYW0uXG4gIHZlcmJvc2U6IGhvdyBtdWNoIGluZm9ybWF0aW9uIHRvIG91dHB1dCBhYm91dCB0aGUgY2FsY3VsYXRpb24gdG8gYWlkIGludmVzdGlnYXRpb24gYW5kIGRlYnVnZ2luZy5cbiAgaGVscDogcHJpbnRzIG91dCB0aGUgYWJvdmUgaGVscCBpbnN0cnVjdGlvbi5cbiAgYCxcbiAgfSxcbiAgR0lUSFVCX1BBVEg6ICdodHRwczovL2dpdGh1Yi5jb20nLFxuICBOQVRJVkVfUExVR0lOOiAnaWYtbW9kZWxzJyxcbiAgQUdHUkVHQVRJT05fQURESVRJT05BTF9QQVJBTVM6IFsndGltZXN0YW1wJywgJ2R1cmF0aW9uJ10sXG59O1xuIl19
|
package/build/config/params.js
CHANGED
|
@@ -7,12 +7,12 @@ exports.PARAMETERS = {
|
|
|
7
7
|
unit: 'gCO2e',
|
|
8
8
|
aggregation: 'sum',
|
|
9
9
|
},
|
|
10
|
-
'
|
|
10
|
+
'cpu/number-cores': {
|
|
11
11
|
description: 'number of cores available',
|
|
12
12
|
unit: 'cores',
|
|
13
13
|
aggregation: 'none',
|
|
14
14
|
},
|
|
15
|
-
'cpu
|
|
15
|
+
'cpu/utilization': {
|
|
16
16
|
description: 'refers to CPU utilization.',
|
|
17
17
|
unit: 'percentage',
|
|
18
18
|
aggregation: 'avg',
|
|
@@ -32,27 +32,27 @@ exports.PARAMETERS = {
|
|
|
32
32
|
unit: 'kWh',
|
|
33
33
|
aggregation: 'sum',
|
|
34
34
|
},
|
|
35
|
-
'energy
|
|
35
|
+
'cpu/energy': {
|
|
36
36
|
description: 'Energy consumed by the CPU of the component',
|
|
37
37
|
unit: 'kWh',
|
|
38
38
|
aggregation: 'sum',
|
|
39
39
|
},
|
|
40
|
-
'expected-lifespan': {
|
|
40
|
+
'device/expected-lifespan': {
|
|
41
41
|
description: 'Total Expected Lifespan of the Component in Seconds',
|
|
42
42
|
unit: 'seconds',
|
|
43
43
|
aggregation: 'sum',
|
|
44
44
|
},
|
|
45
|
-
'energy
|
|
45
|
+
'memory/energy': {
|
|
46
46
|
description: 'Energy consumed by the Memory of the component',
|
|
47
47
|
unit: 'kWh',
|
|
48
48
|
aggregation: 'sum',
|
|
49
49
|
},
|
|
50
|
-
'embodied
|
|
50
|
+
'carbon-embodied': {
|
|
51
51
|
description: 'Embodied Emissions of the component',
|
|
52
52
|
unit: 'gCO2e',
|
|
53
53
|
aggregation: 'sum',
|
|
54
54
|
},
|
|
55
|
-
'energy
|
|
55
|
+
'network/energy': {
|
|
56
56
|
description: 'Energy consumed by the Network of the component',
|
|
57
57
|
unit: 'kWh',
|
|
58
58
|
aggregation: 'sum',
|
|
@@ -72,32 +72,32 @@ exports.PARAMETERS = {
|
|
|
72
72
|
unit: 'percentage',
|
|
73
73
|
aggregation: 'avg',
|
|
74
74
|
},
|
|
75
|
-
'grid
|
|
75
|
+
'grid/carbon-intensity': {
|
|
76
76
|
description: 'Carbon intensity for the grid',
|
|
77
77
|
unit: 'gCO2eq/kWh',
|
|
78
78
|
aggregation: 'avg',
|
|
79
79
|
},
|
|
80
|
-
'instance-type': {
|
|
80
|
+
'cloud/instance-type': {
|
|
81
81
|
description: 'Type of Cloud Instance name used in the cloud provider APIs',
|
|
82
82
|
unit: 'None',
|
|
83
83
|
aggregation: 'none',
|
|
84
84
|
},
|
|
85
|
-
|
|
85
|
+
geolocation: {
|
|
86
86
|
description: 'Geographic location of provider as string (for watt-time model it is provided as latitude and longitude, comma separated, in decimal degrees)',
|
|
87
87
|
unit: 'None (decimal degrees for watt-time model)',
|
|
88
88
|
aggregation: 'none',
|
|
89
89
|
},
|
|
90
|
-
'operational
|
|
90
|
+
'carbon-operational': {
|
|
91
91
|
description: 'Operational Emissions of the component',
|
|
92
92
|
unit: 'gCO2e',
|
|
93
93
|
aggregation: 'sum',
|
|
94
94
|
},
|
|
95
|
-
'
|
|
95
|
+
'cpu/name': {
|
|
96
96
|
description: 'Name of the physical processor',
|
|
97
97
|
unit: 'None',
|
|
98
98
|
aggregation: 'none',
|
|
99
99
|
},
|
|
100
|
-
vendor: {
|
|
100
|
+
'cloud/vendor': {
|
|
101
101
|
description: 'Name of the cloud service provider in the ccf model. Can be aws, gcp or azure',
|
|
102
102
|
unit: 'None',
|
|
103
103
|
aggregation: 'none',
|
|
@@ -117,12 +117,12 @@ exports.PARAMETERS = {
|
|
|
117
117
|
unit: 'count',
|
|
118
118
|
aggregation: 'none',
|
|
119
119
|
},
|
|
120
|
-
'thermal-design-power': {
|
|
120
|
+
'cpu/thermal-design-power': {
|
|
121
121
|
description: 'thermal design power for a processor',
|
|
122
122
|
unit: 'kwh',
|
|
123
123
|
aggregation: 'avg',
|
|
124
124
|
},
|
|
125
|
-
'
|
|
125
|
+
'device/emissions-embodied': {
|
|
126
126
|
description: 'total embodied emissions of some component',
|
|
127
127
|
unit: 'gCO2e',
|
|
128
128
|
aggregation: 'sum',
|
|
@@ -137,10 +137,10 @@ exports.PARAMETERS = {
|
|
|
137
137
|
unit: 'seconds',
|
|
138
138
|
aggregation: 'avg',
|
|
139
139
|
},
|
|
140
|
-
'total
|
|
140
|
+
'resources-total': {
|
|
141
141
|
description: 'total resources available',
|
|
142
142
|
unit: 'count',
|
|
143
143
|
aggregation: 'none',
|
|
144
144
|
},
|
|
145
145
|
};
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9wYXJhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxVQUFVLEdBQWU7SUFDcEMsTUFBTSxFQUFFO1FBQ04sV0FBVyxFQUFFLGlEQUFpRDtRQUM5RCxJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0Qsa0JBQWtCLEVBQUU7UUFDbEIsV0FBVyxFQUFFLDJCQUEyQjtRQUN4QyxJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0QsaUJBQWlCLEVBQUU7UUFDakIsV0FBVyxFQUFFLDRCQUE0QjtRQUN6QyxJQUFJLEVBQUUsWUFBWTtRQUNsQixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFNBQVMsRUFBRTtRQUNULFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsSUFBSSxFQUFFLElBQUk7UUFDVixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxxQ0FBcUM7UUFDbEQsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRSw0Q0FBNEM7UUFDekQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFlBQVksRUFBRTtRQUNaLFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELDBCQUEwQixFQUFFO1FBQzFCLFdBQVcsRUFBRSxxREFBcUQ7UUFDbEUsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGVBQWUsRUFBRTtRQUNmLFdBQVcsRUFBRSxnREFBZ0Q7UUFDN0QsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLFdBQVcsRUFBRSxxQ0FBcUM7UUFDbEQsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGdCQUFnQixFQUFFO1FBQ2hCLFdBQVcsRUFBRSxpREFBaUQ7UUFDOUQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLFdBQVcsRUFDVCx3R0FBd0c7UUFDMUcsSUFBSSxFQUFFLE1BQU07UUFDWixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELHNCQUFzQixFQUFFO1FBQ3RCLFdBQVcsRUFDVCx5R0FBeUc7UUFDM0csSUFBSSxFQUFFLE1BQU07UUFDWixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELFVBQVUsRUFBRTtRQUNWLFdBQVcsRUFBRSw0QkFBNEI7UUFDekMsSUFBSSxFQUFFLFlBQVk7UUFDbEIsV0FBVyxFQUFFLEtBQUs7S0FDbkI7SUFDRCx1QkFBdUIsRUFBRTtRQUN2QixXQUFXLEVBQUUsK0JBQStCO1FBQzVDLElBQUksRUFBRSxZQUFZO1FBQ2xCLFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0QscUJBQXFCLEVBQUU7UUFDckIsV0FBVyxFQUFFLDZEQUE2RDtRQUMxRSxJQUFJLEVBQUUsTUFBTTtRQUNaLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsV0FBVyxFQUNULCtJQUErSTtRQUNqSixJQUFJLEVBQUUsNENBQTRDO1FBQ2xELFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0Qsb0JBQW9CLEVBQUU7UUFDcEIsV0FBVyxFQUFFLHdDQUF3QztRQUNyRCxJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsV0FBVyxFQUFFLGdDQUFnQztRQUM3QyxJQUFJLEVBQUUsTUFBTTtRQUNaLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0QsY0FBYyxFQUFFO1FBQ2QsV0FBVyxFQUNULCtFQUErRTtRQUNqRixJQUFJLEVBQUUsTUFBTTtRQUNaLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsV0FBVyxFQUFFLG1DQUFtQztRQUNoRCxJQUFJLEVBQUUsSUFBSTtRQUNWLFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsV0FBVyxFQUFFLDBDQUEwQztRQUN2RCxJQUFJLEVBQUUsWUFBWTtRQUNsQixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELG9CQUFvQixFQUFFO1FBQ3BCLFdBQVcsRUFBRSx1Q0FBdUM7UUFDcEQsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELDBCQUEwQixFQUFFO1FBQzFCLFdBQVcsRUFBRSxzQ0FBc0M7UUFDbkQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELDJCQUEyQixFQUFFO1FBQzNCLFdBQVcsRUFBRSw0Q0FBNEM7UUFDekQsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFNBQVMsRUFBRTtRQUNULFdBQVcsRUFBRSwrQ0FBK0M7UUFDNUQsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELGVBQWUsRUFBRTtRQUNmLFdBQVcsRUFBRSwrQkFBK0I7UUFDNUMsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLFdBQVcsRUFBRSwyQkFBMkI7UUFDeEMsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsTUFBTTtLQUNwQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BhcmFtZXRlcnN9IGZyb20gJy4uL3R5cGVzL3BhcmFtZXRlcnMnO1xuXG5leHBvcnQgY29uc3QgUEFSQU1FVEVSUzogUGFyYW1ldGVycyA9IHtcbiAgY2FyYm9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdhbiBhbW91bnQgb2YgY2FyYm9uIGVtaXR0ZWQgaW50byB0aGUgYXRtb3NwaGVyZScsXG4gICAgdW5pdDogJ2dDTzJlJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gICdjcHUvbnVtYmVyLWNvcmVzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnbnVtYmVyIG9mIGNvcmVzIGF2YWlsYWJsZScsXG4gICAgdW5pdDogJ2NvcmVzJyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAnY3B1L3V0aWxpemF0aW9uJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIENQVSB1dGlsaXphdGlvbi4nLFxuICAgIHVuaXQ6ICdwZXJjZW50YWdlJyxcbiAgICBhZ2dyZWdhdGlvbjogJ2F2ZycsXG4gIH0sXG4gICdkaXNrLWlvJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIEdCIG9mIGRhdGEgd3JpdHRlbi9yZWFkIGZyb20gZGlzaycsXG4gICAgdW5pdDogJ0dCJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gIGR1cmF0aW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gdGhlIGR1cmF0aW9uIG9mIHRoZSBpbnB1dCcsXG4gICAgdW5pdDogJ3NlY29uZHMnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgZW5lcmd5OiB7XG4gICAgZGVzY3JpcHRpb246ICdhbW91bnQgb2YgZW5lcmd5IHV0aWxpc2VkIGJ5IHRoZSBjb21wb25lbnQnLFxuICAgIHVuaXQ6ICdrV2gnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgJ2NwdS9lbmVyZ3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbmVyZ3kgY29uc3VtZWQgYnkgdGhlIENQVSBvZiB0aGUgY29tcG9uZW50JyxcbiAgICB1bml0OiAna1doJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gICdkZXZpY2UvZXhwZWN0ZWQtbGlmZXNwYW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBFeHBlY3RlZCBMaWZlc3BhbiBvZiB0aGUgQ29tcG9uZW50IGluIFNlY29uZHMnLFxuICAgIHVuaXQ6ICdzZWNvbmRzJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gICdtZW1vcnkvZW5lcmd5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRW5lcmd5IGNvbnN1bWVkIGJ5IHRoZSBNZW1vcnkgb2YgdGhlIGNvbXBvbmVudCcsXG4gICAgdW5pdDogJ2tXaCcsXG4gICAgYWdncmVnYXRpb246ICdzdW0nLFxuICB9LFxuICAnY2FyYm9uLWVtYm9kaWVkJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRW1ib2RpZWQgRW1pc3Npb25zIG9mIHRoZSBjb21wb25lbnQnLFxuICAgIHVuaXQ6ICdnQ08yZScsXG4gICAgYWdncmVnYXRpb246ICdzdW0nLFxuICB9LFxuICAnbmV0d29yay9lbmVyZ3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbmVyZ3kgY29uc3VtZWQgYnkgdGhlIE5ldHdvcmsgb2YgdGhlIGNvbXBvbmVudCcsXG4gICAgdW5pdDogJ2tXaCcsXG4gICAgYWdncmVnYXRpb246ICdzdW0nLFxuICB9LFxuICAnZnVuY3Rpb25hbC11bml0Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbmFsIHVuaXQgaW4gd2hpY2ggdGhlIGZpbmFsIFNDSSB2YWx1ZSBzaG91bGQgYmUgZXhwcmVzc2VkLCBlLmcuIHJlcXVlc3RzLCB1c2VycycsXG4gICAgdW5pdDogJ25vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgJ2Z1bmN0aW9uYWwtdW5pdC10aW1lJzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ3N0cmluZyBkZXNjcmliaW5nIHRoZSB1bml0IG9mIHRpbWUgaW4gd2hpY2ggdGhlIGZpbmFsIFNDSSBjYWxjdWxhdGlvbiBzaG91bGQgYmUgZXhwcmVzc2VkLCBlLmcuIFwiMS1taW5cIicsXG4gICAgdW5pdDogJ25vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG4gICdncHUtdXRpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3JlZmVycyB0byBDUFUgdXRpbGl6YXRpb24uJyxcbiAgICB1bml0OiAncGVyY2VudGFnZScsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAnZ3JpZC9jYXJib24taW50ZW5zaXR5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2FyYm9uIGludGVuc2l0eSBmb3IgdGhlIGdyaWQnLFxuICAgIHVuaXQ6ICdnQ08yZXEva1doJyxcbiAgICBhZ2dyZWdhdGlvbjogJ2F2ZycsXG4gIH0sXG4gICdjbG91ZC9pbnN0YW5jZS10eXBlJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVHlwZSBvZiBDbG91ZCBJbnN0YW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNsb3VkIHByb3ZpZGVyIEFQSXMnLFxuICAgIHVuaXQ6ICdOb25lJyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICBnZW9sb2NhdGlvbjoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0dlb2dyYXBoaWMgbG9jYXRpb24gb2YgcHJvdmlkZXIgYXMgc3RyaW5nIChmb3Igd2F0dC10aW1lIG1vZGVsIGl0IGlzIHByb3ZpZGVkIGFzIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUsIGNvbW1hIHNlcGFyYXRlZCwgaW4gZGVjaW1hbCBkZWdyZWVzKScsXG4gICAgdW5pdDogJ05vbmUgKGRlY2ltYWwgZGVncmVlcyBmb3Igd2F0dC10aW1lIG1vZGVsKScsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ2NhcmJvbi1vcGVyYXRpb25hbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ09wZXJhdGlvbmFsIEVtaXNzaW9ucyBvZiB0aGUgY29tcG9uZW50JyxcbiAgICB1bml0OiAnZ0NPMmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgJ2NwdS9uYW1lJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnTmFtZSBvZiB0aGUgcGh5c2ljYWwgcHJvY2Vzc29yJyxcbiAgICB1bml0OiAnTm9uZScsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ2Nsb3VkL3ZlbmRvcic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdOYW1lIG9mIHRoZSBjbG91ZCBzZXJ2aWNlIHByb3ZpZGVyIGluIHRoZSBjY2YgbW9kZWwuIENhbiBiZSBhd3MsIGdjcCBvciBhenVyZScsXG4gICAgdW5pdDogJ05vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG4gICdyYW0tYWxsb2MnOiB7XG4gICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gR0Igb2YgbWVtb3J5IGFsbG9jYXRlZC4nLFxuICAgIHVuaXQ6ICdHQicsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAncmFtLXV0aWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gcGVyY2VudGFnZSBvZiBtZW1vcnkgdXRpbGl6ZWQuJyxcbiAgICB1bml0OiAncGVyY2VudGFnZScsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAncmVzb3VyY2VzLXJlc2VydmVkJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVzb3VyY2VzIHJlc2VydmVkIGZvciBhbiBhcHBsaWNhdGlvbicsXG4gICAgdW5pdDogJ2NvdW50JyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAnY3B1L3RoZXJtYWwtZGVzaWduLXBvd2VyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAndGhlcm1hbCBkZXNpZ24gcG93ZXIgZm9yIGEgcHJvY2Vzc29yJyxcbiAgICB1bml0OiAna3doJyxcbiAgICBhZ2dyZWdhdGlvbjogJ2F2ZycsXG4gIH0sXG4gICdkZXZpY2UvZW1pc3Npb25zLWVtYm9kaWVkJzoge1xuICAgIGRlc2NyaXB0aW9uOiAndG90YWwgZW1ib2RpZWQgZW1pc3Npb25zIG9mIHNvbWUgY29tcG9uZW50JyxcbiAgICB1bml0OiAnZ0NPMmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgdGltZXN0YW1wOiB7XG4gICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gdGhlIHRpbWUgb2Ygb2NjdXJyZW5jZSBvZiB0aGUgaW5wdXQnLFxuICAgIHVuaXQ6ICdSRkMzMzM5JyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAndGltZS1yZXNlcnZlZCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3RpbWUgcmVzZXJ2ZWQgZm9yIGEgY29tcG9uZW50JyxcbiAgICB1bml0OiAnc2Vjb25kcycsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAncmVzb3VyY2VzLXRvdGFsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAndG90YWwgcmVzb3VyY2VzIGF2YWlsYWJsZScsXG4gICAgdW5pdDogJ2NvdW50JyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxufTtcbiJdfQ==
|