@grnsft/if 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/.devcontainer/devcontainer.json +38 -0
  2. package/.editorconfig +8 -0
  3. package/.env.example +9 -0
  4. package/.eslintignore +4 -0
  5. package/.eslintrc.json +8 -0
  6. package/.github/ISSUE_TEMPLATE/agenda.md +36 -0
  7. package/.github/ISSUE_TEMPLATE/blank-issue.md +10 -0
  8. package/.github/ISSUE_TEMPLATE/feedback.md +42 -0
  9. package/.github/ISSUE_TEMPLATE/model-plugin.md +63 -0
  10. package/.github/ISSUE_TEMPLATE/user-story.md +10 -0
  11. package/.github/PULL_REQUEST_TEMPLATE.md +21 -0
  12. package/.github/workflows/nodejs-ci.yml +34 -0
  13. package/.gitmodules +3 -0
  14. package/.prettierrc.js +3 -0
  15. package/CONTRIBUTING.md +194 -0
  16. package/LICENSE +21 -0
  17. package/Makefile +16 -0
  18. package/README.md +67 -0
  19. package/build/__mocks__/azure/index.d.ts +11 -0
  20. package/build/__mocks__/azure/index.js +132 -0
  21. package/build/__mocks__/boavizta/countries.json +138 -0
  22. package/build/__mocks__/boavizta/instance_types.json +625 -0
  23. package/build/__mocks__/boavizta/providers.json +1 -0
  24. package/build/__mocks__/fs/index.d.ts +3 -0
  25. package/build/__mocks__/fs/index.js +56 -0
  26. package/build/__mocks__/model-universe/index.d.ts +33 -0
  27. package/build/__mocks__/model-universe/index.js +68 -0
  28. package/build/__mocks__/watt-time/data.json +119 -0
  29. package/build/__tests__/integration/ompl/index.test.d.ts +1 -0
  30. package/build/__tests__/integration/ompl/index.test.js +61 -0
  31. package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +1 -0
  32. package/build/__tests__/unit/lib/azure-importer/index.test.js +152 -0
  33. package/build/__tests__/unit/lib/boavizta/index.test.d.ts +1 -0
  34. package/build/__tests__/unit/lib/boavizta/index.test.js +579 -0
  35. package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +1 -0
  36. package/build/__tests__/unit/lib/case-studies/aveva.test.js +36 -0
  37. package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +1 -0
  38. package/build/__tests__/unit/lib/case-studies/emem.test.js +108 -0
  39. package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +1 -0
  40. package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +53 -0
  41. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +1 -0
  42. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +23 -0
  43. package/build/__tests__/unit/lib/ccf/index.test.d.ts +1 -0
  44. package/build/__tests__/unit/lib/ccf/index.test.js +223 -0
  45. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +1 -0
  46. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +73 -0
  47. package/build/__tests__/unit/lib/sci/index.test.d.ts +1 -0
  48. package/build/__tests__/unit/lib/sci/index.test.js +106 -0
  49. package/build/__tests__/unit/lib/sci-e/index.test.d.ts +1 -0
  50. package/build/__tests__/unit/lib/sci-e/index.test.js +30 -0
  51. package/build/__tests__/unit/lib/sci-m/index.test.d.ts +1 -0
  52. package/build/__tests__/unit/lib/sci-m/index.test.js +58 -0
  53. package/build/__tests__/unit/lib/sci-o/index.test.d.ts +1 -0
  54. package/build/__tests__/unit/lib/sci-o/index.test.js +42 -0
  55. package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +1 -0
  56. package/build/__tests__/unit/lib/shell-imp/index.test.js +21 -0
  57. package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +1 -0
  58. package/build/__tests__/unit/lib/tdp-finder/index.test.js +62 -0
  59. package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +1 -0
  60. package/build/__tests__/unit/lib/teads-aws/index.test.js +170 -0
  61. package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +1 -0
  62. package/build/__tests__/unit/lib/teads-curve/index.test.js +146 -0
  63. package/build/__tests__/unit/lib/watt-time/index.test.d.ts +1 -0
  64. package/build/__tests__/unit/lib/watt-time/index.test.js +106 -0
  65. package/build/__tests__/unit/util/args.test.d.ts +1 -0
  66. package/build/__tests__/unit/util/args.test.js +92 -0
  67. package/build/__tests__/unit/util/models-universe.test.d.ts +1 -0
  68. package/build/__tests__/unit/util/models-universe.test.js +211 -0
  69. package/build/__tests__/unit/util/observatory.test.d.ts +1 -0
  70. package/build/__tests__/unit/util/observatory.test.js +91 -0
  71. package/build/__tests__/unit/util/supercomputer.test.d.ts +1 -0
  72. package/build/__tests__/unit/util/supercomputer.test.js +231 -0
  73. package/build/__tests__/unit/util/yaml.test.d.ts +1 -0
  74. package/build/__tests__/unit/util/yaml.test.js +59 -0
  75. package/build/config/config.d.ts +32 -0
  76. package/build/config/config.js +74 -0
  77. package/build/config/index.d.ts +2 -0
  78. package/build/config/index.js +8 -0
  79. package/build/config/strings.d.ts +14 -0
  80. package/build/config/strings.js +30 -0
  81. package/build/index.d.ts +1 -0
  82. package/build/index.js +46 -0
  83. package/build/lib/azure-importer/index.d.ts +55 -0
  84. package/build/lib/azure-importer/index.js +314 -0
  85. package/build/lib/boavizta/index.d.ts +53 -0
  86. package/build/lib/boavizta/index.js +254 -0
  87. package/build/lib/case-studies/aveva-model.d.ts +29 -0
  88. package/build/lib/case-studies/aveva-model.js +53 -0
  89. package/build/lib/case-studies/emem-model.d.ts +42 -0
  90. package/build/lib/case-studies/emem-model.js +93 -0
  91. package/build/lib/case-studies/eshoppen-model.d.ts +24 -0
  92. package/build/lib/case-studies/eshoppen-model.js +123 -0
  93. package/build/lib/case-studies/index.d.ts +4 -0
  94. package/build/lib/case-studies/index.js +21 -0
  95. package/build/lib/case-studies/sci-accenture-model.d.ts +10 -0
  96. package/build/lib/case-studies/sci-accenture-model.js +37 -0
  97. package/build/lib/ccf/aws-embodied.json +5591 -0
  98. package/build/lib/ccf/aws-instances.json +21116 -0
  99. package/build/lib/ccf/aws-use.json +79 -0
  100. package/build/lib/ccf/azure-embodied.json +6547 -0
  101. package/build/lib/ccf/azure-instances.json +8332 -0
  102. package/build/lib/ccf/azure-use.json +58 -0
  103. package/build/lib/ccf/gcp-embodied.json +3049 -0
  104. package/build/lib/ccf/gcp-instances.json +3880 -0
  105. package/build/lib/ccf/gcp-use.json +58 -0
  106. package/build/lib/ccf/index.d.ts +63 -0
  107. package/build/lib/ccf/index.js +338 -0
  108. package/build/lib/cloud-instance-metadata/aws-instances.json +1 -0
  109. package/build/lib/cloud-instance-metadata/azure-instances.json +1 -0
  110. package/build/lib/cloud-instance-metadata/index.d.ts +15 -0
  111. package/build/lib/cloud-instance-metadata/index.js +104 -0
  112. package/build/lib/index.d.ts +15 -0
  113. package/build/lib/index.js +32 -0
  114. package/build/lib/interfaces/ccf.d.ts +19 -0
  115. package/build/lib/interfaces/ccf.js +3 -0
  116. package/build/lib/interfaces/index.d.ts +7 -0
  117. package/build/lib/interfaces/index.js +18 -0
  118. package/build/lib/sci/index.d.ts +13 -0
  119. package/build/lib/sci/index.js +131 -0
  120. package/build/lib/sci-e/index.d.ts +38 -0
  121. package/build/lib/sci-e/index.js +85 -0
  122. package/build/lib/sci-m/index.d.ts +10 -0
  123. package/build/lib/sci-m/index.js +124 -0
  124. package/build/lib/sci-o/index.d.ts +17 -0
  125. package/build/lib/sci-o/index.js +52 -0
  126. package/build/lib/shell-imp/index.d.ts +32 -0
  127. package/build/lib/shell-imp/index.js +82 -0
  128. package/build/lib/tdp-finder/index.d.ts +19 -0
  129. package/build/lib/tdp-finder/index.js +98 -0
  130. package/build/lib/teads-aws/aws-embodied.json +1 -0
  131. package/build/lib/teads-aws/aws-instances.json +1 -0
  132. package/build/lib/teads-aws/index.d.ts +58 -0
  133. package/build/lib/teads-aws/index.js +208 -0
  134. package/build/lib/teads-curve/index.d.ts +52 -0
  135. package/build/lib/teads-curve/index.js +158 -0
  136. package/build/lib/watt-time/index.d.ts +18 -0
  137. package/build/lib/watt-time/index.js +204 -0
  138. package/build/types/azure-importer.d.ts +29 -0
  139. package/build/types/azure-importer.js +3 -0
  140. package/build/types/boavizta.d.ts +7 -0
  141. package/build/types/boavizta.js +3 -0
  142. package/build/types/common.d.ts +7 -0
  143. package/build/types/common.js +9 -0
  144. package/build/types/impl.d.ts +40 -0
  145. package/build/types/impl.js +3 -0
  146. package/build/types/models-universe.d.ts +24 -0
  147. package/build/types/models-universe.js +3 -0
  148. package/build/types/process-args.d.ts +7 -0
  149. package/build/types/process-args.js +3 -0
  150. package/build/types/supercomputer.d.ts +4 -0
  151. package/build/types/supercomputer.js +3 -0
  152. package/build/util/args.d.ts +8 -0
  153. package/build/util/args.js +48 -0
  154. package/build/util/errors.d.ts +6 -0
  155. package/build/util/errors.js +22 -0
  156. package/build/util/helpers.d.ts +4 -0
  157. package/build/util/helpers.js +18 -0
  158. package/build/util/models-universe.d.ts +28 -0
  159. package/build/util/models-universe.js +95 -0
  160. package/build/util/observatory.d.ts +20 -0
  161. package/build/util/observatory.js +31 -0
  162. package/build/util/supercomputer.d.ts +30 -0
  163. package/build/util/supercomputer.js +109 -0
  164. package/build/util/validations.d.ts +25 -0
  165. package/build/util/validations.js +52 -0
  166. package/build/util/yaml.d.ts +13 -0
  167. package/build/util/yaml.js +36 -0
  168. package/coverage/clover.xml +1172 -0
  169. package/coverage/coverage-final.json +27 -0
  170. package/coverage/lcov-report/base.css +224 -0
  171. package/coverage/lcov-report/block-navigation.js +87 -0
  172. package/coverage/lcov-report/config/config.ts.html +310 -0
  173. package/coverage/lcov-report/config/index.html +146 -0
  174. package/coverage/lcov-report/config/index.ts.html +91 -0
  175. package/coverage/lcov-report/config/strings.ts.html +118 -0
  176. package/coverage/lcov-report/favicon.png +0 -0
  177. package/coverage/lcov-report/index.html +341 -0
  178. package/coverage/lcov-report/lib/boavizta/index.html +116 -0
  179. package/coverage/lcov-report/lib/boavizta/index.ts.html +1171 -0
  180. package/coverage/lcov-report/lib/case-studies/aveva-model.ts.html +277 -0
  181. package/coverage/lcov-report/lib/case-studies/emem-model.ts.html +439 -0
  182. package/coverage/lcov-report/lib/case-studies/eshoppen-model.ts.html +550 -0
  183. package/coverage/lcov-report/lib/case-studies/index.html +176 -0
  184. package/coverage/lcov-report/lib/case-studies/index.ts.html +97 -0
  185. package/coverage/lcov-report/lib/case-studies/sci-accenture-model.ts.html +232 -0
  186. package/coverage/lcov-report/lib/ccf/index.html +116 -0
  187. package/coverage/lcov-report/lib/ccf/index.ts.html +1339 -0
  188. package/coverage/lcov-report/lib/cloud-instance-metadata/index.html +116 -0
  189. package/coverage/lcov-report/lib/cloud-instance-metadata/index.ts.html +370 -0
  190. package/coverage/lcov-report/lib/index.html +116 -0
  191. package/coverage/lcov-report/lib/index.ts.html +121 -0
  192. package/coverage/lcov-report/lib/sci/index.html +116 -0
  193. package/coverage/lcov-report/lib/sci/index.ts.html +571 -0
  194. package/coverage/lcov-report/lib/sci-e/index.html +116 -0
  195. package/coverage/lcov-report/lib/sci-e/index.ts.html +403 -0
  196. package/coverage/lcov-report/lib/sci-m/index.html +116 -0
  197. package/coverage/lcov-report/lib/sci-m/index.ts.html +487 -0
  198. package/coverage/lcov-report/lib/sci-o/index.html +116 -0
  199. package/coverage/lcov-report/lib/sci-o/index.ts.html +265 -0
  200. package/coverage/lcov-report/lib/shell-imp/index.html +116 -0
  201. package/coverage/lcov-report/lib/shell-imp/index.ts.html +376 -0
  202. package/coverage/lcov-report/lib/teads-aws/index.html +116 -0
  203. package/coverage/lcov-report/lib/teads-aws/index.ts.html +823 -0
  204. package/coverage/lcov-report/lib/teads-curve/index.html +116 -0
  205. package/coverage/lcov-report/lib/teads-curve/index.ts.html +625 -0
  206. package/coverage/lcov-report/lib/watt-time/index.html +116 -0
  207. package/coverage/lcov-report/lib/watt-time/index.ts.html +829 -0
  208. package/coverage/lcov-report/prettify.css +1 -0
  209. package/coverage/lcov-report/prettify.js +2 -0
  210. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  211. package/coverage/lcov-report/sorter.js +196 -0
  212. package/coverage/lcov-report/types/common.ts.html +109 -0
  213. package/coverage/lcov-report/types/index.html +116 -0
  214. package/coverage/lcov-report/util/args.ts.html +244 -0
  215. package/coverage/lcov-report/util/index.html +176 -0
  216. package/coverage/lcov-report/util/models-universe.ts.html +679 -0
  217. package/coverage/lcov-report/util/observatory.ts.html +229 -0
  218. package/coverage/lcov-report/util/supercomputer.ts.html +466 -0
  219. package/coverage/lcov-report/util/yaml.ts.html +193 -0
  220. package/coverage/lcov.info +2094 -0
  221. package/docs/implementations/tdp-finder.md +36 -0
  222. package/examples/impls/case-studies/accenture.yml +155 -0
  223. package/examples/impls/case-studies/aveva.yaml +48 -0
  224. package/examples/impls/case-studies/azure-yassine.yaml +67 -0
  225. package/examples/impls/case-studies/boavizta.yml +26 -0
  226. package/examples/impls/case-studies/dow_msft.yml +173 -0
  227. package/examples/impls/case-studies/farm-insights.yaml +35 -0
  228. package/examples/impls/case-studies/gsf-website.yaml +93 -0
  229. package/examples/impls/case-studies/msft-eshoppen.yaml +162 -0
  230. package/examples/impls/case-studies/msft-green-ai.yaml +58 -0
  231. package/examples/impls/case-studies/ntt-data-on-premise.yaml +201 -0
  232. package/examples/impls/tdp-finder-test.yml +19 -0
  233. package/examples/impls/test/azure.yml +26 -0
  234. package/examples/impls/test/ccf.yml +19 -0
  235. package/examples/impls/test/complex-pipeline.yml +67 -0
  236. package/examples/impls/test/if-demo.yml +51 -0
  237. package/examples/impls/test/metadata.yml +20 -0
  238. package/examples/impls/test/nesting.yml +65 -0
  239. package/examples/impls/test/sci-e.yml +21 -0
  240. package/examples/impls/test/sci-m.yml +24 -0
  241. package/examples/impls/test/sci-o.yml +28 -0
  242. package/examples/impls/test/sci.yml +27 -0
  243. package/examples/impls/test/shell.yml +18 -0
  244. package/examples/impls/test/toto.yaml +22 -0
  245. package/examples/ompls/azure.yml +145 -0
  246. package/examples/ompls/ccf.yml +27 -0
  247. package/examples/ompls/complex-pipeline.yml +105 -0
  248. package/examples/ompls/full-sci.yml +64 -0
  249. package/examples/ompls/if-demo.yml +493 -0
  250. package/examples/ompls/metadata.yml +29 -0
  251. package/examples/ompls/nesting.yml +107 -0
  252. package/examples/ompls/sci-e.yml +23 -0
  253. package/examples/ompls/sci-m.yml +33 -0
  254. package/examples/ompls/sci-o.yml +29 -0
  255. package/examples/ompls/sci.yml +36 -0
  256. package/examples/ompls/shell.yml +23 -0
  257. package/jest.config.js +14 -0
  258. package/package.json +71 -0
  259. package/scripts/impact-test.sh +12 -0
  260. package/src/__mocks__/boavizta/countries.json +138 -0
  261. package/src/__mocks__/boavizta/instance_types.json +625 -0
  262. package/src/__mocks__/boavizta/providers.json +1 -0
  263. package/src/__mocks__/watt-time/data.json +119 -0
  264. package/src/config/units.yaml +125 -0
  265. package/src/lib/ccf/aws-embodied.json +5591 -0
  266. package/src/lib/ccf/aws-instances.json +21116 -0
  267. package/src/lib/ccf/aws-use.json +79 -0
  268. package/src/lib/ccf/azure-embodied.json +6547 -0
  269. package/src/lib/ccf/azure-instances.json +8332 -0
  270. package/src/lib/ccf/azure-use.json +58 -0
  271. package/src/lib/ccf/gcp-embodied.json +3049 -0
  272. package/src/lib/ccf/gcp-instances.json +3880 -0
  273. package/src/lib/ccf/gcp-use.json +58 -0
  274. package/src/lib/cloud-instance-metadata/aws-instances.json +1 -0
  275. package/src/lib/cloud-instance-metadata/azure-instances.json +1 -0
  276. package/src/lib/shell-imp/sampler +30 -0
  277. package/src/lib/tdp-finder/README.md +7 -0
  278. package/src/lib/tdp-finder/boavizta_data.csv +1768 -0
  279. package/src/lib/tdp-finder/data.csv +4460 -0
  280. package/src/lib/tdp-finder/data2.csv +2162 -0
  281. package/src/lib/teads-aws/aws-embodied.json +1 -0
  282. package/src/lib/teads-aws/aws-instances.json +1 -0
  283. package/tsconfig.test.json +39 -0
  284. package/tsconfig.tsbuildinfo +1 -0
  285. package/yarn-error.log +5854 -0
@@ -0,0 +1,579 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const globals_1 = require("@jest/globals");
4
+ const index_1 = require("../../../../lib/boavizta/index");
5
+ const axios_1 = require("axios");
6
+ const PROVIDERS = require("../../../../__mocks__/boavizta/providers.json");
7
+ const COUNTRIES = require("../../../../__mocks__/boavizta/countries.json");
8
+ const INSTANCE_TYPES = require("../../../../__mocks__/boavizta/instance_types.json");
9
+ async function axiosGet(url) {
10
+ switch (url) {
11
+ case 'https://api.boavizta.org/v1/cloud/instance/all_providers':
12
+ return { data: PROVIDERS };
13
+ case 'https://api.boavizta.org/v1/utils/country_code':
14
+ return Promise.resolve({ data: COUNTRIES });
15
+ case 'https://api.boavizta.org/v1/cloud/instance/all_instances?provider=aws':
16
+ return Promise.resolve({
17
+ data: INSTANCE_TYPES['aws'],
18
+ });
19
+ }
20
+ return Promise.resolve({});
21
+ }
22
+ globals_1.jest.mock('axios');
23
+ const mockAxios = axios_1.default;
24
+ // Mock out all top level functions, such as get, put, delete and post:
25
+ mockAxios.get.mockImplementation(axiosGet);
26
+ mockAxios.post.mockImplementation((url) => {
27
+ switch (url) {
28
+ case 'https://api.boavizta.org/v1/component/cpu?verbose=false&duration=1':
29
+ return Promise.resolve({
30
+ data: {
31
+ outputs: {
32
+ gwp: {
33
+ embedded: {
34
+ value: 0.0008,
35
+ min: 0.0004155,
36
+ max: 0.003113,
37
+ warnings: ['End of life is not included in the calculation'],
38
+ },
39
+ use: { value: 0.06743, min: 0.06743, max: 0.06743 },
40
+ unit: 'kgCO2eq',
41
+ description: 'Total climate change',
42
+ },
43
+ adp: {
44
+ embedded: {
45
+ value: 7.764e-7,
46
+ min: 7.763e-7,
47
+ max: 7.771e-7,
48
+ warnings: ['End of life is not included in the calculation'],
49
+ },
50
+ use: { value: 1.796e-8, min: 1.796e-8, max: 1.796e-8 },
51
+ unit: 'kgSbeq',
52
+ description: 'Use of minerals and fossil ressources',
53
+ },
54
+ pe: {
55
+ embedded: {
56
+ value: 0.012,
57
+ min: 0.006847,
58
+ max: 0.04314,
59
+ warnings: ['End of life is not included in the calculation'],
60
+ },
61
+ use: { value: 2.07, min: 2.07, max: 2.07 },
62
+ unit: 'MJ',
63
+ description: 'Consumption of primary energy',
64
+ },
65
+ },
66
+ },
67
+ });
68
+ case 'https://api.boavizta.org/v1/component/cpu?verbose=true&duration=2':
69
+ return Promise.resolve({
70
+ data: {
71
+ outputs: {
72
+ gwp: {
73
+ embedded: {
74
+ value: 0.0016,
75
+ min: 0.000831,
76
+ max: 0.006226,
77
+ warnings: ['End of life is not included in the calculation'],
78
+ },
79
+ use: { value: 0.1924, min: 0.1924, max: 0.1924 },
80
+ unit: 'kgCO2eq',
81
+ description: 'Total climate change',
82
+ },
83
+ adp: {
84
+ embedded: {
85
+ value: 0.000001553,
86
+ min: 0.000001553,
87
+ max: 0.000001554,
88
+ warnings: ['End of life is not included in the calculation'],
89
+ },
90
+ use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
91
+ unit: 'kgSbeq',
92
+ description: 'Use of minerals and fossil ressources',
93
+ },
94
+ pe: {
95
+ embedded: {
96
+ value: 0.023,
97
+ min: 0.01369,
98
+ max: 0.08627,
99
+ warnings: ['End of life is not included in the calculation'],
100
+ },
101
+ use: { value: 5.907, min: 5.907, max: 5.907 },
102
+ unit: 'MJ',
103
+ description: 'Consumption of primary energy',
104
+ },
105
+ },
106
+ verbose: {
107
+ outputs: {
108
+ gwp: {
109
+ embedded: {
110
+ value: 0.0016,
111
+ min: 0.000831,
112
+ max: 0.006226,
113
+ warnings: [
114
+ 'End of life is not included in the calculation',
115
+ ],
116
+ },
117
+ use: { value: 0.1924, min: 0.1924, max: 0.1924 },
118
+ unit: 'kgCO2eq',
119
+ description: 'Total climate change',
120
+ },
121
+ adp: {
122
+ embedded: {
123
+ value: 0.000001553,
124
+ min: 0.000001553,
125
+ max: 0.000001554,
126
+ warnings: [
127
+ 'End of life is not included in the calculation',
128
+ ],
129
+ },
130
+ use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
131
+ unit: 'kgSbeq',
132
+ description: 'Use of minerals and fossil ressources',
133
+ },
134
+ pe: {
135
+ embedded: {
136
+ value: 0.023,
137
+ min: 0.01369,
138
+ max: 0.08627,
139
+ warnings: [
140
+ 'End of life is not included in the calculation',
141
+ ],
142
+ },
143
+ use: { value: 5.907, min: 5.907, max: 5.907 },
144
+ unit: 'MJ',
145
+ description: 'Consumption of primary energy',
146
+ },
147
+ },
148
+ units: { value: 1, status: 'ARCHETYPE', min: 1, max: 1 },
149
+ die_size: {
150
+ value: 521,
151
+ status: 'COMPLETED',
152
+ unit: 'mm2',
153
+ source: 'Average value for all families',
154
+ min: 41.2,
155
+ max: 3640,
156
+ },
157
+ duration: { value: 2, unit: 'hours' },
158
+ avg_power: {
159
+ value: 260.05,
160
+ status: 'COMPLETED',
161
+ unit: 'W',
162
+ min: 260.05,
163
+ max: 260.05,
164
+ },
165
+ time_workload: { value: 100, status: 'INPUT', unit: '%' },
166
+ usage_location: {
167
+ value: 'USA',
168
+ status: 'INPUT',
169
+ unit: 'CodSP3 - NCS Country Codes - NATO',
170
+ },
171
+ use_time_ratio: {
172
+ value: 1,
173
+ status: 'ARCHETYPE',
174
+ unit: '/1',
175
+ min: 1,
176
+ max: 1,
177
+ },
178
+ hours_life_time: {
179
+ value: 26280,
180
+ status: 'ARCHETYPE',
181
+ unit: 'hours',
182
+ min: 26280,
183
+ max: 26280,
184
+ },
185
+ params: {
186
+ value: { a: 171.2, b: 0.0354, c: 36.89, d: -10.13 },
187
+ status: 'ARCHETYPE',
188
+ },
189
+ gwp_factor: {
190
+ value: 0.37,
191
+ status: 'COMPLETED',
192
+ unit: 'kg CO2eq/kWh',
193
+ source: 'https://ember-climate.org/data/data-explorer',
194
+ min: 0.37,
195
+ max: 0.37,
196
+ },
197
+ adp_factor: {
198
+ value: 9.85548e-8,
199
+ status: 'COMPLETED',
200
+ unit: 'kg Sbeq/kWh',
201
+ source: 'ADEME Base outputS ®',
202
+ min: 9.85548e-8,
203
+ max: 9.85548e-8,
204
+ },
205
+ pe_factor: {
206
+ value: 11.358,
207
+ status: 'COMPLETED',
208
+ unit: 'MJ/kWh',
209
+ source: 'ADPf / (1-%renewable_energy)',
210
+ min: 11.358,
211
+ max: 11.358,
212
+ },
213
+ },
214
+ },
215
+ });
216
+ case 'https://api.boavizta.org/v1/cloud/instance?verbose=false&duration=0.004166666666666667':
217
+ return Promise.resolve({
218
+ data: {
219
+ outputs: {
220
+ gwp: {
221
+ embedded: {
222
+ value: 0.0016,
223
+ min: 0.000831,
224
+ max: 0.006226,
225
+ warnings: ['End of life is not included in the calculation'],
226
+ },
227
+ use: { value: 0.1924, min: 0.1924, max: 0.1924 },
228
+ unit: 'kgCO2eq',
229
+ description: 'Total climate change',
230
+ },
231
+ adp: {
232
+ embedded: {
233
+ value: 0.000001553,
234
+ min: 0.000001553,
235
+ max: 0.000001554,
236
+ warnings: ['End of life is not included in the calculation'],
237
+ },
238
+ use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
239
+ unit: 'kgSbeq',
240
+ description: 'Use of minerals and fossil ressources',
241
+ },
242
+ pe: {
243
+ embedded: {
244
+ value: 0.023,
245
+ min: 0.01369,
246
+ max: 0.08627,
247
+ warnings: ['End of life is not included in the calculation'],
248
+ },
249
+ use: { value: 5.907, min: 5.907, max: 5.907 },
250
+ unit: 'MJ',
251
+ description: 'Consumption of primary energy',
252
+ },
253
+ },
254
+ verbose: {
255
+ outputs: {
256
+ gwp: {
257
+ embedded: {
258
+ value: 0.0016,
259
+ min: 0.000831,
260
+ max: 0.006226,
261
+ warnings: [
262
+ 'End of life is not included in the calculation',
263
+ ],
264
+ },
265
+ use: { value: 0.1924, min: 0.1924, max: 0.1924 },
266
+ unit: 'kgCO2eq',
267
+ description: 'Total climate change',
268
+ },
269
+ adp: {
270
+ embedded: {
271
+ value: 0.000001553,
272
+ min: 0.000001553,
273
+ max: 0.000001554,
274
+ warnings: [
275
+ 'End of life is not included in the calculation',
276
+ ],
277
+ },
278
+ use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
279
+ unit: 'kgSbeq',
280
+ description: 'Use of minerals and fossil ressources',
281
+ },
282
+ pe: {
283
+ embedded: {
284
+ value: 0.023,
285
+ min: 0.01369,
286
+ max: 0.08627,
287
+ warnings: [
288
+ 'End of life is not included in the calculation',
289
+ ],
290
+ },
291
+ use: { value: 5.907, min: 5.907, max: 5.907 },
292
+ unit: 'MJ',
293
+ description: 'Consumption of primary energy',
294
+ },
295
+ },
296
+ units: { value: 1, status: 'ARCHETYPE', min: 1, max: 1 },
297
+ die_size: {
298
+ value: 521,
299
+ status: 'COMPLETED',
300
+ unit: 'mm2',
301
+ source: 'Average value for all families',
302
+ min: 41.2,
303
+ max: 3640,
304
+ },
305
+ duration: { value: 2, unit: 'hours' },
306
+ avg_power: {
307
+ value: 260.05,
308
+ status: 'COMPLETED',
309
+ unit: 'W',
310
+ min: 260.05,
311
+ max: 260.05,
312
+ },
313
+ time_workload: { value: 100, status: 'INPUT', unit: '%' },
314
+ usage_location: {
315
+ value: 'USA',
316
+ status: 'INPUT',
317
+ unit: 'CodSP3 - NCS Country Codes - NATO',
318
+ },
319
+ use_time_ratio: {
320
+ value: 1,
321
+ status: 'ARCHETYPE',
322
+ unit: '/1',
323
+ min: 1,
324
+ max: 1,
325
+ },
326
+ hours_life_time: {
327
+ value: 26280,
328
+ status: 'ARCHETYPE',
329
+ unit: 'hours',
330
+ min: 26280,
331
+ max: 26280,
332
+ },
333
+ params: {
334
+ value: { a: 171.2, b: 0.0354, c: 36.89, d: -10.13 },
335
+ status: 'ARCHETYPE',
336
+ },
337
+ gwp_factor: {
338
+ value: 0.37,
339
+ status: 'COMPLETED',
340
+ unit: 'kg CO2eq/kWh',
341
+ source: 'https://ember-climate.org/data/data-explorer',
342
+ min: 0.37,
343
+ max: 0.37,
344
+ },
345
+ adp_factor: {
346
+ value: 9.85548e-8,
347
+ status: 'COMPLETED',
348
+ unit: 'kg Sbeq/kWh',
349
+ source: 'ADEME Base outputS ®',
350
+ min: 9.85548e-8,
351
+ max: 9.85548e-8,
352
+ },
353
+ pe_factor: {
354
+ value: 11.358,
355
+ status: 'COMPLETED',
356
+ unit: 'MJ/kWh',
357
+ source: 'ADPf / (1-%renewable_energy)',
358
+ min: 11.358,
359
+ max: 11.358,
360
+ },
361
+ },
362
+ },
363
+ });
364
+ }
365
+ return Promise.resolve({});
366
+ });
367
+ globals_1.jest.setTimeout(30000);
368
+ (0, globals_1.describe)('cpu:configure test', () => {
369
+ (0, globals_1.test)('initialize wrong params should throw error', async () => {
370
+ const outputModel = new index_1.BoaviztaCpuOutputModel();
371
+ await (0, globals_1.expect)(outputModel.configure('test', { allocation: 'wrong' })).rejects.toThrowError();
372
+ (0, globals_1.expect)(outputModel.name).toBe('test');
373
+ });
374
+ (0, globals_1.test)('initialize without params throws error for parameter and call execute without params throws error for input', async () => {
375
+ const outputModel = new index_1.BoaviztaCpuOutputModel();
376
+ const outputModelConfigFail = new index_1.BoaviztaCpuOutputModel();
377
+ (0, globals_1.expect)(outputModel.modelIdentifier()).toBe('org.boavizta.cpu.sci');
378
+ await (0, globals_1.expect)(outputModel.authenticate({})).resolves.toBe(undefined);
379
+ await (0, globals_1.expect)(outputModelConfigFail.execute([
380
+ {
381
+ timestamp: '2021-01-01T00:00:00Z',
382
+ duration: 3600,
383
+ 'cpu-util': 50,
384
+ },
385
+ ])).rejects.toThrowError();
386
+ await (0, globals_1.expect)(outputModel.configure('test')).rejects.toThrow(Error('Improper configure: Missing processor parameter'));
387
+ await (0, globals_1.expect)(outputModel.configure('test', {
388
+ 'physical-processor': 'Intel Xeon Gold 6138f',
389
+ })).rejects.toThrow(Error('Improper configure: Missing core-units parameter'));
390
+ await (0, globals_1.expect)(outputModel.configure('test', {
391
+ 'physical-processor': 'Intel Xeon Gold 6138f',
392
+ 'core-units': 24,
393
+ 'expected-lifespan': 4 * 365 * 24 * 60 * 60,
394
+ })).resolves.toBeInstanceOf(index_1.BoaviztaCpuOutputModel);
395
+ (0, globals_1.expect)(outputModel.name).toBe('test');
396
+ // not providing inputs will throw a missing inputs error
397
+ await (0, globals_1.expect)(outputModel.execute()).rejects.toStrictEqual(Error('Parameter Not Given: invalid inputs parameter. Expecting an array of inputs'));
398
+ // improper inputs will throw an invalid inputs error
399
+ await (0, globals_1.expect)(outputModel.execute([{ invalid: 'input' }])).rejects.toStrictEqual(Error('Invalid Input: Invalid inputs parameter'));
400
+ });
401
+ });
402
+ (0, globals_1.describe)('cpu:initialize with params', () => {
403
+ (0, globals_1.test)('initialize with params and call multiple usages in IMPL format', async () => {
404
+ const outputModel = new index_1.BoaviztaCpuOutputModel();
405
+ await (0, globals_1.expect)(outputModel.configure('test', {
406
+ 'physical-processor': 'Intel Xeon Gold 6138f',
407
+ 'core-units': 24,
408
+ location: 'USA',
409
+ })).resolves.toBeInstanceOf(index_1.BoaviztaCpuOutputModel);
410
+ (0, globals_1.expect)(outputModel.name).toBe('test');
411
+ // configure without static params will cause improper configure error
412
+ await (0, globals_1.expect)(outputModel.execute([
413
+ {
414
+ timestamp: '2021-01-01T00:00:00Z',
415
+ duration: 3600,
416
+ 'cpu-util': 50,
417
+ },
418
+ ])).resolves.toStrictEqual([
419
+ {
420
+ 'embodied-carbon': 0.8,
421
+ 'e-cpu': 0.575,
422
+ },
423
+ ]);
424
+ });
425
+ (0, globals_1.test)('initialize with params and call multiple usages in IMPL format:verbose', async () => {
426
+ const outputModel = new index_1.BoaviztaCpuOutputModel();
427
+ await (0, globals_1.expect)(outputModel.configure('test', {
428
+ 'physical-processor': 'Intel Xeon Gold 6138f',
429
+ 'core-units': 24,
430
+ location: 'USA',
431
+ verbose: true,
432
+ })).resolves.toBeInstanceOf(index_1.BoaviztaCpuOutputModel);
433
+ (0, globals_1.expect)(outputModel.name).toBe('test');
434
+ // configure without static params will cause improper configure error
435
+ await (0, globals_1.expect)(outputModel.execute([
436
+ {
437
+ timestamp: '2021-01-01T00:00:00Z',
438
+ duration: 7200,
439
+ 'cpu-util': 100,
440
+ },
441
+ ])).resolves.toStrictEqual([
442
+ {
443
+ 'embodied-carbon': 1.6,
444
+ 'e-cpu': 1.6408333333333334,
445
+ },
446
+ ]);
447
+ });
448
+ });
449
+ (0, globals_1.describe)('cloud:initialize with params', () => {
450
+ (0, globals_1.test)('initialize with params and call usage in RAW Format', async () => {
451
+ const outputModel = new index_1.BoaviztaCloudOutputModel();
452
+ (0, globals_1.expect)(outputModel.modelIdentifier()).toBe('org.boavizta.cloud.sci');
453
+ await (0, globals_1.expect)(outputModel.validateLocation({ location: 'SomethingFail' })).rejects.toThrowError();
454
+ await (0, globals_1.expect)(outputModel.validateInstanceType({ 'instance-type': 'SomethingFail' })).rejects.toThrowError();
455
+ await (0, globals_1.expect)(outputModel.validateProvider({ provider: 'SomethingFail' })).rejects.toThrowError();
456
+ await (0, globals_1.expect)(outputModel.configure('test', {
457
+ 'instance-type': 't2.micro',
458
+ location: 'USA',
459
+ 'expected-lifespan': 4 * 365 * 24 * 60 * 60,
460
+ provider: 'aws',
461
+ verbose: false,
462
+ })).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
463
+ await (0, globals_1.expect)(outputModel.configure('test', {
464
+ 'instance-type': 't2.micro',
465
+ location: 'USA',
466
+ 'expected-lifespan': 4 * 365 * 24 * 60 * 60,
467
+ provider: 'aws',
468
+ verbose: 'false',
469
+ })).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
470
+ await (0, globals_1.expect)(outputModel.configure('test', {
471
+ 'instance-type': 't2.micro',
472
+ location: 'USA',
473
+ 'expected-lifespan': 4 * 365 * 24 * 60 * 60,
474
+ provider: 'aws',
475
+ verbose: 0,
476
+ })).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
477
+ (0, globals_1.expect)(outputModel.name).toBe('test');
478
+ // configure without static params will cause improper configure error
479
+ });
480
+ (0, globals_1.test)("correct 'instance-type': initialize with params and call usage in IMPL Format", async () => {
481
+ const outputModel = new index_1.BoaviztaCloudOutputModel();
482
+ await (0, globals_1.expect)(outputModel.configure('test', {
483
+ 'instance-type': 't2.micro',
484
+ location: 'USA',
485
+ })).rejects.toThrowError();
486
+ await (0, globals_1.expect)(outputModel.configure('test', {
487
+ provider: 'aws',
488
+ location: 'USA',
489
+ })).rejects.toThrowError();
490
+ await (0, globals_1.expect)(outputModel.configure('test', {
491
+ 'instance-type': 't2.micro',
492
+ location: 'USA',
493
+ provider: 'aws',
494
+ })).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
495
+ (0, globals_1.expect)(outputModel.name).toBe('test');
496
+ // mockAxios.get.mockResolvedValue({data: {}});
497
+ await (0, globals_1.expect)(outputModel.execute([
498
+ {
499
+ timestamp: '2021-01-01T00:00:00Z',
500
+ duration: 15,
501
+ 'cpu-util': 34,
502
+ },
503
+ ])).resolves.toStrictEqual([
504
+ {
505
+ 'embodied-carbon': 1.6,
506
+ energy: 1.6408333333333334,
507
+ },
508
+ ]);
509
+ });
510
+ (0, globals_1.test)('wrong "instance-type": initialize with params and call usage in IMPL Format throws error', async () => {
511
+ const outputModel = new index_1.BoaviztaCloudOutputModel();
512
+ await (0, globals_1.expect)(outputModel.configure('test', {
513
+ 'instance-type': 't5.micro',
514
+ location: 'USA',
515
+ provider: 'aws',
516
+ })).rejects.toThrowError();
517
+ (0, globals_1.expect)(outputModel.name).toBe('test');
518
+ // configure without static params will cause improper configure error
519
+ await (0, globals_1.expect)(outputModel.execute([
520
+ {
521
+ timestamp: '2021-01-01T00:00:00Z',
522
+ duration: 15,
523
+ 'cpu-util': 34,
524
+ },
525
+ {
526
+ timestamp: '2021-01-01T00:00:15Z',
527
+ duration: 15,
528
+ 'cpu-util': 12,
529
+ },
530
+ {
531
+ timestamp: '2021-01-01T00:00:30Z',
532
+ duration: 15,
533
+ 'cpu-util': 1,
534
+ },
535
+ {
536
+ timestamp: '2021-01-01T00:00:45Z',
537
+ duration: 15,
538
+ 'cpu-util': 78,
539
+ },
540
+ ])).rejects.toThrowError();
541
+ });
542
+ (0, globals_1.test)('without "instance-type": initialize with params and call usage in IMPL Format throws error', async () => {
543
+ const outputModel = new index_1.BoaviztaCloudOutputModel();
544
+ await (0, globals_1.expect)(outputModel.configure('test', {
545
+ location: 'USA',
546
+ provider: 'aws',
547
+ })).rejects.toStrictEqual(Error("Improper configure: Missing 'instance-type' parameter"));
548
+ await (0, globals_1.expect)(outputModel.configure('test', {
549
+ location: 'USAF',
550
+ provider: 'aws',
551
+ 'instance-type': 't2.micro',
552
+ })).rejects.toThrowError();
553
+ (0, globals_1.expect)(outputModel.name).toBe('test');
554
+ // configure without static params will cause improper configure error
555
+ await (0, globals_1.expect)(outputModel.execute([
556
+ {
557
+ timestamp: '2021-01-01T00:00:00Z',
558
+ duration: 15,
559
+ 'cpu-util': 34,
560
+ },
561
+ {
562
+ timestamp: '2021-01-01T00:00:15Z',
563
+ duration: 15,
564
+ 'cpu-util': 12,
565
+ },
566
+ {
567
+ timestamp: '2021-01-01T00:00:30Z',
568
+ duration: 15,
569
+ 'cpu-util': 1,
570
+ },
571
+ {
572
+ timestamp: '2021-01-01T00:00:45Z',
573
+ duration: 15,
574
+ 'cpu-util': 78,
575
+ },
576
+ ])).rejects.toStrictEqual(Error('Improper configure: Missing configuration parameters'));
577
+ });
578
+ });
579
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9fX3Rlc3RzX18vdW5pdC9saWIvYm9hdml6dGEvaW5kZXgudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJDQUEyRDtBQUMzRCwwREFHd0M7QUFDeEMsaUNBQTJDO0FBQzNDLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UscUZBQXFGO0FBRXJGLEtBQUssVUFBVSxRQUFRLENBQ3JCLEdBQVc7SUFFWCxRQUFRLEdBQUcsRUFBRTtRQUNYLEtBQUssMERBQTBEO1lBQzdELE9BQU8sRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFNLENBQUM7UUFDaEMsS0FBSyxnREFBZ0Q7WUFDbkQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBTSxDQUFDLENBQUM7UUFDakQsS0FBSyx1RUFBdUU7WUFDMUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFJLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQzthQUN2QixDQUFDLENBQUM7S0FDWDtJQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQixNQUFNLFNBQVMsR0FBRyxlQUFrQyxDQUFDO0FBQ3JELHVFQUF1RTtBQUN2RSxTQUFTLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQy9CLENBQXFDLEdBQVcsRUFBYyxFQUFFO0lBQzlELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxvRUFBb0U7WUFDdkUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFO3dCQUNQLEdBQUcsRUFB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akMsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osVUFBVSxFQUFFLEVBQUU7YUFDZjtTQUNGLENBQUMsQ0FDSCxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQ3JCLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUM5RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGVzY3JpYmUsIGV4cGVjdCwgamVzdCwgdGVzdH0gZnJvbSAnQGplc3QvZ2xvYmFscyc7XG5pbXBvcnQge1xuICBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwsXG4gIEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwsXG59IGZyb20gJy4uLy4uLy4uLy4uL2xpYi9ib2F2aXp0YS9pbmRleCc7XG5pbXBvcnQgYXhpb3MsIHtBeGlvc1Jlc3BvbnNlfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgKiBhcyBQUk9WSURFUlMgZnJvbSAnLi4vLi4vLi4vLi4vX19tb2Nrc19fL2JvYXZpenRhL3Byb3ZpZGVycy5qc29uJztcbmltcG9ydCAqIGFzIENPVU5UUklFUyBmcm9tICcuLi8uLi8uLi8uLi9fX21vY2tzX18vYm9hdml6dGEvY291bnRyaWVzLmpzb24nO1xuaW1wb3J0ICogYXMgSU5TVEFOQ0VfVFlQRVMgZnJvbSAnLi4vLi4vLi4vLi4vX19tb2Nrc19fL2JvYXZpenRhL2luc3RhbmNlX3R5cGVzLmpzb24nO1xuXG5hc3luYyBmdW5jdGlvbiBheGlvc0dldDxUID0gYW55LCBSID0gQXhpb3NSZXNwb25zZTxULCBhbnk+PihcbiAgdXJsOiBzdHJpbmdcbik6IFByb21pc2U8Uj4ge1xuICBzd2l0Y2ggKHVybCkge1xuICAgIGNhc2UgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jbG91ZC9pbnN0YW5jZS9hbGxfcHJvdmlkZXJzJzpcbiAgICAgIHJldHVybiB7ZGF0YTogUFJPVklERVJTfSBhcyBSO1xuICAgIGNhc2UgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS91dGlscy9jb3VudHJ5X2NvZGUnOlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7ZGF0YTogQ09VTlRSSUVTfSBhcyBSKTtcbiAgICBjYXNlICdodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2UvYWxsX2luc3RhbmNlcz9wcm92aWRlcj1hd3MnOlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIGRhdGE6IElOU1RBTkNFX1RZUEVTWydhd3MnXSxcbiAgICAgIH0gYXMgUik7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSBhcyBSKTtcbn1cblxuamVzdC5tb2NrKCdheGlvcycpO1xuY29uc3QgbW9ja0F4aW9zID0gYXhpb3MgYXMgamVzdC5Nb2NrZWQ8dHlwZW9mIGF4aW9zPjtcbi8vIE1vY2sgb3V0IGFsbCB0b3AgbGV2ZWwgZnVuY3Rpb25zLCBzdWNoIGFzIGdldCwgcHV0LCBkZWxldGUgYW5kIHBvc3Q6XG5tb2NrQXhpb3MuZ2V0Lm1vY2tJbXBsZW1lbnRhdGlvbihheGlvc0dldCk7XG5tb2NrQXhpb3MucG9zdC5tb2NrSW1wbGVtZW50YXRpb24oXG4gIDxUID0gYW55LCBSID0gQXhpb3NSZXNwb25zZTxULCBhbnk+Pih1cmw6IHN0cmluZyk6IFByb21pc2U8Uj4gPT4ge1xuICAgIHN3aXRjaCAodXJsKSB7XG4gICAgICBjYXNlICdodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY29tcG9uZW50L2NwdT92ZXJib3NlPWZhbHNlJmR1cmF0aW9uPTEnOlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBvdXRwdXRzOiB7XG4gICAgICAgICAgICAgIGd3cDoge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogMC4wMDA4LFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAwMDQxNTUsXG4gICAgICAgICAgICAgICAgICBtYXg6IDAuMDAzMTEzLFxuICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFsnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDAuMDY3NDMsIG1pbjogMC4wNjc0MywgbWF4OiAwLjA2NzQzfSxcbiAgICAgICAgICAgICAgICB1bml0OiAna2dDTzJlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBjbGltYXRlIGNoYW5nZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkcDoge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogNy43NjRlLTcsXG4gICAgICAgICAgICAgICAgICBtaW46IDcuNzYzZS03LFxuICAgICAgICAgICAgICAgICAgbWF4OiA3Ljc3MWUtNyxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAxLjc5NmUtOCwgbWluOiAxLjc5NmUtOCwgbWF4OiAxLjc5NmUtOH0sXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnU2JlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2Ugb2YgbWluZXJhbHMgYW5kIGZvc3NpbCByZXNzb3VyY2VzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGU6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDEyLFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAwNjg0NyxcbiAgICAgICAgICAgICAgICAgIG1heDogMC4wNDMxNCxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAyLjA3LCBtaW46IDIuMDcsIG1heDogMi4wN30sXG4gICAgICAgICAgICAgICAgdW5pdDogJ01KJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bXB0aW9uIG9mIHByaW1hcnkgZW5lcmd5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBSKTtcbiAgICAgIGNhc2UgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jb21wb25lbnQvY3B1P3ZlcmJvc2U9dHJ1ZSZkdXJhdGlvbj0yJzpcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgb3V0cHV0czoge1xuICAgICAgICAgICAgICBnd3A6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAxNixcbiAgICAgICAgICAgICAgICAgIG1pbjogMC4wMDA4MzEsXG4gICAgICAgICAgICAgICAgICBtYXg6IDAuMDA2MjI2LFxuICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFsnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDAuMTkyNCwgbWluOiAwLjE5MjQsIG1heDogMC4xOTI0fSxcbiAgICAgICAgICAgICAgICB1bml0OiAna2dDTzJlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBjbGltYXRlIGNoYW5nZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkcDoge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogMC4wMDAwMDE1NTMsXG4gICAgICAgICAgICAgICAgICBtaW46IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgbWF4OiAwLjAwMDAwMTU1NCxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjEyNmUtOCwgbWluOiA1LjEyNmUtOCwgbWF4OiA1LjEyNmUtOH0sXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnU2JlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2Ugb2YgbWluZXJhbHMgYW5kIGZvc3NpbCByZXNzb3VyY2VzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGU6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDIzLFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAxMzY5LFxuICAgICAgICAgICAgICAgICAgbWF4OiAwLjA4NjI3LFxuICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFsnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDUuOTA3LCBtaW46IDUuOTA3LCBtYXg6IDUuOTA3fSxcbiAgICAgICAgICAgICAgICB1bml0OiAnTUonLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ29uc3VtcHRpb24gb2YgcHJpbWFyeSBlbmVyZ3knLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgICAgICAgb3V0cHV0czoge1xuICAgICAgICAgICAgICAgIGd3cDoge1xuICAgICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAxNixcbiAgICAgICAgICAgICAgICAgICAgbWluOiAwLjAwMDgzMSxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiAwLjAwNjIyNixcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDAuMTkyNCwgbWluOiAwLjE5MjQsIG1heDogMC4xOTI0fSxcbiAgICAgICAgICAgICAgICAgIHVuaXQ6ICdrZ0NPMmVxJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgY2xpbWF0ZSBjaGFuZ2UnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWRwOiB7XG4gICAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMC4wMDAwMDE1NTMsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMC4wMDAwMDE1NTMsXG4gICAgICAgICAgICAgICAgICAgIG1heDogMC4wMDAwMDE1NTQsXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjEyNmUtOCwgbWluOiA1LjEyNmUtOCwgbWF4OiA1LjEyNmUtOH0sXG4gICAgICAgICAgICAgICAgICB1bml0OiAna2dTYmVxJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlIG9mIG1pbmVyYWxzIGFuZCBmb3NzaWwgcmVzc291cmNlcycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwZToge1xuICAgICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDIzLFxuICAgICAgICAgICAgICAgICAgICBtaW46IDAuMDEzNjksXG4gICAgICAgICAgICAgICAgICAgIG1heDogMC4wODYyNyxcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDUuOTA3LCBtaW46IDUuOTA3LCBtYXg6IDUuOTA3fSxcbiAgICAgICAgICAgICAgICAgIHVuaXQ6ICdNSicsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bXB0aW9uIG9mIHByaW1hcnkgZW5lcmd5JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB1bml0czoge3ZhbHVlOiAxLCBzdGF0dXM6ICdBUkNIRVRZUEUnLCBtaW46IDEsIG1heDogMX0sXG4gICAgICAgICAgICAgIGRpZV9zaXplOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDUyMSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdtbTInLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0F2ZXJhZ2UgdmFsdWUgZm9yIGFsbCBmYW1pbGllcycsXG4gICAgICAgICAgICAgICAgbWluOiA0MS4yLFxuICAgICAgICAgICAgICAgIG1heDogMzY0MCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHt2YWx1ZTogMiwgdW5pdDogJ2hvdXJzJ30sXG4gICAgICAgICAgICAgIGF2Z19wb3dlcjoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAyNjAuMDUsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnVycsXG4gICAgICAgICAgICAgICAgbWluOiAyNjAuMDUsXG4gICAgICAgICAgICAgICAgbWF4OiAyNjAuMDUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRpbWVfd29ya2xvYWQ6IHt2YWx1ZTogMTAwLCBzdGF0dXM6ICdJTlBVVCcsIHVuaXQ6ICclJ30sXG4gICAgICAgICAgICAgIHVzYWdlX2xvY2F0aW9uOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICdVU0EnLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0lOUFVUJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnQ29kU1AzIC0gTkNTIENvdW50cnkgQ29kZXMgLSBOQVRPJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXNlX3RpbWVfcmF0aW86IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdBUkNIRVRZUEUnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICcvMScsXG4gICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgIG1heDogMSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaG91cnNfbGlmZV90aW1lOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDI2MjgwLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0FSQ0hFVFlQRScsXG4gICAgICAgICAgICAgICAgdW5pdDogJ2hvdXJzJyxcbiAgICAgICAgICAgICAgICBtaW46IDI2MjgwLFxuICAgICAgICAgICAgICAgIG1heDogMjYyODAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB7YTogMTcxLjIsIGI6IDAuMDM1NCwgYzogMzYuODksIGQ6IC0xMC4xM30sXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQVJDSEVUWVBFJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZ3dwX2ZhY3Rvcjoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAwLjM3LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnIENPMmVxL2tXaCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly9lbWJlci1jbGltYXRlLm9yZy9kYXRhL2RhdGEtZXhwbG9yZXInLFxuICAgICAgICAgICAgICAgIG1pbjogMC4zNyxcbiAgICAgICAgICAgICAgICBtYXg6IDAuMzcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkcF9mYWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogOS44NTU0OGUtOCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdrZyBTYmVxL2tXaCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnQURFTUUgQmFzZSBvdXRwdXRTIMKuJyxcbiAgICAgICAgICAgICAgICBtaW46IDkuODU1NDhlLTgsXG4gICAgICAgICAgICAgICAgbWF4OiA5Ljg1NTQ4ZS04LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwZV9mYWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTEuMzU4LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ01KL2tXaCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnQURQZiAvICgxLSVyZW5ld2FibGVfZW5lcmd5KScsXG4gICAgICAgICAgICAgICAgbWluOiAxMS4zNTgsXG4gICAgICAgICAgICAgICAgbWF4OiAxMS4zNTgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgUik7XG4gICAgICBjYXNlICdodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2U/dmVyYm9zZT1mYWxzZSZkdXJhdGlvbj0wLjAwNDE2NjY2NjY2NjY2NjY2Nyc6XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG91dHB1dHM6IHtcbiAgICAgICAgICAgICAgZ3dwOiB7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAwMTYsXG4gICAgICAgICAgICAgICAgICBtaW46IDAuMDAwODMxLFxuICAgICAgICAgICAgICAgICAgbWF4OiAwLjAwNjIyNixcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAwLjE5MjQsIG1pbjogMC4xOTI0LCBtYXg6IDAuMTkyNH0sXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnQ08yZXEnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgY2xpbWF0ZSBjaGFuZ2UnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhZHA6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAwMDAwMTU1MyxcbiAgICAgICAgICAgICAgICAgIG1heDogMC4wMDAwMDE1NTQsXG4gICAgICAgICAgICAgICAgICB3YXJuaW5nczogWydFbmQgb2YgbGlmZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNhbGN1bGF0aW9uJ10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1c2U6IHt2YWx1ZTogNS4xMjZlLTgsIG1pbjogNS4xMjZlLTgsIG1heDogNS4xMjZlLTh9LFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdrZ1NiZXEnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlIG9mIG1pbmVyYWxzIGFuZCBmb3NzaWwgcmVzc291cmNlcycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBlOiB7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAyMyxcbiAgICAgICAgICAgICAgICAgIG1pbjogMC4wMTM2OSxcbiAgICAgICAgICAgICAgICAgIG1heDogMC4wODYyNyxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjkwNywgbWluOiA1LjkwNywgbWF4OiA1LjkwN30sXG4gICAgICAgICAgICAgICAgdW5pdDogJ01KJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bXB0aW9uIG9mIHByaW1hcnkgZW5lcmd5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJib3NlOiB7XG4gICAgICAgICAgICAgIG91dHB1dHM6IHtcbiAgICAgICAgICAgICAgICBnd3A6IHtcbiAgICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAwMTYsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMC4wMDA4MzEsXG4gICAgICAgICAgICAgICAgICAgIG1heDogMC4wMDYyMjYsXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAwLjE5MjQsIG1pbjogMC4xOTI0LCBtYXg6IDAuMTkyNH0sXG4gICAgICAgICAgICAgICAgICB1bml0OiAna2dDTzJlcScsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIGNsaW1hdGUgY2hhbmdlJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFkcDoge1xuICAgICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgICBtaW46IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDAuMDAwMDAxNTU0LFxuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nczogW1xuICAgICAgICAgICAgICAgICAgICAgICdFbmQgb2YgbGlmZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNhbGN1bGF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB1c2U6IHt2YWx1ZTogNS4xMjZlLTgsIG1pbjogNS4xMjZlLTgsIG1heDogNS4xMjZlLTh9LFxuICAgICAgICAgICAgICAgICAgdW5pdDogJ2tnU2JlcScsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZSBvZiBtaW5lcmFscyBhbmQgZm9zc2lsIHJlc3NvdXJjZXMnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGU6IHtcbiAgICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAyMyxcbiAgICAgICAgICAgICAgICAgICAgbWluOiAwLjAxMzY5LFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDAuMDg2MjcsXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjkwNywgbWluOiA1LjkwNywgbWF4OiA1LjkwN30sXG4gICAgICAgICAgICAgICAgICB1bml0OiAnTUonLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDb25zdW1wdGlvbiBvZiBwcmltYXJ5IGVuZXJneScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5pdHM6IHt2YWx1ZTogMSwgc3RhdHVzOiAnQVJDSEVUWVBFJywgbWluOiAxLCBtYXg6IDF9LFxuICAgICAgICAgICAgICBkaWVfc2l6ZToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiA1MjEsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnbW0yJyxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdBdmVyYWdlIHZhbHVlIGZvciBhbGwgZmFtaWxpZXMnLFxuICAgICAgICAgICAgICAgIG1pbjogNDEuMixcbiAgICAgICAgICAgICAgICBtYXg6IDM2NDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB7dmFsdWU6IDIsIHVuaXQ6ICdob3Vycyd9LFxuICAgICAgICAgICAgICBhdmdfcG93ZXI6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMjYwLjA1LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ1cnLFxuICAgICAgICAgICAgICAgIG1pbjogMjYwLjA1LFxuICAgICAgICAgICAgICAgIG1heDogMjYwLjA1LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aW1lX3dvcmtsb2FkOiB7dmFsdWU6IDEwMCwgc3RhdHVzOiAnSU5QVVQnLCB1bml0OiAnJSd9LFxuICAgICAgICAgICAgICB1c2FnZV9sb2NhdGlvbjoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAnVVNBJyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdJTlBVVCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ0NvZFNQMyAtIE5DUyBDb3VudHJ5IENvZGVzIC0gTkFUTycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVzZV90aW1lX3JhdGlvOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQVJDSEVUWVBFJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnLzEnLFxuICAgICAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGhvdXJzX2xpZmVfdGltZToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAyNjI4MCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdBUkNIRVRZUEUnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdob3VycycsXG4gICAgICAgICAgICAgICAgbWluOiAyNjI4MCxcbiAgICAgICAgICAgICAgICBtYXg6IDI2MjgwLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge2E6IDE3MS4yLCBiOiAwLjAzNTQsIGM6IDM2Ljg5LCBkOiAtMTAuMTN9LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0FSQ0hFVFlQRScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGd3cF9mYWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMC4zNyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdrZyBDTzJlcS9rV2gnLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vZW1iZXItY2xpbWF0ZS5vcmcvZGF0YS9kYXRhLWV4cGxvcmVyJyxcbiAgICAgICAgICAgICAgICBtaW46IDAuMzcsXG4gICAgICAgICAgICAgICAgbWF4OiAwLjM3LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhZHBfZmFjdG9yOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDkuODU1NDhlLTgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgICAgICB1bml0OiAna2cgU2JlcS9rV2gnLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0FERU1FIEJhc2Ugb3V0cHV0UyDCricsXG4gICAgICAgICAgICAgICAgbWluOiA5Ljg1NTQ4ZS04LFxuICAgICAgICAgICAgICAgIG1heDogOS44NTU0OGUtOCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGVfZmFjdG9yOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDExLjM1OCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdNSi9rV2gnLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0FEUGYgLyAoMS0lcmVuZXdhYmxlX2VuZXJneSknLFxuICAgICAgICAgICAgICAgIG1pbjogMTEuMzU4LFxuICAgICAgICAgICAgICAgIG1heDogMTEuMzU4LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIFIpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9IGFzIFIpO1xuICB9XG4pO1xuamVzdC5zZXRUaW1lb3V0KDMwMDAwKTtcbmRlc2NyaWJlKCdjcHU6Y29uZmlndXJlIHRlc3QnLCAoKSA9PiB7XG4gIHRlc3QoJ2luaXRpYWxpemUgd3JvbmcgcGFyYW1zIHNob3VsZCB0aHJvdyBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNwdU91dHB1dE1vZGVsKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge2FsbG9jYXRpb246ICd3cm9uZyd9KVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubmFtZSkudG9CZSgndGVzdCcpO1xuICB9KTtcblxuICB0ZXN0KCdpbml0aWFsaXplIHdpdGhvdXQgcGFyYW1zIHRocm93cyBlcnJvciBmb3IgcGFyYW1ldGVyIGFuZCBjYWxsIGV4ZWN1dGUgd2l0aG91dCBwYXJhbXMgdGhyb3dzIGVycm9yIGZvciBpbnB1dCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNwdU91dHB1dE1vZGVsKCk7XG4gICAgY29uc3Qgb3V0cHV0TW9kZWxDb25maWdGYWlsID0gbmV3IEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubW9kZWxJZGVudGlmaWVyKCkpLnRvQmUoJ29yZy5ib2F2aXp0YS5jcHUuc2NpJyk7XG4gICAgYXdhaXQgZXhwZWN0KG91dHB1dE1vZGVsLmF1dGhlbnRpY2F0ZSh7fSkpLnJlc29sdmVzLnRvQmUodW5kZWZpbmVkKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbENvbmZpZ0ZhaWwuZXhlY3V0ZShbXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjAwWicsXG4gICAgICAgICAgZHVyYXRpb246IDM2MDAsXG4gICAgICAgICAgJ2NwdS11dGlsJzogNTAsXG4gICAgICAgIH0sXG4gICAgICBdKVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcblxuICAgIGF3YWl0IGV4cGVjdChvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnKSkucmVqZWN0cy50b1Rocm93KFxuICAgICAgRXJyb3IoJ0ltcHJvcGVyIGNvbmZpZ3VyZTogTWlzc2luZyBwcm9jZXNzb3IgcGFyYW1ldGVyJylcbiAgICApO1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgJ3BoeXNpY2FsLXByb2Nlc3Nvcic6ICdJbnRlbCBYZW9uIEdvbGQgNjEzOGYnLFxuICAgICAgfSlcbiAgICApLnJlamVjdHMudG9UaHJvdyhcbiAgICAgIEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29yZS11bml0cyBwYXJhbWV0ZXInKVxuICAgICk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge1xuICAgICAgICAncGh5c2ljYWwtcHJvY2Vzc29yJzogJ0ludGVsIFhlb24gR29sZCA2MTM4ZicsXG4gICAgICAgICdjb3JlLXVuaXRzJzogMjQsXG4gICAgICAgICdleHBlY3RlZC1saWZlc3Bhbic6IDQgKiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDcHVPdXRwdXRNb2RlbCk7XG4gICAgZXhwZWN0KG91dHB1dE1vZGVsLm5hbWUpLnRvQmUoJ3Rlc3QnKTtcbiAgICAvLyBub3QgcHJvdmlkaW5nIGlucHV0cyB3aWxsIHRocm93IGEgbWlzc2luZyBpbnB1dHMgZXJyb3JcbiAgICBhd2FpdCBleHBlY3Qob3V0cHV0TW9kZWwuZXhlY3V0ZSgpKS5yZWplY3RzLnRvU3RyaWN0RXF1YWwoXG4gICAgICBFcnJvcihcbiAgICAgICAgJ1BhcmFtZXRlciBOb3QgR2l2ZW46IGludmFsaWQgaW5wdXRzIHBhcmFtZXRlci4gRXhwZWN0aW5nIGFuIGFycmF5IG9mIGlucHV0cydcbiAgICAgIClcbiAgICApO1xuICAgIC8vIGltcHJvcGVyIGlucHV0cyB3aWxsIHRocm93IGFuIGludmFsaWQgaW5wdXRzIGVycm9yXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuZXhlY3V0ZShbe2ludmFsaWQ6ICdpbnB1dCd9XSlcbiAgICApLnJlamVjdHMudG9TdHJpY3RFcXVhbChFcnJvcignSW52YWxpZCBJbnB1dDogSW52YWxpZCBpbnB1dHMgcGFyYW1ldGVyJykpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY3B1OmluaXRpYWxpemUgd2l0aCBwYXJhbXMnLCAoKSA9PiB7XG4gIHRlc3QoJ2luaXRpYWxpemUgd2l0aCBwYXJhbXMgYW5kIGNhbGwgbXVsdGlwbGUgdXNhZ2VzIGluIElNUEwgZm9ybWF0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dHB1dE1vZGVsID0gbmV3IEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwoKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdwaHlzaWNhbC1wcm9jZXNzb3InOiAnSW50ZWwgWGVvbiBHb2xkIDYxMzhmJyxcbiAgICAgICAgJ2NvcmUtdW5pdHMnOiAyNCxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgfSlcbiAgICApLnJlc29sdmVzLnRvQmVJbnN0YW5jZU9mKEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwpO1xuICAgIGV4cGVjdChvdXRwdXRNb2RlbC5uYW1lKS50b0JlKCd0ZXN0Jyk7XG4gICAgLy8gY29uZmlndXJlIHdpdGhvdXQgc3RhdGljIHBhcmFtcyB3aWxsIGNhdXNlIGltcHJvcGVyIGNvbmZpZ3VyZSBlcnJvclxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAzNjAwLFxuICAgICAgICAgICdjcHUtdXRpbCc6IDUwLFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICApLnJlc29sdmVzLnRvU3RyaWN0RXF1YWwoW1xuICAgICAge1xuICAgICAgICAnZW1ib2RpZWQtY2FyYm9uJzogMC44LFxuICAgICAgICAnZS1jcHUnOiAwLjU3NSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0pO1xuICB0ZXN0KCdpbml0aWFsaXplIHdpdGggcGFyYW1zIGFuZCBjYWxsIG11bHRpcGxlIHVzYWdlcyBpbiBJTVBMIGZvcm1hdDp2ZXJib3NlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dHB1dE1vZGVsID0gbmV3IEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwoKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdwaHlzaWNhbC1wcm9jZXNzb3InOiAnSW50ZWwgWGVvbiBHb2xkIDYxMzhmJyxcbiAgICAgICAgJ2NvcmUtdW5pdHMnOiAyNCxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICB2ZXJib3NlOiB0cnVlLFxuICAgICAgfSlcbiAgICApLnJlc29sdmVzLnRvQmVJbnN0YW5jZU9mKEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwpO1xuICAgIGV4cGVjdChvdXRwdXRNb2RlbC5uYW1lKS50b0JlKCd0ZXN0Jyk7XG4gICAgLy8gY29uZmlndXJlIHdpdGhvdXQgc3RhdGljIHBhcmFtcyB3aWxsIGNhdXNlIGltcHJvcGVyIGNvbmZpZ3VyZSBlcnJvclxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiA3MjAwLFxuICAgICAgICAgICdjcHUtdXRpbCc6IDEwMCxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS5yZXNvbHZlcy50b1N0cmljdEVxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgJ2VtYm9kaWVkLWNhcmJvbic6IDEuNixcbiAgICAgICAgJ2UtY3B1JzogMS42NDA4MzMzMzMzMzMzMzM0LFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2Nsb3VkOmluaXRpYWxpemUgd2l0aCBwYXJhbXMnLCAoKSA9PiB7XG4gIHRlc3QoJ2luaXRpYWxpemUgd2l0aCBwYXJhbXMgYW5kIGNhbGwgdXNhZ2UgaW4gUkFXIEZvcm1hdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubW9kZWxJZGVudGlmaWVyKCkpLnRvQmUoJ29yZy5ib2F2aXp0YS5jbG91ZC5zY2knKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC52YWxpZGF0ZUxvY2F0aW9uKHtsb2NhdGlvbjogJ1NvbWV0aGluZ0ZhaWwnfSlcbiAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwudmFsaWRhdGVJbnN0YW5jZVR5cGUoeydpbnN0YW5jZS10eXBlJzogJ1NvbWV0aGluZ0ZhaWwnfSlcbiAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwudmFsaWRhdGVQcm92aWRlcih7cHJvdmlkZXI6ICdTb21ldGhpbmdGYWlsJ30pXG4gICAgKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgJ2luc3RhbmNlLXR5cGUnOiAndDIubWljcm8nLFxuICAgICAgICBsb2NhdGlvbjogJ1VTQScsXG4gICAgICAgICdleHBlY3RlZC1saWZlc3Bhbic6IDQgKiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgICAgIHByb3ZpZGVyOiAnYXdzJyxcbiAgICAgICAgdmVyYm9zZTogZmFsc2UsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3QyLm1pY3JvJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICAnZXhwZWN0ZWQtbGlmZXNwYW4nOiA0ICogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICAgIHZlcmJvc2U6ICdmYWxzZScsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3QyLm1pY3JvJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICAnZXhwZWN0ZWQtbGlmZXNwYW4nOiA0ICogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICAgIHZlcmJvc2U6IDAsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubmFtZSkudG9CZSgndGVzdCcpO1xuICAgIC8vIGNvbmZpZ3VyZSB3aXRob3V0IHN0YXRpYyBwYXJhbXMgd2lsbCBjYXVzZSBpbXByb3BlciBjb25maWd1cmUgZXJyb3JcbiAgfSk7XG5cbiAgdGVzdChcImNvcnJlY3QgJ2luc3RhbmNlLXR5cGUnOiBpbml0aWFsaXplIHdpdGggcGFyYW1zIGFuZCBjYWxsIHVzYWdlIGluIElNUEwgRm9ybWF0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwoKTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgJ2luc3RhbmNlLXR5cGUnOiAndDIubWljcm8nLFxuICAgICAgICBsb2NhdGlvbjogJ1VTQScsXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgIHByb3ZpZGVyOiAnYXdzJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgfSlcbiAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge1xuICAgICAgICAnaW5zdGFuY2UtdHlwZSc6ICd0Mi5taWNybycsXG4gICAgICAgIGxvY2F0aW9uOiAnVVNBJyxcbiAgICAgICAgcHJvdmlkZXI6ICdhd3MnLFxuICAgICAgfSlcbiAgICApLnJlc29sdmVzLnRvQmVJbnN0YW5jZU9mKEJvYXZpenRhQ2xvdWRPdXRwdXRNb2RlbCk7XG4gICAgZXhwZWN0KG91dHB1dE1vZGVsLm5hbWUpLnRvQmUoJ3Rlc3QnKTtcbiAgICAvLyBtb2NrQXhpb3MuZ2V0Lm1vY2tSZXNvbHZlZFZhbHVlKHtkYXRhOiB7fX0pO1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiAzNCxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS5yZXNvbHZlcy50b1N0cmljdEVxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgJ2VtYm9kaWVkLWNhcmJvbic6IDEuNixcbiAgICAgICAgZW5lcmd5OiAxLjY0MDgzMzMzMzMzMzMzMzQsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICB0ZXN0KCd3cm9uZyBcImluc3RhbmNlLXR5cGVcIjogaW5pdGlhbGl6ZSB3aXRoIHBhcmFtcyBhbmQgY2FsbCB1c2FnZSBpbiBJTVBMIEZvcm1hdCB0aHJvd3MgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0cHV0TW9kZWwgPSBuZXcgQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKCk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3Q1Lm1pY3JvJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubmFtZSkudG9CZSgndGVzdCcpO1xuICAgIC8vIGNvbmZpZ3VyZSB3aXRob3V0IHN0YXRpYyBwYXJhbXMgd2lsbCBjYXVzZSBpbXByb3BlciBjb25maWd1cmUgZXJyb3JcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5leGVjdXRlKFtcbiAgICAgICAge1xuICAgICAgICAgIHRpbWVzdGFtcDogJzIwMjEtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICAgICAgICBkdXJhdGlvbjogMTUsXG4gICAgICAgICAgJ2NwdS11dGlsJzogMzQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjE1WicsXG4gICAgICAgICAgZHVyYXRpb246IDE1LFxuICAgICAgICAgICdjcHUtdXRpbCc6IDEyLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDozMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDo0NVonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiA3OCxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICB9KTtcblxuICB0ZXN0KCd3aXRob3V0IFwiaW5zdGFuY2UtdHlwZVwiOiBpbml0aWFsaXplIHdpdGggcGFyYW1zIGFuZCBjYWxsIHVzYWdlIGluIElNUEwgRm9ybWF0IHRocm93cyBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwoKTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1N0cmljdEVxdWFsKFxuICAgICAgRXJyb3IoXCJJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgJ2luc3RhbmNlLXR5cGUnIHBhcmFtZXRlclwiKVxuICAgICk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge1xuICAgICAgICBsb2NhdGlvbjogJ1VTQUYnLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3QyLm1pY3JvJyxcbiAgICAgIH0pXG4gICAgKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgIGV4cGVjdChvdXRwdXRNb2RlbC5uYW1lKS50b0JlKCd0ZXN0Jyk7XG4gICAgLy8gY29uZmlndXJlIHdpdGhvdXQgc3RhdGljIHBhcmFtcyB3aWxsIGNhdXNlIGltcHJvcGVyIGNvbmZpZ3VyZSBlcnJvclxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiAzNCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRpbWVzdGFtcDogJzIwMjEtMDEtMDFUMDA6MDA6MTVaJyxcbiAgICAgICAgICBkdXJhdGlvbjogMTUsXG4gICAgICAgICAgJ2NwdS11dGlsJzogMTIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjMwWicsXG4gICAgICAgICAgZHVyYXRpb246IDE1LFxuICAgICAgICAgICdjcHUtdXRpbCc6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjQ1WicsXG4gICAgICAgICAgZHVyYXRpb246IDE1LFxuICAgICAgICAgICdjcHUtdXRpbCc6IDc4LFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICApLnJlamVjdHMudG9TdHJpY3RFcXVhbChcbiAgICAgIEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzJylcbiAgICApO1xuICB9KTtcbn0pO1xuIl19