UNPKG

@grnsft/if

Version:

Impact Framework

142 lines 22.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SciEmbodied = void 0; const zod_1 = require("zod"); const utils_1 = require("@grnsft/if-core/utils"); const interfaces_1 = require("@grnsft/if-core/interfaces"); exports.SciEmbodied = (0, interfaces_1.PluginFactory)({ metadata: { inputs: { vCPUs: { description: 'number of CPUs allocated to an application', unit: 'CPUs', 'aggregation-method': { time: 'copy', component: 'copy', }, }, memory: { description: 'RAM available for a resource, in GB', unit: 'GB', 'aggregation-method': { time: 'copy', component: 'copy', }, }, ssd: { description: 'number of SSDs available for a resource', unit: 'SSDs', 'aggregation-method': { time: 'copy', component: 'copy', }, }, hdd: { description: 'number of HDDs available for a resource', unit: 'HDDs', 'aggregation-method': { time: 'copy', component: 'copy', }, }, gpu: { description: 'number of GPUs available for a resource', unit: 'GPUs', 'aggregation-method': { time: 'copy', component: 'copy', }, }, 'usage-ratio': { description: 'a scaling factor that can be used to describe the ratio of actual resource usage comapred to real device usage, e.g. 0.25 if you are using 2 out of 8 vCPUs, 0.1 if you are responsible for 1 out of 10 GB of storage, etc', unit: 'dimensionless', 'aggregation-method': { time: 'copy', component: 'copy', }, }, time: { description: 'a time unit to scale the embodied carbon by, in seconds. If not provided,time defaults to the value of the timestep duration.', unit: 'seconds', 'aggregation-method': { time: 'copy', component: 'copy', }, }, }, outputs: { 'embodied-carbon': { description: 'embodied carbon for a resource, scaled by usage', unit: 'gCO2eq', 'aggregation-method': { time: 'sum', component: 'sum', }, }, }, }, configValidation: zod_1.z.object({ 'baseline-vcpus': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('baseline-vcpus', value, 'number'), zod_1.z.number().gte(0).default(1)), 'baseline-memory': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('baseline-memory', value, 'number'), zod_1.z.number().gte(0).default(16)), 'baseline-emissions': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('baseline-emissions', value, 'number'), zod_1.z.number().gte(0).default(1000000)), lifespan: zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('lifespan', value, 'number'), zod_1.z.number().gt(0).default(126144000)), 'vcpu-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('vcpu-emissions-constant', value, 'number'), zod_1.z.number().gte(0).default(100000)), 'memory-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('memory-emissions-constant', value, 'number'), zod_1.z .number() .gte(0) .default(533 / 384)), 'ssd-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('ssd-emissions-constant', value, 'number'), zod_1.z.number().gte(0).default(50000)), 'hdd-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('hdd-emissions-constant', value, 'number'), zod_1.z.number().gte(0).default(100000)), 'gpu-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('gpu-emissions-constant', value, 'number'), zod_1.z.number().gte(0).default(150000)), 'output-parameter': zod_1.z.string().optional(), }), inputValidation: zod_1.z.object({ duration: zod_1.z.number().gt(0), vCPUs: zod_1.z.number().gt(0).default(1), memory: zod_1.z.number().gt(0).default(16), ssd: zod_1.z.number().gte(0).default(0), hdd: zod_1.z.number().gte(0).default(0), gpu: zod_1.z.number().gte(0).default(0), 'usage-ratio': zod_1.z.number().gt(0).default(1), time: zod_1.z.number().gt(0).optional(), }), implementation: async (inputs, config) => { /** * 1. Validates configuration and assigns defaults values if not provided. * 2. Maps through observations and validates them. * 3. Calculates total embodied carbon by substracting and the difference between baseline server and given one. */ return inputs.map(input => { const cpuE = (input.vCPUs - config['baseline-vcpus']) * config['vcpu-emissions-constant']; const memoryE = (input.memory - config['baseline-memory']) * ((config['memory-emissions-constant'] * config['baseline-memory']) / 16) * 1000; const hddE = input.hdd * config['hdd-emissions-constant']; const gpuE = input.gpu * config['gpu-emissions-constant']; const ssdE = input.ssd * config['ssd-emissions-constant']; const time = input['time'] || input.duration; const totalEmbodied = config['baseline-emissions'] + cpuE + memoryE + ssdE + hddE + gpuE; const totalEmbodiedScaledByUsage = totalEmbodied * input['usage-ratio']; const totalEmbodiedScaledByUsageAndTime = totalEmbodiedScaledByUsage * (time / config['lifespan']); const embodiedCarbonKey = config['output-parameter'] || 'embodied-carbon'; return { ...input, [embodiedCarbonKey]: totalEmbodiedScaledByUsageAndTime, }; }); }, allowArithmeticExpressions: [ 'baseline-vcpus', 'baseline-memory', 'baseline-emissions', 'lifespan', 'vcpu-emissions-constant', 'memory-emissions-constant', 'ssd-emissions-constant', 'hdd-emissions-constant', 'gpu-emissions-constant', ], }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL3NjaS1lbWJvZGllZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBc0I7QUFFdEIsaURBQW1FO0FBRW5FLDJEQUF5RDtBQUU1QyxRQUFBLFdBQVcsR0FBRyxJQUFBLDBCQUFhLEVBQUM7SUFDdkMsUUFBUSxFQUFFO1FBQ1IsTUFBTSxFQUFFO1lBQ04sS0FBSyxFQUFFO2dCQUNMLFdBQVcsRUFBRSw0Q0FBNEM7Z0JBQ3pELElBQUksRUFBRSxNQUFNO2dCQUNaLG9CQUFvQixFQUFFO29CQUNwQixJQUFJLEVBQUUsTUFBTTtvQkFDWixTQUFTLEVBQUUsTUFBTTtpQkFDbEI7YUFDRjtZQUNELE1BQU0sRUFBRTtnQkFDTixXQUFXLEVBQUUscUNBQXFDO2dCQUNsRCxJQUFJLEVBQUUsSUFBSTtnQkFDVixvQkFBb0IsRUFBRTtvQkFDcEIsSUFBSSxFQUFFLE1BQU07b0JBQ1osU0FBUyxFQUFFLE1BQU07aUJBQ2xCO2FBQ0Y7WUFDRCxHQUFHLEVBQUU7Z0JBQ0gsV0FBVyxFQUFFLHlDQUF5QztnQkFDdEQsSUFBSSxFQUFFLE1BQU07Z0JBQ1osb0JBQW9CLEVBQUU7b0JBQ3BCLElBQUksRUFBRSxNQUFNO29CQUNaLFNBQVMsRUFBRSxNQUFNO2lCQUNsQjthQUNGO1lBQ0QsR0FBRyxFQUFFO2dCQUNILFdBQVcsRUFBRSx5Q0FBeUM7Z0JBQ3RELElBQUksRUFBRSxNQUFNO2dCQUNaLG9CQUFvQixFQUFFO29CQUNwQixJQUFJLEVBQUUsTUFBTTtvQkFDWixTQUFTLEVBQUUsTUFBTTtpQkFDbEI7YUFDRjtZQUNELEdBQUcsRUFBRTtnQkFDSCxXQUFXLEVBQUUseUNBQXlDO2dCQUN0RCxJQUFJLEVBQUUsTUFBTTtnQkFDWixvQkFBb0IsRUFBRTtvQkFDcEIsSUFBSSxFQUFFLE1BQU07b0JBQ1osU0FBUyxFQUFFLE1BQU07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QUssQ0FBQyxRQUFRLENBQUM7WUFFN0MsTUFBTSxhQUFhLEdBQ2pCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLElBQUksR0FBRyxPQUFPLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7WUFFckUsTUFBTSwwQkFBMEIsR0FBRyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXhFLE1BQU0saUNBQWlDLEdBQ3JDLDBCQUEwQixHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRTNELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksaUJBQWlCLENBQUM7WUFFMUUsT0FBTztnQkFDTCxHQUFHLEtBQUs7Z0JBQ1IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLGlDQUFpQzthQUN2RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsMEJBQTBCLEVBQUU7UUFDMUIsZ0JBQWdCO1FBQ2hCLGlCQUFpQjtRQUNqQixvQkFBb0I7UUFDcEIsVUFBVTtRQUNWLHlCQUF5QjtRQUN6QiwyQkFBMkI7UUFDM0Isd0JBQXdCO1FBQ3hCLHdCQUF3QjtRQUN4Qix3QkFBd0I7S0FDekI7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7dmFsaWRhdGVBcml0aG1ldGljRXhwcmVzc2lvbn0gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3V0aWxzJztcbmltcG9ydCB7Q29uZmlnUGFyYW1zLCBQbHVnaW5QYXJhbXN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS90eXBlcyc7XG5pbXBvcnQge1BsdWdpbkZhY3Rvcnl9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGNvbnN0IFNjaUVtYm9kaWVkID0gUGx1Z2luRmFjdG9yeSh7XG4gIG1ldGFkYXRhOiB7XG4gICAgaW5wdXRzOiB7XG4gICAgICB2Q1BVczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ251bWJlciBvZiBDUFVzIGFsbG9jYXRlZCB0byBhbiBhcHBsaWNhdGlvbicsXG4gICAgICAgIHVuaXQ6ICdDUFVzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnY29weScsXG4gICAgICAgICAgY29tcG9uZW50OiAnY29weScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVtb3J5OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUkFNIGF2YWlsYWJsZSBmb3IgYSByZXNvdXJjZSwgaW4gR0InLFxuICAgICAgICB1bml0OiAnR0InLFxuICAgICAgICAnYWdncmVnYXRpb24tbWV0aG9kJzoge1xuICAgICAgICAgIHRpbWU6ICdjb3B5JyxcbiAgICAgICAgICBjb21wb25lbnQ6ICdjb3B5JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzc2Q6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdudW1iZXIgb2YgU1NEcyBhdmFpbGFibGUgZm9yIGEgcmVzb3VyY2UnLFxuICAgICAgICB1bml0OiAnU1NEcycsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ2NvcHknLFxuICAgICAgICAgIGNvbXBvbmVudDogJ2NvcHknLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhkZDoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ251bWJlciBvZiBIRERzIGF2YWlsYWJsZSBmb3IgYSByZXNvdXJjZScsXG4gICAgICAgIHVuaXQ6ICdIRERzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnY29weScsXG4gICAgICAgICAgY29tcG9uZW50OiAnY29weScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZ3B1OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnbnVtYmVyIG9mIEdQVXMgYXZhaWxhYmxlIGZvciBhIHJlc291cmNlJyxcbiAgICAgICAgdW5pdDogJ0dQVXMnLFxuICAgICAgICAnYWdncmVnYXRpb24tbWV0aG9kJzoge1xuICAgICAgICAgIHRpbWU6ICdjb3B5JyxcbiAgICAgICAgICBjb21wb25lbnQ6ICdjb3B5JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAndXNhZ2UtcmF0aW8nOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdhIHNjYWxpbmcgZmFjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHJhdGlvIG9mIGFjdHVhbCByZXNvdXJjZSB1c2FnZSBjb21hcHJlZCB0byByZWFsIGRldmljZSB1c2FnZSwgZS5nLiAwLjI1IGlmIHlvdSBhcmUgdXNpbmcgMiBvdXQgb2YgOCB2Q1BVcywgMC4xIGlmIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIDEgb3V0IG9mIDEwIEdCIG9mIHN0b3JhZ2UsIGV0YycsXG4gICAgICAgIHVuaXQ6ICdkaW1lbnNpb25sZXNzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnY29weScsXG4gICAgICAgICAgY29tcG9uZW50OiAnY29weScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGltZToge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnYSB0aW1lIHVuaXQgdG8gc2NhbGUgdGhlIGVtYm9kaWVkIGNhcmJvbiBieSwgaW4gc2Vjb25kcy4gSWYgbm90IHByb3ZpZGVkLHRpbWUgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0aW1lc3RlcCBkdXJhdGlvbi4nLFxuICAgICAgICB1bml0OiAnc2Vjb25kcycsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ2NvcHknLFxuICAgICAgICAgIGNvbXBvbmVudDogJ2NvcHknLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG91dHB1dHM6IHtcbiAgICAgICdlbWJvZGllZC1jYXJib24nOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnZW1ib2RpZWQgY2FyYm9uIGZvciBhIHJlc291cmNlLCBzY2FsZWQgYnkgdXNhZ2UnLFxuICAgICAgICB1bml0OiAnZ0NPMmVxJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnc3VtJyxcbiAgICAgICAgICBjb21wb25lbnQ6ICdzdW0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjb25maWdWYWxpZGF0aW9uOiB6Lm9iamVjdCh7XG4gICAgJ2Jhc2VsaW5lLXZjcHVzJzogei5wcmVwcm9jZXNzKFxuICAgICAgdmFsdWUgPT4gdmFsaWRhdGVBcml0aG1ldGljRXhwcmVzc2lvbignYmFzZWxpbmUtdmNwdXMnLCB2YWx1ZSwgJ251bWJlcicpLFxuICAgICAgei5udW1iZXIoKS5ndGUoMCkuZGVmYXVsdCgxKVxuICAgICksXG4gICAgJ2Jhc2VsaW5lLW1lbW9yeSc6IHoucHJlcHJvY2VzcyhcbiAgICAgIHZhbHVlID0+IHZhbGlkYXRlQXJpdGhtZXRpY0V4cHJlc3Npb24oJ2Jhc2VsaW5lLW1lbW9yeScsIHZhbHVlLCAnbnVtYmVyJyksXG4gICAgICB6Lm51bWJlcigpLmd0ZSgwKS5kZWZhdWx0KDE2KVxuICAgICksXG4gICAgJ2Jhc2VsaW5lLWVtaXNzaW9ucyc6IHoucHJlcHJvY2VzcyhcbiAgICAgIHZhbHVlID0+XG4gICAgICAgIHZhbGlkYXRlQXJpdGhtZXRpY0V4cHJlc3Npb24oJ2Jhc2VsaW5lLWVtaXNzaW9ucycsIHZhbHVlLCAnbnVtYmVyJyksXG4gICAgICB6Lm51bWJlcigpLmd0ZSgwKS5kZWZhdWx0KDEwMDAwMDApXG4gICAgKSxcbiAgICBsaWZlc3Bhbjogei5wcmVwcm9jZXNzKFxuICAgICAgdmFsdWUgPT4gdmFsaWRhdGVBcml0aG1ldGljRXhwcmVzc2lvbignbGlmZXNwYW4nLCB2YWx1ZSwgJ251bWJlcicpLFxuICAgICAgei5udW1iZXIoKS5ndCgwKS5kZWZhdWx0KDEyNjE0NDAwMClcbiAgICApLFxuICAgICd2Y3B1LWVtaXNzaW9ucy1jb25zdGFudCc6IHoucHJlcHJvY2VzcyhcbiAgICAgIHZhbHVlID0+XG4gICAgICAgIHZhbGlkYXRlQXJpdGhtZXRpY0V4cHJlc3Npb24oXG4gICAgICAgICAgJ3ZjcHUtZW1pc3Npb25zLWNvbnN0YW50JyxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAnbnVtYmVyJ1xuICAgICAgICApLFxuICAgICAgei5udW1iZXIoKS5ndGUoMCkuZGVmYXVsdCgxMDAwMDApXG4gICAgKSxcbiAgICAnbWVtb3J5LWVtaXNzaW9ucy1jb25zdGFudCc6IHoucHJlcHJvY2VzcyhcbiAgICAgIHZhbHVlID0+XG4gICAgICAgIHZhbGlkYXRlQXJpdGhtZXRpY0V4cHJlc3Npb24oXG4gICAgICAgICAgJ21lbW9yeS1lbWlzc2lvbnMtY29uc3RhbnQnLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICdudW1iZXInXG4gICAgICAgICksXG4gICAgICB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAuZ3RlKDApXG4gICAgICAgIC5kZWZhdWx0KDUzMyAvIDM4NClcbiAgICApLFxuICAgICdzc2QtZW1pc3Npb25zLWNvbnN0YW50Jzogei5wcmVwcm9jZXNzKFxuICAgICAgdmFsdWUgPT5cbiAgICAgICAgdmFsaWRhdGVBcml0aG1ldGljRXhwcmVzc2lvbignc3NkLWVtaXNzaW9ucy1jb25zdGFudCcsIHZhbHVlLCAnbnVtYmVyJyksXG4gICAgICB6Lm51bWJlcigpLmd0ZSgwKS5kZWZhdWx0KDUwMDAwKVxuICAgICksXG4gICAgJ2hkZC1lbWlzc2lvbnMtY29uc3RhbnQnOiB6LnByZXByb2Nlc3MoXG4gICAgICB2YWx1ZSA9PlxuICAgICAgICB2YWxpZGF0ZUFyaXRobWV0aWNFeHByZXNzaW9uKCdoZGQtZW1pc3Npb25zLWNvbnN0YW50JywgdmFsdWUsICdudW1iZXInKSxcbiAgICAgIHoubnVtYmVyKCkuZ3RlKDApLmRlZmF1bHQoMTAwMDAwKVxuICAgICksXG4gICAgJ2dwdS1lbWlzc2lvbnMtY29uc3RhbnQnOiB6LnByZXByb2Nlc3MoXG4gICAgICB2YWx1ZSA9PlxuICAgICAgICB2YWxpZGF0ZUFyaXRobWV0aWNFeHByZXNzaW9uKCdncHUtZW1pc3Npb25zLWNvbnN0YW50JywgdmFsdWUsICdudW1iZXInKSxcbiAgICAgIHoubnVtYmVyKCkuZ3RlKDApLmRlZmF1bHQoMTUwMDAwKVxuICAgICksXG4gICAgJ291dHB1dC1wYXJhbWV0ZXInOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuICBpbnB1dFZhbGlkYXRpb246IHoub2JqZWN0KHtcbiAgICBkdXJhdGlvbjogei5udW1iZXIoKS5ndCgwKSxcbiAgICB2Q1BVczogei5udW1iZXIoKS5ndCgwKS5kZWZhdWx0KDEpLFxuICAgIG1lbW9yeTogei5udW1iZXIoKS5ndCgwKS5kZWZhdWx0KDE2KSxcbiAgICBzc2Q6IHoubnVtYmVyKCkuZ3RlKDApLmRlZmF1bHQoMCksXG4gICAgaGRkOiB6Lm51bWJlcigpLmd0ZSgwKS5kZWZhdWx0KDApLFxuICAgIGdwdTogei5udW1iZXIoKS5ndGUoMCkuZGVmYXVsdCgwKSxcbiAgICAndXNhZ2UtcmF0aW8nOiB6Lm51bWJlcigpLmd0KDApLmRlZmF1bHQoMSksXG4gICAgdGltZTogei5udW1iZXIoKS5ndCgwKS5vcHRpb25hbCgpLFxuICB9KSxcbiAgaW1wbGVtZW50YXRpb246IGFzeW5jIChpbnB1dHM6IFBsdWdpblBhcmFtc1tdLCBjb25maWc6IENvbmZpZ1BhcmFtcykgPT4ge1xuICAgIC8qKlxuICAgICAqIDEuIFZhbGlkYXRlcyBjb25maWd1cmF0aW9uIGFuZCBhc3NpZ25zIGRlZmF1bHRzIHZhbHVlcyBpZiBub3QgcHJvdmlkZWQuXG4gICAgICogMi4gTWFwcyB0aHJvdWdoIG9ic2VydmF0aW9ucyBhbmQgdmFsaWRhdGVzIHRoZW0uXG4gICAgICogMy4gQ2FsY3VsYXRlcyB0b3RhbCBlbWJvZGllZCBjYXJib24gYnkgc3Vic3RyYWN0aW5nIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGJhc2VsaW5lIHNlcnZlciBhbmQgZ2l2ZW4gb25lLlxuICAgICAqL1xuICAgIHJldHVybiBpbnB1dHMubWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGNwdUUgPVxuICAgICAgICAoaW5wdXQudkNQVXMgLSBjb25maWdbJ2Jhc2VsaW5lLXZjcHVzJ10pICpcbiAgICAgICAgY29uZmlnWyd2Y3B1LWVtaXNzaW9ucy1jb25zdGFudCddO1xuICAgICAgY29uc3QgbWVtb3J5RSA9XG4gICAgICAgIChpbnB1dC5tZW1vcnkgLSBjb25maWdbJ2Jhc2VsaW5lLW1lbW9yeSddKSAqXG4gICAgICAgICgoY29uZmlnWydtZW1vcnktZW1pc3Npb25zLWNvbnN0YW50J10gKiBjb25maWdbJ2Jhc2VsaW5lLW1lbW9yeSddKSAvXG4gICAgICAgICAgMTYpICpcbiAgICAgICAgMTAwMDtcbiAgICAgIGNvbnN0IGhkZEUgPSBpbnB1dC5oZGQgKiBjb25maWdbJ2hkZC1lbWlzc2lvbnMtY29uc3RhbnQnXTtcbiAgICAgIGNvbnN0IGdwdUUgPSBpbnB1dC5ncHUgKiBjb25maWdbJ2dwdS1lbWlzc2lvbnMtY29uc3RhbnQnXTtcbiAgICAgIGNvbnN0IHNzZEUgPSBpbnB1dC5zc2QgKiBjb25maWdbJ3NzZC1lbWlzc2lvbnMtY29uc3RhbnQnXTtcbiAgICAgIGNvbnN0IHRpbWUgPSBpbnB1dFsndGltZSddIHx8IGlucHV0LmR1cmF0aW9uO1xuXG4gICAgICBjb25zdCB0b3RhbEVtYm9kaWVkID1cbiAgICAgICAgY29uZmlnWydiYXNlbGluZS1lbWlzc2lvbnMnXSArIGNwdUUgKyBtZW1vcnlFICsgc3NkRSArIGhkZEUgKyBncHVFO1xuXG4gICAgICBjb25zdCB0b3RhbEVtYm9kaWVkU2NhbGVkQnlVc2FnZSA9IHRvdGFsRW1ib2RpZWQgKiBpbnB1dFsndXNhZ2UtcmF0aW8nXTtcblxuICAgICAgY29uc3QgdG90YWxFbWJvZGllZFNjYWxlZEJ5VXNhZ2VBbmRUaW1lID1cbiAgICAgICAgdG90YWxFbWJvZGllZFNjYWxlZEJ5VXNhZ2UgKiAodGltZSAvIGNvbmZpZ1snbGlmZXNwYW4nXSk7XG5cbiAgICAgIGNvbnN0IGVtYm9kaWVkQ2FyYm9uS2V5ID0gY29uZmlnWydvdXRwdXQtcGFyYW1ldGVyJ10gfHwgJ2VtYm9kaWVkLWNhcmJvbic7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0LFxuICAgICAgICBbZW1ib2RpZWRDYXJib25LZXldOiB0b3RhbEVtYm9kaWVkU2NhbGVkQnlVc2FnZUFuZFRpbWUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9LFxuICBhbGxvd0FyaXRobWV0aWNFeHByZXNzaW9uczogW1xuICAgICdiYXNlbGluZS12Y3B1cycsXG4gICAgJ2Jhc2VsaW5lLW1lbW9yeScsXG4gICAgJ2Jhc2VsaW5lLWVtaXNzaW9ucycsXG4gICAgJ2xpZmVzcGFuJyxcbiAgICAndmNwdS1lbWlzc2lvbnMtY29uc3RhbnQnLFxuICAgICdtZW1vcnktZW1pc3Npb25zLWNvbnN0YW50JyxcbiAgICAnc3NkLWVtaXNzaW9ucy1jb25zdGFudCcsXG4gICAgJ2hkZC1lbWlzc2lvbnMtY29uc3RhbnQnLFxuICAgICdncHUtZW1pc3Npb25zLWNvbnN0YW50JyxcbiAgXSxcbn0pO1xuIl19