UNPKG

faastjs

Version:

Serverless batch computing made simple.

197 lines 25.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.serializeReturnValue = exports.serializeFunctionArgs = exports.deserialize = exports.deserializeUint8Array = exports.serializeToUint8Array = exports.serialize = exports.deepCopyUndefined = void 0; const assert_1 = require("assert"); const error_1 = require("./error"); const util_1 = require("util"); // Deep copy undefined and symbol keys from source to dest. Mainly used to see // if the source and dest are deep equal once these differences are factored // out. function deepCopyUndefined(dest, source) { const stack = []; function isBackReference(o) { for (const elem of stack) { if (elem === o) { return true; } } return false; } function recurse(d, s) { if (isBackReference(s) || d === undefined) { return; } stack.push(s); Object.keys(s).forEach(key => { if (s[key] && typeof s[key] === "object") { recurse(d[key], s[key]); } else if (s[key] === undefined) { d[key] = undefined; } else if (typeof s[key] === "symbol") { d[key] = s[key]; } }); Object.getOwnPropertySymbols(s).forEach(key => { d[key] = s[key]; }); stack.pop(); } typeof source === "object" && recurse(dest, source); } exports.deepCopyUndefined = deepCopyUndefined; const FJS_TYPE = "[faastjs type]"; function replacer(key, value) { const orig = this[key]; const type = Object.prototype.toString.call(orig).slice(8, -1); if (typeof orig === "object" && orig instanceof Buffer) { return { [FJS_TYPE]: "Buffer", value }; } switch (type) { case "Undefined": return { [FJS_TYPE]: type }; case "Number": if (orig === Number.POSITIVE_INFINITY) { return { [FJS_TYPE]: type, value: "+Infinity" }; } else if (orig === Number.NEGATIVE_INFINITY) { return { [FJS_TYPE]: type, value: "-Infinity" }; } else if (Number.isNaN(orig)) { return { [FJS_TYPE]: type, value: "NaN" }; } return value; case "Error": { const errObj = {}; Object.getOwnPropertyNames(value).forEach(name => { if (typeof value[name] === "string") { errObj[name] = JSON.stringify(value[name], replacer); } }); return { [FJS_TYPE]: type, value: errObj }; } case "Date": return { [FJS_TYPE]: type, value }; case "Int8Array": case "Uint8Array": case "Uint8ClampedArray": case "Int16Array": case "Uint16Array": case "Int32Array": case "Uint32Array": case "Float32Array": case "Float64Array": case "Map": case "Set": return { [FJS_TYPE]: type, value: [...orig] }; default: return value; } } function serialize(arg, validate = false) { const str = JSON.stringify(arg, replacer); if (validate) { const deserialized = deserialize(str); deepCopyUndefined(deserialized, arg); (0, assert_1.deepStrictEqual)(deserialized, arg); } return str; } exports.serialize = serialize; function serializeToUint8Array(arg, validate = false) { const encoder = new util_1.TextEncoder(); return encoder.encode(serialize(arg, validate)); } exports.serializeToUint8Array = serializeToUint8Array; function reviver(_, value) { try { if (typeof value === "object") { if (value.hasOwnProperty(FJS_TYPE)) { const type = value[FJS_TYPE]; switch (type) { case "Date": return new Date(value["value"]); case "Buffer": return Buffer.from(value["value"]); case "Error": { const sErr = value["value"]; const err = new Error(sErr.message); for (const key of Object.keys(sErr)) { err[key] = JSON.parse(sErr[key], reviver); } return err; } case "Int8Array": return new Int8Array(value["value"]); case "Uint8Array": return new Uint8Array(value["value"]); case "Uint8ClampedArray": return new Uint8ClampedArray(value["value"]); case "Int16Array": return new Int16Array(value["value"]); case "Uint16Array": return new Uint16Array(value["value"]); case "Int32Array": return new Int32Array(value["value"]); case "Uint32Array": return new Uint32Array(value["value"]); case "Float32Array": return new Float32Array(value["value"]); case "Float64Array": return new Float64Array(value["value"]); case "Undefined": return undefined; case "Number": { switch (value["value"]) { case "+Infinity": return Number.POSITIVE_INFINITY; case "-Infinity": return Number.NEGATIVE_INFINITY; case "NaN": return Number.NaN; default: return value; } } case "Map": return new Map(value["value"]); case "Set": return new Set(value["value"]); } } } } catch { } return value; } function deserializeUint8Array(data) { const decoder = new util_1.TextDecoder(); return JSON.parse(decoder.decode(data), reviver); } exports.deserializeUint8Array = deserializeUint8Array; function deserialize(data) { return JSON.parse(data, reviver); } exports.deserialize = deserialize; function serializeFunctionArgs(name, args, validate) { try { return serialize(args, validate); } catch (err) { const error = new error_1.FaastError({ cause: err, name: error_1.FaastErrorNames.ESERIALIZE }, `faast: Detected '${name}' argument cannot be serialized by JSON.stringify`); throw error; } } exports.serializeFunctionArgs = serializeFunctionArgs; function serializeReturnValue(name, returned, validate) { try { return serialize(returned, validate); } catch (err) { const error = new error_1.FaastError({ cause: err, name: error_1.FaastErrorNames.ESERIALIZE }, `faast: Detected return value from ${name} cannot be serialized by JSON.stringify: ${(0, util_1.inspect)(returned)}`); throw error; } } exports.serializeReturnValue = serializeReturnValue; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBeUM7QUFDekMsbUNBQXNEO0FBQ3RELCtCQUF5RDtBQUV6RCw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLE9BQU87QUFDUCxTQUFnQixpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsTUFBYztJQUMxRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsU0FBUyxlQUFlLENBQUMsQ0FBUztRQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN0QixJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7Z0JBQ1osT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELFNBQVMsT0FBTyxDQUFDLENBQU0sRUFBRSxDQUFNO1FBQzNCLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDdkMsT0FBTztTQUNWO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDdEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMzQjtpQkFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQzdCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7YUFDdEI7aUJBQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxH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LENBQUM7QUFIRCxzREFHQztBQUVELFNBQWdCLFdBQVcsQ0FBVSxJQUFZO0lBQzdDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUZELGtDQUVDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsSUFBWSxFQUFFLElBQVcsRUFBRSxRQUFpQjtJQUM5RSxJQUFJO1FBQ0EsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ3BDO0lBQUMsT0FBTyxHQUFRLEVBQUU7UUFDZixNQUFNLEtBQUssR0FBRyxJQUFJLGtCQUFVLENBQ3hCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsdUJBQWUsQ0FBQyxVQUFVLEVBQUUsRUFDaEQsb0JBQW9CLElBQUksbURBQW1ELENBQzlFLENBQUM7UUFDRixNQUFNLEtBQUssQ0FBQztLQUNmO0FBQ0wsQ0FBQztBQVZELHNEQVVDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsSUFBWSxFQUFFLFFBQWEsRUFBRSxRQUFpQjtJQUMvRSxJQUFJO1FBQ0EsT0FBTyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ3hDO0lBQUMsT0FBTyxHQUFRLEVBQUU7UUFDZixNQUFNLEtBQUssR0FBRyxJQUFJLGtCQUFVLENBQ3hCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsdUJBQWUsQ0FBQyxVQUFVLEVBQUUsRUFDaEQscUNBQXFDLElBQUksNENBQTRDLElBQUEsY0FBTyxFQUN4RixRQUFRLENBQ1gsRUFBRSxDQUNOLENBQUM7UUFDRixNQUFNLEtBQUssQ0FBQztLQUNmO0FBQ0wsQ0FBQztBQVpELG9EQVlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVlcFN0cmljdEVxdWFsIH0gZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgRmFhc3RFcnJvciwgRmFhc3RFcnJvck5hbWVzIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IGluc3BlY3QsIFRleHREZWNvZGVyLCBUZXh0RW5jb2RlciB9IGZyb20gXCJ1dGlsXCI7XG5cbi8vIERlZXAgY29weSB1bmRlZmluZWQgYW5kIHN5bWJvbCBrZXlzIGZyb20gc291cmNlIHRvIGRlc3QuIE1haW5seSB1c2VkIHRvIHNlZVxuLy8gaWYgdGhlIHNvdXJjZSBhbmQgZGVzdCBhcmUgZGVlcCBlcXVhbCBvbmNlIHRoZXNlIGRpZmZlcmVuY2VzIGFyZSBmYWN0b3JlZFxuLy8gb3V0LlxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDb3B5VW5kZWZpbmVkKGRlc3Q6IG9iamVjdCwgc291cmNlOiBvYmplY3QpIHtcbiAgICBjb25zdCBzdGFjazogb2JqZWN0W10gPSBbXTtcbiAgICBmdW5jdGlvbiBpc0JhY2tSZWZlcmVuY2Uobzogb2JqZWN0KSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbSBvZiBzdGFjaykge1xuICAgICAgICAgICAgaWYgKGVsZW0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2UoZDogYW55LCBzOiBhbnkpIHtcbiAgICAgICAgaWYgKGlzQmFja1JlZmVyZW5jZShzKSB8fCBkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdGFjay5wdXNoKHMpO1xuICAgICAgICBPYmplY3Qua2V5cyhzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoc1trZXldICYmIHR5cGVvZiBzW2tleV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICByZWN1cnNlKGRba2V5XSwgc1trZXldKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzW2tleV0gPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICAgICAgICBkW2tleV0gPSBzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGRba2V5XSA9IHNba2V5XTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgIH1cbiAgICB0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHJlY3Vyc2UoZGVzdCwgc291cmNlKTtcbn1cblxuY29uc3QgRkpTX1RZUEUgPSBcIltmYWFzdGpzIHR5cGVdXCI7XG5cbmZ1bmN0aW9uIHJlcGxhY2VyKHRoaXM6IGFueSwga2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBvcmlnID0gdGhpc1trZXldO1xuICAgIGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob3JpZykuc2xpY2UoOCwgLTEpO1xuICAgIGlmICh0eXBlb2Ygb3JpZyA9PT0gXCJvYmplY3RcIiAmJiBvcmlnIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB7IFtGSlNfVFlQRV06IFwiQnVmZmVyXCIsIHZhbHVlIH07XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiVW5kZWZpbmVkXCI6XG4gICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlIH07XG4gICAgICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgICAgICAgIGlmIChvcmlnID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlLCB2YWx1ZTogXCIrSW5maW5pdHlcIiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlLCB2YWx1ZTogXCItSW5maW5pdHlcIiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNOYU4ob3JpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlLCB2YWx1ZTogXCJOYU5cIiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjYXNlIFwiRXJyb3JcIjoge1xuICAgICAgICAgICAgY29uc3QgZXJyT2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSlbbmFtZV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyT2JqW25hbWVdID0gSlNPTi5zdHJpbmdpZnkoKHZhbHVlIGFzIGFueSlbbmFtZV0sIHJlcGxhY2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IFtGSlNfVFlQRV06IHR5cGUsIHZhbHVlOiBlcnJPYmogfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiRGF0ZVwiOlxuICAgICAgICAgICAgcmV0dXJuIHsgW0ZKU19UWVBFXTogdHlwZSwgdmFsdWUgfTtcbiAgICAgICAgY2FzZSBcIkludDhBcnJheVwiOlxuICAgICAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgICAgICBjYXNlIFwiVWludDhDbGFtcGVkQXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIkludDE2QXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJJbnQzMkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJVaW50MzJBcnJheVwiOlxuICAgICAgICBjYXNlIFwiRmxvYXQzMkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJGbG9hdDY0QXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIk1hcFwiOlxuICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlLCB2YWx1ZTogWy4uLm9yaWddIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGFyZzogYW55LCB2YWxpZGF0ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoYXJnLCByZXBsYWNlcik7XG4gICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IGRlc2VyaWFsaXplKHN0cik7XG4gICAgICAgIGRlZXBDb3B5VW5kZWZpbmVkKGRlc2VyaWFsaXplZCwgYXJnKTtcbiAgICAgICAgZGVlcFN0cmljdEVxdWFsKGRlc2VyaWFsaXplZCwgYXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVRvVWludDhBcnJheShhcmc6IGFueSwgdmFsaWRhdGU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICByZXR1cm4gZW5jb2Rlci5lbmNvZGUoc2VyaWFsaXplKGFyZywgdmFsaWRhdGUpKTtcbn1cblxuZnVuY3Rpb24gcmV2aXZlcih0aGlzOiBhbnksIF86IGFueSwgdmFsdWU6IGFueSkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShGSlNfVFlQRSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdmFsdWVbRkpTX1RZUEVdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJFcnJvclwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzRXJyID0gdmFsdWVbXCJ2YWx1ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihzRXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc0VycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyIGFzIGFueSlba2V5XSA9IEpTT04ucGFyc2Uoc0VycltrZXldLCByZXZpdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkludDhBcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQ4QXJyYXkodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVaW50OEFycmF5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVaW50OENsYW1wZWRBcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkludDE2QXJyYXlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50MTZBcnJheSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQxNkFycmF5KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiSW50MzJBcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVWludDMyQXJyYXlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDMyQXJyYXkodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJGbG9hdDMyQXJyYXlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRmxvYXQ2NEFycmF5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0NjRBcnJheSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk51bWJlclwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlW1widmFsdWVcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiK0luZmluaXR5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIi1JbmZpbml0eVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJOYU5cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5OYU47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNYXBcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWFwKHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVVaW50OEFycmF5PFQgPSBhbnk+KGRhdGE6IFVpbnQ4QXJyYXkpOiBUIHtcbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2Rlci5kZWNvZGUoZGF0YSksIHJldml2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8VCA9IGFueT4oZGF0YTogc3RyaW5nKTogVCB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSwgcmV2aXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVGdW5jdGlvbkFyZ3MobmFtZTogc3RyaW5nLCBhcmdzOiBhbnlbXSwgdmFsaWRhdGU6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplKGFyZ3MsIHZhbGlkYXRlKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBGYWFzdEVycm9yKFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyLCBuYW1lOiBGYWFzdEVycm9yTmFtZXMuRVNFUklBTElaRSB9LFxuICAgICAgICAgICAgYGZhYXN0OiBEZXRlY3RlZCAnJHtuYW1lfScgYXJndW1lbnQgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYnkgSlNPTi5zdHJpbmdpZnlgXG4gICAgICAgICk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJldHVyblZhbHVlKG5hbWU6IHN0cmluZywgcmV0dXJuZWQ6IGFueSwgdmFsaWRhdGU6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplKHJldHVybmVkLCB2YWxpZGF0ZSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRmFhc3RFcnJvcihcbiAgICAgICAgICAgIHsgY2F1c2U6IGVyciwgbmFtZTogRmFhc3RFcnJvck5hbWVzLkVTRVJJQUxJWkUgfSxcbiAgICAgICAgICAgIGBmYWFzdDogRGV0ZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gJHtuYW1lfSBjYW5ub3QgYmUgc2VyaWFsaXplZCBieSBKU09OLnN0cmluZ2lmeTogJHtpbnNwZWN0KFxuICAgICAgICAgICAgICAgIHJldHVybmVkXG4gICAgICAgICAgICApfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuIl19