1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.serializeReturnValue = exports.serializeFunctionArgs = exports.deserialize = exports.serialize = exports.deepCopyUndefined = void 0;
|
4 | const assert_1 = require("assert");
|
5 | const error_1 = require("./error");
|
6 | const util_1 = require("util");
|
7 | // Deep copy undefined and symbol keys from source to dest. Mainly used to see
|
8 | // if the source and dest are deep equal once these differences are factored
|
9 | // out.
|
10 | function deepCopyUndefined(dest, source) {
|
11 | const stack = [];
|
12 | function isBackReference(o) {
|
13 | for (const elem of stack) {
|
14 | if (elem === o) {
|
15 | return true;
|
16 | }
|
17 | }
|
18 | return false;
|
19 | }
|
20 | function recurse(d, s) {
|
21 | if (isBackReference(s) || d === undefined) {
|
22 | return;
|
23 | }
|
24 | stack.push(s);
|
25 | Object.keys(s).forEach(key => {
|
26 | if (s[key] && typeof s[key] === "object") {
|
27 | recurse(d[key], s[key]);
|
28 | }
|
29 | else if (s[key] === undefined) {
|
30 | d[key] = undefined;
|
31 | }
|
32 | else if (typeof s[key] === "symbol") {
|
33 | d[key] = s[key];
|
34 | }
|
35 | });
|
36 | Object.getOwnPropertySymbols(s).forEach(key => {
|
37 | d[key] = s[key];
|
38 | });
|
39 | stack.pop();
|
40 | }
|
41 | typeof source === "object" && recurse(dest, source);
|
42 | }
|
43 | exports.deepCopyUndefined = deepCopyUndefined;
|
44 | const FJS_TYPE = "[faastjs type]";
|
45 | function replacer(key, value) {
|
46 | const orig = this[key];
|
47 | const type = Object.prototype.toString.call(orig).slice(8, -1);
|
48 | if (typeof orig === "object" && orig instanceof Buffer) {
|
49 | return { [FJS_TYPE]: "Buffer", value };
|
50 | }
|
51 | switch (type) {
|
52 | case "Undefined":
|
53 | return { [FJS_TYPE]: type };
|
54 | case "Number":
|
55 | if (orig === Number.POSITIVE_INFINITY) {
|
56 | return { [FJS_TYPE]: type, value: "+Infinity" };
|
57 | }
|
58 | else if (orig === Number.NEGATIVE_INFINITY) {
|
59 | return { [FJS_TYPE]: type, value: "-Infinity" };
|
60 | }
|
61 | else if (Number.isNaN(orig)) {
|
62 | return { [FJS_TYPE]: type, value: "NaN" };
|
63 | }
|
64 | return value;
|
65 | case "Error": {
|
66 | const errObj = {};
|
67 | Object.getOwnPropertyNames(value).forEach(name => {
|
68 | if (typeof value[name] === "string") {
|
69 | errObj[name] = JSON.stringify(value[name], replacer);
|
70 | }
|
71 | });
|
72 | return { [FJS_TYPE]: type, value: errObj };
|
73 | }
|
74 | case "Date":
|
75 | return { [FJS_TYPE]: type, value };
|
76 | case "Int8Array":
|
77 | case "Uint8Array":
|
78 | case "Uint8ClampedArray":
|
79 | case "Int16Array":
|
80 | case "Uint16Array":
|
81 | case "Int32Array":
|
82 | case "Uint32Array":
|
83 | case "Float32Array":
|
84 | case "Float64Array":
|
85 | case "Map":
|
86 | case "Set":
|
87 | return { [FJS_TYPE]: type, value: [...orig] };
|
88 | default:
|
89 | return value;
|
90 | }
|
91 | }
|
92 | function serialize(arg, validate = false) {
|
93 | const str = JSON.stringify(arg, replacer);
|
94 | if (validate) {
|
95 | const deserialized = deserialize(str);
|
96 | deepCopyUndefined(deserialized, arg);
|
97 | (0, assert_1.deepStrictEqual)(deserialized, arg);
|
98 | }
|
99 | return str;
|
100 | }
|
101 | exports.serialize = serialize;
|
102 | function reviver(_, value) {
|
103 | try {
|
104 | if (typeof value === "object") {
|
105 | if (value.hasOwnProperty(FJS_TYPE)) {
|
106 | const type = value[FJS_TYPE];
|
107 | switch (type) {
|
108 | case "Date":
|
109 | return new Date(value["value"]);
|
110 | case "Buffer":
|
111 | return Buffer.from(value["value"]);
|
112 | case "Error": {
|
113 | const sErr = value["value"];
|
114 | const err = new Error(sErr.message);
|
115 | for (const key of Object.keys(sErr)) {
|
116 | err[key] = JSON.parse(sErr[key], reviver);
|
117 | }
|
118 | return err;
|
119 | }
|
120 | case "Int8Array":
|
121 | return new Int8Array(value["value"]);
|
122 | case "Uint8Array":
|
123 | return new Uint8Array(value["value"]);
|
124 | case "Uint8ClampedArray":
|
125 | return new Uint8ClampedArray(value["value"]);
|
126 | case "Int16Array":
|
127 | return new Int16Array(value["value"]);
|
128 | case "Uint16Array":
|
129 | return new Uint16Array(value["value"]);
|
130 | case "Int32Array":
|
131 | return new Int32Array(value["value"]);
|
132 | case "Uint32Array":
|
133 | return new Uint32Array(value["value"]);
|
134 | case "Float32Array":
|
135 | return new Float32Array(value["value"]);
|
136 | case "Float64Array":
|
137 | return new Float64Array(value["value"]);
|
138 | case "Undefined":
|
139 | return undefined;
|
140 | case "Number": {
|
141 | switch (value["value"]) {
|
142 | case "+Infinity":
|
143 | return Number.POSITIVE_INFINITY;
|
144 | case "-Infinity":
|
145 | return Number.NEGATIVE_INFINITY;
|
146 | case "NaN":
|
147 | return Number.NaN;
|
148 | default:
|
149 | return value;
|
150 | }
|
151 | }
|
152 | case "Map":
|
153 | return new Map(value["value"]);
|
154 | case "Set":
|
155 | return new Set(value["value"]);
|
156 | }
|
157 | }
|
158 | }
|
159 | }
|
160 | catch { }
|
161 | return value;
|
162 | }
|
163 | function deserialize(str) {
|
164 | return JSON.parse(str, reviver);
|
165 | }
|
166 | exports.deserialize = deserialize;
|
167 | function serializeFunctionArgs(name, args, validate) {
|
168 | try {
|
169 | return serialize(args, validate);
|
170 | }
|
171 | catch (err) {
|
172 | const error = new error_1.FaastError({ cause: err, name: error_1.FaastErrorNames.ESERIALIZE }, `faast: Detected '${name}' argument cannot be serialized by JSON.stringify`);
|
173 | throw error;
|
174 | }
|
175 | }
|
176 | exports.serializeFunctionArgs = serializeFunctionArgs;
|
177 | function serializeReturnValue(name, returned, validate) {
|
178 | try {
|
179 | return serialize(returned, validate);
|
180 | }
|
181 | catch (err) {
|
182 | 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)}`);
|
183 | throw error;
|
184 | }
|
185 | }
|
186 | exports.serializeReturnValue = serializeReturnValue;
|
187 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBeUM7QUFDekMsbUNBQXNEO0FBQ3RELCtCQUErQjtBQUUvQiw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLE9BQU87QUFDUCxTQUFnQixpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsTUFBYztJQUMxRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsU0FBUyxlQUFlLENBQUMsQ0FBUztRQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN0QixJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7Z0JBQ1osT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELFNBQVMsT0FBTyxDQUFDLENBQU0sRUFBRSxDQUFNO1FBQzNCLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDdkMsT0FBTztTQUNWO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDdEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMzQjtpQkFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQzdCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7YUFDdEI7aUJBQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxH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QkFBb0IsSUFBSSxtREFBbUQsQ0FDOUUsQ0FBQztRQUNGLE1BQU0sS0FBSyxDQUFDO0tBQ2Y7QUFDTCxDQUFDO0FBZEQsc0RBY0M7QUFFRCxTQUFnQixvQkFBb0IsQ0FDaEMsSUFBWSxFQUNaLFFBQWEsRUFDYixRQUFpQjtJQUVqQixJQUFJO1FBQ0EsT0FBTyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ3hDO0lBQUMsT0FBTyxHQUFRLEVBQUU7UUFDZixNQUFNLEtBQUssR0FBRyxJQUFJLGtCQUFVLENBQ3hCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsdUJBQWUsQ0FBQyxVQUFVLEVBQUUsRUFDaEQscUNBQXFDLElBQUksNENBQTRDLElBQUEsY0FBTyxFQUN4RixRQUFRLENBQ1gsRUFBRSxDQUNOLENBQUM7UUFDRixNQUFNLEtBQUssQ0FBQztLQUNmO0FBQ0wsQ0FBQztBQWhCRCxvREFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWVwU3RyaWN0RXF1YWwgfSBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBGYWFzdEVycm9yLCBGYWFzdEVycm9yTmFtZXMgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5cbi8vIERlZXAgY29weSB1bmRlZmluZWQgYW5kIHN5bWJvbCBrZXlzIGZyb20gc291cmNlIHRvIGRlc3QuIE1haW5seSB1c2VkIHRvIHNlZVxuLy8gaWYgdGhlIHNvdXJjZSBhbmQgZGVzdCBhcmUgZGVlcCBlcXVhbCBvbmNlIHRoZXNlIGRpZmZlcmVuY2VzIGFyZSBmYWN0b3JlZFxuLy8gb3V0LlxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDb3B5VW5kZWZpbmVkKGRlc3Q6IG9iamVjdCwgc291cmNlOiBvYmplY3QpIHtcbiAgICBjb25zdCBzdGFjazogb2JqZWN0W10gPSBbXTtcbiAgICBmdW5jdGlvbiBpc0JhY2tSZWZlcmVuY2Uobzogb2JqZWN0KSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbSBvZiBzdGFjaykge1xuICAgICAgICAgICAgaWYgKGVsZW0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2UoZDogYW55LCBzOiBhbnkpIHtcbiAgICAgICAgaWYgKGlzQmFja1JlZmVyZW5jZShzKSB8fCBkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdGFjay5wdXNoKHMpO1xuICAgICAgICBPYmplY3Qua2V5cyhzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoc1trZXldICYmIHR5cGVvZiBzW2tleV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICByZWN1cnNlKGRba2V5XSwgc1trZXldKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzW2tleV0gPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICAgICAgICBkW2tleV0gPSBzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGRba2V5XSA9IHNba2V5XTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgIH1cbiAgICB0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHJlY3Vyc2UoZGVzdCwgc291cmNlKTtcbn1cblxuY29uc3QgRkpTX1RZUEUgPSBcIltmYWFzdGpzIHR5cGVdXCI7XG5cbmZ1bmN0aW9uIHJlcGxhY2VyKHRoaXM6IGFueSwga2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBvcmlnID0gdGhpc1trZXldO1xuICAgIGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob3JpZykuc2xpY2UoOCwgLTEpO1xuICAgIGlmICh0eXBlb2Ygb3JpZyA9PT0gXCJvYmplY3RcIiAmJiBvcmlnIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB7IFtGSlNfVFlQRV06IFwiQnVmZmVyXCIsIHZhbHVlIH07XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiVW5kZWZpbmVkXCI6XG4gICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlIH07XG4gICAgICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgICAgICAgIGlmIChvcmlnID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlLCB2YWx1ZTogXCIrSW5maW5pdHlcIiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlLCB2YWx1ZTogXCItSW5maW5pdHlcIiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNOYU4ob3JpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlLCB2YWx1ZTogXCJOYU5cIiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjYXNlIFwiRXJyb3JcIjoge1xuICAgICAgICAgICAgY29uc3QgZXJyT2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSlbbmFtZV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyT2JqW25hbWVdID0gSlNPTi5zdHJpbmdpZnkoKHZhbHVlIGFzIGFueSlbbmFtZV0sIHJlcGxhY2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IFtGSlNfVFlQRV06IHR5cGUsIHZhbHVlOiBlcnJPYmogfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiRGF0ZVwiOlxuICAgICAgICAgICAgcmV0dXJuIHsgW0ZKU19UWVBFXTogdHlwZSwgdmFsdWUgfTtcbiAgICAgICAgY2FzZSBcIkludDhBcnJheVwiOlxuICAgICAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgICAgICBjYXNlIFwiVWludDhDbGFtcGVkQXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIkludDE2QXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJJbnQzMkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJVaW50MzJBcnJheVwiOlxuICAgICAgICBjYXNlIFwiRmxvYXQzMkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJGbG9hdDY0QXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIk1hcFwiOlxuICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlLCB2YWx1ZTogWy4uLm9yaWddIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGFyZzogYW55LCB2YWxpZGF0ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoYXJnLCByZXBsYWNlcik7XG4gICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IGRlc2VyaWFsaXplKHN0cik7XG4gICAgICAgIGRlZXBDb3B5VW5kZWZpbmVkKGRlc2VyaWFsaXplZCwgYXJnKTtcbiAgICAgICAgZGVlcFN0cmljdEVxdWFsKGRlc2VyaWFsaXplZCwgYXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gcmV2aXZlcih0aGlzOiBhbnksIF86IGFueSwgdmFsdWU6IGFueSkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShGSlNfVFlQRSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdmFsdWVbRkpTX1RZUEVdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJFcnJvclwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzRXJyID0gdmFsdWVbXCJ2YWx1ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihzRXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc0VycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyIGFzIGFueSlba2V5XSA9IEpTT04ucGFyc2Uoc0VycltrZXldLCByZXZpdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkludDhBcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQ4QXJyYXkodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVaW50OEFycmF5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVaW50OENsYW1wZWRBcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkludDE2QXJyYXlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50MTZBcnJheSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQxNkFycmF5KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiSW50MzJBcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVWludDMyQXJyYXlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDMyQXJyYXkodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJGbG9hdDMyQXJyYXlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRmxvYXQ2NEFycmF5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0NjRBcnJheSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk51bWJlclwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlW1widmFsdWVcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiK0luZmluaXR5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIi1JbmZpbml0eVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJOYU5cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5OYU47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNYXBcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWFwKHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8VCA9IGFueT4oc3RyOiBzdHJpbmcpOiBUIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIsIHJldml2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplRnVuY3Rpb25BcmdzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhcmdzOiBhbnlbXSxcbiAgICB2YWxpZGF0ZTogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplKGFyZ3MsIHZhbGlkYXRlKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBGYWFzdEVycm9yKFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyLCBuYW1lOiBGYWFzdEVycm9yTmFtZXMuRVNFUklBTElaRSB9LFxuICAgICAgICAgICAgYGZhYXN0OiBEZXRlY3RlZCAnJHtuYW1lfScgYXJndW1lbnQgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYnkgSlNPTi5zdHJpbmdpZnlgXG4gICAgICAgICk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJldHVyblZhbHVlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICByZXR1cm5lZDogYW55LFxuICAgIHZhbGlkYXRlOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemUocmV0dXJuZWQsIHZhbGlkYXRlKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBGYWFzdEVycm9yKFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyLCBuYW1lOiBGYWFzdEVycm9yTmFtZXMuRVNFUklBTElaRSB9LFxuICAgICAgICAgICAgYGZhYXN0OiBEZXRlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSAke25hbWV9IGNhbm5vdCBiZSBzZXJpYWxpemVkIGJ5IEpTT04uc3RyaW5naWZ5OiAke2luc3BlY3QoXG4gICAgICAgICAgICAgICAgcmV0dXJuZWRcbiAgICAgICAgICAgICl9YFxuICAgICAgICApO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG4iXX0= |
\ | No newline at end of file |