jsoniq
Version:
JSONiq implementation for JavaScript
349 lines (348 loc) • 54.9 kB
JavaScript
"use strict";
/// <reference path="../../../typings/tsd.d.ts" />
var _ = require("lodash");
var uuid = require("node-uuid");
var PUL_1 = require("../../../lib/updates/PUL");
var jerr = require("../../../lib/errors");
describe("PUL", () => {
it("Should build a simple PUL", () => {
var pul = new PUL_1.default();
pul
.insertIntoObject(uuid.v4(), [], { b: 2 })
.insertIntoArray(uuid.v4(), [], 0, ["a"])
.deleteFromObject(uuid.v4(), [], ["a", "b"])
.replaceInObject(uuid.v4(), [], "a", 1);
});
it("Two or more ReplaceInObject primitives have the same target object and selector.", () => {
expect(() => {
var pul = new PUL_1.default();
pul.replaceInObject(uuid.v4(), [], "a", 1);
pul.replaceInObject(uuid.v4(), [], "a", 2);
}).not.toThrow();
expect(() => {
try {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.replaceInObject(target, [], "a", 1);
pul.replaceInObject(target, [], "a", 2);
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
});
it("Two or more RenameInObject primitives have the same target object and selector.", () => {
expect(() => {
var pul = new PUL_1.default();
pul.renameInObject(uuid.v4(), [], "a", "b");
pul.renameInObject(uuid.v4(), [], "a", "b");
}).not.toThrow();
expect(() => {
try {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.renameInObject(target, [], "a", "b");
pul.renameInObject(target, [], "a", "c");
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
});
it("Two or more ReplaceInArray primitives have the same target object and selector.", () => {
expect(() => {
var pul = new PUL_1.default();
pul.replaceInArray(uuid.v4(), [], 1, "b");
pul.replaceInArray(uuid.v4(), [], 1, "a");
}).not.toThrow();
expect(() => {
try {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.replaceInArray(target, [], 1, "b");
pul.replaceInArray(target, [], 1, "c");
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
});
it("insertIntoObject Normalization", () => {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.insertIntoObject(target, [], { a: 1, b: 2 });
pul.insertIntoObject(target, [], { c: 3 });
pul.insertIntoObject(target, [], { d: 4 });
expect(pul.udps.insertIntoObject.length).toBe(1);
expect(pul.udps.insertIntoObject[0].pairs["a"]).toBe(1);
expect(pul.udps.insertIntoObject[0].pairs["b"]).toBe(2);
expect(pul.udps.insertIntoObject[0].pairs["c"]).toBe(3);
expect(pul.udps.insertIntoObject[0].pairs["d"]).toBe(4);
expect(() => {
try {
var pul = new PUL_1.default();
pul.insertIntoObject(target, [], { a: 1, b: 2 });
pul.insertIntoObject(target, [], { b: 3, c: 3 });
pul.insertIntoObject(target, [], { c: 3, d: 4 });
}
catch (e) {
expect(e instanceof jerr.JNUP0005).toBe(true);
throw e;
}
}).toThrow();
});
it("InsertIntoArray Normalization", () => {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.insertIntoArray(target, [], 1, ["a"]);
pul.insertIntoArray(target, [], 0, ["a"]);
pul.insertIntoArray(target, [], 0, ["a"]);
expect(pul.udps.insertIntoArray.length).toBe(2);
});
it("DeleteFromObject Normalization", () => {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.deleteFromObject(target, [], ["a"]);
pul.deleteFromObject(target, [], ["a"]);
pul.deleteFromObject(target, [], ["b"]);
pul.deleteFromObject(target, [], ["b"]);
expect(pul.udps.deleteFromObject.length).toBe(1);
expect(pul.udps.deleteFromObject[0].keys.length).toBe(2);
expect(pul.udps.deleteFromObject[0].keys.indexOf("a") !== -1).toBe(true);
expect(pul.udps.deleteFromObject[0].keys.indexOf("b") !== -1).toBe(true);
});
it("DeleteFromArray Normalization", () => {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.deleteFromArray(target, [], 0);
pul.deleteFromArray(target, [], 0);
pul.deleteFromArray(target, [], 0);
pul.deleteFromArray(target, [], 1);
pul.deleteFromArray(target, [], 1);
expect(pul.udps.deleteFromArray.length).toBe(2);
});
it("ReplaceInArray Normalization", () => {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.deleteFromArray(target, [], 0);
pul.replaceInArray(target, [], 0, 1);
expect(pul.normalize().udps.replaceInArray.length).toBe(0);
pul = new PUL_1.default();
pul.replaceInArray(target, [], 0, 1);
pul.deleteFromArray(target, [], 0);
expect(pul.normalize().udps.replaceInArray.length).toBe(0);
//The presence of multiple UPs of this type with the same (array,index) target raises an error.
expect(() => {
try {
var pul = new PUL_1.default();
pul.replaceInArray(target, [], 0, 1);
pul.replaceInArray(target, [], 0, 1);
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
expect(() => {
try {
var pul = new PUL_1.default();
pul.deleteFromArray(target, [], 0);
pul.replaceInArray(target, [], 0, 1);
pul.replaceInArray(target, [], 0, 1);
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
expect(() => {
try {
var pul = new PUL_1.default();
pul.replaceInArray(target, [], 0, 1);
pul.deleteFromArray(target, [], 0);
pul.replaceInArray(target, [], 0, 1);
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
});
it("ReplaceInObject Normalization", () => {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.deleteFromObject(target, [], ["foo"]);
pul.replaceInObject(target, [], "foo", "bar");
expect(pul.normalize().udps.replaceInObject.length).toBe(0);
pul = new PUL_1.default();
pul.replaceInObject(target, [], "foo", "bar");
pul.deleteFromObject(target, [], ["foo"]);
expect(pul.normalize().udps.replaceInObject.length).toBe(0);
//The presence of multiple UPs of this type with the same (array,index) target raises an error.
expect(() => {
try {
var pul = new PUL_1.default();
pul.replaceInObject(target, [], "foo", "bar");
pul.replaceInObject(target, [], "foo", "bar");
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
expect(() => {
try {
var pul = new PUL_1.default();
pul
.deleteFromObject(target, [], ["foo"])
.replaceInObject(target, [], "foo", "bar")
.replaceInObject(target, [], "foo", "bar");
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
expect(() => {
try {
var pul = new PUL_1.default();
pul
.replaceInObject(target, [], "foo", "bar")
.deleteFromObject(target, [], ["foo"])
.replaceInObject(target, [], "foo", "bar");
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
});
it("RenameInObject Normalization", () => {
var target = uuid.v4();
var pul = new PUL_1.default();
pul
.deleteFromObject(target, [], ["foo"])
.renameInObject(target, [], "foo", "bar");
expect(pul.normalize().udps.replaceInObject.length).toBe(0);
pul = new PUL_1.default();
pul
.renameInObject(target, [], "foo", "bar")
.deleteFromObject(target, [], ["foo"]);
expect(pul.normalize().udps.replaceInObject.length).toBe(0);
//The presence of multiple UPs of this type with the same (array,index) target raises an error.
expect(() => {
try {
var pul = new PUL_1.default();
pul
.renameInObject(target, [], "foo", "bar")
.renameInObject(target, [], "foo", "bar");
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
expect(() => {
try {
var pul = new PUL_1.default();
pul
.deleteFromObject(target, [], ["foo"])
.renameInObject(target, [], "foo", "bar")
.renameInObject(target, [], "foo", "bar");
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
expect(() => {
try {
var pul = new PUL_1.default();
pul
.renameInObject(target, [], "foo", "bar")
.deleteFromObject(target, [], ["foo"])
.renameInObject(target, [], "foo", "bar");
}
catch (e) {
expect(e instanceof jerr.JNUP0009).toBe(true);
throw e;
}
}).toThrow();
});
it("Insert Conflict", () => {
expect(() => {
try {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.insert(target, { id: 1 });
pul.insert(target, { id: 2 });
}
catch (e) {
expect(e instanceof jerr.JNUP0005).toBe(true);
throw e;
}
}).toThrow();
});
it("Remove Normalization", () => {
var pul = new PUL_1.default();
pul.insert("1", { a: 1 });
pul.remove("1");
pul.normalize();
expect(pul.udps.insert.length).toBe(0);
expect(pul.udps.remove.length).toBe(1);
});
it("Normalization Example", () => {
var target = uuid.v4();
var pul = new PUL_1.default();
pul.insertIntoArray(target, [], 0, [{ id: 1 }]);
pul.insertIntoArray(target, [], 0, [{ id: 2 }]);
pul.deleteFromArray(target, [], 1);
pul.deleteFromArray(target, [], 2);
pul.deleteFromArray(target, [], 2);
pul.deleteFromArray(target, [], 3);
pul.renameInObject(target, ["0"], "title", "obsolete");
pul.deleteFromObject(target, ["0"], ["title"]);
pul.insertIntoObject(target, ["0"], { a: 1 });
pul.insertIntoObject(target, ["0"], { b: 2 });
pul.normalize();
expect(pul.udps.insertIntoArray.length).toBe(1);
expect(pul.udps.insertIntoArray[0].items.length).toBe(2);
expect(_.isEqual(pul.udps.insertIntoArray[0].items, [{ id: 1 }, { id: 2 }])).toBe(true);
expect(pul.udps.insertIntoObject.length).toBe(1);
expect(_.isEqual(pul.udps.insertIntoObject[0].pairs, { "a": 1, "b": 2 })).toBe(true);
expect(pul.udps.deleteFromArray.length).toBe(3);
var positions = [];
pul.udps.deleteFromArray.forEach((udp) => {
positions.push(udp.position);
});
expect(_.isEqual(positions.sort(), [1, 2, 3].sort()));
expect(pul.udps.deleteFromObject.length).toBe(1);
expect(pul.udps.deleteFromObject[0].keys.length).toBe(1);
expect(pul.udps.deleteFromObject[0].keys["0"]).toBe("title");
});
it("Test PUL parsing and serialization", () => {
var pul = new PUL_1.default();
pul
.insertIntoObject(uuid.v4(), [], { a: 1 })
.insertIntoArray(uuid.v4(), [], 0, [1, 2])
.deleteFromObject(uuid.v4(), [], ["a"])
.replaceInObject(uuid.v4(), [], "a", 1)
.deleteFromArray(uuid.v4(), [], 0)
.replaceInArray(uuid.v4(), [], 0, 1)
.renameInObject(uuid.v4(), [], "a", "b")
.insert(uuid.v4(), { hello: "world" })
.remove(uuid.v4());
var serializedPUL = pul.serialize();
var pul1 = new PUL_1.default();
pul1.parse(serializedPUL);
var pul2 = new PUL_1.default();
pul2.parse(serializedPUL);
expect(pul1.serialize()).toBe(pul2.serialize());
expect(pul1.serialize()).toBe(serializedPUL);
expect(pul2.serialize()).toBe(serializedPUL);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3RzL25vZGUvdXBkYXRlcy9QVUwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGtEQUFrRDtBQUNsRCxJQUFZLENBQUMsV0FBTSxRQUFRLENBQUMsQ0FBQTtBQUM1QixJQUFZLElBQUksV0FBTSxXQUFXLENBQUMsQ0FBQTtBQUNsQyxvQkFBZ0IsMEJBQTBCLENBQUMsQ0FBQTtBQUMzQyxJQUFZLElBQUksV0FBTSxxQkFBcUIsQ0FBQyxDQUFBO0FBRTVDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7SUFDWixFQUFFLENBQUMsMkJBQTJCLEVBQUU7UUFDNUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQztRQUNwQixHQUFHO2FBQ0UsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUN6QyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN4QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQzNDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrRkFBa0YsRUFBRTtRQUVuRixNQUFNLENBQUM7WUFDSCxJQUFJLEdBQUcsR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFDO1lBQ3BCLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0MsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFB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R0FBRyxFQUFFLEdBQUcsQ0FBQzthQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV2QixJQUFJLGFBQWEsR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFCLElBQUksSUFBSSxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3RzL25vZGUvdXBkYXRlcy9QVUwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vdHlwaW5ncy90c2QuZC50c1wiIC8+XG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSBcIm5vZGUtdXVpZFwiO1xuaW1wb3J0IFBVTCBmcm9tIFwiLi4vLi4vLi4vbGliL3VwZGF0ZXMvUFVMXCI7XG5pbXBvcnQgKiBhcyBqZXJyIGZyb20gXCIuLi8uLi8uLi9saWIvZXJyb3JzXCI7XG5cbmRlc2NyaWJlKFwiUFVMXCIsICgpID0+IHtcbiAgICBpdChcIlNob3VsZCBidWlsZCBhIHNpbXBsZSBQVUxcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWxcbiAgICAgICAgICAgIC5pbnNlcnRJbnRvT2JqZWN0KHV1aWQudjQoKSwgW10sIHsgYjogMiB9KVxuICAgICAgICAgICAgLmluc2VydEludG9BcnJheSh1dWlkLnY0KCksIFtdLCAwLCBbXCJhXCJdKVxuICAgICAgICAgICAgLmRlbGV0ZUZyb21PYmplY3QodXVpZC52NCgpLCBbXSwgW1wiYVwiLCBcImJcIl0pXG4gICAgICAgICAgICAucmVwbGFjZUluT2JqZWN0KHV1aWQudjQoKSwgW10sIFwiYVwiLCAxKTtcbiAgICB9KTtcblxuICAgIGl0KFwiVHdvIG9yIG1vcmUgUmVwbGFjZUluT2JqZWN0IHByaW1pdGl2ZXMgaGF2ZSB0aGUgc2FtZSB0YXJnZXQgb2JqZWN0IGFuZCBzZWxlY3Rvci5cIiwgKCkgPT4ge1xuXG4gICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICAgICAgcHVsLnJlcGxhY2VJbk9iamVjdCh1dWlkLnY0KCksIFtdLCBcImFcIiwgMSk7XG4gICAgICAgICAgICBwdWwucmVwbGFjZUluT2JqZWN0KHV1aWQudjQoKSwgW10sIFwiYVwiLCAyKTtcbiAgICAgICAgfSkubm90LnRvVGhyb3coKTtcblxuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdXVpZC52NCgpO1xuICAgICAgICAgICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgICAgICAgICAgcHVsLnJlcGxhY2VJbk9iamVjdCh0YXJnZXQsIFtdLCBcImFcIiwgMSk7XG4gICAgICAgICAgICAgICAgcHVsLnJlcGxhY2VJbk9iamVjdCh0YXJnZXQsIFtdLCBcImFcIiwgMik7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZSBpbnN0YW5jZW9mIGplcnIuSk5VUDAwMDkpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJUd28gb3IgbW9yZSBSZW5hbWVJbk9iamVjdCBwcmltaXRpdmVzIGhhdmUgdGhlIHNhbWUgdGFyZ2V0IG9iamVjdCBhbmQgc2VsZWN0b3IuXCIsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgICAgICBwdWwucmVuYW1lSW5PYmplY3QodXVpZC52NCgpLCBbXSwgXCJhXCIsIFwiYlwiKTtcbiAgICAgICAgICAgIHB1bC5yZW5hbWVJbk9iamVjdCh1dWlkLnY0KCksIFtdLCBcImFcIiwgXCJiXCIpO1xuICAgICAgICB9KS5ub3QudG9UaHJvdygpO1xuXG4gICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB1dWlkLnY0KCk7XG4gICAgICAgICAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgICAgICAgICBwdWwucmVuYW1lSW5PYmplY3QodGFyZ2V0LCBbXSwgXCJhXCIsIFwiYlwiKTtcbiAgICAgICAgICAgICAgICBwdWwucmVuYW1lSW5PYmplY3QodGFyZ2V0LCBbXSwgXCJhXCIsIFwiY1wiKTtcbiAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChlIGluc3RhbmNlb2YgamVyci5KTlVQMDAwOSkudG9CZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdChcIlR3byBvciBtb3JlIFJlcGxhY2VJbkFycmF5IHByaW1pdGl2ZXMgaGF2ZSB0aGUgc2FtZSB0YXJnZXQgb2JqZWN0IGFuZCBzZWxlY3Rvci5cIiwgKCkgPT4ge1xuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgICAgIHB1bC5yZXBsYWNlSW5BcnJheSh1dWlkLnY0KCksIFtdLCAxLCBcImJcIik7XG4gICAgICAgICAgICBwdWwucmVwbGFjZUluQXJyYXkodXVpZC52NCgpLCBbXSwgMSwgXCJhXCIpO1xuICAgICAgICB9KS5ub3QudG9UaHJvdygpO1xuXG4gICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB1dWlkLnY0KCk7XG4gICAgICAgICAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgICAgICAgICBwdWwucmVwbGFjZUluQXJyYXkodGFyZ2V0LCBbXSwgMSwgXCJiXCIpO1xuICAgICAgICAgICAgICAgIHB1bC5yZXBsYWNlSW5BcnJheSh0YXJnZXQsIFtdLCAxLCBcImNcIik7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZSBpbnN0YW5jZW9mIGplcnIuSk5VUDAwMDkpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJpbnNlcnRJbnRvT2JqZWN0IE5vcm1hbGl6YXRpb25cIiwgKCkgPT4ge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gdXVpZC52NCgpO1xuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWwuaW5zZXJ0SW50b09iamVjdCh0YXJnZXQsIFtdLCB7IGE6IDEsIGI6IDJ9KTtcbiAgICAgICAgcHVsLmluc2VydEludG9PYmplY3QodGFyZ2V0LCBbXSwgeyBjOiAzIH0pO1xuICAgICAgICBwdWwuaW5zZXJ0SW50b09iamVjdCh0YXJnZXQsIFtdLCB7IGQ6IDQgfSk7XG4gICAgICAgIGV4cGVjdChwdWwudWRwcy5pbnNlcnRJbnRvT2JqZWN0Lmxlbmd0aCkudG9CZSgxKTtcbiAgICAgICAgZXhwZWN0KHB1bC51ZHBzLmluc2VydEludG9PYmplY3RbMF0ucGFpcnNbXCJhXCJdKS50b0JlKDEpO1xuICAgICAgICBleHBlY3QocHVsLnVkcHMuaW5zZXJ0SW50b09iamVjdFswXS5wYWlyc1tcImJcIl0pLnRvQmUoMik7XG4gICAgICAgIGV4cGVjdChwdWwudWRwcy5pbnNlcnRJbnRvT2JqZWN0WzBdLnBhaXJzW1wiY1wiXSkudG9CZSgzKTtcbiAgICAgICAgZXhwZWN0KHB1bC51ZHBzLmluc2VydEludG9PYmplY3RbMF0ucGFpcnNbXCJkXCJdKS50b0JlKDQpO1xuXG4gICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgICAgICAgICAgcHVsLmluc2VydEludG9PYmplY3QodGFyZ2V0LCBbXSwgeyBhOiAxLCBiOiAyIH0pO1xuICAgICAgICAgICAgICAgIHB1bC5pbnNlcnRJbnRvT2JqZWN0KHRhcmdldCwgW10sIHsgYjogMywgYzogMyB9KTtcbiAgICAgICAgICAgICAgICBwdWwuaW5zZXJ0SW50b09iamVjdCh0YXJnZXQsIFtdLCB7IGM6IDMsIGQ6IDQgfSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZSBpbnN0YW5jZW9mIGplcnIuSk5VUDAwMDUpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJJbnNlcnRJbnRvQXJyYXkgTm9ybWFsaXphdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB1dWlkLnY0KCk7XG4gICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bC5pbnNlcnRJbnRvQXJyYXkodGFyZ2V0LCBbXSwgMSwgW1wiYVwiXSk7XG4gICAgICAgIHB1bC5pbnNlcnRJbnRvQXJyYXkodGFyZ2V0LCBbXSwgMCwgW1wiYVwiXSk7XG4gICAgICAgIHB1bC5pbnNlcnRJbnRvQXJyYXkodGFyZ2V0LCBbXSwgMCwgW1wiYVwiXSk7XG4gICAgICAgIGV4cGVjdChwdWwudWRwcy5pbnNlcnRJbnRvQXJyYXkubGVuZ3RoKS50b0JlKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJEZWxldGVGcm9tT2JqZWN0IE5vcm1hbGl6YXRpb25cIiwgKCkgPT4ge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gdXVpZC52NCgpO1xuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWwuZGVsZXRlRnJvbU9iamVjdCh0YXJnZXQsIFtdLCBbXCJhXCJdKTtcbiAgICAgICAgcHVsLmRlbGV0ZUZyb21PYmplY3QodGFyZ2V0LCBbXSwgW1wiYVwiXSk7XG4gICAgICAgIHB1bC5kZWxldGVGcm9tT2JqZWN0KHRhcmdldCwgW10sIFtcImJcIl0pO1xuICAgICAgICBwdWwuZGVsZXRlRnJvbU9iamVjdCh0YXJnZXQsIFtdLCBbXCJiXCJdKTtcblxuICAgICAgICBleHBlY3QocHVsLnVkcHMuZGVsZXRlRnJvbU9iamVjdC5sZW5ndGgpLnRvQmUoMSk7XG4gICAgICAgIGV4cGVjdChwdWwudWRwcy5kZWxldGVGcm9tT2JqZWN0WzBdLmtleXMubGVuZ3RoKS50b0JlKDIpO1xuICAgICAgICBleHBlY3QocHVsLnVkcHMuZGVsZXRlRnJvbU9iamVjdFswXS5rZXlzLmluZGV4T2YoXCJhXCIpICE9PSAtMSkudG9CZSh0cnVlKTtcbiAgICAgICAgZXhwZWN0KHB1bC51ZHBzLmRlbGV0ZUZyb21PYmplY3RbMF0ua2V5cy5pbmRleE9mKFwiYlwiKSAhPT0gLTEpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdChcIkRlbGV0ZUZyb21BcnJheSBOb3JtYWxpemF0aW9uXCIsICgpID0+IHtcbiAgICAgICAgdmFyIHRhcmdldCA9IHV1aWQudjQoKTtcbiAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgcHVsLmRlbGV0ZUZyb21BcnJheSh0YXJnZXQsIFtdLCAwKTtcbiAgICAgICAgcHVsLmRlbGV0ZUZyb21BcnJheSh0YXJnZXQsIFtdLCAwKTtcbiAgICAgICAgcHVsLmRlbGV0ZUZyb21BcnJheSh0YXJnZXQsIFtdLCAwKTtcbiAgICAgICAgcHVsLmRlbGV0ZUZyb21BcnJheSh0YXJnZXQsIFtdLCAxKTtcbiAgICAgICAgcHVsLmRlbGV0ZUZyb21BcnJheSh0YXJnZXQsIFtdLCAxKTtcblxuICAgICAgICBleHBlY3QocHVsLnVkcHMuZGVsZXRlRnJvbUFycmF5Lmxlbmd0aCkudG9CZSgyKTtcbiAgICB9KTtcblxuICAgIGl0KFwiUmVwbGFjZUluQXJyYXkgTm9ybWFsaXphdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB1dWlkLnY0KCk7XG4gICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bC5kZWxldGVGcm9tQXJyYXkodGFyZ2V0LCBbXSwgMCk7XG4gICAgICAgIHB1bC5yZXBsYWNlSW5BcnJheSh0YXJnZXQsIFtdLCAwLCAxKTtcbiAgICAgICAgZXhwZWN0KHB1bC5ub3JtYWxpemUoKS51ZHBzLnJlcGxhY2VJbkFycmF5Lmxlbmd0aCkudG9CZSgwKTtcblxuICAgICAgICBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bC5yZXBsYWNlSW5BcnJheSh0YXJnZXQsIFtdLCAwLCAxKTtcbiAgICAgICAgcHVsLmRlbGV0ZUZyb21BcnJheSh0YXJnZXQsIFtdLCAwKTtcbiAgICAgICAgZXhwZWN0KHB1bC5ub3JtYWxpemUoKS51ZHBzLnJlcGxhY2VJbkFycmF5Lmxlbmd0aCkudG9CZSgwKTtcblxuICAgICAgICAvL1RoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBVUHMgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNhbWUgKGFycmF5LGluZGV4KSB0YXJnZXQgcmFpc2VzIGFuIGVycm9yLlxuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICAgICAgICAgIHB1bC5yZXBsYWNlSW5BcnJheSh0YXJnZXQsIFtdLCAwLCAxKTtcbiAgICAgICAgICAgICAgICBwdWwucmVwbGFjZUluQXJyYXkodGFyZ2V0LCBbXSwgMCwgMSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZSBpbnN0YW5jZW9mIGplcnIuSk5VUDAwMDkpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudG9UaHJvdygpO1xuXG4gICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgICAgICAgICAgcHVsLmRlbGV0ZUZyb21BcnJheSh0YXJnZXQsIFtdLCAwKTtcbiAgICAgICAgICAgICAgICBwdWwucmVwbGFjZUluQXJyYXkodGFyZ2V0LCBbXSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgcHVsLnJlcGxhY2VJbkFycmF5KHRhcmdldCwgW10sIDAsIDEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGUgaW5zdGFuY2VvZiBqZXJyLkpOVVAwMDA5KS50b0JlKHRydWUpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnRvVGhyb3coKTtcblxuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICAgICAgICAgIHB1bC5yZXBsYWNlSW5BcnJheSh0YXJnZXQsIFtdLCAwLCAxKTtcbiAgICAgICAgICAgICAgICBwdWwuZGVsZXRlRnJvbUFycmF5KHRhcmdldCwgW10sIDApO1xuICAgICAgICAgICAgICAgIHB1bC5yZXBsYWNlSW5BcnJheSh0YXJnZXQsIFtdLCAwLCAxKTtcbiAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChlIGluc3RhbmNlb2YgamVyci5KTlVQMDAwOSkudG9CZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdChcIlJlcGxhY2VJbk9iamVjdCBOb3JtYWxpemF0aW9uXCIsICgpID0+IHtcbiAgICAgICAgdmFyIHRhcmdldCA9IHV1aWQudjQoKTtcbiAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgcHVsLmRlbGV0ZUZyb21PYmplY3QodGFyZ2V0LCBbXSwgW1wiZm9vXCJdKTtcbiAgICAgICAgcHVsLnJlcGxhY2VJbk9iamVjdCh0YXJnZXQsIFtdLCBcImZvb1wiLCBcImJhclwiKTtcbiAgICAgICAgZXhwZWN0KHB1bC5ub3JtYWxpemUoKS51ZHBzLnJlcGxhY2VJbk9iamVjdC5sZW5ndGgpLnRvQmUoMCk7XG5cbiAgICAgICAgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWwucmVwbGFjZUluT2JqZWN0KHRhcmdldCwgW10sIFwiZm9vXCIsIFwiYmFyXCIpO1xuICAgICAgICBwdWwuZGVsZXRlRnJvbU9iamVjdCh0YXJnZXQsIFtdLCBbXCJmb29cIl0pO1xuICAgICAgICBleHBlY3QocHVsLm5vcm1hbGl6ZSgpLnVkcHMucmVwbGFjZUluT2JqZWN0Lmxlbmd0aCkudG9CZSgwKTtcblxuICAgICAgICAvL1RoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBVUHMgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNhbWUgKGFycmF5LGluZGV4KSB0YXJnZXQgcmFpc2VzIGFuIGVycm9yLlxuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICAgICAgICAgIHB1bC5yZXBsYWNlSW5PYmplY3QodGFyZ2V0LCBbXSwgXCJmb29cIiwgXCJiYXJcIik7XG4gICAgICAgICAgICAgICAgcHVsLnJlcGxhY2VJbk9iamVjdCh0YXJnZXQsIFtdLCBcImZvb1wiLCBcImJhclwiKTtcbiAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChlIGluc3RhbmNlb2YgamVyci5KTlVQMDAwOSkudG9CZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS50b1Rocm93KCk7XG5cbiAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgICAgICAgICBwdWxcbiAgICAgICAgICAgICAgICAgICAgLmRlbGV0ZUZyb21PYmplY3QodGFyZ2V0LCBbXSwgW1wiZm9vXCJdKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUluT2JqZWN0KHRhcmdldCwgW10sIFwiZm9vXCIsIFwiYmFyXCIpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlSW5PYmplY3QodGFyZ2V0LCBbXSwgXCJmb29cIiwgXCJiYXJcIik7XG5cbiAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChlIGluc3RhbmNlb2YgamVyci5KTlVQMDAwOSkudG9CZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS50b1Rocm93KCk7XG5cbiAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgICAgICAgICBwdWxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VJbk9iamVjdCh0YXJnZXQsIFtdLCBcImZvb1wiLCBcImJhclwiKVxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlRnJvbU9iamVjdCh0YXJnZXQsIFtdLCBbXCJmb29cIl0pXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlSW5PYmplY3QodGFyZ2V0LCBbXSwgXCJmb29cIiwgXCJiYXJcIik7XG5cbiAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChlIGluc3RhbmNlb2YgamVyci5KTlVQMDAwOSkudG9CZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS50b1Rocm93KCk7XG5cbiAgICB9KTtcblxuICAgIGl0KFwiUmVuYW1lSW5PYmplY3QgTm9ybWFsaXphdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB1dWlkLnY0KCk7XG4gICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bFxuICAgICAgICAgICAgLmRlbGV0ZUZyb21PYmplY3QodGFyZ2V0LCBbXSwgW1wiZm9vXCJdKVxuICAgICAgICAgICAgLnJlbmFtZUluT2JqZWN0KHRhcmdldCwgW10sIFwiZm9vXCIsIFwiYmFyXCIpO1xuICAgICAgICBleHBlY3QocHVsLm5vcm1hbGl6ZSgpLnVkcHMucmVwbGFjZUluT2JqZWN0Lmxlbmd0aCkudG9CZSgwKTtcblxuICAgICAgICBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bFxuICAgICAgICAgICAgLnJlbmFtZUluT2JqZWN0KHRhcmdldCwgW10sIFwiZm9vXCIsIFwiYmFyXCIpXG4gICAgICAgICAgICAuZGVsZXRlRnJvbU9iamVjdCh0YXJnZXQsIFtdLCBbXCJmb29cIl0pO1xuICAgICAgICBleHBlY3QocHVsLm5vcm1hbGl6ZSgpLnVkcHMucmVwbGFjZUluT2JqZWN0Lmxlbmd0aCkudG9CZSgwKTtcblxuICAgICAgICAvL1RoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBVUHMgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNhbWUgKGFycmF5LGluZGV4KSB0YXJnZXQgcmFpc2VzIGFuIGVycm9yLlxuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICAgICAgICAgIHB1bFxuICAgICAgICAgICAgICAgICAgICAucmVuYW1lSW5PYmplY3QodGFyZ2V0LCBbXSwgXCJmb29cIiwgXCJiYXJcIilcbiAgICAgICAgICAgICAgICAgICAgLnJlbmFtZUluT2JqZWN0KHRhcmdldCwgW10sIFwiZm9vXCIsIFwiYmFyXCIpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGUgaW5zdGFuY2VvZiBqZXJyLkpOVVAwMDA5KS50b0JlKHRydWUpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnRvVGhyb3coKTtcblxuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICAgICAgICAgIHB1bFxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlRnJvbU9iamVjdCh0YXJnZXQsIFtdLCBbXCJmb29cIl0pXG4gICAgICAgICAgICAgICAgICAgIC5yZW5hbWVJbk9iamVjdCh0YXJnZXQsIFtdLCBcImZvb1wiLCBcImJhclwiKVxuICAgICAgICAgICAgICAgICAgICAucmVuYW1lSW5PYmplY3QodGFyZ2V0LCBbXSwgXCJmb29cIiwgXCJiYXJcIik7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZSBpbnN0YW5jZW9mIGplcnIuSk5VUD