2260 lines
235 KiB
JavaScript
2260 lines
235 KiB
JavaScript
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
if you want to view the source, please visit the github repository of this plugin
|
|
*/
|
|
|
|
var __create = Object.create;
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __commonJS = (cb, mod) => function __require() {
|
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
};
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __copyProps = (to, from, except, desc) => {
|
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
for (let key of __getOwnPropNames(from))
|
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
}
|
|
return to;
|
|
};
|
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
// If the importer is in node compatibility mode or this is not an ESM
|
|
// file that has been converted to a CommonJS file using a Babel-
|
|
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
mod
|
|
));
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
|
|
// node_modules/qrcode/lib/can-promise.js
|
|
var require_can_promise = __commonJS({
|
|
"node_modules/qrcode/lib/can-promise.js"(exports, module2) {
|
|
module2.exports = function() {
|
|
return typeof Promise === "function" && Promise.prototype && Promise.prototype.then;
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/utils.js
|
|
var require_utils = __commonJS({
|
|
"node_modules/qrcode/lib/core/utils.js"(exports) {
|
|
var toSJISFunction;
|
|
var CODEWORDS_COUNT = [
|
|
0,
|
|
// Not used
|
|
26,
|
|
44,
|
|
70,
|
|
100,
|
|
134,
|
|
172,
|
|
196,
|
|
242,
|
|
292,
|
|
346,
|
|
404,
|
|
466,
|
|
532,
|
|
581,
|
|
655,
|
|
733,
|
|
815,
|
|
901,
|
|
991,
|
|
1085,
|
|
1156,
|
|
1258,
|
|
1364,
|
|
1474,
|
|
1588,
|
|
1706,
|
|
1828,
|
|
1921,
|
|
2051,
|
|
2185,
|
|
2323,
|
|
2465,
|
|
2611,
|
|
2761,
|
|
2876,
|
|
3034,
|
|
3196,
|
|
3362,
|
|
3532,
|
|
3706
|
|
];
|
|
exports.getSymbolSize = function getSymbolSize(version) {
|
|
if (!version)
|
|
throw new Error('"version" cannot be null or undefined');
|
|
if (version < 1 || version > 40)
|
|
throw new Error('"version" should be in range from 1 to 40');
|
|
return version * 4 + 17;
|
|
};
|
|
exports.getSymbolTotalCodewords = function getSymbolTotalCodewords(version) {
|
|
return CODEWORDS_COUNT[version];
|
|
};
|
|
exports.getBCHDigit = function(data) {
|
|
let digit = 0;
|
|
while (data !== 0) {
|
|
digit++;
|
|
data >>>= 1;
|
|
}
|
|
return digit;
|
|
};
|
|
exports.setToSJISFunction = function setToSJISFunction(f) {
|
|
if (typeof f !== "function") {
|
|
throw new Error('"toSJISFunc" is not a valid function.');
|
|
}
|
|
toSJISFunction = f;
|
|
};
|
|
exports.isKanjiModeEnabled = function() {
|
|
return typeof toSJISFunction !== "undefined";
|
|
};
|
|
exports.toSJIS = function toSJIS(kanji) {
|
|
return toSJISFunction(kanji);
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/error-correction-level.js
|
|
var require_error_correction_level = __commonJS({
|
|
"node_modules/qrcode/lib/core/error-correction-level.js"(exports) {
|
|
exports.L = { bit: 1 };
|
|
exports.M = { bit: 0 };
|
|
exports.Q = { bit: 3 };
|
|
exports.H = { bit: 2 };
|
|
function fromString(string) {
|
|
if (typeof string !== "string") {
|
|
throw new Error("Param is not a string");
|
|
}
|
|
const lcStr = string.toLowerCase();
|
|
switch (lcStr) {
|
|
case "l":
|
|
case "low":
|
|
return exports.L;
|
|
case "m":
|
|
case "medium":
|
|
return exports.M;
|
|
case "q":
|
|
case "quartile":
|
|
return exports.Q;
|
|
case "h":
|
|
case "high":
|
|
return exports.H;
|
|
default:
|
|
throw new Error("Unknown EC Level: " + string);
|
|
}
|
|
}
|
|
exports.isValid = function isValid(level) {
|
|
return level && typeof level.bit !== "undefined" && level.bit >= 0 && level.bit < 4;
|
|
};
|
|
exports.from = function from(value, defaultValue) {
|
|
if (exports.isValid(value)) {
|
|
return value;
|
|
}
|
|
try {
|
|
return fromString(value);
|
|
} catch (e) {
|
|
return defaultValue;
|
|
}
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/bit-buffer.js
|
|
var require_bit_buffer = __commonJS({
|
|
"node_modules/qrcode/lib/core/bit-buffer.js"(exports, module2) {
|
|
function BitBuffer() {
|
|
this.buffer = [];
|
|
this.length = 0;
|
|
}
|
|
BitBuffer.prototype = {
|
|
get: function(index) {
|
|
const bufIndex = Math.floor(index / 8);
|
|
return (this.buffer[bufIndex] >>> 7 - index % 8 & 1) === 1;
|
|
},
|
|
put: function(num, length) {
|
|
for (let i = 0; i < length; i++) {
|
|
this.putBit((num >>> length - i - 1 & 1) === 1);
|
|
}
|
|
},
|
|
getLengthInBits: function() {
|
|
return this.length;
|
|
},
|
|
putBit: function(bit) {
|
|
const bufIndex = Math.floor(this.length / 8);
|
|
if (this.buffer.length <= bufIndex) {
|
|
this.buffer.push(0);
|
|
}
|
|
if (bit) {
|
|
this.buffer[bufIndex] |= 128 >>> this.length % 8;
|
|
}
|
|
this.length++;
|
|
}
|
|
};
|
|
module2.exports = BitBuffer;
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/bit-matrix.js
|
|
var require_bit_matrix = __commonJS({
|
|
"node_modules/qrcode/lib/core/bit-matrix.js"(exports, module2) {
|
|
function BitMatrix(size) {
|
|
if (!size || size < 1) {
|
|
throw new Error("BitMatrix size must be defined and greater than 0");
|
|
}
|
|
this.size = size;
|
|
this.data = new Uint8Array(size * size);
|
|
this.reservedBit = new Uint8Array(size * size);
|
|
}
|
|
BitMatrix.prototype.set = function(row, col, value, reserved) {
|
|
const index = row * this.size + col;
|
|
this.data[index] = value;
|
|
if (reserved)
|
|
this.reservedBit[index] = true;
|
|
};
|
|
BitMatrix.prototype.get = function(row, col) {
|
|
return this.data[row * this.size + col];
|
|
};
|
|
BitMatrix.prototype.xor = function(row, col, value) {
|
|
this.data[row * this.size + col] ^= value;
|
|
};
|
|
BitMatrix.prototype.isReserved = function(row, col) {
|
|
return this.reservedBit[row * this.size + col];
|
|
};
|
|
module2.exports = BitMatrix;
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/alignment-pattern.js
|
|
var require_alignment_pattern = __commonJS({
|
|
"node_modules/qrcode/lib/core/alignment-pattern.js"(exports) {
|
|
var getSymbolSize = require_utils().getSymbolSize;
|
|
exports.getRowColCoords = function getRowColCoords(version) {
|
|
if (version === 1)
|
|
return [];
|
|
const posCount = Math.floor(version / 7) + 2;
|
|
const size = getSymbolSize(version);
|
|
const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2;
|
|
const positions = [size - 7];
|
|
for (let i = 1; i < posCount - 1; i++) {
|
|
positions[i] = positions[i - 1] - intervals;
|
|
}
|
|
positions.push(6);
|
|
return positions.reverse();
|
|
};
|
|
exports.getPositions = function getPositions(version) {
|
|
const coords = [];
|
|
const pos = exports.getRowColCoords(version);
|
|
const posLength = pos.length;
|
|
for (let i = 0; i < posLength; i++) {
|
|
for (let j = 0; j < posLength; j++) {
|
|
if (i === 0 && j === 0 || // top-left
|
|
i === 0 && j === posLength - 1 || // bottom-left
|
|
i === posLength - 1 && j === 0) {
|
|
continue;
|
|
}
|
|
coords.push([pos[i], pos[j]]);
|
|
}
|
|
}
|
|
return coords;
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/finder-pattern.js
|
|
var require_finder_pattern = __commonJS({
|
|
"node_modules/qrcode/lib/core/finder-pattern.js"(exports) {
|
|
var getSymbolSize = require_utils().getSymbolSize;
|
|
var FINDER_PATTERN_SIZE = 7;
|
|
exports.getPositions = function getPositions(version) {
|
|
const size = getSymbolSize(version);
|
|
return [
|
|
// top-left
|
|
[0, 0],
|
|
// top-right
|
|
[size - FINDER_PATTERN_SIZE, 0],
|
|
// bottom-left
|
|
[0, size - FINDER_PATTERN_SIZE]
|
|
];
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/mask-pattern.js
|
|
var require_mask_pattern = __commonJS({
|
|
"node_modules/qrcode/lib/core/mask-pattern.js"(exports) {
|
|
exports.Patterns = {
|
|
PATTERN000: 0,
|
|
PATTERN001: 1,
|
|
PATTERN010: 2,
|
|
PATTERN011: 3,
|
|
PATTERN100: 4,
|
|
PATTERN101: 5,
|
|
PATTERN110: 6,
|
|
PATTERN111: 7
|
|
};
|
|
var PenaltyScores = {
|
|
N1: 3,
|
|
N2: 3,
|
|
N3: 40,
|
|
N4: 10
|
|
};
|
|
exports.isValid = function isValid(mask) {
|
|
return mask != null && mask !== "" && !isNaN(mask) && mask >= 0 && mask <= 7;
|
|
};
|
|
exports.from = function from(value) {
|
|
return exports.isValid(value) ? parseInt(value, 10) : void 0;
|
|
};
|
|
exports.getPenaltyN1 = function getPenaltyN1(data) {
|
|
const size = data.size;
|
|
let points = 0;
|
|
let sameCountCol = 0;
|
|
let sameCountRow = 0;
|
|
let lastCol = null;
|
|
let lastRow = null;
|
|
for (let row = 0; row < size; row++) {
|
|
sameCountCol = sameCountRow = 0;
|
|
lastCol = lastRow = null;
|
|
for (let col = 0; col < size; col++) {
|
|
let module3 = data.get(row, col);
|
|
if (module3 === lastCol) {
|
|
sameCountCol++;
|
|
} else {
|
|
if (sameCountCol >= 5)
|
|
points += PenaltyScores.N1 + (sameCountCol - 5);
|
|
lastCol = module3;
|
|
sameCountCol = 1;
|
|
}
|
|
module3 = data.get(col, row);
|
|
if (module3 === lastRow) {
|
|
sameCountRow++;
|
|
} else {
|
|
if (sameCountRow >= 5)
|
|
points += PenaltyScores.N1 + (sameCountRow - 5);
|
|
lastRow = module3;
|
|
sameCountRow = 1;
|
|
}
|
|
}
|
|
if (sameCountCol >= 5)
|
|
points += PenaltyScores.N1 + (sameCountCol - 5);
|
|
if (sameCountRow >= 5)
|
|
points += PenaltyScores.N1 + (sameCountRow - 5);
|
|
}
|
|
return points;
|
|
};
|
|
exports.getPenaltyN2 = function getPenaltyN2(data) {
|
|
const size = data.size;
|
|
let points = 0;
|
|
for (let row = 0; row < size - 1; row++) {
|
|
for (let col = 0; col < size - 1; col++) {
|
|
const last = data.get(row, col) + data.get(row, col + 1) + data.get(row + 1, col) + data.get(row + 1, col + 1);
|
|
if (last === 4 || last === 0)
|
|
points++;
|
|
}
|
|
}
|
|
return points * PenaltyScores.N2;
|
|
};
|
|
exports.getPenaltyN3 = function getPenaltyN3(data) {
|
|
const size = data.size;
|
|
let points = 0;
|
|
let bitsCol = 0;
|
|
let bitsRow = 0;
|
|
for (let row = 0; row < size; row++) {
|
|
bitsCol = bitsRow = 0;
|
|
for (let col = 0; col < size; col++) {
|
|
bitsCol = bitsCol << 1 & 2047 | data.get(row, col);
|
|
if (col >= 10 && (bitsCol === 1488 || bitsCol === 93))
|
|
points++;
|
|
bitsRow = bitsRow << 1 & 2047 | data.get(col, row);
|
|
if (col >= 10 && (bitsRow === 1488 || bitsRow === 93))
|
|
points++;
|
|
}
|
|
}
|
|
return points * PenaltyScores.N3;
|
|
};
|
|
exports.getPenaltyN4 = function getPenaltyN4(data) {
|
|
let darkCount = 0;
|
|
const modulesCount = data.data.length;
|
|
for (let i = 0; i < modulesCount; i++)
|
|
darkCount += data.data[i];
|
|
const k = Math.abs(Math.ceil(darkCount * 100 / modulesCount / 5) - 10);
|
|
return k * PenaltyScores.N4;
|
|
};
|
|
function getMaskAt(maskPattern, i, j) {
|
|
switch (maskPattern) {
|
|
case exports.Patterns.PATTERN000:
|
|
return (i + j) % 2 === 0;
|
|
case exports.Patterns.PATTERN001:
|
|
return i % 2 === 0;
|
|
case exports.Patterns.PATTERN010:
|
|
return j % 3 === 0;
|
|
case exports.Patterns.PATTERN011:
|
|
return (i + j) % 3 === 0;
|
|
case exports.Patterns.PATTERN100:
|
|
return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0;
|
|
case exports.Patterns.PATTERN101:
|
|
return i * j % 2 + i * j % 3 === 0;
|
|
case exports.Patterns.PATTERN110:
|
|
return (i * j % 2 + i * j % 3) % 2 === 0;
|
|
case exports.Patterns.PATTERN111:
|
|
return (i * j % 3 + (i + j) % 2) % 2 === 0;
|
|
default:
|
|
throw new Error("bad maskPattern:" + maskPattern);
|
|
}
|
|
}
|
|
exports.applyMask = function applyMask(pattern, data) {
|
|
const size = data.size;
|
|
for (let col = 0; col < size; col++) {
|
|
for (let row = 0; row < size; row++) {
|
|
if (data.isReserved(row, col))
|
|
continue;
|
|
data.xor(row, col, getMaskAt(pattern, row, col));
|
|
}
|
|
}
|
|
};
|
|
exports.getBestMask = function getBestMask(data, setupFormatFunc) {
|
|
const numPatterns = Object.keys(exports.Patterns).length;
|
|
let bestPattern = 0;
|
|
let lowerPenalty = Infinity;
|
|
for (let p = 0; p < numPatterns; p++) {
|
|
setupFormatFunc(p);
|
|
exports.applyMask(p, data);
|
|
const penalty = exports.getPenaltyN1(data) + exports.getPenaltyN2(data) + exports.getPenaltyN3(data) + exports.getPenaltyN4(data);
|
|
exports.applyMask(p, data);
|
|
if (penalty < lowerPenalty) {
|
|
lowerPenalty = penalty;
|
|
bestPattern = p;
|
|
}
|
|
}
|
|
return bestPattern;
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/error-correction-code.js
|
|
var require_error_correction_code = __commonJS({
|
|
"node_modules/qrcode/lib/core/error-correction-code.js"(exports) {
|
|
var ECLevel = require_error_correction_level();
|
|
var EC_BLOCKS_TABLE = [
|
|
// L M Q H
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
1,
|
|
2,
|
|
2,
|
|
4,
|
|
1,
|
|
2,
|
|
4,
|
|
4,
|
|
2,
|
|
4,
|
|
4,
|
|
4,
|
|
2,
|
|
4,
|
|
6,
|
|
5,
|
|
2,
|
|
4,
|
|
6,
|
|
6,
|
|
2,
|
|
5,
|
|
8,
|
|
8,
|
|
4,
|
|
5,
|
|
8,
|
|
8,
|
|
4,
|
|
5,
|
|
8,
|
|
11,
|
|
4,
|
|
8,
|
|
10,
|
|
11,
|
|
4,
|
|
9,
|
|
12,
|
|
16,
|
|
4,
|
|
9,
|
|
16,
|
|
16,
|
|
6,
|
|
10,
|
|
12,
|
|
18,
|
|
6,
|
|
10,
|
|
17,
|
|
16,
|
|
6,
|
|
11,
|
|
16,
|
|
19,
|
|
6,
|
|
13,
|
|
18,
|
|
21,
|
|
7,
|
|
14,
|
|
21,
|
|
25,
|
|
8,
|
|
16,
|
|
20,
|
|
25,
|
|
8,
|
|
17,
|
|
23,
|
|
25,
|
|
9,
|
|
17,
|
|
23,
|
|
34,
|
|
9,
|
|
18,
|
|
25,
|
|
30,
|
|
10,
|
|
20,
|
|
27,
|
|
32,
|
|
12,
|
|
21,
|
|
29,
|
|
35,
|
|
12,
|
|
23,
|
|
34,
|
|
37,
|
|
12,
|
|
25,
|
|
34,
|
|
40,
|
|
13,
|
|
26,
|
|
35,
|
|
42,
|
|
14,
|
|
28,
|
|
38,
|
|
45,
|
|
15,
|
|
29,
|
|
40,
|
|
48,
|
|
16,
|
|
31,
|
|
43,
|
|
51,
|
|
17,
|
|
33,
|
|
45,
|
|
54,
|
|
18,
|
|
35,
|
|
48,
|
|
57,
|
|
19,
|
|
37,
|
|
51,
|
|
60,
|
|
19,
|
|
38,
|
|
53,
|
|
63,
|
|
20,
|
|
40,
|
|
56,
|
|
66,
|
|
21,
|
|
43,
|
|
59,
|
|
70,
|
|
22,
|
|
45,
|
|
62,
|
|
74,
|
|
24,
|
|
47,
|
|
65,
|
|
77,
|
|
25,
|
|
49,
|
|
68,
|
|
81
|
|
];
|
|
var EC_CODEWORDS_TABLE = [
|
|
// L M Q H
|
|
7,
|
|
10,
|
|
13,
|
|
17,
|
|
10,
|
|
16,
|
|
22,
|
|
28,
|
|
15,
|
|
26,
|
|
36,
|
|
44,
|
|
20,
|
|
36,
|
|
52,
|
|
64,
|
|
26,
|
|
48,
|
|
72,
|
|
88,
|
|
36,
|
|
64,
|
|
96,
|
|
112,
|
|
40,
|
|
72,
|
|
108,
|
|
130,
|
|
48,
|
|
88,
|
|
132,
|
|
156,
|
|
60,
|
|
110,
|
|
160,
|
|
192,
|
|
72,
|
|
130,
|
|
192,
|
|
224,
|
|
80,
|
|
150,
|
|
224,
|
|
264,
|
|
96,
|
|
176,
|
|
260,
|
|
308,
|
|
104,
|
|
198,
|
|
288,
|
|
352,
|
|
120,
|
|
216,
|
|
320,
|
|
384,
|
|
132,
|
|
240,
|
|
360,
|
|
432,
|
|
144,
|
|
280,
|
|
408,
|
|
480,
|
|
168,
|
|
308,
|
|
448,
|
|
532,
|
|
180,
|
|
338,
|
|
504,
|
|
588,
|
|
196,
|
|
364,
|
|
546,
|
|
650,
|
|
224,
|
|
416,
|
|
600,
|
|
700,
|
|
224,
|
|
442,
|
|
644,
|
|
750,
|
|
252,
|
|
476,
|
|
690,
|
|
816,
|
|
270,
|
|
504,
|
|
750,
|
|
900,
|
|
300,
|
|
560,
|
|
810,
|
|
960,
|
|
312,
|
|
588,
|
|
870,
|
|
1050,
|
|
336,
|
|
644,
|
|
952,
|
|
1110,
|
|
360,
|
|
700,
|
|
1020,
|
|
1200,
|
|
390,
|
|
728,
|
|
1050,
|
|
1260,
|
|
420,
|
|
784,
|
|
1140,
|
|
1350,
|
|
450,
|
|
812,
|
|
1200,
|
|
1440,
|
|
480,
|
|
868,
|
|
1290,
|
|
1530,
|
|
510,
|
|
924,
|
|
1350,
|
|
1620,
|
|
540,
|
|
980,
|
|
1440,
|
|
1710,
|
|
570,
|
|
1036,
|
|
1530,
|
|
1800,
|
|
570,
|
|
1064,
|
|
1590,
|
|
1890,
|
|
600,
|
|
1120,
|
|
1680,
|
|
1980,
|
|
630,
|
|
1204,
|
|
1770,
|
|
2100,
|
|
660,
|
|
1260,
|
|
1860,
|
|
2220,
|
|
720,
|
|
1316,
|
|
1950,
|
|
2310,
|
|
750,
|
|
1372,
|
|
2040,
|
|
2430
|
|
];
|
|
exports.getBlocksCount = function getBlocksCount(version, errorCorrectionLevel) {
|
|
switch (errorCorrectionLevel) {
|
|
case ECLevel.L:
|
|
return EC_BLOCKS_TABLE[(version - 1) * 4 + 0];
|
|
case ECLevel.M:
|
|
return EC_BLOCKS_TABLE[(version - 1) * 4 + 1];
|
|
case ECLevel.Q:
|
|
return EC_BLOCKS_TABLE[(version - 1) * 4 + 2];
|
|
case ECLevel.H:
|
|
return EC_BLOCKS_TABLE[(version - 1) * 4 + 3];
|
|
default:
|
|
return void 0;
|
|
}
|
|
};
|
|
exports.getTotalCodewordsCount = function getTotalCodewordsCount(version, errorCorrectionLevel) {
|
|
switch (errorCorrectionLevel) {
|
|
case ECLevel.L:
|
|
return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0];
|
|
case ECLevel.M:
|
|
return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1];
|
|
case ECLevel.Q:
|
|
return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2];
|
|
case ECLevel.H:
|
|
return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3];
|
|
default:
|
|
return void 0;
|
|
}
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/galois-field.js
|
|
var require_galois_field = __commonJS({
|
|
"node_modules/qrcode/lib/core/galois-field.js"(exports) {
|
|
var EXP_TABLE = new Uint8Array(512);
|
|
var LOG_TABLE = new Uint8Array(256);
|
|
(function initTables() {
|
|
let x = 1;
|
|
for (let i = 0; i < 255; i++) {
|
|
EXP_TABLE[i] = x;
|
|
LOG_TABLE[x] = i;
|
|
x <<= 1;
|
|
if (x & 256) {
|
|
x ^= 285;
|
|
}
|
|
}
|
|
for (let i = 255; i < 512; i++) {
|
|
EXP_TABLE[i] = EXP_TABLE[i - 255];
|
|
}
|
|
})();
|
|
exports.log = function log(n) {
|
|
if (n < 1)
|
|
throw new Error("log(" + n + ")");
|
|
return LOG_TABLE[n];
|
|
};
|
|
exports.exp = function exp(n) {
|
|
return EXP_TABLE[n];
|
|
};
|
|
exports.mul = function mul(x, y) {
|
|
if (x === 0 || y === 0)
|
|
return 0;
|
|
return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]];
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/polynomial.js
|
|
var require_polynomial = __commonJS({
|
|
"node_modules/qrcode/lib/core/polynomial.js"(exports) {
|
|
var GF = require_galois_field();
|
|
exports.mul = function mul(p1, p2) {
|
|
const coeff = new Uint8Array(p1.length + p2.length - 1);
|
|
for (let i = 0; i < p1.length; i++) {
|
|
for (let j = 0; j < p2.length; j++) {
|
|
coeff[i + j] ^= GF.mul(p1[i], p2[j]);
|
|
}
|
|
}
|
|
return coeff;
|
|
};
|
|
exports.mod = function mod(divident, divisor) {
|
|
let result = new Uint8Array(divident);
|
|
while (result.length - divisor.length >= 0) {
|
|
const coeff = result[0];
|
|
for (let i = 0; i < divisor.length; i++) {
|
|
result[i] ^= GF.mul(divisor[i], coeff);
|
|
}
|
|
let offset = 0;
|
|
while (offset < result.length && result[offset] === 0)
|
|
offset++;
|
|
result = result.slice(offset);
|
|
}
|
|
return result;
|
|
};
|
|
exports.generateECPolynomial = function generateECPolynomial(degree) {
|
|
let poly = new Uint8Array([1]);
|
|
for (let i = 0; i < degree; i++) {
|
|
poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]));
|
|
}
|
|
return poly;
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/reed-solomon-encoder.js
|
|
var require_reed_solomon_encoder = __commonJS({
|
|
"node_modules/qrcode/lib/core/reed-solomon-encoder.js"(exports, module2) {
|
|
var Polynomial = require_polynomial();
|
|
function ReedSolomonEncoder(degree) {
|
|
this.genPoly = void 0;
|
|
this.degree = degree;
|
|
if (this.degree)
|
|
this.initialize(this.degree);
|
|
}
|
|
ReedSolomonEncoder.prototype.initialize = function initialize(degree) {
|
|
this.degree = degree;
|
|
this.genPoly = Polynomial.generateECPolynomial(this.degree);
|
|
};
|
|
ReedSolomonEncoder.prototype.encode = function encode(data) {
|
|
if (!this.genPoly) {
|
|
throw new Error("Encoder not initialized");
|
|
}
|
|
const paddedData = new Uint8Array(data.length + this.degree);
|
|
paddedData.set(data);
|
|
const remainder = Polynomial.mod(paddedData, this.genPoly);
|
|
const start = this.degree - remainder.length;
|
|
if (start > 0) {
|
|
const buff = new Uint8Array(this.degree);
|
|
buff.set(remainder, start);
|
|
return buff;
|
|
}
|
|
return remainder;
|
|
};
|
|
module2.exports = ReedSolomonEncoder;
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/version-check.js
|
|
var require_version_check = __commonJS({
|
|
"node_modules/qrcode/lib/core/version-check.js"(exports) {
|
|
exports.isValid = function isValid(version) {
|
|
return !isNaN(version) && version >= 1 && version <= 40;
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/regex.js
|
|
var require_regex = __commonJS({
|
|
"node_modules/qrcode/lib/core/regex.js"(exports) {
|
|
var numeric = "[0-9]+";
|
|
var alphanumeric = "[A-Z $%*+\\-./:]+";
|
|
var kanji = "(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";
|
|
kanji = kanji.replace(/u/g, "\\u");
|
|
var byte = "(?:(?![A-Z0-9 $%*+\\-./:]|" + kanji + ")(?:.|[\r\n]))+";
|
|
exports.KANJI = new RegExp(kanji, "g");
|
|
exports.BYTE_KANJI = new RegExp("[^A-Z0-9 $%*+\\-./:]+", "g");
|
|
exports.BYTE = new RegExp(byte, "g");
|
|
exports.NUMERIC = new RegExp(numeric, "g");
|
|
exports.ALPHANUMERIC = new RegExp(alphanumeric, "g");
|
|
var TEST_KANJI = new RegExp("^" + kanji + "$");
|
|
var TEST_NUMERIC = new RegExp("^" + numeric + "$");
|
|
var TEST_ALPHANUMERIC = new RegExp("^[A-Z0-9 $%*+\\-./:]+$");
|
|
exports.testKanji = function testKanji(str) {
|
|
return TEST_KANJI.test(str);
|
|
};
|
|
exports.testNumeric = function testNumeric(str) {
|
|
return TEST_NUMERIC.test(str);
|
|
};
|
|
exports.testAlphanumeric = function testAlphanumeric(str) {
|
|
return TEST_ALPHANUMERIC.test(str);
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/mode.js
|
|
var require_mode = __commonJS({
|
|
"node_modules/qrcode/lib/core/mode.js"(exports) {
|
|
var VersionCheck = require_version_check();
|
|
var Regex = require_regex();
|
|
exports.NUMERIC = {
|
|
id: "Numeric",
|
|
bit: 1 << 0,
|
|
ccBits: [10, 12, 14]
|
|
};
|
|
exports.ALPHANUMERIC = {
|
|
id: "Alphanumeric",
|
|
bit: 1 << 1,
|
|
ccBits: [9, 11, 13]
|
|
};
|
|
exports.BYTE = {
|
|
id: "Byte",
|
|
bit: 1 << 2,
|
|
ccBits: [8, 16, 16]
|
|
};
|
|
exports.KANJI = {
|
|
id: "Kanji",
|
|
bit: 1 << 3,
|
|
ccBits: [8, 10, 12]
|
|
};
|
|
exports.MIXED = {
|
|
bit: -1
|
|
};
|
|
exports.getCharCountIndicator = function getCharCountIndicator(mode, version) {
|
|
if (!mode.ccBits)
|
|
throw new Error("Invalid mode: " + mode);
|
|
if (!VersionCheck.isValid(version)) {
|
|
throw new Error("Invalid version: " + version);
|
|
}
|
|
if (version >= 1 && version < 10)
|
|
return mode.ccBits[0];
|
|
else if (version < 27)
|
|
return mode.ccBits[1];
|
|
return mode.ccBits[2];
|
|
};
|
|
exports.getBestModeForData = function getBestModeForData(dataStr) {
|
|
if (Regex.testNumeric(dataStr))
|
|
return exports.NUMERIC;
|
|
else if (Regex.testAlphanumeric(dataStr))
|
|
return exports.ALPHANUMERIC;
|
|
else if (Regex.testKanji(dataStr))
|
|
return exports.KANJI;
|
|
else
|
|
return exports.BYTE;
|
|
};
|
|
exports.toString = function toString(mode) {
|
|
if (mode && mode.id)
|
|
return mode.id;
|
|
throw new Error("Invalid mode");
|
|
};
|
|
exports.isValid = function isValid(mode) {
|
|
return mode && mode.bit && mode.ccBits;
|
|
};
|
|
function fromString(string) {
|
|
if (typeof string !== "string") {
|
|
throw new Error("Param is not a string");
|
|
}
|
|
const lcStr = string.toLowerCase();
|
|
switch (lcStr) {
|
|
case "numeric":
|
|
return exports.NUMERIC;
|
|
case "alphanumeric":
|
|
return exports.ALPHANUMERIC;
|
|
case "kanji":
|
|
return exports.KANJI;
|
|
case "byte":
|
|
return exports.BYTE;
|
|
default:
|
|
throw new Error("Unknown mode: " + string);
|
|
}
|
|
}
|
|
exports.from = function from(value, defaultValue) {
|
|
if (exports.isValid(value)) {
|
|
return value;
|
|
}
|
|
try {
|
|
return fromString(value);
|
|
} catch (e) {
|
|
return defaultValue;
|
|
}
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/version.js
|
|
var require_version = __commonJS({
|
|
"node_modules/qrcode/lib/core/version.js"(exports) {
|
|
var Utils = require_utils();
|
|
var ECCode = require_error_correction_code();
|
|
var ECLevel = require_error_correction_level();
|
|
var Mode = require_mode();
|
|
var VersionCheck = require_version_check();
|
|
var G18 = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0;
|
|
var G18_BCH = Utils.getBCHDigit(G18);
|
|
function getBestVersionForDataLength(mode, length, errorCorrectionLevel) {
|
|
for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {
|
|
if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {
|
|
return currentVersion;
|
|
}
|
|
}
|
|
return void 0;
|
|
}
|
|
function getReservedBitsCount(mode, version) {
|
|
return Mode.getCharCountIndicator(mode, version) + 4;
|
|
}
|
|
function getTotalBitsFromDataArray(segments, version) {
|
|
let totalBits = 0;
|
|
segments.forEach(function(data) {
|
|
const reservedBits = getReservedBitsCount(data.mode, version);
|
|
totalBits += reservedBits + data.getBitsLength();
|
|
});
|
|
return totalBits;
|
|
}
|
|
function getBestVersionForMixedData(segments, errorCorrectionLevel) {
|
|
for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {
|
|
const length = getTotalBitsFromDataArray(segments, currentVersion);
|
|
if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {
|
|
return currentVersion;
|
|
}
|
|
}
|
|
return void 0;
|
|
}
|
|
exports.from = function from(value, defaultValue) {
|
|
if (VersionCheck.isValid(value)) {
|
|
return parseInt(value, 10);
|
|
}
|
|
return defaultValue;
|
|
};
|
|
exports.getCapacity = function getCapacity(version, errorCorrectionLevel, mode) {
|
|
if (!VersionCheck.isValid(version)) {
|
|
throw new Error("Invalid QR Code version");
|
|
}
|
|
if (typeof mode === "undefined")
|
|
mode = Mode.BYTE;
|
|
const totalCodewords = Utils.getSymbolTotalCodewords(version);
|
|
const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel);
|
|
const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8;
|
|
if (mode === Mode.MIXED)
|
|
return dataTotalCodewordsBits;
|
|
const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version);
|
|
switch (mode) {
|
|
case Mode.NUMERIC:
|
|
return Math.floor(usableBits / 10 * 3);
|
|
case Mode.ALPHANUMERIC:
|
|
return Math.floor(usableBits / 11 * 2);
|
|
case Mode.KANJI:
|
|
return Math.floor(usableBits / 13);
|
|
case Mode.BYTE:
|
|
default:
|
|
return Math.floor(usableBits / 8);
|
|
}
|
|
};
|
|
exports.getBestVersionForData = function getBestVersionForData(data, errorCorrectionLevel) {
|
|
let seg;
|
|
const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M);
|
|
if (Array.isArray(data)) {
|
|
if (data.length > 1) {
|
|
return getBestVersionForMixedData(data, ecl);
|
|
}
|
|
if (data.length === 0) {
|
|
return 1;
|
|
}
|
|
seg = data[0];
|
|
} else {
|
|
seg = data;
|
|
}
|
|
return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl);
|
|
};
|
|
exports.getEncodedBits = function getEncodedBits(version) {
|
|
if (!VersionCheck.isValid(version) || version < 7) {
|
|
throw new Error("Invalid QR Code version");
|
|
}
|
|
let d = version << 12;
|
|
while (Utils.getBCHDigit(d) - G18_BCH >= 0) {
|
|
d ^= G18 << Utils.getBCHDigit(d) - G18_BCH;
|
|
}
|
|
return version << 12 | d;
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/format-info.js
|
|
var require_format_info = __commonJS({
|
|
"node_modules/qrcode/lib/core/format-info.js"(exports) {
|
|
var Utils = require_utils();
|
|
var G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0;
|
|
var G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1;
|
|
var G15_BCH = Utils.getBCHDigit(G15);
|
|
exports.getEncodedBits = function getEncodedBits(errorCorrectionLevel, mask) {
|
|
const data = errorCorrectionLevel.bit << 3 | mask;
|
|
let d = data << 10;
|
|
while (Utils.getBCHDigit(d) - G15_BCH >= 0) {
|
|
d ^= G15 << Utils.getBCHDigit(d) - G15_BCH;
|
|
}
|
|
return (data << 10 | d) ^ G15_MASK;
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/numeric-data.js
|
|
var require_numeric_data = __commonJS({
|
|
"node_modules/qrcode/lib/core/numeric-data.js"(exports, module2) {
|
|
var Mode = require_mode();
|
|
function NumericData(data) {
|
|
this.mode = Mode.NUMERIC;
|
|
this.data = data.toString();
|
|
}
|
|
NumericData.getBitsLength = function getBitsLength(length) {
|
|
return 10 * Math.floor(length / 3) + (length % 3 ? length % 3 * 3 + 1 : 0);
|
|
};
|
|
NumericData.prototype.getLength = function getLength() {
|
|
return this.data.length;
|
|
};
|
|
NumericData.prototype.getBitsLength = function getBitsLength() {
|
|
return NumericData.getBitsLength(this.data.length);
|
|
};
|
|
NumericData.prototype.write = function write(bitBuffer) {
|
|
let i, group, value;
|
|
for (i = 0; i + 3 <= this.data.length; i += 3) {
|
|
group = this.data.substr(i, 3);
|
|
value = parseInt(group, 10);
|
|
bitBuffer.put(value, 10);
|
|
}
|
|
const remainingNum = this.data.length - i;
|
|
if (remainingNum > 0) {
|
|
group = this.data.substr(i);
|
|
value = parseInt(group, 10);
|
|
bitBuffer.put(value, remainingNum * 3 + 1);
|
|
}
|
|
};
|
|
module2.exports = NumericData;
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/alphanumeric-data.js
|
|
var require_alphanumeric_data = __commonJS({
|
|
"node_modules/qrcode/lib/core/alphanumeric-data.js"(exports, module2) {
|
|
var Mode = require_mode();
|
|
var ALPHA_NUM_CHARS = [
|
|
"0",
|
|
"1",
|
|
"2",
|
|
"3",
|
|
"4",
|
|
"5",
|
|
"6",
|
|
"7",
|
|
"8",
|
|
"9",
|
|
"A",
|
|
"B",
|
|
"C",
|
|
"D",
|
|
"E",
|
|
"F",
|
|
"G",
|
|
"H",
|
|
"I",
|
|
"J",
|
|
"K",
|
|
"L",
|
|
"M",
|
|
"N",
|
|
"O",
|
|
"P",
|
|
"Q",
|
|
"R",
|
|
"S",
|
|
"T",
|
|
"U",
|
|
"V",
|
|
"W",
|
|
"X",
|
|
"Y",
|
|
"Z",
|
|
" ",
|
|
"$",
|
|
"%",
|
|
"*",
|
|
"+",
|
|
"-",
|
|
".",
|
|
"/",
|
|
":"
|
|
];
|
|
function AlphanumericData(data) {
|
|
this.mode = Mode.ALPHANUMERIC;
|
|
this.data = data;
|
|
}
|
|
AlphanumericData.getBitsLength = function getBitsLength(length) {
|
|
return 11 * Math.floor(length / 2) + 6 * (length % 2);
|
|
};
|
|
AlphanumericData.prototype.getLength = function getLength() {
|
|
return this.data.length;
|
|
};
|
|
AlphanumericData.prototype.getBitsLength = function getBitsLength() {
|
|
return AlphanumericData.getBitsLength(this.data.length);
|
|
};
|
|
AlphanumericData.prototype.write = function write(bitBuffer) {
|
|
let i;
|
|
for (i = 0; i + 2 <= this.data.length; i += 2) {
|
|
let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45;
|
|
value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1]);
|
|
bitBuffer.put(value, 11);
|
|
}
|
|
if (this.data.length % 2) {
|
|
bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6);
|
|
}
|
|
};
|
|
module2.exports = AlphanumericData;
|
|
}
|
|
});
|
|
|
|
// node_modules/encode-utf8/index.js
|
|
var require_encode_utf8 = __commonJS({
|
|
"node_modules/encode-utf8/index.js"(exports, module2) {
|
|
"use strict";
|
|
module2.exports = function encodeUtf8(input) {
|
|
var result = [];
|
|
var size = input.length;
|
|
for (var index = 0; index < size; index++) {
|
|
var point = input.charCodeAt(index);
|
|
if (point >= 55296 && point <= 56319 && size > index + 1) {
|
|
var second = input.charCodeAt(index + 1);
|
|
if (second >= 56320 && second <= 57343) {
|
|
point = (point - 55296) * 1024 + second - 56320 + 65536;
|
|
index += 1;
|
|
}
|
|
}
|
|
if (point < 128) {
|
|
result.push(point);
|
|
continue;
|
|
}
|
|
if (point < 2048) {
|
|
result.push(point >> 6 | 192);
|
|
result.push(point & 63 | 128);
|
|
continue;
|
|
}
|
|
if (point < 55296 || point >= 57344 && point < 65536) {
|
|
result.push(point >> 12 | 224);
|
|
result.push(point >> 6 & 63 | 128);
|
|
result.push(point & 63 | 128);
|
|
continue;
|
|
}
|
|
if (point >= 65536 && point <= 1114111) {
|
|
result.push(point >> 18 | 240);
|
|
result.push(point >> 12 & 63 | 128);
|
|
result.push(point >> 6 & 63 | 128);
|
|
result.push(point & 63 | 128);
|
|
continue;
|
|
}
|
|
result.push(239, 191, 189);
|
|
}
|
|
return new Uint8Array(result).buffer;
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/byte-data.js
|
|
var require_byte_data = __commonJS({
|
|
"node_modules/qrcode/lib/core/byte-data.js"(exports, module2) {
|
|
var encodeUtf8 = require_encode_utf8();
|
|
var Mode = require_mode();
|
|
function ByteData(data) {
|
|
this.mode = Mode.BYTE;
|
|
if (typeof data === "string") {
|
|
data = encodeUtf8(data);
|
|
}
|
|
this.data = new Uint8Array(data);
|
|
}
|
|
ByteData.getBitsLength = function getBitsLength(length) {
|
|
return length * 8;
|
|
};
|
|
ByteData.prototype.getLength = function getLength() {
|
|
return this.data.length;
|
|
};
|
|
ByteData.prototype.getBitsLength = function getBitsLength() {
|
|
return ByteData.getBitsLength(this.data.length);
|
|
};
|
|
ByteData.prototype.write = function(bitBuffer) {
|
|
for (let i = 0, l = this.data.length; i < l; i++) {
|
|
bitBuffer.put(this.data[i], 8);
|
|
}
|
|
};
|
|
module2.exports = ByteData;
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/kanji-data.js
|
|
var require_kanji_data = __commonJS({
|
|
"node_modules/qrcode/lib/core/kanji-data.js"(exports, module2) {
|
|
var Mode = require_mode();
|
|
var Utils = require_utils();
|
|
function KanjiData(data) {
|
|
this.mode = Mode.KANJI;
|
|
this.data = data;
|
|
}
|
|
KanjiData.getBitsLength = function getBitsLength(length) {
|
|
return length * 13;
|
|
};
|
|
KanjiData.prototype.getLength = function getLength() {
|
|
return this.data.length;
|
|
};
|
|
KanjiData.prototype.getBitsLength = function getBitsLength() {
|
|
return KanjiData.getBitsLength(this.data.length);
|
|
};
|
|
KanjiData.prototype.write = function(bitBuffer) {
|
|
let i;
|
|
for (i = 0; i < this.data.length; i++) {
|
|
let value = Utils.toSJIS(this.data[i]);
|
|
if (value >= 33088 && value <= 40956) {
|
|
value -= 33088;
|
|
} else if (value >= 57408 && value <= 60351) {
|
|
value -= 49472;
|
|
} else {
|
|
throw new Error(
|
|
"Invalid SJIS character: " + this.data[i] + "\nMake sure your charset is UTF-8"
|
|
);
|
|
}
|
|
value = (value >>> 8 & 255) * 192 + (value & 255);
|
|
bitBuffer.put(value, 13);
|
|
}
|
|
};
|
|
module2.exports = KanjiData;
|
|
}
|
|
});
|
|
|
|
// node_modules/dijkstrajs/dijkstra.js
|
|
var require_dijkstra = __commonJS({
|
|
"node_modules/dijkstrajs/dijkstra.js"(exports, module2) {
|
|
"use strict";
|
|
var dijkstra = {
|
|
single_source_shortest_paths: function(graph, s, d) {
|
|
var predecessors = {};
|
|
var costs = {};
|
|
costs[s] = 0;
|
|
var open = dijkstra.PriorityQueue.make();
|
|
open.push(s, 0);
|
|
var closest, u, v, cost_of_s_to_u, adjacent_nodes, cost_of_e, cost_of_s_to_u_plus_cost_of_e, cost_of_s_to_v, first_visit;
|
|
while (!open.empty()) {
|
|
closest = open.pop();
|
|
u = closest.value;
|
|
cost_of_s_to_u = closest.cost;
|
|
adjacent_nodes = graph[u] || {};
|
|
for (v in adjacent_nodes) {
|
|
if (adjacent_nodes.hasOwnProperty(v)) {
|
|
cost_of_e = adjacent_nodes[v];
|
|
cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;
|
|
cost_of_s_to_v = costs[v];
|
|
first_visit = typeof costs[v] === "undefined";
|
|
if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {
|
|
costs[v] = cost_of_s_to_u_plus_cost_of_e;
|
|
open.push(v, cost_of_s_to_u_plus_cost_of_e);
|
|
predecessors[v] = u;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (typeof d !== "undefined" && typeof costs[d] === "undefined") {
|
|
var msg = ["Could not find a path from ", s, " to ", d, "."].join("");
|
|
throw new Error(msg);
|
|
}
|
|
return predecessors;
|
|
},
|
|
extract_shortest_path_from_predecessor_list: function(predecessors, d) {
|
|
var nodes = [];
|
|
var u = d;
|
|
var predecessor;
|
|
while (u) {
|
|
nodes.push(u);
|
|
predecessor = predecessors[u];
|
|
u = predecessors[u];
|
|
}
|
|
nodes.reverse();
|
|
return nodes;
|
|
},
|
|
find_path: function(graph, s, d) {
|
|
var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);
|
|
return dijkstra.extract_shortest_path_from_predecessor_list(
|
|
predecessors,
|
|
d
|
|
);
|
|
},
|
|
/**
|
|
* A very naive priority queue implementation.
|
|
*/
|
|
PriorityQueue: {
|
|
make: function(opts) {
|
|
var T = dijkstra.PriorityQueue, t = {}, key;
|
|
opts = opts || {};
|
|
for (key in T) {
|
|
if (T.hasOwnProperty(key)) {
|
|
t[key] = T[key];
|
|
}
|
|
}
|
|
t.queue = [];
|
|
t.sorter = opts.sorter || T.default_sorter;
|
|
return t;
|
|
},
|
|
default_sorter: function(a, b) {
|
|
return a.cost - b.cost;
|
|
},
|
|
/**
|
|
* Add a new item to the queue and ensure the highest priority element
|
|
* is at the front of the queue.
|
|
*/
|
|
push: function(value, cost) {
|
|
var item = { value, cost };
|
|
this.queue.push(item);
|
|
this.queue.sort(this.sorter);
|
|
},
|
|
/**
|
|
* Return the highest priority element in the queue.
|
|
*/
|
|
pop: function() {
|
|
return this.queue.shift();
|
|
},
|
|
empty: function() {
|
|
return this.queue.length === 0;
|
|
}
|
|
}
|
|
};
|
|
if (typeof module2 !== "undefined") {
|
|
module2.exports = dijkstra;
|
|
}
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/segments.js
|
|
var require_segments = __commonJS({
|
|
"node_modules/qrcode/lib/core/segments.js"(exports) {
|
|
var Mode = require_mode();
|
|
var NumericData = require_numeric_data();
|
|
var AlphanumericData = require_alphanumeric_data();
|
|
var ByteData = require_byte_data();
|
|
var KanjiData = require_kanji_data();
|
|
var Regex = require_regex();
|
|
var Utils = require_utils();
|
|
var dijkstra = require_dijkstra();
|
|
function getStringByteLength(str) {
|
|
return unescape(encodeURIComponent(str)).length;
|
|
}
|
|
function getSegments(regex, mode, str) {
|
|
const segments = [];
|
|
let result;
|
|
while ((result = regex.exec(str)) !== null) {
|
|
segments.push({
|
|
data: result[0],
|
|
index: result.index,
|
|
mode,
|
|
length: result[0].length
|
|
});
|
|
}
|
|
return segments;
|
|
}
|
|
function getSegmentsFromString(dataStr) {
|
|
const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr);
|
|
const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr);
|
|
let byteSegs;
|
|
let kanjiSegs;
|
|
if (Utils.isKanjiModeEnabled()) {
|
|
byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr);
|
|
kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr);
|
|
} else {
|
|
byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr);
|
|
kanjiSegs = [];
|
|
}
|
|
const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs);
|
|
return segs.sort(function(s1, s2) {
|
|
return s1.index - s2.index;
|
|
}).map(function(obj) {
|
|
return {
|
|
data: obj.data,
|
|
mode: obj.mode,
|
|
length: obj.length
|
|
};
|
|
});
|
|
}
|
|
function getSegmentBitsLength(length, mode) {
|
|
switch (mode) {
|
|
case Mode.NUMERIC:
|
|
return NumericData.getBitsLength(length);
|
|
case Mode.ALPHANUMERIC:
|
|
return AlphanumericData.getBitsLength(length);
|
|
case Mode.KANJI:
|
|
return KanjiData.getBitsLength(length);
|
|
case Mode.BYTE:
|
|
return ByteData.getBitsLength(length);
|
|
}
|
|
}
|
|
function mergeSegments(segs) {
|
|
return segs.reduce(function(acc, curr) {
|
|
const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null;
|
|
if (prevSeg && prevSeg.mode === curr.mode) {
|
|
acc[acc.length - 1].data += curr.data;
|
|
return acc;
|
|
}
|
|
acc.push(curr);
|
|
return acc;
|
|
}, []);
|
|
}
|
|
function buildNodes(segs) {
|
|
const nodes = [];
|
|
for (let i = 0; i < segs.length; i++) {
|
|
const seg = segs[i];
|
|
switch (seg.mode) {
|
|
case Mode.NUMERIC:
|
|
nodes.push([
|
|
seg,
|
|
{ data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },
|
|
{ data: seg.data, mode: Mode.BYTE, length: seg.length }
|
|
]);
|
|
break;
|
|
case Mode.ALPHANUMERIC:
|
|
nodes.push([
|
|
seg,
|
|
{ data: seg.data, mode: Mode.BYTE, length: seg.length }
|
|
]);
|
|
break;
|
|
case Mode.KANJI:
|
|
nodes.push([
|
|
seg,
|
|
{ data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }
|
|
]);
|
|
break;
|
|
case Mode.BYTE:
|
|
nodes.push([
|
|
{ data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }
|
|
]);
|
|
}
|
|
}
|
|
return nodes;
|
|
}
|
|
function buildGraph(nodes, version) {
|
|
const table = {};
|
|
const graph = { start: {} };
|
|
let prevNodeIds = ["start"];
|
|
for (let i = 0; i < nodes.length; i++) {
|
|
const nodeGroup = nodes[i];
|
|
const currentNodeIds = [];
|
|
for (let j = 0; j < nodeGroup.length; j++) {
|
|
const node = nodeGroup[j];
|
|
const key = "" + i + j;
|
|
currentNodeIds.push(key);
|
|
table[key] = { node, lastCount: 0 };
|
|
graph[key] = {};
|
|
for (let n = 0; n < prevNodeIds.length; n++) {
|
|
const prevNodeId = prevNodeIds[n];
|
|
if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {
|
|
graph[prevNodeId][key] = getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) - getSegmentBitsLength(table[prevNodeId].lastCount, node.mode);
|
|
table[prevNodeId].lastCount += node.length;
|
|
} else {
|
|
if (table[prevNodeId])
|
|
table[prevNodeId].lastCount = node.length;
|
|
graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) + 4 + Mode.getCharCountIndicator(node.mode, version);
|
|
}
|
|
}
|
|
}
|
|
prevNodeIds = currentNodeIds;
|
|
}
|
|
for (let n = 0; n < prevNodeIds.length; n++) {
|
|
graph[prevNodeIds[n]].end = 0;
|
|
}
|
|
return { map: graph, table };
|
|
}
|
|
function buildSingleSegment(data, modesHint) {
|
|
let mode;
|
|
const bestMode = Mode.getBestModeForData(data);
|
|
mode = Mode.from(modesHint, bestMode);
|
|
if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {
|
|
throw new Error('"' + data + '" cannot be encoded with mode ' + Mode.toString(mode) + ".\n Suggested mode is: " + Mode.toString(bestMode));
|
|
}
|
|
if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {
|
|
mode = Mode.BYTE;
|
|
}
|
|
switch (mode) {
|
|
case Mode.NUMERIC:
|
|
return new NumericData(data);
|
|
case Mode.ALPHANUMERIC:
|
|
return new AlphanumericData(data);
|
|
case Mode.KANJI:
|
|
return new KanjiData(data);
|
|
case Mode.BYTE:
|
|
return new ByteData(data);
|
|
}
|
|
}
|
|
exports.fromArray = function fromArray(array) {
|
|
return array.reduce(function(acc, seg) {
|
|
if (typeof seg === "string") {
|
|
acc.push(buildSingleSegment(seg, null));
|
|
} else if (seg.data) {
|
|
acc.push(buildSingleSegment(seg.data, seg.mode));
|
|
}
|
|
return acc;
|
|
}, []);
|
|
};
|
|
exports.fromString = function fromString(data, version) {
|
|
const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled());
|
|
const nodes = buildNodes(segs);
|
|
const graph = buildGraph(nodes, version);
|
|
const path = dijkstra.find_path(graph.map, "start", "end");
|
|
const optimizedSegs = [];
|
|
for (let i = 1; i < path.length - 1; i++) {
|
|
optimizedSegs.push(graph.table[path[i]].node);
|
|
}
|
|
return exports.fromArray(mergeSegments(optimizedSegs));
|
|
};
|
|
exports.rawSplit = function rawSplit(data) {
|
|
return exports.fromArray(
|
|
getSegmentsFromString(data, Utils.isKanjiModeEnabled())
|
|
);
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/core/qrcode.js
|
|
var require_qrcode = __commonJS({
|
|
"node_modules/qrcode/lib/core/qrcode.js"(exports) {
|
|
var Utils = require_utils();
|
|
var ECLevel = require_error_correction_level();
|
|
var BitBuffer = require_bit_buffer();
|
|
var BitMatrix = require_bit_matrix();
|
|
var AlignmentPattern = require_alignment_pattern();
|
|
var FinderPattern = require_finder_pattern();
|
|
var MaskPattern = require_mask_pattern();
|
|
var ECCode = require_error_correction_code();
|
|
var ReedSolomonEncoder = require_reed_solomon_encoder();
|
|
var Version = require_version();
|
|
var FormatInfo = require_format_info();
|
|
var Mode = require_mode();
|
|
var Segments = require_segments();
|
|
function setupFinderPattern(matrix, version) {
|
|
const size = matrix.size;
|
|
const pos = FinderPattern.getPositions(version);
|
|
for (let i = 0; i < pos.length; i++) {
|
|
const row = pos[i][0];
|
|
const col = pos[i][1];
|
|
for (let r = -1; r <= 7; r++) {
|
|
if (row + r <= -1 || size <= row + r)
|
|
continue;
|
|
for (let c = -1; c <= 7; c++) {
|
|
if (col + c <= -1 || size <= col + c)
|
|
continue;
|
|
if (r >= 0 && r <= 6 && (c === 0 || c === 6) || c >= 0 && c <= 6 && (r === 0 || r === 6) || r >= 2 && r <= 4 && c >= 2 && c <= 4) {
|
|
matrix.set(row + r, col + c, true, true);
|
|
} else {
|
|
matrix.set(row + r, col + c, false, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function setupTimingPattern(matrix) {
|
|
const size = matrix.size;
|
|
for (let r = 8; r < size - 8; r++) {
|
|
const value = r % 2 === 0;
|
|
matrix.set(r, 6, value, true);
|
|
matrix.set(6, r, value, true);
|
|
}
|
|
}
|
|
function setupAlignmentPattern(matrix, version) {
|
|
const pos = AlignmentPattern.getPositions(version);
|
|
for (let i = 0; i < pos.length; i++) {
|
|
const row = pos[i][0];
|
|
const col = pos[i][1];
|
|
for (let r = -2; r <= 2; r++) {
|
|
for (let c = -2; c <= 2; c++) {
|
|
if (r === -2 || r === 2 || c === -2 || c === 2 || r === 0 && c === 0) {
|
|
matrix.set(row + r, col + c, true, true);
|
|
} else {
|
|
matrix.set(row + r, col + c, false, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function setupVersionInfo(matrix, version) {
|
|
const size = matrix.size;
|
|
const bits = Version.getEncodedBits(version);
|
|
let row, col, mod;
|
|
for (let i = 0; i < 18; i++) {
|
|
row = Math.floor(i / 3);
|
|
col = i % 3 + size - 8 - 3;
|
|
mod = (bits >> i & 1) === 1;
|
|
matrix.set(row, col, mod, true);
|
|
matrix.set(col, row, mod, true);
|
|
}
|
|
}
|
|
function setupFormatInfo(matrix, errorCorrectionLevel, maskPattern) {
|
|
const size = matrix.size;
|
|
const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern);
|
|
let i, mod;
|
|
for (i = 0; i < 15; i++) {
|
|
mod = (bits >> i & 1) === 1;
|
|
if (i < 6) {
|
|
matrix.set(i, 8, mod, true);
|
|
} else if (i < 8) {
|
|
matrix.set(i + 1, 8, mod, true);
|
|
} else {
|
|
matrix.set(size - 15 + i, 8, mod, true);
|
|
}
|
|
if (i < 8) {
|
|
matrix.set(8, size - i - 1, mod, true);
|
|
} else if (i < 9) {
|
|
matrix.set(8, 15 - i - 1 + 1, mod, true);
|
|
} else {
|
|
matrix.set(8, 15 - i - 1, mod, true);
|
|
}
|
|
}
|
|
matrix.set(size - 8, 8, 1, true);
|
|
}
|
|
function setupData(matrix, data) {
|
|
const size = matrix.size;
|
|
let inc = -1;
|
|
let row = size - 1;
|
|
let bitIndex = 7;
|
|
let byteIndex = 0;
|
|
for (let col = size - 1; col > 0; col -= 2) {
|
|
if (col === 6)
|
|
col--;
|
|
while (true) {
|
|
for (let c = 0; c < 2; c++) {
|
|
if (!matrix.isReserved(row, col - c)) {
|
|
let dark = false;
|
|
if (byteIndex < data.length) {
|
|
dark = (data[byteIndex] >>> bitIndex & 1) === 1;
|
|
}
|
|
matrix.set(row, col - c, dark);
|
|
bitIndex--;
|
|
if (bitIndex === -1) {
|
|
byteIndex++;
|
|
bitIndex = 7;
|
|
}
|
|
}
|
|
}
|
|
row += inc;
|
|
if (row < 0 || size <= row) {
|
|
row -= inc;
|
|
inc = -inc;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function createData(version, errorCorrectionLevel, segments) {
|
|
const buffer = new BitBuffer();
|
|
segments.forEach(function(data) {
|
|
buffer.put(data.mode.bit, 4);
|
|
buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version));
|
|
data.write(buffer);
|
|
});
|
|
const totalCodewords = Utils.getSymbolTotalCodewords(version);
|
|
const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel);
|
|
const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8;
|
|
if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {
|
|
buffer.put(0, 4);
|
|
}
|
|
while (buffer.getLengthInBits() % 8 !== 0) {
|
|
buffer.putBit(0);
|
|
}
|
|
const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8;
|
|
for (let i = 0; i < remainingByte; i++) {
|
|
buffer.put(i % 2 ? 17 : 236, 8);
|
|
}
|
|
return createCodewords(buffer, version, errorCorrectionLevel);
|
|
}
|
|
function createCodewords(bitBuffer, version, errorCorrectionLevel) {
|
|
const totalCodewords = Utils.getSymbolTotalCodewords(version);
|
|
const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel);
|
|
const dataTotalCodewords = totalCodewords - ecTotalCodewords;
|
|
const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel);
|
|
const blocksInGroup2 = totalCodewords % ecTotalBlocks;
|
|
const blocksInGroup1 = ecTotalBlocks - blocksInGroup2;
|
|
const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks);
|
|
const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks);
|
|
const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1;
|
|
const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1;
|
|
const rs = new ReedSolomonEncoder(ecCount);
|
|
let offset = 0;
|
|
const dcData = new Array(ecTotalBlocks);
|
|
const ecData = new Array(ecTotalBlocks);
|
|
let maxDataSize = 0;
|
|
const buffer = new Uint8Array(bitBuffer.buffer);
|
|
for (let b = 0; b < ecTotalBlocks; b++) {
|
|
const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2;
|
|
dcData[b] = buffer.slice(offset, offset + dataSize);
|
|
ecData[b] = rs.encode(dcData[b]);
|
|
offset += dataSize;
|
|
maxDataSize = Math.max(maxDataSize, dataSize);
|
|
}
|
|
const data = new Uint8Array(totalCodewords);
|
|
let index = 0;
|
|
let i, r;
|
|
for (i = 0; i < maxDataSize; i++) {
|
|
for (r = 0; r < ecTotalBlocks; r++) {
|
|
if (i < dcData[r].length) {
|
|
data[index++] = dcData[r][i];
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < ecCount; i++) {
|
|
for (r = 0; r < ecTotalBlocks; r++) {
|
|
data[index++] = ecData[r][i];
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
function createSymbol(data, version, errorCorrectionLevel, maskPattern) {
|
|
let segments;
|
|
if (Array.isArray(data)) {
|
|
segments = Segments.fromArray(data);
|
|
} else if (typeof data === "string") {
|
|
let estimatedVersion = version;
|
|
if (!estimatedVersion) {
|
|
const rawSegments = Segments.rawSplit(data);
|
|
estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel);
|
|
}
|
|
segments = Segments.fromString(data, estimatedVersion || 40);
|
|
} else {
|
|
throw new Error("Invalid data");
|
|
}
|
|
const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel);
|
|
if (!bestVersion) {
|
|
throw new Error("The amount of data is too big to be stored in a QR Code");
|
|
}
|
|
if (!version) {
|
|
version = bestVersion;
|
|
} else if (version < bestVersion) {
|
|
throw new Error(
|
|
"\nThe chosen QR Code version cannot contain this amount of data.\nMinimum version required to store current data is: " + bestVersion + ".\n"
|
|
);
|
|
}
|
|
const dataBits = createData(version, errorCorrectionLevel, segments);
|
|
const moduleCount = Utils.getSymbolSize(version);
|
|
const modules = new BitMatrix(moduleCount);
|
|
setupFinderPattern(modules, version);
|
|
setupTimingPattern(modules);
|
|
setupAlignmentPattern(modules, version);
|
|
setupFormatInfo(modules, errorCorrectionLevel, 0);
|
|
if (version >= 7) {
|
|
setupVersionInfo(modules, version);
|
|
}
|
|
setupData(modules, dataBits);
|
|
if (isNaN(maskPattern)) {
|
|
maskPattern = MaskPattern.getBestMask(
|
|
modules,
|
|
setupFormatInfo.bind(null, modules, errorCorrectionLevel)
|
|
);
|
|
}
|
|
MaskPattern.applyMask(maskPattern, modules);
|
|
setupFormatInfo(modules, errorCorrectionLevel, maskPattern);
|
|
return {
|
|
modules,
|
|
version,
|
|
errorCorrectionLevel,
|
|
maskPattern,
|
|
segments
|
|
};
|
|
}
|
|
exports.create = function create(data, options) {
|
|
if (typeof data === "undefined" || data === "") {
|
|
throw new Error("No input text");
|
|
}
|
|
let errorCorrectionLevel = ECLevel.M;
|
|
let version;
|
|
let mask;
|
|
if (typeof options !== "undefined") {
|
|
errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M);
|
|
version = Version.from(options.version);
|
|
mask = MaskPattern.from(options.maskPattern);
|
|
if (options.toSJISFunc) {
|
|
Utils.setToSJISFunction(options.toSJISFunc);
|
|
}
|
|
}
|
|
return createSymbol(data, version, errorCorrectionLevel, mask);
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/renderer/utils.js
|
|
var require_utils2 = __commonJS({
|
|
"node_modules/qrcode/lib/renderer/utils.js"(exports) {
|
|
function hex2rgba(hex) {
|
|
if (typeof hex === "number") {
|
|
hex = hex.toString();
|
|
}
|
|
if (typeof hex !== "string") {
|
|
throw new Error("Color should be defined as hex string");
|
|
}
|
|
let hexCode = hex.slice().replace("#", "").split("");
|
|
if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {
|
|
throw new Error("Invalid hex color: " + hex);
|
|
}
|
|
if (hexCode.length === 3 || hexCode.length === 4) {
|
|
hexCode = Array.prototype.concat.apply([], hexCode.map(function(c) {
|
|
return [c, c];
|
|
}));
|
|
}
|
|
if (hexCode.length === 6)
|
|
hexCode.push("F", "F");
|
|
const hexValue = parseInt(hexCode.join(""), 16);
|
|
return {
|
|
r: hexValue >> 24 & 255,
|
|
g: hexValue >> 16 & 255,
|
|
b: hexValue >> 8 & 255,
|
|
a: hexValue & 255,
|
|
hex: "#" + hexCode.slice(0, 6).join("")
|
|
};
|
|
}
|
|
exports.getOptions = function getOptions(options) {
|
|
if (!options)
|
|
options = {};
|
|
if (!options.color)
|
|
options.color = {};
|
|
const margin = typeof options.margin === "undefined" || options.margin === null || options.margin < 0 ? 4 : options.margin;
|
|
const width = options.width && options.width >= 21 ? options.width : void 0;
|
|
const scale = options.scale || 4;
|
|
return {
|
|
width,
|
|
scale: width ? 4 : scale,
|
|
margin,
|
|
color: {
|
|
dark: hex2rgba(options.color.dark || "#000000ff"),
|
|
light: hex2rgba(options.color.light || "#ffffffff")
|
|
},
|
|
type: options.type,
|
|
rendererOpts: options.rendererOpts || {}
|
|
};
|
|
};
|
|
exports.getScale = function getScale(qrSize, opts) {
|
|
return opts.width && opts.width >= qrSize + opts.margin * 2 ? opts.width / (qrSize + opts.margin * 2) : opts.scale;
|
|
};
|
|
exports.getImageWidth = function getImageWidth(qrSize, opts) {
|
|
const scale = exports.getScale(qrSize, opts);
|
|
return Math.floor((qrSize + opts.margin * 2) * scale);
|
|
};
|
|
exports.qrToImageData = function qrToImageData(imgData, qr, opts) {
|
|
const size = qr.modules.size;
|
|
const data = qr.modules.data;
|
|
const scale = exports.getScale(size, opts);
|
|
const symbolSize = Math.floor((size + opts.margin * 2) * scale);
|
|
const scaledMargin = opts.margin * scale;
|
|
const palette = [opts.color.light, opts.color.dark];
|
|
for (let i = 0; i < symbolSize; i++) {
|
|
for (let j = 0; j < symbolSize; j++) {
|
|
let posDst = (i * symbolSize + j) * 4;
|
|
let pxColor = opts.color.light;
|
|
if (i >= scaledMargin && j >= scaledMargin && i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {
|
|
const iSrc = Math.floor((i - scaledMargin) / scale);
|
|
const jSrc = Math.floor((j - scaledMargin) / scale);
|
|
pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0];
|
|
}
|
|
imgData[posDst++] = pxColor.r;
|
|
imgData[posDst++] = pxColor.g;
|
|
imgData[posDst++] = pxColor.b;
|
|
imgData[posDst] = pxColor.a;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/renderer/canvas.js
|
|
var require_canvas = __commonJS({
|
|
"node_modules/qrcode/lib/renderer/canvas.js"(exports) {
|
|
var Utils = require_utils2();
|
|
function clearCanvas(ctx, canvas, size) {
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
if (!canvas.style)
|
|
canvas.style = {};
|
|
canvas.height = size;
|
|
canvas.width = size;
|
|
canvas.style.height = size + "px";
|
|
canvas.style.width = size + "px";
|
|
}
|
|
function getCanvasElement() {
|
|
try {
|
|
return document.createElement("canvas");
|
|
} catch (e) {
|
|
throw new Error("You need to specify a canvas element");
|
|
}
|
|
}
|
|
exports.render = function render(qrData, canvas, options) {
|
|
let opts = options;
|
|
let canvasEl = canvas;
|
|
if (typeof opts === "undefined" && (!canvas || !canvas.getContext)) {
|
|
opts = canvas;
|
|
canvas = void 0;
|
|
}
|
|
if (!canvas) {
|
|
canvasEl = getCanvasElement();
|
|
}
|
|
opts = Utils.getOptions(opts);
|
|
const size = Utils.getImageWidth(qrData.modules.size, opts);
|
|
const ctx = canvasEl.getContext("2d");
|
|
const image = ctx.createImageData(size, size);
|
|
Utils.qrToImageData(image.data, qrData, opts);
|
|
clearCanvas(ctx, canvasEl, size);
|
|
ctx.putImageData(image, 0, 0);
|
|
return canvasEl;
|
|
};
|
|
exports.renderToDataURL = function renderToDataURL(qrData, canvas, options) {
|
|
let opts = options;
|
|
if (typeof opts === "undefined" && (!canvas || !canvas.getContext)) {
|
|
opts = canvas;
|
|
canvas = void 0;
|
|
}
|
|
if (!opts)
|
|
opts = {};
|
|
const canvasEl = exports.render(qrData, canvas, opts);
|
|
const type = opts.type || "image/png";
|
|
const rendererOpts = opts.rendererOpts || {};
|
|
return canvasEl.toDataURL(type, rendererOpts.quality);
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/renderer/svg-tag.js
|
|
var require_svg_tag = __commonJS({
|
|
"node_modules/qrcode/lib/renderer/svg-tag.js"(exports) {
|
|
var Utils = require_utils2();
|
|
function getColorAttrib(color, attrib) {
|
|
const alpha = color.a / 255;
|
|
const str = attrib + '="' + color.hex + '"';
|
|
return alpha < 1 ? str + " " + attrib + '-opacity="' + alpha.toFixed(2).slice(1) + '"' : str;
|
|
}
|
|
function svgCmd(cmd, x, y) {
|
|
let str = cmd + x;
|
|
if (typeof y !== "undefined")
|
|
str += " " + y;
|
|
return str;
|
|
}
|
|
function qrToPath(data, size, margin) {
|
|
let path = "";
|
|
let moveBy = 0;
|
|
let newRow = false;
|
|
let lineLength = 0;
|
|
for (let i = 0; i < data.length; i++) {
|
|
const col = Math.floor(i % size);
|
|
const row = Math.floor(i / size);
|
|
if (!col && !newRow)
|
|
newRow = true;
|
|
if (data[i]) {
|
|
lineLength++;
|
|
if (!(i > 0 && col > 0 && data[i - 1])) {
|
|
path += newRow ? svgCmd("M", col + margin, 0.5 + row + margin) : svgCmd("m", moveBy, 0);
|
|
moveBy = 0;
|
|
newRow = false;
|
|
}
|
|
if (!(col + 1 < size && data[i + 1])) {
|
|
path += svgCmd("h", lineLength);
|
|
lineLength = 0;
|
|
}
|
|
} else {
|
|
moveBy++;
|
|
}
|
|
}
|
|
return path;
|
|
}
|
|
exports.render = function render(qrData, options, cb) {
|
|
const opts = Utils.getOptions(options);
|
|
const size = qrData.modules.size;
|
|
const data = qrData.modules.data;
|
|
const qrcodesize = size + opts.margin * 2;
|
|
const bg = !opts.color.light.a ? "" : "<path " + getColorAttrib(opts.color.light, "fill") + ' d="M0 0h' + qrcodesize + "v" + qrcodesize + 'H0z"/>';
|
|
const path = "<path " + getColorAttrib(opts.color.dark, "stroke") + ' d="' + qrToPath(data, size, opts.margin) + '"/>';
|
|
const viewBox = 'viewBox="0 0 ' + qrcodesize + " " + qrcodesize + '"';
|
|
const width = !opts.width ? "" : 'width="' + opts.width + '" height="' + opts.width + '" ';
|
|
const svgTag = '<svg xmlns="http://www.w3.org/2000/svg" ' + width + viewBox + ' shape-rendering="crispEdges">' + bg + path + "</svg>\n";
|
|
if (typeof cb === "function") {
|
|
cb(null, svgTag);
|
|
}
|
|
return svgTag;
|
|
};
|
|
}
|
|
});
|
|
|
|
// node_modules/qrcode/lib/browser.js
|
|
var require_browser = __commonJS({
|
|
"node_modules/qrcode/lib/browser.js"(exports) {
|
|
var canPromise = require_can_promise();
|
|
var QRCode2 = require_qrcode();
|
|
var CanvasRenderer = require_canvas();
|
|
var SvgRenderer = require_svg_tag();
|
|
function renderCanvas(renderFunc, canvas, text, opts, cb) {
|
|
const args = [].slice.call(arguments, 1);
|
|
const argsNum = args.length;
|
|
const isLastArgCb = typeof args[argsNum - 1] === "function";
|
|
if (!isLastArgCb && !canPromise()) {
|
|
throw new Error("Callback required as last argument");
|
|
}
|
|
if (isLastArgCb) {
|
|
if (argsNum < 2) {
|
|
throw new Error("Too few arguments provided");
|
|
}
|
|
if (argsNum === 2) {
|
|
cb = text;
|
|
text = canvas;
|
|
canvas = opts = void 0;
|
|
} else if (argsNum === 3) {
|
|
if (canvas.getContext && typeof cb === "undefined") {
|
|
cb = opts;
|
|
opts = void 0;
|
|
} else {
|
|
cb = opts;
|
|
opts = text;
|
|
text = canvas;
|
|
canvas = void 0;
|
|
}
|
|
}
|
|
} else {
|
|
if (argsNum < 1) {
|
|
throw new Error("Too few arguments provided");
|
|
}
|
|
if (argsNum === 1) {
|
|
text = canvas;
|
|
canvas = opts = void 0;
|
|
} else if (argsNum === 2 && !canvas.getContext) {
|
|
opts = text;
|
|
text = canvas;
|
|
canvas = void 0;
|
|
}
|
|
return new Promise(function(resolve, reject) {
|
|
try {
|
|
const data = QRCode2.create(text, opts);
|
|
resolve(renderFunc(data, canvas, opts));
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
});
|
|
}
|
|
try {
|
|
const data = QRCode2.create(text, opts);
|
|
cb(null, renderFunc(data, canvas, opts));
|
|
} catch (e) {
|
|
cb(e);
|
|
}
|
|
}
|
|
exports.create = QRCode2.create;
|
|
exports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render);
|
|
exports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL);
|
|
exports.toString = renderCanvas.bind(null, function(data, _, opts) {
|
|
return SvgRenderer.render(data, opts);
|
|
});
|
|
}
|
|
});
|
|
|
|
// main.ts
|
|
var main_exports = {};
|
|
__export(main_exports, {
|
|
default: () => QrCodePlugin
|
|
});
|
|
module.exports = __toCommonJS(main_exports);
|
|
var import_obsidian = require("obsidian");
|
|
var import_qrcode = __toESM(require_browser());
|
|
var QrCodePlugin = class extends import_obsidian.Plugin {
|
|
constructor() {
|
|
super(...arguments);
|
|
/**
|
|
* Function for processing Content-only QR code blocks
|
|
*/
|
|
this.postprocessorRaw = async (content, el, ctx) => {
|
|
const destination = document.createElement("canvas");
|
|
if (content.endsWith("\n")) {
|
|
content = content.substring(0, content.length - 1);
|
|
}
|
|
(0, import_qrcode.toCanvas)(destination, content);
|
|
el.appendChild(destination);
|
|
return;
|
|
};
|
|
/**
|
|
* Function for processing JSON like QR code blocks
|
|
*/
|
|
this.postprocessorComplex = async (content, el, ctx) => {
|
|
const destination = document.createElement("canvas");
|
|
let [text, parameters] = this.readParameters(content);
|
|
(0, import_qrcode.toCanvas)(destination, text, parameters);
|
|
el.appendChild(destination);
|
|
return;
|
|
};
|
|
}
|
|
readParameters(jsonString) {
|
|
let params = JSON.parse(jsonString);
|
|
let options = {};
|
|
options.color = { light: "#ffffff", dark: "#000000" };
|
|
options.errorCorrectionLevel = "M";
|
|
if (params.width !== void 0) {
|
|
options.width = params.width;
|
|
}
|
|
if (params.errorCorrectionLevel !== void 0) {
|
|
options.errorCorrectionLevel = params.errorCorrectionLevel;
|
|
}
|
|
if (params.margin !== void 0) {
|
|
options.margin = params.margin;
|
|
}
|
|
if (params.dark !== void 0) {
|
|
options.color.dark = params.dark;
|
|
}
|
|
if (params.light !== void 0) {
|
|
options.color.light = params.light;
|
|
}
|
|
return [params.text, options];
|
|
}
|
|
async onload() {
|
|
this.registerMarkdownCodeBlockProcessor("qrcode", this.postprocessorRaw);
|
|
this.registerMarkdownCodeBlockProcessor("qrcode-complex", this.postprocessorComplex);
|
|
}
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY2FuLXByb21pc2UuanMiLCAibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS91dGlscy5qcyIsICJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL2Vycm9yLWNvcnJlY3Rpb24tbGV2ZWwuanMiLCAibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9iaXQtYnVmZmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvYml0LW1hdHJpeC5qcyIsICJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL2FsaWdubWVudC1wYXR0ZXJuLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvZmluZGVyLXBhdHRlcm4uanMiLCAibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9tYXNrLXBhdHRlcm4uanMiLCAibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9lcnJvci1jb3JyZWN0aW9uLWNvZGUuanMiLCAibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9nYWxvaXMtZmllbGQuanMiLCAibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9wb2x5bm9taWFsLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvcmVlZC1zb2xvbW9uLWVuY29kZXIuanMiLCAibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS92ZXJzaW9uLWNoZWNrLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvcmVnZXguanMiLCAibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9tb2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL2Zvcm1hdC1pbmZvLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvbnVtZXJpYy1kYXRhLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvYWxwaGFudW1lcmljLWRhdGEuanMiLCAibm9kZV9tb2R1bGVzL2VuY29kZS11dGY4L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvYnl0ZS1kYXRhLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUva2FuamktZGF0YS5qcyIsICJub2RlX21vZHVsZXMvZGlqa3N0cmFqcy9kaWprc3RyYS5qcyIsICJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL3NlZ21lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvcXJjb2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL3JlbmRlcmVyL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL3JlbmRlcmVyL2NhbnZhcy5qcyIsICJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9yZW5kZXJlci9zdmctdGFnLmpzIiwgIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2Jyb3dzZXIuanMiLCAibWFpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gY2FuLXByb21pc2UgaGFzIGEgY3Jhc2ggaW4gc29tZSB2ZXJzaW9ucyBvZiByZWFjdCBuYXRpdmUgdGhhdCBkb250IGhhdmVcbi8vIHN0YW5kYXJkIGdsb2JhbCBvYmplY3RzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vc29sZGFpci9ub2RlLXFyY29kZS9pc3N1ZXMvMTU3XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFByb21pc2UgPT09ICdmdW5jdGlvbicgJiYgUHJvbWlzZS5wcm90b3R5cGUgJiYgUHJvbWlzZS5wcm90b3R5cGUudGhlblxufVxuIiwgImxldCB0b1NKSVNGdW5jdGlvblxuY29uc3QgQ09ERVdPUkRTX0NPVU5UID0gW1xuICAwLCAvLyBOb3QgdXNlZFxuICAyNiwgNDQsIDcwLCAxMDAsIDEzNCwgMTcyLCAxOTYsIDI0MiwgMjkyLCAzNDYsXG4gIDQwNCwgNDY2LCA1MzIsIDU4MSwgNjU1LCA3MzMsIDgxNSwgOTAxLCA5OTEsIDEwODUsXG4gIDExNTYsIDEyNTgsIDEzNjQsIDE0NzQsIDE1ODgsIDE3MDYsIDE4MjgsIDE5MjEsIDIwNTEsIDIxODUsXG4gIDIzMjMsIDI0NjUsIDI2MTEsIDI3NjEsIDI4NzYsIDMwMzQsIDMxOTYsIDMzNjIsIDM1MzIsIDM3MDZcbl1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBRUiBDb2RlIHNpemUgZm9yIHRoZSBzcGVjaWZpZWQgdmVyc2lvblxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gdmVyc2lvbiBRUiBDb2RlIHZlcnNpb25cbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICBzaXplIG9mIFFSIGNvZGVcbiAqL1xuZXhwb3J0cy5nZXRTeW1ib2xTaXplID0gZnVuY3Rpb24gZ2V0U3ltYm9sU2l6ZSAodmVyc2lvbikge1xuICBpZiAoIXZlcnNpb24pIHRocm93IG5ldyBFcnJvcignXCJ2ZXJzaW9uXCIgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJylcbiAgaWYgKHZlcnNpb24gPCAxIHx8IHZlcnNpb24gPiA0MCkgdGhyb3cgbmV3IEVycm9yKCdcInZlcnNpb25cIiBzaG91bGQgYmUgaW4gcmFuZ2UgZnJvbSAxIHRvIDQwJylcbiAgcmV0dXJuIHZlcnNpb24gKiA0ICsgMTdcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY29kZXdvcmRzIHVzZWQgdG8gc3RvcmUgZGF0YSBhbmQgRUMgaW5mb3JtYXRpb24uXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSB2ZXJzaW9uIFFSIENvZGUgdmVyc2lvblxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgIERhdGEgbGVuZ3RoIGluIGJpdHNcbiAqL1xuZXhwb3J0cy5nZXRTeW1ib2xUb3RhbENvZGV3b3JkcyA9IGZ1bmN0aW9uIGdldFN5bWJvbFRvdGFsQ29kZXdvcmRzICh2ZXJzaW9uKSB7XG4gIHJldHVybiBDT0RFV09SRFNfQ09VTlRbdmVyc2lvbl1cbn1cblxuLyoqXG4gKiBFbmNvZGUgZGF0YSB3aXRoIEJvc2UtQ2hhdWRodXJpLUhvY3F1ZW5naGVtXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSBkYXRhIFZhbHVlIHRvIGVuY29kZVxuICogQHJldHVybiB7TnVtYmVyfSAgICAgIEVuY29kZWQgdmFsdWVcbiAqL1xuZXhwb3J0cy5nZXRCQ0hEaWdpdCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIGxldCBkaWdpdCA9IDBcblxuICB3aGlsZSAoZGF0YSAhPT0gMCkge1xuICAgIGRpZ2l0KytcbiAgICBkYXRhID4+Pj0gMVxuICB9XG5cbiAgcmV0dXJuIGRpZ2l0XG59XG5cbmV4cG9ydHMuc2V0VG9TSklTRnVuY3Rpb24gPSBmdW5jdGlvbiBzZXRUb1NKSVNGdW5jdGlvbiAoZikge1xuICBpZiAodHlwZW9mIGYgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1widG9TSklTRnVuY1wiIGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uLicpXG4gIH1cblxuICB0b1NKSVNGdW5jdGlvbiA9IGZcbn1cblxuZXhwb3J0cy5pc0thbmppTW9kZUVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0eXBlb2YgdG9TSklTRnVuY3Rpb24gIT09ICd1bmRlZmluZWQnXG59XG5cbmV4cG9ydHMudG9TSklTID0gZnVuY3Rpb24gdG9TSklTIChrYW5qaSkge1xuICByZXR1cm4gdG9TSklTRnVuY3Rpb24oa2FuamkpXG59XG4iLCAiZXhwb3J0cy5MID0geyBiaXQ6IDEgfVxuZXhwb3J0cy5NID0geyBiaXQ6IDAgfVxuZXhwb3J0cy5RID0geyBiaXQ6IDMgfVxuZXhwb3J0cy5IID0geyBiaXQ6IDIgfVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nIChzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbSBpcyBub3QgYSBzdHJpbmcnKVxuICB9XG5cbiAgY29uc3QgbGNTdHIgPSBzdHJpbmcudG9Mb3dlckNhc2UoKVxuXG4gIHN3aXRjaCAobGNTdHIpIHtcbiAgICBjYXNlICdsJzpcbiAgICBjYXNlICdsb3cnOlxuICAgICAgcmV0dXJuIGV4cG9ydHMuTFxuXG4gICAgY2FzZSAnbSc6XG4gICAgY2FzZSAnbWVkaXVtJzpcbiAgICAgIHJldHVybiBleHBvcnRzLk1cblxuICAgIGNhc2UgJ3EnOlxuICAgIGNhc2UgJ3F1YXJ0aWxlJzpcbiAgICAgIHJldHVybiBleHBvcnRzLlFcblxuICAgIGNhc2UgJ2gnOlxuICAgIGNhc2UgJ2hpZ2gnOlxuICAgICAgcmV0dXJuIGV4cG9ydHMuSFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBFQyBMZXZlbDogJyArIHN0cmluZylcbiAgfVxufVxuXG5leHBvcnRzLmlzVmFsaWQgPSBmdW5jdGlvbiBpc1ZhbGlkIChsZXZlbCkge1xuICByZXR1cm4gbGV2ZWwgJiYgdHlwZW9mIGxldmVsLmJpdCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBsZXZlbC5iaXQgPj0gMCAmJiBsZXZlbC5iaXQgPCA0XG59XG5cbmV4cG9ydHMuZnJvbSA9IGZ1bmN0aW9uIGZyb20gKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGV4cG9ydHMuaXNWYWxpZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gIH1cbn1cbiIsICJmdW5jdGlvbiBCaXRCdWZmZXIgKCkge1xuICB0aGlzLmJ1ZmZlciA9IFtdXG4gIHRoaXMubGVuZ3RoID0gMFxufVxuXG5CaXRCdWZmZXIucHJvdG90eXBlID0ge1xuXG4gIGdldDogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgY29uc3QgYnVmSW5kZXggPSBNYXRoLmZsb29yKGluZGV4IC8gOClcbiAgICByZXR1cm4gKCh0aGlzLmJ1ZmZlcltidWZJbmRleF0gPj4+ICg3IC0gaW5kZXggJSA4KSkgJiAxKSA9PT0gMVxuICB9LFxuXG4gIHB1dDogZnVuY3Rpb24gKG51bSwgbGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wdXRCaXQoKChudW0gPj4+IChsZW5ndGggLSBpIC0gMSkpICYgMSkgPT09IDEpXG4gICAgfVxuICB9LFxuXG4gIGdldExlbmd0aEluQml0czogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aFxuICB9LFxuXG4gIHB1dEJpdDogZnVuY3Rpb24gKGJpdCkge1xuICAgIGNvbnN0IGJ1ZkluZGV4ID0gTWF0aC5mbG9vcih0aGlzLmxlbmd0aCAvIDgpXG4gICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8PSBidWZJbmRleCkge1xuICAgICAgdGhpcy5idWZmZXIucHVzaCgwKVxuICAgIH1cblxuICAgIGlmIChiaXQpIHtcbiAgICAgIHRoaXMuYnVmZmVyW2J1ZkluZGV4XSB8PSAoMHg4MCA+Pj4gKHRoaXMubGVuZ3RoICUgOCkpXG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGgrK1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQml0QnVmZmVyXG4iLCAiLyoqXG4gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIFFSIENvZGUgc3ltYm9sIG1vZHVsZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc2l6ZSBTeW1ib2wgc2l6ZVxuICovXG5mdW5jdGlvbiBCaXRNYXRyaXggKHNpemUpIHtcbiAgaWYgKCFzaXplIHx8IHNpemUgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCaXRNYXRyaXggc2l6ZSBtdXN0IGJlIGRlZmluZWQgYW5kIGdyZWF0ZXIgdGhhbiAwJylcbiAgfVxuXG4gIHRoaXMuc2l6ZSA9IHNpemVcbiAgdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIHNpemUpXG4gIHRoaXMucmVzZXJ2ZWRCaXQgPSBuZXcgVWludDhBcnJheShzaXplICogc2l6ZSlcbn1cblxuLyoqXG4gKiBTZXQgYml0IHZhbHVlIGF0IHNwZWNpZmllZCBsb2NhdGlvblxuICogSWYgcmVzZXJ2ZWQgZmxhZyBpcyBzZXQsIHRoaXMgYml0IHdpbGwgYmUgaWdub3JlZCBkdXJpbmcgbWFza2luZyBwcm9jZXNzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9ICByb3dcbiAqIEBwYXJhbSB7TnVtYmVyfSAgY29sXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHZhbHVlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlc2VydmVkXG4gKi9cbkJpdE1hdHJpeC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHJvdywgY29sLCB2YWx1ZSwgcmVzZXJ2ZWQpIHtcbiAgY29uc3QgaW5kZXggPSByb3cgKiB0aGlzLnNpemUgKyBjb2xcbiAgdGhpcy5kYXRhW2luZGV4XSA9IHZhbHVlXG4gIGlmIChyZXNlcnZlZCkgdGhpcy5yZXNlcnZlZEJpdFtpbmRleF0gPSB0cnVlXG59XG5cbi8qKlxuICogUmV0dXJucyBiaXQgdmFsdWUgYXQgc3BlY2lmaWVkIGxvY2F0aW9uXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSAgcm93XG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICBjb2xcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbkJpdE1hdHJpeC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHJvdywgY29sKSB7XG4gIHJldHVybiB0aGlzLmRhdGFbcm93ICogdGhpcy5zaXplICsgY29sXVxufVxuXG4vKipcbiAqIEFwcGxpZXMgeG9yIG9wZXJhdG9yIGF0IHNwZWNpZmllZCBsb2NhdGlvblxuICogKHVzZWQgZHVyaW5nIG1hc2tpbmcgcHJvY2VzcylcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gIHJvd1xuICogQHBhcmFtIHtOdW1iZXJ9ICBjb2xcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdmFsdWVcbiAqL1xuQml0TWF0cml4LnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiAocm93LCBjb2wsIHZhbHVlKSB7XG4gIHRoaXMuZGF0YVtyb3cgKiB0aGlzLnNpemUgKyBjb2xdIF49IHZhbHVlXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYml0IGF0IHNwZWNpZmllZCBsb2NhdGlvbiBpcyByZXNlcnZlZFxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSAgIHJvd1xuICogQHBhcmFtIHtOdW1iZXJ9ICAgY29sXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5CaXRNYXRyaXgucHJvdG90eXBlLmlzUmVzZXJ2ZWQgPSBmdW5jdGlvbiAocm93LCBjb2wpIHtcbiAgcmV0dXJuIHRoaXMucmVzZXJ2ZWRCaXRbcm93ICogdGhpcy5zaXplICsgY29sXVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJpdE1hdHJpeFxuIiwgIi8qKlxuICogQWxpZ25tZW50IHBhdHRlcm4gYXJlIGZpeGVkIHJlZmVyZW5jZSBwYXR0ZXJuIGluIGRlZmluZWQgcG9zaXRpb25zXG4gKiBpbiBhIG1hdHJpeCBzeW1ib2xvZ3ksIHdoaWNoIGVuYWJsZXMgdGhlIGRlY29kZSBzb2Z0d2FyZSB0byByZS1zeW5jaHJvbmlzZVxuICogdGhlIGNvb3JkaW5hdGUgbWFwcGluZyBvZiB0aGUgaW1hZ2UgbW9kdWxlcyBpbiB0aGUgZXZlbnQgb2YgbW9kZXJhdGUgYW1vdW50c1xuICogb2YgZGlzdG9ydGlvbiBvZiB0aGUgaW1hZ2UuXG4gKlxuICogQWxpZ25tZW50IHBhdHRlcm5zIGFyZSBwcmVzZW50IG9ubHkgaW4gUVIgQ29kZSBzeW1ib2xzIG9mIHZlcnNpb24gMiBvciBsYXJnZXJcbiAqIGFuZCB0aGVpciBudW1iZXIgZGVwZW5kcyBvbiB0aGUgc3ltYm9sIHZlcnNpb24uXG4gKi9cblxuY29uc3QgZ2V0U3ltYm9sU2l6ZSA9IHJlcXVpcmUoJy4vdXRpbHMnKS5nZXRTeW1ib2xTaXplXG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSByb3cvY29sdW1uIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgbW9kdWxlIG9mIGVhY2ggYWxpZ25tZW50IHBhdHRlcm5cbiAqIGZvciB0aGUgc3BlY2lmaWVkIFFSIENvZGUgdmVyc2lvbi5cbiAqXG4gKiBUaGUgYWxpZ25tZW50IHBhdHRlcm5zIGFyZSBwb3NpdGlvbmVkIHN5bW1ldHJpY2FsbHkgb24gZWl0aGVyIHNpZGUgb2YgdGhlIGRpYWdvbmFsXG4gKiBydW5uaW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgc3ltYm9sIHRvIHRoZSBib3R0b20gcmlnaHQgY29ybmVyLlxuICpcbiAqIFNpbmNlIHBvc2l0aW9ucyBhcmUgc2ltbWV0cmljYWwgb25seSBoYWxmIG9mIHRoZSBjb29yZGluYXRlcyBhcmUgcmV0dXJuZWQuXG4gKiBFYWNoIGl0ZW0gb2YgdGhlIGFycmF5IHdpbGwgcmVwcmVzZW50IGluIHR1cm4gdGhlIHggYW5kIHkgY29vcmRpbmF0ZS5cbiAqIEBzZWUge0BsaW5rIGdldFBvc2l0aW9uc31cbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHZlcnNpb24gUVIgQ29kZSB2ZXJzaW9uXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgQXJyYXkgb2YgY29vcmRpbmF0ZVxuICovXG5leHBvcnRzLmdldFJvd0NvbENvb3JkcyA9IGZ1bmN0aW9uIGdldFJvd0NvbENvb3JkcyAodmVyc2lvbikge1xuICBpZiAodmVyc2lvbiA9PT0gMSkgcmV0dXJuIFtdXG5cbiAgY29uc3QgcG9zQ291bnQgPSBNYXRoLmZsb29yKHZlcnNpb24gLyA3KSArIDJcbiAgY29uc3Qgc2l6ZSA9IGdldFN5bWJvbFNpemUodmVyc2lvbilcbiAgY29uc3QgaW50ZXJ2YWxzID0gc2l6ZSA9PT0gMTQ1ID8gMjYgOiBNYXRoLmNlaWwoKHNpemUgLSAxMykgLyAoMiAqIHBvc0NvdW50IC0gMikpICogMlxuICBjb25zdCBwb3NpdGlvbnMgPSBbc2l6ZSAtIDddIC8vIExhc3QgY29vcmQgaXMgYWx3YXlzIChzaXplIC0gNylcblxuICBmb3IgKGxldCBpID0gMTsgaSA8IHBvc0NvdW50IC0gMTsgaSsrKSB7XG4gICAgcG9zaXRpb25zW2ldID0gcG9zaXRpb25zW2kgLSAxXSAtIGludGVydmFsc1xuICB9XG5cbiAgcG9zaXRpb25zLnB1c2goNikgLy8gRmlyc3QgY29vcmQgaXMgYWx3YXlzIDZcblxuICByZXR1cm4gcG9zaXRpb25zLnJldmVyc2UoKVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcG9zaXRpb25zIG9mIGVhY2ggYWxpZ25tZW50IHBhdHRlcm4uXG4gKiBFYWNoIGFycmF5J3MgZWxlbWVudCByZXByZXNlbnQgdGhlIGNlbnRlciBwb2ludCBvZiB0aGUgcGF0dGVybiBhcyAoeCwgeSkgY29vcmRpbmF0ZXNcbiAqXG4gKiBDb29yZGluYXRlcyBhcmUgY2FsY3VsYXRlZCBleHBhbmRpbmcgdGhlIHJvdy9jb2x1bW4gY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkge0BsaW5rIGdldFJvd0NvbENvb3Jkc31cbiAqIGFuZCBmaWx0ZXJpbmcgb3V0IHRoZSBpdGVtcyB0aGF0IG92ZXJsYXBzIHdpdGggZmluZGVyIHBhdHRlcm5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGEgVmVyc2lvbiA3IHN5bWJvbCB7QGxpbmsgZ2V0Um93Q29sQ29vcmRzfSByZXR1cm5zIHZhbHVlcyA2LCAyMiBhbmQgMzguXG4gKiBUaGUgYWxpZ25tZW50IHBhdHRlcm5zLCB0aGVyZWZvcmUsIGFyZSB0byBiZSBjZW50ZXJlZCBvbiAocm93LCBjb2x1bW4pXG4gKiBwb3NpdGlvbnMgKDYsMjIpLCAoMjIsNiksICgyMiwyMiksICgyMiwzOCksICgzOCwyMiksICgzOCwzOCkuXG4gKiBOb3RlIHRoYXQgdGhlIGNvb3JkaW5hdGVzICg2LDYpLCAoNiwzOCksICgzOCw2KSBhcmUgb2NjdXBpZWQgYnkgZmluZGVyIHBhdHRlcm5zXG4gKiBhbmQgYXJlIG5vdCB0aGVyZWZvcmUgdXNlZCBmb3IgYWxpZ25tZW50IHBhdHRlcm5zLlxuICpcbiAqIGxldCBwb3MgPSBnZXRQb3NpdGlvbnMoNylcbiAqIC8vIFtbNiwyMl0sIFsyMiw2XSwgWzIyLDIyXSwgWzIyLDM4XSwgWzM4LDIyXSwgWzM4LDM4XV1cbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHZlcnNpb24gUVIgQ29kZSB2ZXJzaW9uXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgQXJyYXkgb2YgY29vcmRpbmF0ZXNcbiAqL1xuZXhwb3J0cy5nZXRQb3NpdGlvbnMgPSBmdW5jdGlvbiBnZXRQb3NpdGlvbnMgKHZlcnNpb24pIHtcbiAgY29uc3QgY29vcmRzID0gW11cbiAgY29uc3QgcG9zID0gZXhwb3J0cy5nZXRSb3dDb2xDb29yZHModmVyc2lvbilcbiAgY29uc3QgcG9zTGVuZ3RoID0gcG9zLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zTGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBvc0xlbmd0aDsgaisrKSB7XG4gICAgICAvLyBTa2lwIGlmIHBvc2l0aW9uIGlzIG9jY3VwaWVkIGJ5IGZpbmRlciBwYXR0ZXJuc1xuICAgICAgaWYgKChpID09PSAwICYmIGogPT09IDApIHx8IC8vIHRvcC1sZWZ0XG4gICAgICAgICAgKGkgPT09IDAgJiYgaiA9PT0gcG9zTGVuZ3RoIC0gMSkgfHwgLy8gYm90dG9tLWxlZnRcbiAgICAgICAgICAoaSA9PT0gcG9zTGVuZ3RoIC0gMSAmJiBqID09PSAwKSkgeyAvLyB0b3AtcmlnaHRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29vcmRzLnB1c2goW3Bvc1tpXSwgcG9zW2pdXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29vcmRzXG59XG4iLCAiY29uc3QgZ2V0U3ltYm9sU2l6ZSA9IHJlcXVpcmUoJy4vdXRpbHMnKS5nZXRTeW1ib2xTaXplXG5jb25zdCBGSU5ERVJfUEFUVEVSTl9TSVpFID0gN1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcG9zaXRpb25zIG9mIGVhY2ggZmluZGVyIHBhdHRlcm4uXG4gKiBFYWNoIGFycmF5J3MgZWxlbWVudCByZXByZXNlbnQgdGhlIHRvcC1sZWZ0IHBvaW50IG9mIHRoZSBwYXR0ZXJuIGFzICh4LCB5KSBjb29yZGluYXRlc1xuICpcbiAqIEBwYXJhbSAge051bWJlcn0gdmVyc2lvbiBRUiBDb2RlIHZlcnNpb25cbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICBBcnJheSBvZiBjb29yZGluYXRlc1xuICovXG5leHBvcnRzLmdldFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGdldFBvc2l0aW9ucyAodmVyc2lvbikge1xuICBjb25zdCBzaXplID0gZ2V0U3ltYm9sU2l6ZSh2ZXJzaW9uKVxuXG4gIHJldHVybiBbXG4gICAgLy8gdG9wLWxlZnRcbiAgICBbMCwgMF0sXG4gICAgLy8gdG9wLXJpZ2h0XG4gICAgW3NpemUgLSBGSU5ERVJfUEFUVEVSTl9TSVpFLCAwXSxcbiAgICAvLyBib3R0b20tbGVmdFxuICAgIFswLCBzaXplIC0gRklOREVSX1BBVFRFUk5fU0laRV1cbiAgXVxufVxuIiwgIi8qKlxuICogRGF0YSBtYXNrIHBhdHRlcm4gcmVmZXJlbmNlXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5leHBvcnRzLlBhdHRlcm5zID0ge1xuICBQQVRURVJOMDAwOiAwLFxuICBQQVRURVJOMDAxOiAxLFxuICBQQVRURVJOMDEwOiAyLFxuICBQQVRURVJOMDExOiAzLFxuICBQQVRURVJOMTAwOiA0LFxuICBQQVRURVJOMTAxOiA1LFxuICBQQVRURVJOMTEwOiA2LFxuICBQQVRURVJOMTExOiA3XG59XG5cbi8qKlxuICogV2VpZ2h0ZWQgcGVuYWx0eSBzY29yZXMgZm9yIHRoZSB1bmRlc2lyYWJsZSBmZWF0dXJlc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xuY29uc3QgUGVuYWx0eVNjb3JlcyA9IHtcbiAgTjE6IDMsXG4gIE4yOiAzLFxuICBOMzogNDAsXG4gIE40OiAxMFxufVxuXG4vKipcbiAqIENoZWNrIGlmIG1hc2sgcGF0dGVybiB2YWx1ZSBpcyB2YWxpZFxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gIG1hc2sgICAgTWFzayBwYXR0ZXJuXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgIHRydWUgaWYgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnRzLmlzVmFsaWQgPSBmdW5jdGlvbiBpc1ZhbGlkIChtYXNrKSB7XG4gIHJldHVybiBtYXNrICE9IG51bGwgJiYgbWFzayAhPT0gJycgJiYgIWlzTmFOKG1hc2spICYmIG1hc2sgPj0gMCAmJiBtYXNrIDw9IDdcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG1hc2sgcGF0dGVybiBmcm9tIGEgdmFsdWUuXG4gKiBJZiB2YWx1ZSBpcyBub3QgdmFsaWQsIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfFN0cmluZ30gdmFsdWUgICAgICAgIE1hc2sgcGF0dGVybiB2YWx1ZVxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgICAgICAgICAgIFZhbGlkIG1hc2sgcGF0dGVybiBvciB1bmRlZmluZWRcbiAqL1xuZXhwb3J0cy5mcm9tID0gZnVuY3Rpb24gZnJvbSAodmFsdWUpIHtcbiAgcmV0dXJuIGV4cG9ydHMuaXNWYWxpZCh2YWx1ZSkgPyBwYXJzZUludCh2YWx1ZSwgMTApIDogdW5kZWZpbmVkXG59XG5cbi8qKlxuKiBGaW5kIGFkamFjZW50IG1vZHVsZXMgaW4gcm93L2NvbHVtbiB3aXRoIHRoZSBzYW1lIGNvbG9yXG4qIGFuZCBhc3NpZ24gYSBwZW5hbHR5IHZhbHVlLlxuKlxuKiBQb2ludHM6IE4xICsgaVxuKiBpIGlzIHRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIG51bWJlciBvZiBhZGphY2VudCBtb2R1bGVzIG9mIHRoZSBzYW1lIGNvbG9yIGV4Y2VlZHMgNVxuKi9cbmV4cG9ydHMuZ2V0UGVuYWx0eU4xID0gZnVuY3Rpb24gZ2V0UGVuYWx0eU4xIChkYXRhKSB7XG4gIGNvbnN0IHNpemUgPSBkYXRhLnNpemVcbiAgbGV0IHBvaW50cyA9IDBcbiAgbGV0IHNhbWVDb3VudENvbCA9IDBcbiAgbGV0IHNhbWVDb3VudFJvdyA9IDBcbiAgbGV0IGxhc3RDb2wgPSBudWxsXG4gIGxldCBsYXN0Um93ID0gbnVsbFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHNpemU7IHJvdysrKSB7XG4gICAgc2FtZUNvdW50Q29sID0gc2FtZUNvdW50Um93ID0gMFxuICAgIGxhc3RDb2wgPSBsYXN0Um93ID0gbnVsbFxuXG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgc2l6ZTsgY29sKyspIHtcbiAgICAgIGxldCBtb2R1bGUgPSBkYXRhLmdldChyb3csIGNvbClcbiAgICAgIGlmIChtb2R1bGUgPT09IGxhc3RDb2wpIHtcbiAgICAgICAgc2FtZUNvdW50Q29sKytcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzYW1lQ291bnRDb2wgPj0gNSkgcG9pbnRzICs9IFBlbmFsdHlTY29yZXMuTjEgKyAoc2FtZUNvdW50Q29sIC0gNSlcbiAgICAgICAgbGFzdENvbCA9IG1vZHVsZVxuICAgICAgICBzYW1lQ291bnRDb2wgPSAxXG4gICAgICB9XG5cbiAgICAgIG1vZHVsZSA9IGRhdGEuZ2V0KGNvbCwgcm93KVxuICAgICAgaWYgKG1vZHVsZSA9PT0gbGFzdFJvdykge1xuICAgICAgICBzYW1lQ291bnRSb3crK1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNhbWVDb3VudFJvdyA+PSA1KSBwb2ludHMgKz0gUGVuYWx0eVNjb3Jlcy5OMSArIChzYW1lQ291bnRSb3cgLSA1KVxuICAgICAgICBsYXN0Um93ID0gbW9kdWxlXG4gICAgICAgIHNhbWVDb3VudFJvdyA9IDFcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2FtZUNvdW50Q29sID49IDUpIHBvaW50cyArPSBQZW5hbHR5U2NvcmVzLk4xICsgKHNhbWVDb3VudENvbCAtIDUpXG4gICAgaWYgKHNhbWVDb3VudFJvdyA+PSA1KSBwb2ludHMgKz0gUGVuYWx0eVNjb3Jlcy5OMSArIChzYW1lQ291bnRSb3cgLSA1KVxuICB9XG5cbiAgcmV0dXJuIHBvaW50c1xufVxuXG4vKipcbiAqIEZpbmQgMngyIGJsb2NrcyB3aXRoIHRoZSBzYW1lIGNvbG9yIGFuZCBhc3NpZ24gYSBwZW5hbHR5IHZhbHVlXG4gKlxuICogUG9pbnRzOiBOMiAqIChtIC0gMSkgKiAobiAtIDEpXG4gKi9cbmV4cG9ydHMuZ2V0UGVuYWx0eU4yID0gZnVuY3Rpb24gZ2V0UGVuYWx0eU4yIChkYXRhKSB7XG4gIGNvbnN0IHNpemUgPSBkYXRhLnNpemVcbiAgbGV0IHBvaW50cyA9IDBcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBzaXplIC0gMTsgcm93KyspIHtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBzaXplIC0gMTsgY29sKyspIHtcbiAgICAgIGNvbnN0IGxhc3QgPSBkYXRhLmdldChyb3csIGNvbCkgK1xuICAgICAgICBkYXRhLmdldChyb3csIGNvbCArIDEpICtcbiAgICAgICAgZGF0YS5nZXQocm93ICsgMSwgY29sKSArXG4gICAgICAgIGRhdGEuZ2V0KHJvdyArIDEsIGNvbCArIDEpXG5cbiAgICAgIGlmIChsYXN0ID09PSA0IHx8IGxhc3QgPT09IDApIHBvaW50cysrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBvaW50cyAqIFBlbmFsdHlTY29yZXMuTjJcbn1cblxuLyoqXG4gKiBGaW5kIDE6MTozOjE6MSByYXRpbyAoZGFyazpsaWdodDpkYXJrOmxpZ2h0OmRhcmspIHBhdHRlcm4gaW4gcm93L2NvbHVtbixcbiAqIHByZWNlZGVkIG9yIGZvbGxvd2VkIGJ5IGxpZ2h0IGFyZWEgNCBtb2R1bGVzIHdpZGVcbiAqXG4gKiBQb2ludHM6IE4zICogbnVtYmVyIG9mIHBhdHRlcm4gZm91bmRcbiAqL1xuZXhwb3J0cy5nZXRQZW5hbHR5TjMgPSBmdW5jdGlvbiBnZXRQZW5hbHR5TjMgKGRhdGEpIHtcbiAgY29uc3Qgc2l6ZSA9IGRhdGEuc2l6ZVxuICBsZXQgcG9pbnRzID0gMFxuICBsZXQgYml0c0NvbCA9IDBcbiAgbGV0IGJpdHNSb3cgPSAwXG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgc2l6ZTsgcm93KyspIHtcbiAgICBiaXRzQ29sID0gYml0c1JvdyA9IDBcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBzaXplOyBjb2wrKykge1xuICAgICAgYml0c0NvbCA9ICgoYml0c0NvbCA8PCAxKSAmIDB4N0ZGKSB8IGRhdGEuZ2V0KHJvdywgY29sKVxuICAgICAgaWYgKGNvbCA+PSAxMCAmJiAoYml0c0NvbCA9PT0gMHg1RDAgfHwgYml0c0NvbCA9PT0gMHgwNUQpKSBwb2ludHMrK1xuXG4gICAgICBiaXRzUm93ID0gKChiaXRzUm93IDw8IDEpICYgMHg3RkYpIHwgZGF0YS5nZXQoY29sLCByb3cpXG4gICAgICBpZiAoY29sID49IDEwICYmIChiaXRzUm93ID09PSAweDVEMCB8fCBiaXRzUm93ID09PSAweDA1RCkpIHBvaW50cysrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBvaW50cyAqIFBlbmFsdHlTY29yZXMuTjNcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgcHJvcG9ydGlvbiBvZiBkYXJrIG1vZHVsZXMgaW4gZW50aXJlIHN5bWJvbFxuICpcbiAqIFBvaW50czogTjQgKiBrXG4gKlxuICogayBpcyB0aGUgcmF0aW5nIG9mIHRoZSBkZXZpYXRpb24gb2YgdGhlIHByb3BvcnRpb24gb2YgZGFyayBtb2R1bGVzXG4gKiBpbiB0aGUgc3ltYm9sIGZyb20gNTAlIGluIHN0ZXBzIG9mIDUlXG4gKi9cbmV4cG9ydHMuZ2V0UGVuYWx0eU40ID0gZnVuY3Rpb24gZ2V0UGVuYWx0eU40IChkYXRhKSB7XG4gIGxldCBkYXJrQ291bnQgPSAwXG4gIGNvbnN0IG1vZHVsZXNDb3VudCA9IGRhdGEuZGF0YS5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZHVsZXNDb3VudDsgaSsrKSBkYXJrQ291bnQgKz0gZGF0YS5kYXRhW2ldXG5cbiAgY29uc3QgayA9IE1hdGguYWJzKE1hdGguY2VpbCgoZGFya0NvdW50ICogMTAwIC8gbW9kdWxlc0NvdW50KSAvIDUpIC0gMTApXG5cbiAgcmV0dXJuIGsgKiBQZW5hbHR5U2NvcmVzLk40XG59XG5cbi8qKlxuICogUmV0dXJuIG1hc2sgdmFsdWUgYXQgZ2l2ZW4gcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IG1hc2tQYXR0ZXJuIFBhdHRlcm4gcmVmZXJlbmNlIHZhbHVlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGkgICAgICAgICAgIFJvd1xuICogQHBhcmFtICB7TnVtYmVyfSBqICAgICAgICAgICBDb2x1bW5cbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICAgICAgTWFzayB2YWx1ZVxuICovXG5mdW5jdGlvbiBnZXRNYXNrQXQgKG1hc2tQYXR0ZXJuLCBpLCBqKSB7XG4gIHN3aXRjaCAobWFza1BhdHRlcm4pIHtcbiAgICBjYXNlIGV4cG9ydHMuUGF0dGVybnMuUEFUVEVSTjAwMDogcmV0dXJuIChpICsgaikgJSAyID09PSAwXG4gICAgY2FzZSBleHBvcnRzLlBhdHRlcm5zLlBBVFRFUk4wMDE6IHJldHVybiBpICUgMiA9PT0gMFxuICAgIGNhc2UgZXhwb3J0cy5QYXR0ZXJucy5QQVRURVJOMDEwOiByZXR1cm4gaiAlIDMgPT09IDBcbiAgICBjYXNlIGV4cG9ydHMuUGF0dGVybnMuUEFUVEVSTjAxMTogcmV0dXJuIChpICsgaikgJSAzID09PSAwXG4gICAgY2FzZSBleHBvcnRzLlBhdHRlcm5zLlBBVFRFUk4xMDA6IHJldHVybiAoTWF0aC5mbG9vcihpIC8gMikgKyBNYXRoLmZsb29yKGogLyAzKSkgJSAyID09PSAwXG4gICAgY2FzZSBleHBvcnRzLlBhdHRlcm5zLlBBVFRFUk4xMDE6IHJldHVybiAoaSAqIGopICUgMiArIChpICogaikgJSAzID09PSAwXG4gICAgY2FzZSBleHBvcnRzLlBhdHRlcm5zLlBBVFRFUk4xMTA6IHJldHVybiAoKGkgKiBqKSAlIDIgKyAoaSAqIGopICUgMykgJSAyID09PSAwXG4gICAgY2FzZSBleHBvcnRzLlBhdHRlcm5zLlBBVFRFUk4xMTE6IHJldHVybiAoKGkgKiBqKSAlIDMgKyAoaSArIGopICUgMikgJSAyID09PSAwXG5cbiAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBtYXNrUGF0dGVybjonICsgbWFza1BhdHRlcm4pXG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSBhIG1hc2sgcGF0dGVybiB0byBhIEJpdE1hdHJpeFxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gICAgcGF0dGVybiBQYXR0ZXJuIHJlZmVyZW5jZSBudW1iZXJcbiAqIEBwYXJhbSAge0JpdE1hdHJpeH0gZGF0YSAgICBCaXRNYXRyaXggZGF0YVxuICovXG5leHBvcnRzLmFwcGx5TWFzayA9IGZ1bmN0aW9uIGFwcGx5TWFzayAocGF0dGVybiwgZGF0YSkge1xuICBjb25zdCBzaXplID0gZGF0YS5zaXplXG5cbiAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgc2l6ZTsgY29sKyspIHtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBzaXplOyByb3crKykge1xuICAgICAgaWYgKGRhdGEuaXNSZXNlcnZlZChyb3csIGNvbCkpIGNvbnRpbnVlXG4gICAgICBkYXRhLnhvcihyb3csIGNvbCwgZ2V0TWFza0F0KHBhdHRlcm4sIHJvdywgY29sKSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiZXN0IG1hc2sgcGF0dGVybiBmb3IgZGF0YVxuICpcbiAqIEBwYXJhbSAge0JpdE1hdHJpeH0gZGF0YVxuICogQHJldHVybiB7TnVtYmVyfSBNYXNrIHBhdHRlcm4gcmVmZXJlbmNlIG51bWJlclxuICovXG5leHBvcnRzLmdldEJlc3RNYXNrID0gZnVuY3Rpb24gZ2V0QmVzdE1hc2sgKGRhdGEsIHNldHVwRm9ybWF0RnVuYykge1xuICBjb25zdCBudW1QYXR0ZXJucyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuUGF0dGVybnMpLmxlbmd0aFxuICBsZXQgYmVzdFBhdHRlcm4gPSAwXG4gIGxldCBsb3dlclBlbmFsdHkgPSBJbmZpbml0eVxuXG4gIGZvciAobGV0IHAgPSAwOyBwIDwgbnVtUGF0dGVybnM7IHArKykge1xuICAgIHNldHVwRm9ybWF0RnVuYyhwKVxuICAgIGV4cG9ydHMuYXBwbHlNYXNrKHAsIGRhdGEpXG5cbiAgICAvLyBDYWxjdWxhdGUgcGVuYWx0eVxuICAgIGNvbnN0IHBlbmFsdHkgPVxuICAgICAgZXhwb3J0cy5nZXRQZW5hbHR5TjEoZGF0YSkgK1xuICAgICAgZXhwb3J0cy5nZXRQZW5hbHR5TjIoZGF0YSkgK1xuICAgICAgZXhwb3J0cy5nZXRQZW5hbHR5TjMoZGF0YSkgK1xuICAgICAgZXhwb3J0cy5nZXRQZW5hbHR5TjQoZGF0YSlcblxuICAgIC8vIFVuZG8gcHJldmlvdXNseSBhcHBsaWVkIG1hc2tcbiAgICBleHBvcnRzLmFwcGx5TWFzayhwLCBkYXRhKVxuXG4gICAgaWYgKHBlbmFsdHkgPCBsb3dlclBlbmFsdHkpIHtcbiAgICAgIGxvd2VyUGVuYWx0eSA9IHBlbmFsdHlcbiAgICAgIGJlc3RQYXR0ZXJuID0gcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiZXN0UGF0dGVyblxufVxuIiwgImNvbnN0IEVDTGV2ZWwgPSByZXF1aXJlKCcuL2Vycm9yLWNvcnJlY3Rpb24tbGV2ZWwnKVxyXG5cclxuY29uc3QgRUNfQkxPQ0tTX1RBQkxFID0gW1xyXG4vLyBMICBNICBRICBIXHJcbiAgMSwgMSwgMSwgMSxcclxuICAxLCAxLCAxLCAxLFxyXG4gIDEsIDEsIDIsIDIsXHJcbiAgMSwgMiwgMiwgNCxcclxuICAxLCAyLCA0LCA0LFxyXG4gIDIsIDQsIDQsIDQsXHJcbiAgMiwgNCwgNiwgNSxcclxuICAyLCA0LCA2LCA2LFxyXG4gIDIsIDUsIDgsIDgsXHJcbiAgNCwgNSwgOCwgOCxcclxuICA0LCA1LCA4LCAxMSxcclxuICA0LCA4LCAxMCwgMTEsXHJcbiAgNCwgOSwgMTIsIDE2LFxyXG4gIDQsIDksIDE2LCAxNixcclxuICA2LCAxMCwgMTIsIDE4LFxyXG4gIDYsIDEwLCAxNywgMTYsXHJcbiAgNiwgMTEsIDE2LCAxOSxcclxuICA2LCAxMywgMTgsIDIxLFxyXG4gIDcsIDE0LCAyMSwgMjUsXHJcbiAgOCwgMTYsIDIwLCAyNSxcclxuICA4LCAxNywgMjMsIDI1LFxyXG4gIDksIDE3LCAyMywgMzQsXHJcbiAgOSwgMTgsIDI1LCAzMCxcclxuICAxMCwgMjAsIDI3LCAzMixcclxuICAxMiwgMjEsIDI5LCAzNSxcclxuICAxMiwgMjMsIDM0LCAzNyxcclxuICAxMiwgMjUsIDM0LCA0MCxcclxuICAxMywgMjYsIDM1LCA0MixcclxuICAxNCwgMjgsIDM4LCA0NSxcclxuICAxNSwgMjksIDQwLCA0OCxcclxuICAxNiwgMzEsIDQzLCA1MSxcclxuICAxNywgMzMsIDQ1LCA1NCxcclxuICAxOCwgMzUsIDQ4LCA1NyxcclxuICAxOSwgMzcsIDUxLCA2MCxcclxuICAxOSwgMzgsIDUzLCA2MyxcclxuICAyMCwgNDAsIDU2LCA2NixcclxuICAyMSwgNDMsIDU5LCA3MCxcclxuICAyMiwgNDUsIDYyLCA3NCxcclxuICAyNCwgNDcsIDY1LCA3NyxcclxuICAyNSwgNDksIDY4LCA4MVxyXG5dXHJcblxyXG5jb25zdCBFQ19DT0RFV09SRFNfVEFCTEUgPSBbXHJcbi8vIEwgIE0gIFEgIEhcclxuICA3LCAxMCwgMTMsIDE3LFxyXG4gIDEwLCAxNiwgMjIsIDI4LFxyXG4gIDE1LCAyNiwgMzYsIDQ0LFxyXG4gIDIwLCAzNiwgNTIsIDY0LFxyXG4gIDI2LCA0OCwgNzIsIDg4LFxyXG4gIDM2LCA2NCwgOTYsIDExMixcclxuICA0MCwgNzIsIDEwOCwgMTMwLFxyXG4gIDQ4LCA4OCwgMTMyLCAxNTYsXHJcbiAgNjAsIDExMCwgMTYwLCAxOTIsXHJcbiAgNzIsIDEzMCwgMTkyLCAyMjQsXHJcbiAgODAsIDE1MCwgMjI0LCAyNjQsXHJcbiAgOTYsIDE3NiwgMjYwLCAzMDgsXHJcbiAgMTA0LCAxOTgsIDI4OCwgMzUyLFxyXG4gIDEyMCwgMjE2LCAzMjAsIDM4NCxcclxuICAxMzIsIDI0MCwgMzYwLCA0MzIsXHJcbiAgMTQ0LCAyODAsIDQwOCwgNDgwLFxyXG4gIDE2OCwgMzA4LCA0NDgsIDUzMixcclxuICAxODAsIDMzOCwgNTA0LCA1ODgsXHJcbiAgMTk2LCAzNjQsIDU0NiwgNjUwLFxyXG4gIDIyNCwgNDE2LCA2MDAsIDcwMCxcclxuICAyMjQsIDQ0MiwgNjQ0LCA3NTAsXHJcbiAgMjUyLCA0NzYsIDY5MCwgODE2LFxyXG4gIDI3MCwgNTA0LCA3NTAsIDkwMCxcclxuICAzMDAsIDU2MCwgODEwLCA5NjAsXHJcbiAgMzEyLCA1ODgsIDg3MCwgMTA1MCxcclxuICAzMzYsIDY0NCwgOTUyLCAxMTEwLFxyXG4gIDM2MCwgNzAwLCAxMDIwLCAxMjAwLFxyXG4gIDM5MCwgNzI4LCAxMDUwLCAxMjYwLFxyXG4gIDQyMCwgNzg0LCAxMTQwLCAxMzUwLFxyXG4gIDQ1MCwgODEyLCAxMjAwLCAxNDQwLFxyXG4gIDQ4MCwgODY4LCAxMjkwLCAxNTMwLFxyXG4gIDUxMCwgOTI0LCAxMzUwLCAxNjIwLFxyXG4gIDU0MCwgOTgwLCAxNDQwLCAxNzEwLFxyXG4gIDU3MCwgMTAzNiwgMTUzMCwgMTgwMCxcclxuICA1NzAsIDEwNjQsIDE1OTAsIDE4OTAsXHJcbiAgNjAwLCAxMTIwLCAxNjgwLCAxOTgwLFxyXG4gIDYzMCwgMTIwNCwgMTc3MCwgMjEwMCxcclxuICA2NjAsIDEyNjAsIDE4NjAsIDIyMjAsXHJcbiAgNzIwLCAxMzE2LCAxOTUwLCAyMzEwLFxyXG4gIDc1MCwgMTM3MiwgMjA0MCwgMjQzMFxyXG5dXHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVycm9yIGNvcnJlY3Rpb24gYmxvY2sgdGhhdCB0aGUgUVIgQ29kZSBzaG91bGQgY29udGFpblxyXG4gKiBmb3IgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIGFuZCBlcnJvciBjb3JyZWN0aW9uIGxldmVsLlxyXG4gKlxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHZlcnNpb24gICAgICAgICAgICAgIFFSIENvZGUgdmVyc2lvblxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGVycm9yQ29ycmVjdGlvbkxldmVsIEVycm9yIGNvcnJlY3Rpb24gbGV2ZWxcclxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgZXJyb3IgY29ycmVjdGlvbiBibG9ja3NcclxuICovXHJcbmV4cG9ydHMuZ2V0QmxvY2tzQ291bnQgPSBmdW5jdGlvbiBnZXRCbG9ja3NDb3VudCAodmVyc2lvbiwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpIHtcclxuICBzd2l0Y2ggKGVycm9yQ29ycmVjdGlvbkxldmVsKSB7XHJcbiAgICBjYXNlIEVDTGV2ZWwuTDpcclxuICAgICAgcmV0dXJuIEVDX0JMT0NLU19UQUJMRVsodmVyc2lvbiAtIDEpICogNCArIDBdXHJcbiAgICBjYXNlIEVDTGV2ZWwuTTpcclxuICAgICAgcmV0dXJuIEVDX0JMT0NLU19UQUJMRVsodmVyc2lvbiAtIDEpICogNCArIDFdXHJcbiAgICBjYXNlIEVDTGV2ZWwuUTpcclxuICAgICAgcmV0dXJuIEVDX0JMT0NLU19UQUJMRVsodmVyc2lvbiAtIDEpICogNCArIDJdXHJcbiAgICBjYXNlIEVDTGV2ZWwuSDpcclxuICAgICAgcmV0dXJuIEVDX0JMT0NLU19UQUJMRVsodmVyc2lvbiAtIDEpICogNCArIDNdXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVycm9yIGNvcnJlY3Rpb24gY29kZXdvcmRzIHRvIHVzZSBmb3IgdGhlIHNwZWNpZmllZFxyXG4gKiB2ZXJzaW9uIGFuZCBlcnJvciBjb3JyZWN0aW9uIGxldmVsLlxyXG4gKlxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHZlcnNpb24gICAgICAgICAgICAgIFFSIENvZGUgdmVyc2lvblxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGVycm9yQ29ycmVjdGlvbkxldmVsIEVycm9yIGNvcnJlY3Rpb24gbGV2ZWxcclxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgZXJyb3IgY29ycmVjdGlvbiBjb2Rld29yZHNcclxuICovXHJcbmV4cG9ydHMuZ2V0VG90YWxDb2Rld29yZHNDb3VudCA9IGZ1bmN0aW9uIGdldFRvdGFsQ29kZXdvcmRzQ291bnQgKHZlcnNpb24sIGVycm9yQ29ycmVjdGlvbkxldmVsKSB7XHJcbiAgc3dpdGNoIChlcnJvckNvcnJlY3Rpb25MZXZlbCkge1xyXG4gICAgY2FzZSBFQ0xldmVsLkw6XHJcbiAgICAgIHJldHVybiBFQ19DT0RFV09SRFNfVEFCTEVbKHZlcnNpb24gLSAxKSAqIDQgKyAwXVxyXG4gICAgY2FzZSBFQ0xldmVsLk06XHJcbiAgICAgIHJldHVybiBFQ19DT0RFV09SRFNfVEFCTEVbKHZlcnNpb24gLSAxKSAqIDQgKyAxXVxyXG4gICAgY2FzZSBFQ0xldmVsLlE6XHJcbiAgICAgIHJldHVybiBFQ19DT0RFV09SRFNfVEFCTEVbKHZlcnNpb24gLSAxKSAqIDQgKyAyXVxyXG4gICAgY2FzZSBFQ0xldmVsLkg6XHJcbiAgICAgIHJldHVybiBFQ19DT0RFV09SRFNfVEFCTEVbKHZlcnNpb24gLSAxKSAqIDQgKyAzXVxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gIH1cclxufVxyXG4iLCAiY29uc3QgRVhQX1RBQkxFID0gbmV3IFVpbnQ4QXJyYXkoNTEyKVxuY29uc3QgTE9HX1RBQkxFID0gbmV3IFVpbnQ4QXJyYXkoMjU2KVxuLyoqXG4gKiBQcmVjb21wdXRlIHRoZSBsb2cgYW5kIGFudGktbG9nIHRhYmxlcyBmb3IgZmFzdGVyIGNvbXB1dGF0aW9uIGxhdGVyXG4gKlxuICogRm9yIGVhY2ggcG9zc2libGUgdmFsdWUgaW4gdGhlIGdhbG9pcyBmaWVsZCAyXjgsIHdlIHdpbGwgcHJlLWNvbXB1dGVcbiAqIHRoZSBsb2dhcml0aG0gYW5kIGFudGktbG9nYXJpdGhtIChleHBvbmVudGlhbCkgb2YgdGhpcyB2YWx1ZVxuICpcbiAqIHJlZiB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpdmVyc2l0eS5vcmcvd2lraS9SZWVkJUUyJTgwJTkzU29sb21vbl9jb2Rlc19mb3JfY29kZXJzI0ludHJvZHVjdGlvbl90b19tYXRoZW1hdGljYWxfZmllbGRzfVxuICovXG47KGZ1bmN0aW9uIGluaXRUYWJsZXMgKCkge1xuICBsZXQgeCA9IDFcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTU7IGkrKykge1xuICAgIEVYUF9UQUJMRVtpXSA9IHhcbiAgICBMT0dfVEFCTEVbeF0gPSBpXG5cbiAgICB4IDw8PSAxIC8vIG11bHRpcGx5IGJ5IDJcblxuICAgIC8vIFRoZSBRUiBjb2RlIHNwZWNpZmljYXRpb24gc2F5cyB0byB1c2UgYnl0ZS13aXNlIG1vZHVsbyAxMDAwMTExMDEgYXJpdGhtZXRpYy5cbiAgICAvLyBUaGlzIG1lYW5zIHRoYXQgd2hlbiBhIG51bWJlciBpcyAyNTYgb3IgbGFyZ2VyLCBpdCBzaG91bGQgYmUgWE9SZWQgd2l0aCAweDExRC5cbiAgICBpZiAoeCAmIDB4MTAwKSB7IC8vIHNpbWlsYXIgdG8geCA+PSAyNTYsIGJ1dCBhIGxvdCBmYXN0ZXIgKGJlY2F1c2UgMHgxMDAgPT0gMjU2KVxuICAgICAgeCBePSAweDExRFxuICAgIH1cbiAgfVxuXG4gIC8vIE9wdGltaXphdGlvbjogZG91YmxlIHRoZSBzaXplIG9mIHRoZSBhbnRpLWxvZyB0YWJsZSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gbW9kIDI1NSB0b1xuICAvLyBzdGF5IGluc2lkZSB0aGUgYm91bmRzIChiZWNhdXNlIHdlIHdpbGwgbWFpbmx5IHVzZSB0aGlzIHRhYmxlIGZvciB0aGUgbXVsdGlwbGljYXRpb24gb2ZcbiAgLy8gdHdvIEdGIG51bWJlcnMsIG5vIG1vcmUpLlxuICAvLyBAc2VlIHtAbGluayBtdWx9XG4gIGZvciAobGV0IGkgPSAyNTU7IGkgPCA1MTI7IGkrKykge1xuICAgIEVYUF9UQUJMRVtpXSA9IEVYUF9UQUJMRVtpIC0gMjU1XVxuICB9XG59KCkpXG5cbi8qKlxuICogUmV0dXJucyBsb2cgdmFsdWUgb2YgbiBpbnNpZGUgR2Fsb2lzIEZpZWxkXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmV4cG9ydHMubG9nID0gZnVuY3Rpb24gbG9nIChuKSB7XG4gIGlmIChuIDwgMSkgdGhyb3cgbmV3IEVycm9yKCdsb2coJyArIG4gKyAnKScpXG4gIHJldHVybiBMT0dfVEFCTEVbbl1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFudGktbG9nIHZhbHVlIG9mIG4gaW5zaWRlIEdhbG9pcyBGaWVsZFxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gblxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5leHBvcnRzLmV4cCA9IGZ1bmN0aW9uIGV4cCAobikge1xuICByZXR1cm4gRVhQX1RBQkxFW25dXG59XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbnVtYmVyIGluc2lkZSBHYWxvaXMgRmllbGRcbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSAge051bWJlcn0geVxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5leHBvcnRzLm11bCA9IGZ1bmN0aW9uIG11bCAoeCwgeSkge1xuICBpZiAoeCA9PT0gMCB8fCB5ID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIHNob3VsZCBiZSBFWFBfVEFCTEVbKExPR19UQUJMRVt4XSArIExPR19UQUJMRVt5XSkgJSAyNTVdIGlmIEVYUF9UQUJMRSB3YXNuJ3Qgb3ZlcnNpemVkXG4gIC8vIEBzZWUge0BsaW5rIGluaXRUYWJsZXN9XG4gIHJldHVybiBFWFBfVEFCTEVbTE9HX1RBQkxFW3hdICsgTE9HX1RBQkxFW3ldXVxufVxuIiwgImNvbnN0IEdGID0gcmVxdWlyZSgnLi9nYWxvaXMtZmllbGQnKVxuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHBvbHlub21pYWxzIGluc2lkZSBHYWxvaXMgRmllbGRcbiAqXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBwMSBQb2x5bm9taWFsXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBwMiBQb2x5bm9taWFsXG4gKiBAcmV0dXJuIHtVaW50OEFycmF5fSAgICBQcm9kdWN0IG9mIHAxIGFuZCBwMlxuICovXG5leHBvcnRzLm11bCA9IGZ1bmN0aW9uIG11bCAocDEsIHAyKSB7XG4gIGNvbnN0IGNvZWZmID0gbmV3IFVpbnQ4QXJyYXkocDEubGVuZ3RoICsgcDIubGVuZ3RoIC0gMSlcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHAxLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBwMi5sZW5ndGg7IGorKykge1xuICAgICAgY29lZmZbaSArIGpdIF49IEdGLm11bChwMVtpXSwgcDJbal0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvZWZmXG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSByZW1haW5kZXIgb2YgcG9seW5vbWlhbHMgZGl2aXNpb25cbiAqXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBkaXZpZGVudCBQb2x5bm9taWFsXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBkaXZpc29yICBQb2x5bm9taWFsXG4gKiBAcmV0dXJuIHtVaW50OEFycmF5fSAgICAgICAgICBSZW1haW5kZXJcbiAqL1xuZXhwb3J0cy5tb2QgPSBmdW5jdGlvbiBtb2QgKGRpdmlkZW50LCBkaXZpc29yKSB7XG4gIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheShkaXZpZGVudClcblxuICB3aGlsZSAoKHJlc3VsdC5sZW5ndGggLSBkaXZpc29yLmxlbmd0aCkgPj0gMCkge1xuICAgIGNvbnN0IGNvZWZmID0gcmVzdWx0WzBdXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpdmlzb3IubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSBePSBHRi5tdWwoZGl2aXNvcltpXSwgY29lZmYpXG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGFsbCB6ZXJvcyBmcm9tIGJ1ZmZlciBoZWFkXG4gICAgbGV0IG9mZnNldCA9IDBcbiAgICB3aGlsZSAob2Zmc2V0IDwgcmVzdWx0Lmxlbmd0aCAmJiByZXN1bHRbb2Zmc2V0XSA9PT0gMCkgb2Zmc2V0KytcbiAgICByZXN1bHQgPSByZXN1bHQuc2xpY2Uob2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIGlycmVkdWNpYmxlIGdlbmVyYXRvciBwb2x5bm9taWFsIG9mIHNwZWNpZmllZCBkZWdyZWVcbiAqICh1c2VkIGJ5IFJlZWQtU29sb21vbiBlbmNvZGVyKVxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gZGVncmVlIERlZ3JlZSBvZiB0aGUgZ2VuZXJhdG9yIHBvbHlub21pYWxcbiAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9ICAgIEJ1ZmZlciBjb250YWluaW5nIHBvbHlub21pYWwgY29lZmZpY2llbnRzXG4gKi9cbmV4cG9ydHMuZ2VuZXJhdGVFQ1BvbHlub21pYWwgPSBmdW5jdGlvbiBnZW5lcmF0ZUVDUG9seW5vbWlhbCAoZGVncmVlKSB7XG4gIGxldCBwb2x5ID0gbmV3IFVpbnQ4QXJyYXkoWzFdKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRlZ3JlZTsgaSsrKSB7XG4gICAgcG9seSA9IGV4cG9ydHMubXVsKHBvbHksIG5ldyBVaW50OEFycmF5KFsxLCBHRi5leHAoaSldKSlcbiAgfVxuXG4gIHJldHVybiBwb2x5XG59XG4iLCAiY29uc3QgUG9seW5vbWlhbCA9IHJlcXVpcmUoJy4vcG9seW5vbWlhbCcpXG5cbmZ1bmN0aW9uIFJlZWRTb2xvbW9uRW5jb2RlciAoZGVncmVlKSB7XG4gIHRoaXMuZ2VuUG9seSA9IHVuZGVmaW5lZFxuICB0aGlzLmRlZ3JlZSA9IGRlZ3JlZVxuXG4gIGlmICh0aGlzLmRlZ3JlZSkgdGhpcy5pbml0aWFsaXplKHRoaXMuZGVncmVlKVxufVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGVuY29kZXIuXG4gKiBUaGUgaW5wdXQgcGFyYW0gc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIG51bWJlciBvZiBlcnJvciBjb3JyZWN0aW9uIGNvZGV3b3Jkcy5cbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGRlZ3JlZVxuICovXG5SZWVkU29sb21vbkVuY29kZXIucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiBpbml0aWFsaXplIChkZWdyZWUpIHtcbiAgLy8gY3JlYXRlIGFuIGlycmVkdWNpYmxlIGdlbmVyYXRvciBwb2x5bm9taWFsXG4gIHRoaXMuZGVncmVlID0gZGVncmVlXG4gIHRoaXMuZ2VuUG9seSA9IFBvbHlub21pYWwuZ2VuZXJhdGVFQ1BvbHlub21pYWwodGhpcy5kZWdyZWUpXG59XG5cbi8qKlxuICogRW5jb2RlcyBhIGNodW5rIG9mIGRhdGFcbiAqXG4gKiBAcGFyYW0gIHtVaW50OEFycmF5fSBkYXRhIEJ1ZmZlciBjb250YWluaW5nIGlucHV0IGRhdGFcbiAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9ICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgZW5jb2RlZCBkYXRhXG4gKi9cblJlZWRTb2xvbW9uRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlIChkYXRhKSB7XG4gIGlmICghdGhpcy5nZW5Qb2x5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvZGVyIG5vdCBpbml0aWFsaXplZCcpXG4gIH1cblxuICAvLyBDYWxjdWxhdGUgRUMgZm9yIHRoaXMgZGF0YSBibG9ja1xuICAvLyBleHRlbmRzIGRhdGEgc2l6ZSB0byBkYXRhK2dlblBvbHkgc2l6ZVxuICBjb25zdCBwYWRkZWREYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGggKyB0aGlzLmRlZ3JlZSlcbiAgcGFkZGVkRGF0YS5zZXQoZGF0YSlcblxuICAvLyBUaGUgZXJyb3IgY29ycmVjdGlvbiBjb2Rld29yZHMgYXJlIHRoZSByZW1haW5kZXIgYWZ0ZXIgZGl2aWRpbmcgdGhlIGRhdGEgY29kZXdvcmRzXG4gIC8vIGJ5IGEgZ2VuZXJhdG9yIHBvbHlub21pYWxcbiAgY29uc3QgcmVtYWluZGVyID0gUG9seW5vbWlhbC5tb2QocGFkZGVkRGF0YSwgdGhpcy5nZW5Qb2x5KVxuXG4gIC8vIHJldHVybiBFQyBkYXRhIGJsb2NrcyAobGFzdCBuIGJ5dGUsIHdoZXJlIG4gaXMgdGhlIGRlZ3JlZSBvZiBnZW5Qb2x5KVxuICAvLyBJZiBjb2VmZmljaWVudHMgbnVtYmVyIGluIHJlbWFpbmRlciBhcmUgbGVzcyB0aGFuIGdlblBvbHkgZGVncmVlLFxuICAvLyBwYWQgd2l0aCAwcyB0byB0aGUgbGVmdCB0byByZWFjaCB0aGUgbmVlZGVkIG51bWJlciBvZiBjb2VmZmljaWVudHNcbiAgY29uc3Qgc3RhcnQgPSB0aGlzLmRlZ3JlZSAtIHJlbWFpbmRlci5sZW5ndGhcbiAgaWYgKHN0YXJ0ID4gMCkge1xuICAgIGNvbnN0IGJ1ZmYgPSBuZXcgVWludDhBcnJheSh0aGlzLmRlZ3JlZSlcbiAgICBidWZmLnNldChyZW1haW5kZXIsIHN0YXJ0KVxuXG4gICAgcmV0dXJuIGJ1ZmZcbiAgfVxuXG4gIHJldHVybiByZW1haW5kZXJcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWVkU29sb21vbkVuY29kZXJcbiIsICIvKipcbiAqIENoZWNrIGlmIFFSIENvZGUgdmVyc2lvbiBpcyB2YWxpZFxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gIHZlcnNpb24gUVIgQ29kZSB2ZXJzaW9uXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgIHRydWUgaWYgdmFsaWQgdmVyc2lvbiwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydHMuaXNWYWxpZCA9IGZ1bmN0aW9uIGlzVmFsaWQgKHZlcnNpb24pIHtcbiAgcmV0dXJuICFpc05hTih2ZXJzaW9uKSAmJiB2ZXJzaW9uID49IDEgJiYgdmVyc2lvbiA8PSA0MFxufVxuIiwgImNvbnN0IG51bWVyaWMgPSAnWzAtOV0rJ1xuY29uc3QgYWxwaGFudW1lcmljID0gJ1tBLVogJCUqK1xcXFwtLi86XSsnXG5sZXQga2FuamkgPSAnKD86W3UzMDAwLXUzMDNGXXxbdTMwNDAtdTMwOUZdfFt1MzBBMC11MzBGRl18JyArXG4gICdbdUZGMDAtdUZGRUZdfFt1NEUwMC11OUZBRl18W3UyNjA1LXUyNjA2XXxbdTIxOTAtdTIxOTVdfHUyMDNCfCcgK1xuICAnW3UyMDEwdTIwMTV1MjAxOHUyMDE5dTIwMjV1MjAyNnUyMDFDdTIwMUR1MjIyNXUyMjYwXXwnICtcbiAgJ1t1MDM5MS11MDQ1MV18W3UwMEE3dTAwQTh1MDBCMXUwMEI0dTAwRDd1MDBGN10pKydcbmthbmppID0ga2FuamkucmVwbGFjZSgvdS9nLCAnXFxcXHUnKVxuXG5jb25zdCBieXRlID0gJyg/Oig/IVtBLVowLTkgJCUqK1xcXFwtLi86XXwnICsga2FuamkgKyAnKSg/Oi58W1xcclxcbl0pKSsnXG5cbmV4cG9ydHMuS0FOSkkgPSBuZXcgUmVnRXhwKGthbmppLCAnZycpXG5leHBvcnRzLkJZVEVfS0FOSkkgPSBuZXcgUmVnRXhwKCdbXkEtWjAtOSAkJSorXFxcXC0uLzpdKycsICdnJylcbmV4cG9ydHMuQllURSA9IG5ldyBSZWdFeHAoYnl0ZSwgJ2cnKVxuZXhwb3J0cy5OVU1FUklDID0gbmV3IFJlZ0V4cChudW1lcmljLCAnZycpXG5leHBvcnRzLkFMUEhBTlVNRVJJQyA9IG5ldyBSZWdFeHAoYWxwaGFudW1lcmljLCAnZycpXG5cbmNvbnN0IFRFU1RfS0FOSkkgPSBuZXcgUmVnRXhwKCdeJyArIGthbmppICsgJyQnKVxuY29uc3QgVEVTVF9OVU1FUklDID0gbmV3IFJlZ0V4cCgnXicgKyBudW1lcmljICsgJyQnKVxuY29uc3QgVEVTVF9BTFBIQU5VTUVSSUMgPSBuZXcgUmVnRXhwKCdeW0EtWjAtOSAkJSorXFxcXC0uLzpdKyQnKVxuXG5leHBvcnRzLnRlc3RLYW5qaSA9IGZ1bmN0aW9uIHRlc3RLYW5qaSAoc3RyKSB7XG4gIHJldHVybiBURVNUX0tBTkpJLnRlc3Qoc3RyKVxufVxuXG5leHBvcnRzLnRlc3ROdW1lcmljID0gZnVuY3Rpb24gdGVzdE51bWVyaWMgKHN0cikge1xuICByZXR1cm4gVEVTVF9OVU1FUklDLnRlc3Qoc3RyKVxufVxuXG5leHBvcnRzLnRlc3RBbHBoYW51bWVyaWMgPSBmdW5jdGlvbiB0ZXN0QWxwaGFudW1lcmljIChzdHIpIHtcbiAgcmV0dXJuIFRFU1RfQUxQSEFOVU1FUklDLnRlc3Qoc3RyKVxufVxuIiwgImNvbnN0IFZlcnNpb25DaGVjayA9IHJlcXVpcmUoJy4vdmVyc2lvbi1jaGVjaycpXG5jb25zdCBSZWdleCA9IHJlcXVpcmUoJy4vcmVnZXgnKVxuXG4vKipcbiAqIE51bWVyaWMgbW9kZSBlbmNvZGVzIGRhdGEgZnJvbSB0aGUgZGVjaW1hbCBkaWdpdCBzZXQgKDAgLSA5KVxuICogKGJ5dGUgdmFsdWVzIDMwSEVYIHRvIDM5SEVYKS5cbiAqIE5vcm1hbGx5LCAzIGRhdGEgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgMTAgYml0cy5cbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5leHBvcnRzLk5VTUVSSUMgPSB7XG4gIGlkOiAnTnVtZXJpYycsXG4gIGJpdDogMSA8PCAwLFxuICBjY0JpdHM6IFsxMCwgMTIsIDE0XVxufVxuXG4vKipcbiAqIEFscGhhbnVtZXJpYyBtb2RlIGVuY29kZXMgZGF0YSBmcm9tIGEgc2V0IG9mIDQ1IGNoYXJhY3RlcnMsXG4gKiBpLmUuIDEwIG51bWVyaWMgZGlnaXRzICgwIC0gOSksXG4gKiAgICAgIDI2IGFscGhhYmV0aWMgY2hhcmFjdGVycyAoQSAtIFopLFxuICogICBhbmQgOSBzeW1ib2xzIChTUCwgJCwgJSwgKiwgKywgLSwgLiwgLywgOikuXG4gKiBOb3JtYWxseSwgdHdvIGlucHV0IGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IDExIGJpdHMuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuZXhwb3J0cy5BTFBIQU5VTUVSSUMgPSB7XG4gIGlkOiAnQWxwaGFudW1lcmljJyxcbiAgYml0OiAxIDw8IDEsXG4gIGNjQml0czogWzksIDExLCAxM11cbn1cblxuLyoqXG4gKiBJbiBieXRlIG1vZGUsIGRhdGEgaXMgZW5jb2RlZCBhdCA4IGJpdHMgcGVyIGNoYXJhY3Rlci5cbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5leHBvcnRzLkJZVEUgPSB7XG4gIGlkOiAnQnl0ZScsXG4gIGJpdDogMSA8PCAyLFxuICBjY0JpdHM6IFs4LCAxNiwgMTZdXG59XG5cbi8qKlxuICogVGhlIEthbmppIG1vZGUgZWZmaWNpZW50bHkgZW5jb2RlcyBLYW5qaSBjaGFyYWN0ZXJzIGluIGFjY29yZGFuY2Ugd2l0aFxuICogdGhlIFNoaWZ0IEpJUyBzeXN0ZW0gYmFzZWQgb24gSklTIFggMDIwOC5cbiAqIFRoZSBTaGlmdCBKSVMgdmFsdWVzIGFyZSBzaGlmdGVkIGZyb20gdGhlIEpJUyBYIDAyMDggdmFsdWVzLlxuICogSklTIFggMDIwOCBnaXZlcyBkZXRhaWxzIG9mIHRoZSBzaGlmdCBjb2RlZCByZXByZXNlbnRhdGlvbi5cbiAqIEVhY2ggdHdvLWJ5dGUgY2hhcmFjdGVyIHZhbHVlIGlzIGNvbXBhY3RlZCB0byBhIDEzLWJpdCBiaW5hcnkgY29kZXdvcmQuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuZXhwb3J0cy5LQU5KSSA9IHtcbiAgaWQ6ICdLYW5qaScsXG4gIGJpdDogMSA8PCAzLFxuICBjY0JpdHM6IFs4LCAxMCwgMTJdXG59XG5cbi8qKlxuICogTWl4ZWQgbW9kZSB3aWxsIGNvbnRhaW4gYSBzZXF1ZW5jZXMgb2YgZGF0YSBpbiBhIGNvbWJpbmF0aW9uIG9mIGFueSBvZlxuICogdGhlIG1vZGVzIGRlc2NyaWJlZCBhYm92ZVxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbmV4cG9ydHMuTUlYRUQgPSB7XG4gIGJpdDogLTFcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gc3RvcmUgdGhlIGRhdGEgbGVuZ3RoXG4gKiBhY2NvcmRpbmcgdG8gUVIgQ29kZSBzcGVjaWZpY2F0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtNb2RlfSAgIG1vZGUgICAgRGF0YSBtb2RlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHZlcnNpb24gUVIgQ29kZSB2ZXJzaW9uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgTnVtYmVyIG9mIGJpdHNcbiAqL1xuZXhwb3J0cy5nZXRDaGFyQ291bnRJbmRpY2F0b3IgPSBmdW5jdGlvbiBnZXRDaGFyQ291bnRJbmRpY2F0b3IgKG1vZGUsIHZlcnNpb24pIHtcbiAgaWYgKCFtb2RlLmNjQml0cykgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1vZGU6ICcgKyBtb2RlKVxuXG4gIGlmICghVmVyc2lvbkNoZWNrLmlzVmFsaWQodmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmVyc2lvbjogJyArIHZlcnNpb24pXG4gIH1cblxuICBpZiAodmVyc2lvbiA+PSAxICYmIHZlcnNpb24gPCAxMCkgcmV0dXJuIG1vZGUuY2NCaXRzWzBdXG4gIGVsc2UgaWYgKHZlcnNpb24gPCAyNykgcmV0dXJuIG1vZGUuY2NCaXRzWzFdXG4gIHJldHVybiBtb2RlLmNjQml0c1syXVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vc3QgZWZmaWNpZW50IG1vZGUgdG8gc3RvcmUgdGhlIHNwZWNpZmllZCBkYXRhXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBkYXRhU3RyIElucHV0IGRhdGEgc3RyaW5nXG4gKiBAcmV0dXJuIHtNb2RlfSAgICAgICAgICAgQmVzdCBtb2RlXG4gKi9cbmV4cG9ydHMuZ2V0QmVzdE1vZGVGb3JEYXRhID0gZnVuY3Rpb24gZ2V0QmVzdE1vZGVGb3JEYXRhIChkYXRhU3RyKSB7XG4gIGlmIChSZWdleC50ZXN0TnVtZXJpYyhkYXRhU3RyKSkgcmV0dXJuIGV4cG9ydHMuTlVNRVJJQ1xuICBlbHNlIGlmIChSZWdleC50ZXN0QWxwaGFudW1lcmljKGRhdGFTdHIpKSByZXR1cm4gZXhwb3J0cy5BTFBIQU5VTUVSSUNcbiAgZWxzZSBpZiAoUmVnZXgudGVzdEthbmppKGRhdGFTdHIpKSByZXR1cm4gZXhwb3J0cy5LQU5KSVxuICBlbHNlIHJldHVybiBleHBvcnRzLkJZVEVcbn1cblxuLyoqXG4gKiBSZXR1cm4gbW9kZSBuYW1lIGFzIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7TW9kZX0gbW9kZSBNb2RlIG9iamVjdFxuICogQHJldHVybnMge1N0cmluZ30gIE1vZGUgbmFtZVxuICovXG5leHBvcnRzLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKG1vZGUpIHtcbiAgaWYgKG1vZGUgJiYgbW9kZS5pZCkgcmV0dXJuIG1vZGUuaWRcbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1vZGUnKVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGlucHV0IHBhcmFtIGlzIGEgdmFsaWQgbW9kZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0gICB7TW9kZX0gICAgbW9kZSBNb2RlIG9iamVjdFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdmFsaWQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydHMuaXNWYWxpZCA9IGZ1bmN0aW9uIGlzVmFsaWQgKG1vZGUpIHtcbiAgcmV0dXJuIG1vZGUgJiYgbW9kZS5iaXQgJiYgbW9kZS5jY0JpdHNcbn1cblxuLyoqXG4gKiBHZXQgbW9kZSBvYmplY3QgZnJvbSBpdHMgbmFtZVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IHN0cmluZyBNb2RlIG5hbWVcbiAqIEByZXR1cm5zIHtNb2RlfSAgICAgICAgICBNb2RlIG9iamVjdFxuICovXG5mdW5jdGlvbiBmcm9tU3RyaW5nIChzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbSBpcyBub3QgYSBzdHJpbmcnKVxuICB9XG5cbiAgY29uc3QgbGNTdHIgPSBzdHJpbmcudG9Mb3dlckNhc2UoKVxuXG4gIHN3aXRjaCAobGNTdHIpIHtcbiAgICBjYXNlICdudW1lcmljJzpcbiAgICAgIHJldHVybiBleHBvcnRzLk5VTUVSSUNcbiAgICBjYXNlICdhbHBoYW51bWVyaWMnOlxuICAgICAgcmV0dXJuIGV4cG9ydHMuQUxQSEFOVU1FUklDXG4gICAgY2FzZSAna2FuamknOlxuICAgICAgcmV0dXJuIGV4cG9ydHMuS0FOSklcbiAgICBjYXNlICdieXRlJzpcbiAgICAgIHJldHVybiBleHBvcnRzLkJZVEVcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGU6ICcgKyBzdHJpbmcpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIG1vZGUgZnJvbSBhIHZhbHVlLlxuICogSWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgbW9kZSwgcmV0dXJucyBkZWZhdWx0VmFsdWVcbiAqXG4gKiBAcGFyYW0gIHtNb2RlfFN0cmluZ30gdmFsdWUgICAgICAgIEVuY29kaW5nIG1vZGVcbiAqIEBwYXJhbSAge01vZGV9ICAgICAgICBkZWZhdWx0VmFsdWUgRmFsbGJhY2sgdmFsdWVcbiAqIEByZXR1cm4ge01vZGV9ICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmcgbW9kZVxuICovXG5leHBvcnRzLmZyb20gPSBmdW5jdGlvbiBmcm9tICh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmIChleHBvcnRzLmlzVmFsaWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbHVlKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICB9XG59XG4iLCAiY29uc3QgVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJylcbmNvbnN0IEVDQ29kZSA9IHJlcXVpcmUoJy4vZXJyb3ItY29ycmVjdGlvbi1jb2RlJylcbmNvbnN0IEVDTGV2ZWwgPSByZXF1aXJlKCcuL2Vycm9yLWNvcnJlY3Rpb24tbGV2ZWwnKVxuY29uc3QgTW9kZSA9IHJlcXVpcmUoJy4vbW9kZScpXG5jb25zdCBWZXJzaW9uQ2hlY2sgPSByZXF1aXJlKCcuL3ZlcnNpb24tY2hlY2snKVxuXG4vLyBHZW5lcmF0b3IgcG9seW5vbWlhbCB1c2VkIHRvIGVuY29kZSB2ZXJzaW9uIGluZm9ybWF0aW9uXG5jb25zdCBHMTggPSAoMSA8PCAxMikgfCAoMSA8PCAxMSkgfCAoMSA8PCAxMCkgfCAoMSA8PCA5KSB8ICgxIDw8IDgpIHwgKDEgPDwgNSkgfCAoMSA8PCAyKSB8ICgxIDw8IDApXG5jb25zdCBHMThfQkNIID0gVXRpbHMuZ2V0QkNIRGlnaXQoRzE4KVxuXG5mdW5jdGlvbiBnZXRCZXN0VmVyc2lvbkZvckRhdGFMZW5ndGggKG1vZGUsIGxlbmd0aCwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpIHtcbiAgZm9yIChsZXQgY3VycmVudFZlcnNpb24gPSAxOyBjdXJyZW50VmVyc2lvbiA8PSA0MDsgY3VycmVudFZlcnNpb24rKykge1xuICAgIGlmIChsZW5ndGggPD0gZXhwb3J0cy5nZXRDYXBhY2l0eShjdXJyZW50VmVyc2lvbiwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIG1vZGUpKSB7XG4gICAgICByZXR1cm4gY3VycmVudFZlcnNpb25cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGdldFJlc2VydmVkQml0c0NvdW50IChtb2RlLCB2ZXJzaW9uKSB7XG4gIC8vIENoYXJhY3RlciBjb3VudCBpbmRpY2F0b3IgKyBtb2RlIGluZGljYXRvciBiaXRzXG4gIHJldHVybiBNb2RlLmdldENoYXJDb3VudEluZGljYXRvcihtb2RlLCB2ZXJzaW9uKSArIDRcbn1cblxuZnVuY3Rpb24gZ2V0VG90YWxCaXRzRnJvbURhdGFBcnJheSAoc2VnbWVudHMsIHZlcnNpb24pIHtcbiAgbGV0IHRvdGFsQml0cyA9IDBcblxuICBzZWdtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgY29uc3QgcmVzZXJ2ZWRCaXRzID0gZ2V0UmVzZXJ2ZWRCaXRzQ291bnQoZGF0YS5tb2RlLCB2ZXJzaW9uKVxuICAgIHRvdGFsQml0cyArPSByZXNlcnZlZEJpdHMgKyBkYXRhLmdldEJpdHNMZW5ndGgoKVxuICB9KVxuXG4gIHJldHVybiB0b3RhbEJpdHNcbn1cblxuZnVuY3Rpb24gZ2V0QmVzdFZlcnNpb25Gb3JNaXhlZERhdGEgKHNlZ21lbnRzLCBlcnJvckNvcnJlY3Rpb25MZXZlbCkge1xuICBmb3IgKGxldCBjdXJyZW50VmVyc2lvbiA9IDE7IGN1cnJlbnRWZXJzaW9uIDw9IDQwOyBjdXJyZW50VmVyc2lvbisrKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gZ2V0VG90YWxCaXRzRnJvbURhdGFBcnJheShzZWdtZW50cywgY3VycmVudFZlcnNpb24pXG4gICAgaWYgKGxlbmd0aCA8PSBleHBvcnRzLmdldENhcGFjaXR5KGN1cnJlbnRWZXJzaW9uLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgTW9kZS5NSVhFRCkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHZlcnNpb24gbnVtYmVyIGZyb20gYSB2YWx1ZS5cbiAqIElmIHZhbHVlIGlzIG5vdCBhIHZhbGlkIHZlcnNpb24sIHJldHVybnMgZGVmYXVsdFZhbHVlXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfFN0cmluZ30gdmFsdWUgICAgICAgIFFSIENvZGUgdmVyc2lvblxuICogQHBhcmFtICB7TnVtYmVyfSAgICAgICAgZGVmYXVsdFZhbHVlIEZhbGxiYWNrIHZhbHVlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgICAgUVIgQ29kZSB2ZXJzaW9uIG51bWJlclxuICovXG5leHBvcnRzLmZyb20gPSBmdW5jdGlvbiBmcm9tICh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmIChWZXJzaW9uQ2hlY2suaXNWYWxpZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKVxuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxufVxuXG4vKipcbiAqIFJldHVybnMgaG93IG11Y2ggZGF0YSBjYW4gYmUgc3RvcmVkIHdpdGggdGhlIHNwZWNpZmllZCBRUiBjb2RlIHZlcnNpb25cbiAqIGFuZCBlcnJvciBjb3JyZWN0aW9uIGxldmVsXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSB2ZXJzaW9uICAgICAgICAgICAgICBRUiBDb2RlIHZlcnNpb24gKDEtNDApXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGVycm9yQ29ycmVjdGlvbkxldmVsIEVycm9yIGNvcnJlY3Rpb24gbGV2ZWxcbiAqIEBwYXJhbSAge01vZGV9ICAgbW9kZSAgICAgICAgICAgICAgICAgRGF0YSBtb2RlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgICAgIFF1YW50aXR5IG9mIHN0b3JhYmxlIGRhdGFcbiAqL1xuZXhwb3J0cy5nZXRDYXBhY2l0eSA9IGZ1bmN0aW9uIGdldENhcGFjaXR5ICh2ZXJzaW9uLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgbW9kZSkge1xuICBpZiAoIVZlcnNpb25DaGVjay5pc1ZhbGlkKHZlcnNpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFFSIENvZGUgdmVyc2lvbicpXG4gIH1cblxuICAvLyBVc2UgQnl0ZSBtb2RlIGFzIGRlZmF1bHRcbiAgaWYgKHR5cGVvZiBtb2RlID09PSAndW5kZWZpbmVkJykgbW9kZSA9IE1vZGUuQllURVxuXG4gIC8vIFRvdGFsIGNvZGV3b3JkcyBmb3IgdGhpcyBRUiBjb2RlIHZlcnNpb24gKERhdGEgKyBFcnJvciBjb3JyZWN0aW9uKVxuICBjb25zdCB0b3RhbENvZGV3b3JkcyA9IFV0aWxzLmdldFN5bWJvbFRvdGFsQ29kZXdvcmRzKHZlcnNpb24pXG5cbiAgLy8gVG90YWwgbnVtYmVyIG9mIGVycm9yIGNvcnJlY3Rpb24gY29kZXdvcmRzXG4gIGNvbnN0IGVjVG90YWxDb2Rld29yZHMgPSBFQ0NvZGUuZ2V0VG90YWxDb2Rld29yZHNDb3VudCh2ZXJzaW9uLCBlcnJvckNvcnJlY3Rpb25MZXZlbClcblxuICAvLyBUb3RhbCBudW1iZXIgb2YgZGF0YSBjb2Rld29yZHNcbiAgY29uc3QgZGF0YVRvdGFsQ29kZXdvcmRzQml0cyA9ICh0b3RhbENvZGV3b3JkcyAtIGVjVG90YWxDb2Rld29yZHMpICogOFxuXG4gIGlmIChtb2RlID09PSBNb2RlLk1JWEVEKSByZXR1cm4gZGF0YVRvdGFsQ29kZXdvcmRzQml0c1xuXG4gIGNvbnN0IHVzYWJsZUJpdHMgPSBkYXRhVG90YWxDb2Rld29yZHNCaXRzIC0gZ2V0UmVzZXJ2ZWRCaXRzQ291bnQobW9kZSwgdmVyc2lvbilcblxuICAvLyBSZXR1cm4gbWF4IG51bWJlciBvZiBzdG9yYWJsZSBjb2Rld29yZHNcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBNb2RlLk5VTUVSSUM6XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcigodXNhYmxlQml0cyAvIDEwKSAqIDMpXG5cbiAgICBjYXNlIE1vZGUuQUxQSEFOVU1FUklDOlxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHVzYWJsZUJpdHMgLyAxMSkgKiAyKVxuXG4gICAgY2FzZSBNb2RlLktBTkpJOlxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodXNhYmxlQml0cyAvIDEzKVxuXG4gICAgY2FzZSBNb2RlLkJZVEU6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKHVzYWJsZUJpdHMgLyA4KVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSB2ZXJzaW9uIG5lZWRlZCB0byBjb250YWluIHRoZSBhbW91bnQgb2YgZGF0YVxuICpcbiAqIEBwYXJhbSAge1NlZ21lbnR9IGRhdGEgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQgb2YgZGF0YVxuICogQHBhcmFtICB7TnVtYmVyfSBbZXJyb3JDb3JyZWN0aW9uTGV2ZWw9SF0gRXJyb3IgY29ycmVjdGlvbiBsZXZlbFxuICogQHBhcmFtICB7TW9kZX0gbW9kZSAgICAgICAgICAgICAgICAgICAgICAgRGF0YSBtb2RlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgICAgICAgICBRUiBDb2RlIHZlcnNpb25cbiAqL1xuZXhwb3J0cy5nZXRCZXN0VmVyc2lvbkZvckRhdGEgPSBmdW5jdGlvbiBnZXRCZXN0VmVyc2lvbkZvckRhdGEgKGRhdGEsIGVycm9yQ29ycmVjdGlvbkxldmVsKSB7XG4gIGxldCBzZWdcblxuICBjb25zdCBlY2wgPSBFQ0xldmVsLmZyb20oZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIEVDTGV2ZWwuTSlcblxuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiBnZXRCZXN0VmVyc2lvbkZvck1peGVkRGF0YShkYXRhLCBlY2wpXG4gICAgfVxuXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cblxuICAgIHNlZyA9IGRhdGFbMF1cbiAgfSBlbHNlIHtcbiAgICBzZWcgPSBkYXRhXG4gIH1cblxuICByZXR1cm4gZ2V0QmVzdFZlcnNpb25Gb3JEYXRhTGVuZ3RoKHNlZy5tb2RlLCBzZWcuZ2V0TGVuZ3RoKCksIGVjbClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHZlcnNpb24gaW5mb3JtYXRpb24gd2l0aCByZWxhdGl2ZSBlcnJvciBjb3JyZWN0aW9uIGJpdHNcbiAqXG4gKiBUaGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBpbmNsdWRlZCBpbiBRUiBDb2RlIHN5bWJvbHMgb2YgdmVyc2lvbiA3IG9yIGxhcmdlci5cbiAqIEl0IGNvbnNpc3RzIG9mIGFuIDE4LWJpdCBzZXF1ZW5jZSBjb250YWluaW5nIDYgZGF0YSBiaXRzLFxuICogd2l0aCAxMiBlcnJvciBjb3JyZWN0aW9uIGJpdHMgY2FsY3VsYXRlZCB1c2luZyB0aGUgKDE4LCA2KSBHb2xheSBjb2RlLlxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gdmVyc2lvbiBRUiBDb2RlIHZlcnNpb25cbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICBFbmNvZGVkIHZlcnNpb24gaW5mbyBiaXRzXG4gKi9cbmV4cG9ydHMuZ2V0RW5jb2RlZEJpdHMgPSBmdW5jdGlvbiBnZXRFbmNvZGVkQml0cyAodmVyc2lvbikge1xuICBpZiAoIVZlcnNpb25DaGVjay5pc1ZhbGlkKHZlcnNpb24pIHx8IHZlcnNpb24gPCA3KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFFSIENvZGUgdmVyc2lvbicpXG4gIH1cblxuICBsZXQgZCA9IHZlcnNpb24gPDwgMTJcblxuICB3aGlsZSAoVXRpbHMuZ2V0QkNIRGlnaXQoZCkgLSBHMThfQkNIID49IDApIHtcbiAgICBkIF49IChHMTggPDwgKFV0aWxzLmdldEJDSERpZ2l0KGQpIC0gRzE4X0JDSCkpXG4gIH1cblxuICByZXR1cm4gKHZlcnNpb24gPDwgMTIpIHwgZFxufVxuIiwgImNvbnN0IFV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmNvbnN0IEcxNSA9ICgxIDw8IDEwKSB8ICgxIDw8IDgpIHwgKDEgPDwgNSkgfCAoMSA8PCA0KSB8ICgxIDw8IDIpIHwgKDEgPDwgMSkgfCAoMSA8PCAwKVxuY29uc3QgRzE1X01BU0sgPSAoMSA8PCAxNCkgfCAoMSA8PCAxMikgfCAoMSA8PCAxMCkgfCAoMSA8PCA0KSB8ICgxIDw8IDEpXG5jb25zdCBHMTVfQkNIID0gVXRpbHMuZ2V0QkNIRGlnaXQoRzE1KVxuXG4vKipcbiAqIFJldHVybnMgZm9ybWF0IGluZm9ybWF0aW9uIHdpdGggcmVsYXRpdmUgZXJyb3IgY29ycmVjdGlvbiBiaXRzXG4gKlxuICogVGhlIGZvcm1hdCBpbmZvcm1hdGlvbiBpcyBhIDE1LWJpdCBzZXF1ZW5jZSBjb250YWluaW5nIDUgZGF0YSBiaXRzLFxuICogd2l0aCAxMCBlcnJvciBjb3JyZWN0aW9uIGJpdHMgY2FsY3VsYXRlZCB1c2luZyB0aGUgKDE1LCA1KSBCQ0ggY29kZS5cbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGVycm9yQ29ycmVjdGlvbkxldmVsIEVycm9yIGNvcnJlY3Rpb24gbGV2ZWxcbiAqIEBwYXJhbSAge051bWJlcn0gbWFzayAgICAgICAgICAgICAgICAgTWFzayBwYXR0ZXJuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgICAgIEVuY29kZWQgZm9ybWF0IGluZm9ybWF0aW9uIGJpdHNcbiAqL1xuZXhwb3J0cy5nZXRFbmNvZGVkQml0cyA9IGZ1bmN0aW9uIGdldEVuY29kZWRCaXRzIChlcnJvckNvcnJlY3Rpb25MZXZlbCwgbWFzaykge1xuICBjb25zdCBkYXRhID0gKChlcnJvckNvcnJlY3Rpb25MZXZlbC5iaXQgPDwgMykgfCBtYXNrKVxuICBsZXQgZCA9IGRhdGEgPDwgMTBcblxuICB3aGlsZSAoVXRpbHMuZ2V0QkNIRGlnaXQoZCkgLSBHMTVfQkNIID49IDApIHtcbiAgICBkIF49IChHMTUgPDwgKFV0aWxzLmdldEJDSERpZ2l0KGQpIC0gRzE1X0JDSCkpXG4gIH1cblxuICAvLyB4b3IgZmluYWwgZGF0YSB3aXRoIG1hc2sgcGF0dGVybiBpbiBvcmRlciB0byBlbnN1cmUgdGhhdFxuICAvLyBubyBjb21iaW5hdGlvbiBvZiBFcnJvciBDb3JyZWN0aW9uIExldmVsIGFuZCBkYXRhIG1hc2sgcGF0dGVyblxuICAvLyB3aWxsIHJlc3VsdCBpbiBhbiBhbGwtemVybyBkYXRhIHN0cmluZ1xuICByZXR1cm4gKChkYXRhIDw8IDEwKSB8IGQpIF4gRzE1X01BU0tcbn1cbiIsICJjb25zdCBNb2RlID0gcmVxdWlyZSgnLi9tb2RlJylcblxuZnVuY3Rpb24gTnVtZXJpY0RhdGEgKGRhdGEpIHtcbiAgdGhpcy5tb2RlID0gTW9kZS5OVU1FUklDXG4gIHRoaXMuZGF0YSA9IGRhdGEudG9TdHJpbmcoKVxufVxuXG5OdW1lcmljRGF0YS5nZXRCaXRzTGVuZ3RoID0gZnVuY3Rpb24gZ2V0Qml0c0xlbmd0aCAobGVuZ3RoKSB7XG4gIHJldHVybiAxMCAqIE1hdGguZmxvb3IobGVuZ3RoIC8gMykgKyAoKGxlbmd0aCAlIDMpID8gKChsZW5ndGggJSAzKSAqIDMgKyAxKSA6IDApXG59XG5cbk51bWVyaWNEYXRhLnByb3RvdHlwZS5nZXRMZW5ndGggPSBmdW5jdGlvbiBnZXRMZW5ndGggKCkge1xuICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aFxufVxuXG5OdW1lcmljRGF0YS5wcm90b3R5cGUuZ2V0Qml0c0xlbmd0aCA9IGZ1bmN0aW9uIGdldEJpdHNMZW5ndGggKCkge1xuICByZXR1cm4gTnVtZXJpY0RhdGEuZ2V0Qml0c0xlbmd0aCh0aGlzLmRhdGEubGVuZ3RoKVxufVxuXG5OdW1lcmljRGF0YS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoYml0QnVmZmVyKSB7XG4gIGxldCBpLCBncm91cCwgdmFsdWVcblxuICAvLyBUaGUgaW5wdXQgZGF0YSBzdHJpbmcgaXMgZGl2aWRlZCBpbnRvIGdyb3VwcyBvZiB0aHJlZSBkaWdpdHMsXG4gIC8vIGFuZCBlYWNoIGdyb3VwIGlzIGNvbnZlcnRlZCB0byBpdHMgMTAtYml0IGJpbmFyeSBlcXVpdmFsZW50LlxuICBmb3IgKGkgPSAwOyBpICsgMyA8PSB0aGlzLmRhdGEubGVuZ3RoOyBpICs9IDMpIHtcbiAgICBncm91cCA9IHRoaXMuZGF0YS5zdWJzdHIoaSwgMylcbiAgICB2YWx1ZSA9IHBhcnNlSW50KGdyb3VwLCAxMClcblxuICAgIGJpdEJ1ZmZlci5wdXQodmFsdWUsIDEwKVxuICB9XG5cbiAgLy8gSWYgdGhlIG51bWJlciBvZiBpbnB1dCBkaWdpdHMgaXMgbm90IGFuIGV4YWN0IG11bHRpcGxlIG9mIHRocmVlLFxuICAvLyB0aGUgZmluYWwgb25lIG9yIHR3byBkaWdpdHMgYXJlIGNvbnZlcnRlZCB0byA0IG9yIDcgYml0cyByZXNwZWN0aXZlbHkuXG4gIGNvbnN0IHJlbWFpbmluZ051bSA9IHRoaXMuZGF0YS5sZW5ndGggLSBpXG4gIGlmIChyZW1haW5pbmdOdW0gPiAwKSB7XG4gICAgZ3JvdXAgPSB0aGlzLmRhdGEuc3Vic3RyKGkpXG4gICAgdmFsdWUgPSBwYXJzZUludChncm91cCwgMTApXG5cbiAgICBiaXRCdWZmZXIucHV0KHZhbHVlLCByZW1haW5pbmdOdW0gKiAzICsgMSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWVyaWNEYXRhXG4iLCAiY29uc3QgTW9kZSA9IHJlcXVpcmUoJy4vbW9kZScpXG5cbi8qKlxuICogQXJyYXkgb2YgY2hhcmFjdGVycyBhdmFpbGFibGUgaW4gYWxwaGFudW1lcmljIG1vZGVcbiAqXG4gKiBBcyBwZXIgUVIgQ29kZSBzcGVjaWZpY2F0aW9uLCB0byBlYWNoIGNoYXJhY3RlclxuICogaXMgYXNzaWduZWQgYSB2YWx1ZSBmcm9tIDAgdG8gNDQgd2hpY2ggaW4gdGhpcyBjYXNlIGNvaW5jaWRlc1xuICogd2l0aCB0aGUgYXJyYXkgaW5kZXhcbiAqXG4gKiBAdHlwZSB7QXJyYXl9XG4gKi9cbmNvbnN0IEFMUEhBX05VTV9DSEFSUyA9IFtcbiAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLFxuICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsXG4gICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJyxcbiAgJyAnLCAnJCcsICclJywgJyonLCAnKycsICctJywgJy4nLCAnLycsICc6J1xuXVxuXG5mdW5jdGlvbiBBbHBoYW51bWVyaWNEYXRhIChkYXRhKSB7XG4gIHRoaXMubW9kZSA9IE1vZGUuQUxQSEFOVU1FUklDXG4gIHRoaXMuZGF0YSA9IGRhdGFcbn1cblxuQWxwaGFudW1lcmljRGF0YS5nZXRCaXRzTGVuZ3RoID0gZnVuY3Rpb24gZ2V0Qml0c0xlbmd0aCAobGVuZ3RoKSB7XG4gIHJldHVybiAxMSAqIE1hdGguZmxvb3IobGVuZ3RoIC8gMikgKyA2ICogKGxlbmd0aCAlIDIpXG59XG5cbkFscGhhbnVtZXJpY0RhdGEucHJvdG90eXBlLmdldExlbmd0aCA9IGZ1bmN0aW9uIGdldExlbmd0aCAoKSB7XG4gIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoXG59XG5cbkFscGhhbnVtZXJpY0RhdGEucHJvdG90eXBlLmdldEJpdHNMZW5ndGggPSBmdW5jdGlvbiBnZXRCaXRzTGVuZ3RoICgpIHtcbiAgcmV0dXJuIEFscGhhbnVtZXJpY0RhdGEuZ2V0Qml0c0xlbmd0aCh0aGlzLmRhdGEubGVuZ3RoKVxufVxuXG5BbHBoYW51bWVyaWNEYXRhLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChiaXRCdWZmZXIpIHtcbiAgbGV0IGlcblxuICAvLyBJbnB1dCBkYXRhIGNoYXJhY3RlcnMgYXJlIGRpdmlkZWQgaW50byBncm91cHMgb2YgdHdvIGNoYXJhY3RlcnNcbiAgLy8gYW5kIGVuY29kZWQgYXMgMTEtYml0IGJpbmFyeSBjb2Rlcy5cbiAgZm9yIChpID0gMDsgaSArIDIgPD0gdGhpcy5kYXRhLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgLy8gVGhlIGNoYXJhY3RlciB2YWx1ZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIG11bHRpcGxpZWQgYnkgNDVcbiAgICBsZXQgdmFsdWUgPSBBTFBIQV9OVU1fQ0hBUlMuaW5kZXhPZih0aGlzLmRhdGFbaV0pICogNDVcblxuICAgIC8vIFRoZSBjaGFyYWN0ZXIgdmFsdWUgb2YgdGhlIHNlY29uZCBkaWdpdCBpcyBhZGRlZCB0byB0aGUgcHJvZHVjdFxuICAgIHZhbHVlICs9IEFMUEhBX05VTV9DSEFSUy5pbmRleE9mKHRoaXMuZGF0YVtpICsgMV0pXG5cbiAgICAvLyBUaGUgc3VtIGlzIHRoZW4gc3RvcmVkIGFzIDExLWJpdCBiaW5hcnkgbnVtYmVyXG4gICAgYml0QnVmZmVyLnB1dCh2YWx1ZSwgMTEpXG4gIH1cblxuICAvLyBJZiB0aGUgbnVtYmVyIG9mIGlucHV0IGRhdGEgY2hhcmFjdGVycyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0d28sXG4gIC8vIHRoZSBjaGFyYWN0ZXIgdmFsdWUgb2YgdGhlIGZpbmFsIGNoYXJhY3RlciBpcyBlbmNvZGVkIGFzIGEgNi1iaXQgYmluYXJ5IG51bWJlci5cbiAgaWYgKHRoaXMuZGF0YS5sZW5ndGggJSAyKSB7XG4gICAgYml0QnVmZmVyLnB1dChBTFBIQV9OVU1fQ0hBUlMuaW5kZXhPZih0aGlzLmRhdGFbaV0pLCA2KVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWxwaGFudW1lcmljRGF0YVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVuY29kZVV0ZjggKGlucHV0KSB7XG4gIHZhciByZXN1bHQgPSBbXVxuICB2YXIgc2l6ZSA9IGlucHV0Lmxlbmd0aFxuXG4gIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCsrKSB7XG4gICAgdmFyIHBvaW50ID0gaW5wdXQuY2hhckNvZGVBdChpbmRleClcblxuICAgIGlmIChwb2ludCA+PSAweEQ4MDAgJiYgcG9pbnQgPD0gMHhEQkZGICYmIHNpemUgPiBpbmRleCArIDEpIHtcbiAgICAgIHZhciBzZWNvbmQgPSBpbnB1dC5jaGFyQ29kZUF0KGluZGV4ICsgMSlcblxuICAgICAgaWYgKHNlY29uZCA+PSAweERDMDAgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuICAgICAgICAvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcbiAgICAgICAgcG9pbnQgPSAocG9pbnQgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwXG4gICAgICAgIGluZGV4ICs9IDFcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVUy1BU0NJSVxuICAgIGlmIChwb2ludCA8IDB4ODApIHtcbiAgICAgIHJlc3VsdC5wdXNoKHBvaW50KVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyAyLWJ5dGUgVVRGLThcbiAgICBpZiAocG9pbnQgPCAweDgwMCkge1xuICAgICAgcmVzdWx0LnB1c2goKHBvaW50ID4+IDYpIHwgMTkyKVxuICAgICAgcmVzdWx0LnB1c2goKHBvaW50ICYgNjMpIHwgMTI4KVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyAzLWJ5dGUgVVRGLThcbiAgICBpZiAocG9pbnQgPCAweEQ4MDAgfHwgKHBvaW50ID49IDB4RTAwMCAmJiBwb2ludCA8IDB4MTAwMDApKSB7XG4gICAgICByZXN1bHQucHVzaCgocG9pbnQgPj4gMTIpIHwgMjI0KVxuICAgICAgcmVzdWx0LnB1c2goKChwb2ludCA+PiA2KSAmIDYzKSB8IDEyOClcbiAgICAgIHJlc3VsdC5wdXNoKChwb2ludCAmIDYzKSB8IDEyOClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gNC1ieXRlIFVURi04XG4gICAgaWYgKHBvaW50ID49IDB4MTAwMDAgJiYgcG9pbnQgPD0gMHgxMEZGRkYpIHtcbiAgICAgIHJlc3VsdC5wdXNoKChwb2ludCA+PiAxOCkgfCAyNDApXG4gICAgICByZXN1bHQucHVzaCgoKHBvaW50ID4+IDEyKSAmIDYzKSB8IDEyOClcbiAgICAgIHJlc3VsdC5wdXNoKCgocG9pbnQgPj4gNikgJiA2MykgfCAxMjgpXG4gICAgICByZXN1bHQucHVzaCgocG9pbnQgJiA2MykgfCAxMjgpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgcmVzdWx0LnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgfVxuXG4gIHJldHVybiBuZXcgVWludDhBcnJheShyZXN1bHQpLmJ1ZmZlclxufVxuIiwgImNvbnN0IGVuY29kZVV0ZjggPSByZXF1aXJlKCdlbmNvZGUtdXRmOCcpXG5jb25zdCBNb2RlID0gcmVxdWlyZSgnLi9tb2RlJylcblxuZnVuY3Rpb24gQnl0ZURhdGEgKGRhdGEpIHtcbiAgdGhpcy5tb2RlID0gTW9kZS5CWVRFXG4gIGlmICh0eXBlb2YgKGRhdGEpID09PSAnc3RyaW5nJykge1xuICAgIGRhdGEgPSBlbmNvZGVVdGY4KGRhdGEpXG4gIH1cbiAgdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSlcbn1cblxuQnl0ZURhdGEuZ2V0Qml0c0xlbmd0aCA9IGZ1bmN0aW9uIGdldEJpdHNMZW5ndGggKGxlbmd0aCkge1xuICByZXR1cm4gbGVuZ3RoICogOFxufVxuXG5CeXRlRGF0YS5wcm90b3R5cGUuZ2V0TGVuZ3RoID0gZnVuY3Rpb24gZ2V0TGVuZ3RoICgpIHtcbiAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGhcbn1cblxuQnl0ZURhdGEucHJvdG90eXBlLmdldEJpdHNMZW5ndGggPSBmdW5jdGlvbiBnZXRCaXRzTGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ5dGVEYXRhLmdldEJpdHNMZW5ndGgodGhpcy5kYXRhLmxlbmd0aClcbn1cblxuQnl0ZURhdGEucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJpdEJ1ZmZlcikge1xuICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMuZGF0YS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBiaXRCdWZmZXIucHV0KHRoaXMuZGF0YVtpXSwgOClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ5dGVEYXRhXG4iLCAiY29uc3QgTW9kZSA9IHJlcXVpcmUoJy4vbW9kZScpXG5jb25zdCBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuXG5mdW5jdGlvbiBLYW5qaURhdGEgKGRhdGEpIHtcbiAgdGhpcy5tb2RlID0gTW9kZS5LQU5KSVxuICB0aGlzLmRhdGEgPSBkYXRhXG59XG5cbkthbmppRGF0YS5nZXRCaXRzTGVuZ3RoID0gZnVuY3Rpb24gZ2V0Qml0c0xlbmd0aCAobGVuZ3RoKSB7XG4gIHJldHVybiBsZW5ndGggKiAxM1xufVxuXG5LYW5qaURhdGEucHJvdG90eXBlLmdldExlbmd0aCA9IGZ1bmN0aW9uIGdldExlbmd0aCAoKSB7XG4gIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoXG59XG5cbkthbmppRGF0YS5wcm90b3R5cGUuZ2V0Qml0c0xlbmd0aCA9IGZ1bmN0aW9uIGdldEJpdHNMZW5ndGggKCkge1xuICByZXR1cm4gS2FuamlEYXRhLmdldEJpdHNMZW5ndGgodGhpcy5kYXRhLmxlbmd0aClcbn1cblxuS2FuamlEYXRhLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChiaXRCdWZmZXIpIHtcbiAgbGV0IGlcblxuICAvLyBJbiB0aGUgU2hpZnQgSklTIHN5c3RlbSwgS2FuamkgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgYSB0d28gYnl0ZSBjb21iaW5hdGlvbi5cbiAgLy8gVGhlc2UgYnl0ZSB2YWx1ZXMgYXJlIHNoaWZ0ZWQgZnJvbSB0aGUgSklTIFggMDIwOCB2YWx1ZXMuXG4gIC8vIEpJUyBYIDAyMDggZ2l2ZXMgZGV0YWlscyBvZiB0aGUgc2hpZnQgY29kZWQgcmVwcmVzZW50YXRpb24uXG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgdmFsdWUgPSBVdGlscy50b1NKSVModGhpcy5kYXRhW2ldKVxuXG4gICAgLy8gRm9yIGNoYXJhY3RlcnMgd2l0aCBTaGlmdCBKSVMgdmFsdWVzIGZyb20gMHg4MTQwIHRvIDB4OUZGQzpcbiAgICBpZiAodmFsdWUgPj0gMHg4MTQwICYmIHZhbHVlIDw9IDB4OUZGQykge1xuICAgICAgLy8gU3VidHJhY3QgMHg4MTQwIGZyb20gU2hpZnQgSklTIHZhbHVlXG4gICAgICB2YWx1ZSAtPSAweDgxNDBcblxuICAgIC8vIEZvciBjaGFyYWN0ZXJzIHdpdGggU2hpZnQgSklTIHZhbHVlcyBmcm9tIDB4RTA0MCB0byAweEVCQkZcbiAgICB9IGVsc2UgaWYgKHZhbHVlID49IDB4RTA0MCAmJiB2YWx1ZSA8PSAweEVCQkYpIHtcbiAgICAgIC8vIFN1YnRyYWN0IDB4QzE0MCBmcm9tIFNoaWZ0IEpJUyB2YWx1ZVxuICAgICAgdmFsdWUgLT0gMHhDMTQwXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgU0pJUyBjaGFyYWN0ZXI6ICcgKyB0aGlzLmRhdGFbaV0gKyAnXFxuJyArXG4gICAgICAgICdNYWtlIHN1cmUgeW91ciBjaGFyc2V0IGlzIFVURi04JylcbiAgICB9XG5cbiAgICAvLyBNdWx0aXBseSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgb2YgcmVzdWx0IGJ5IDB4QzBcbiAgICAvLyBhbmQgYWRkIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgdG8gcHJvZHVjdFxuICAgIHZhbHVlID0gKCgodmFsdWUgPj4+IDgpICYgMHhmZikgKiAweEMwKSArICh2YWx1ZSAmIDB4ZmYpXG5cbiAgICAvLyBDb252ZXJ0IHJlc3VsdCB0byBhIDEzLWJpdCBiaW5hcnkgc3RyaW5nXG4gICAgYml0QnVmZmVyLnB1dCh2YWx1ZSwgMTMpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBLYW5qaURhdGFcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIENyZWF0ZWQgMjAwOC0wOC0xOS5cbiAqXG4gKiBEaWprc3RyYSBwYXRoLWZpbmRpbmcgZnVuY3Rpb25zLiBBZGFwdGVkIGZyb20gdGhlIERpamtzdGFyIFB5dGhvbiBwcm9qZWN0LlxuICpcbiAqIENvcHlyaWdodCAoQykgMjAwOFxuICogICBXeWF0dCBCYWxkd2luIDxzZWxmQHd5YXR0YmFsZHdpbi5jb20+XG4gKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xudmFyIGRpamtzdHJhID0ge1xuICBzaW5nbGVfc291cmNlX3Nob3J0ZXN0X3BhdGhzOiBmdW5jdGlvbihncmFwaCwgcywgZCkge1xuICAgIC8vIFByZWRlY2Vzc29yIG1hcCBmb3IgZWFjaCBub2RlIHRoYXQgaGFzIGJlZW4gZW5jb3VudGVyZWQuXG4gICAgLy8gbm9kZSBJRCA9PiBwcmVkZWNlc3NvciBub2RlIElEXG4gICAgdmFyIHByZWRlY2Vzc29ycyA9IHt9O1xuXG4gICAgLy8gQ29zdHMgb2Ygc2hvcnRlc3QgcGF0aHMgZnJvbSBzIHRvIGFsbCBub2RlcyBlbmNvdW50ZXJlZC5cbiAgICAvLyBub2RlIElEID0+IGNvc3RcbiAgICB2YXIgY29zdHMgPSB7fTtcbiAgICBjb3N0c1tzXSA9IDA7XG5cbiAgICAvLyBDb3N0cyBvZiBzaG9ydGVzdCBwYXRocyBmcm9tIHMgdG8gYWxsIG5vZGVzIGVuY291bnRlcmVkOyBkaWZmZXJzIGZyb21cbiAgICAvLyBgY29zdHNgIGluIHRoYXQgaXQgcHJvdmlkZXMgZWFzeSBhY2Nlc3MgdG8gdGhlIG5vZGUgdGhhdCBjdXJyZW50bHkgaGFzXG4gICAgLy8gdGhlIGtub3duIHNob3J0ZXN0IHBhdGggZnJvbSBzLlxuICAgIC8vIFhYWDogRG8gd2UgYWN0dWFsbHkgbmVlZCBib3RoIGBjb3N0c2AgYW5kIGBvcGVuYD9cbiAgICB2YXIgb3BlbiA9IGRpamtzdHJhLlByaW9yaXR5UXVldWUubWFrZSgpO1xuICAgIG9wZW4ucHVzaChzLCAwKTtcblxuICAgIHZhciBjbG9zZXN0LFxuICAgICAgICB1LCB2LFxuICAgICAgICBjb3N0X29mX3NfdG9fdSxcbiAgICAgICAgYWRqYWNlbnRfbm9kZXMsXG4gICAgICAgIGNvc3Rfb2ZfZSxcbiAgICAgICAgY29zdF9vZl9zX3RvX3VfcGx1c19jb3N0X29mX2UsXG4gICAgICAgIGNvc3Rfb2Zfc190b192LFxuICAgICAgICBmaXJzdF92aXNpdDtcbiAgICB3aGlsZSAoIW9wZW4uZW1wdHkoKSkge1xuICAgICAgLy8gSW4gdGhlIG5vZGVzIHJlbWFpbmluZyBpbiBncmFwaCB0aGF0IGhhdmUgYSBrbm93biBjb3N0IGZyb20gcyxcbiAgICAgIC8vIGZpbmQgdGhlIG5vZGUsIHUsIHRoYXQgY3VycmVudGx5IGhhcyB0aGUgc2hvcnRlc3QgcGF0aCBmcm9tIHMuXG4gICAgICBjbG9zZXN0ID0gb3Blbi5wb3AoKTtcbiAgICAgIHUgPSBjbG9zZXN0LnZhbHVlO1xuICAgICAgY29zdF9vZl9zX3RvX3UgPSBjbG9zZXN0LmNvc3Q7XG5cbiAgICAgIC8vIEdldCBub2RlcyBhZGphY2VudCB0byB1Li4uXG4gICAgICBhZGphY2VudF9ub2RlcyA9IGdyYXBoW3VdIHx8IHt9O1xuXG4gICAgICAvLyAuLi5hbmQgZXhwbG9yZSB0aGUgZWRnZXMgdGhhdCBjb25uZWN0IHUgdG8gdGhvc2Ugbm9kZXMsIHVwZGF0aW5nXG4gICAgICAvLyB0aGUgY29zdCBvZiB0aGUgc2hvcnRlc3QgcGF0aHMgdG8gYW55IG9yIGFsbCBvZiB0aG9zZSBub2RlcyBhc1xuICAgICAgLy8gbmVjZXNzYXJ5LiB2IGlzIHRoZSBub2RlIGFjcm9zcyB0aGUgY3VycmVudCBlZGdlIGZyb20gdS5cbiAgICAgIGZvciAodiBpbiBhZGphY2VudF9ub2Rlcykge1xuICAgICAgICBpZiAoYWRqYWNlbnRfbm9kZXMuaGFzT3duUHJvcGVydHkodikpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGNvc3Qgb2YgdGhlIGVkZ2UgcnVubmluZyBmcm9tIHUgdG8gdi5cbiAgICAgICAgICBjb3N0X29mX2UgPSBhZGphY2VudF9ub2Rlc1t2XTtcblxuICAgICAgICAgIC8vIENvc3Qgb2YgcyB0byB1IHBsdXMgdGhlIGNvc3Qgb2YgdSB0byB2IGFjcm9zcyBlLS10aGlzIGlzICphKlxuICAgICAgICAgIC8vIGNvc3QgZnJvbSBzIHRvIHYgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnRcbiAgICAgICAgICAvLyBrbm93biBjb3N0IHRvIHYuXG4gICAgICAgICAgY29zdF9vZl9zX3RvX3VfcGx1c19jb3N0X29mX2UgPSBjb3N0X29mX3NfdG9fdSArIGNvc3Rfb2ZfZTtcblxuICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgdmlzaXRlZCB2IHlldCBPUiBpZiB0aGUgY3VycmVudCBrbm93biBjb3N0IGZyb20gcyB0b1xuICAgICAgICAgIC8vIHYgaXMgZ3JlYXRlciB0aGFuIHRoZSBuZXcgY29zdCB3ZSBqdXN0IGZvdW5kIChjb3N0IG9mIHMgdG8gdSBwbHVzXG4gICAgICAgICAgLy8gY29zdCBvZiB1IHRvIHYgYWNyb3NzIGUpLCB1cGRhdGUgdidzIGNvc3QgaW4gdGhlIGNvc3QgbGlzdCBhbmRcbiAgICAgICAgICAvLyB1cGRhdGUgdidzIHByZWRlY2Vzc29yIGluIHRoZSBwcmVkZWNlc3NvciBsaXN0IChpdCdzIG5vdyB1KS5cbiAgICAgICAgICBjb3N0X29mX3NfdG9fdiA9IGNvc3RzW3ZdO1xuICAgICAgICAgIGZpcnN0X3Zpc2l0ID0gKHR5cGVvZiBjb3N0c1t2XSA9PT0gJ3VuZGVmaW5lZCcpO1xuICAgICAgICAgIGlmIChmaXJzdF92aXNpdCB8fCBjb3N0X29mX3NfdG9fdiA+IGNvc3Rfb2Zfc190b191X3BsdXNfY29zdF9vZl9lKSB7XG4gICAgICAgICAgICBjb3N0c1t2XSA9IGNvc3Rfb2Zfc190b191X3BsdXNfY29zdF9vZl9lO1xuICAgICAgICAgICAgb3Blbi5wdXNoKHYsIGNvc3Rfb2Zfc190b191X3BsdXNfY29zdF9vZl9lKTtcbiAgICAgICAgICAgIHByZWRlY2Vzc29yc1t2XSA9IHU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29zdHNbZF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgbXNnID0gWydDb3VsZCBub3QgZmluZCBhIHBhdGggZnJvbSAnLCBzLCAnIHRvICcsIGQsICcuJ10uam9pbignJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJlZGVjZXNzb3JzO1xuICB9LFxuXG4gIGV4dHJhY3Rfc2hvcnRlc3RfcGF0aF9mcm9tX3ByZWRlY2Vzc29yX2xpc3Q6IGZ1bmN0aW9uKHByZWRlY2Vzc29ycywgZCkge1xuICAgIHZhciBub2RlcyA9IFtdO1xuICAgIHZhciB1ID0gZDtcbiAgICB2YXIgcHJlZGVjZXNzb3I7XG4gICAgd2hpbGUgKHUpIHtcbiAgICAgIG5vZGVzLnB1c2godSk7XG4gICAgICBwcmVkZWNlc3NvciA9IHByZWRlY2Vzc29yc1t1XTtcbiAgICAgIHUgPSBwcmVkZWNlc3NvcnNbdV07XG4gICAgfVxuICAgIG5vZGVzLnJldmVyc2UoKTtcbiAgICByZXR1cm4gbm9kZXM7XG4gIH0sXG5cbiAgZmluZF9wYXRoOiBmdW5jdGlvbihncmFwaCwgcywgZCkge1xuICAgIHZhciBwcmVkZWNlc3NvcnMgPSBkaWprc3RyYS5zaW5nbGVfc291cmNlX3Nob3J0ZXN0X3BhdGhzKGdyYXBoLCBzLCBkKTtcbiAgICByZXR1cm4gZGlqa3N0cmEuZXh0cmFjdF9zaG9ydGVzdF9wYXRoX2Zyb21fcHJlZGVjZXNzb3JfbGlzdChcbiAgICAgIHByZWRlY2Vzc29ycywgZCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEEgdmVyeSBuYWl2ZSBwcmlvcml0eSBxdWV1ZSBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIFByaW9yaXR5UXVldWU6IHtcbiAgICBtYWtlOiBmdW5jdGlvbiAob3B0cykge1xuICAgICAgdmFyIFQgPSBkaWprc3RyYS5Qcmlvcml0eVF1ZXVlLFxuICAgICAgICAgIHQgPSB7fSxcbiAgICAgICAgICBrZXk7XG4gICAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICAgIGZvciAoa2V5IGluIFQpIHtcbiAgICAgICAgaWYgKFQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHRba2V5XSA9IFRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdC5xdWV1ZSA9IFtdO1xuICAgICAgdC5zb3J0ZXIgPSBvcHRzLnNvcnRlciB8fCBULmRlZmF1bHRfc29ydGVyO1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSxcblxuICAgIGRlZmF1bHRfc29ydGVyOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEuY29zdCAtIGIuY29zdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbmV3IGl0ZW0gdG8gdGhlIHF1ZXVlIGFuZCBlbnN1cmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZWxlbWVudFxuICAgICAqIGlzIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUuXG4gICAgICovXG4gICAgcHVzaDogZnVuY3Rpb24gKHZhbHVlLCBjb3N0KSB7XG4gICAgICB2YXIgaXRlbSA9IHt2YWx1ZTogdmFsdWUsIGNvc3Q6IGNvc3R9O1xuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGl0ZW0pO1xuICAgICAgdGhpcy5xdWV1ZS5zb3J0KHRoaXMuc29ydGVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBoaWdoZXN0IHByaW9yaXR5IGVsZW1lbnQgaW4gdGhlIHF1ZXVlLlxuICAgICAqL1xuICAgIHBvcDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICB9LFxuXG4gICAgZW1wdHk6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gIH1cbn07XG5cblxuLy8gbm9kZS5qcyBtb2R1bGUgZXhwb3J0c1xuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gZGlqa3N0cmE7XG59XG4iLCAiY29uc3QgTW9kZSA9IHJlcXVpcmUoJy4vbW9kZScpXG5jb25zdCBOdW1lcmljRGF0YSA9IHJlcXVpcmUoJy4vbnVtZXJpYy1kYXRhJylcbmNvbnN0IEFscGhhbnVtZXJpY0RhdGEgPSByZXF1aXJlKCcuL2FscGhhbnVtZXJpYy1kYXRhJylcbmNvbnN0IEJ5dGVEYXRhID0gcmVxdWlyZSgnLi9ieXRlLWRhdGEnKVxuY29uc3QgS2FuamlEYXRhID0gcmVxdWlyZSgnLi9rYW5qaS1kYXRhJylcbmNvbnN0IFJlZ2V4ID0gcmVxdWlyZSgnLi9yZWdleCcpXG5jb25zdCBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuY29uc3QgZGlqa3N0cmEgPSByZXF1aXJlKCdkaWprc3RyYWpzJylcblxuLyoqXG4gKiBSZXR1cm5zIFVURjggYnl0ZSBsZW5ndGhcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHN0ciBJbnB1dCBzdHJpbmdcbiAqIEByZXR1cm4ge051bWJlcn0gICAgIE51bWJlciBvZiBieXRlXG4gKi9cbmZ1bmN0aW9uIGdldFN0cmluZ0J5dGVMZW5ndGggKHN0cikge1xuICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpLmxlbmd0aFxufVxuXG4vKipcbiAqIEdldCBhIGxpc3Qgb2Ygc2VnbWVudHMgb2YgdGhlIHNwZWNpZmllZCBtb2RlXG4gKiBmcm9tIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtICB7TW9kZX0gICBtb2RlIFNlZ21lbnQgbW9kZVxuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgIFN0cmluZyB0byBwcm9jZXNzXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgQXJyYXkgb2Ygb2JqZWN0IHdpdGggc2VnbWVudHMgZGF0YVxuICovXG5mdW5jdGlvbiBnZXRTZWdtZW50cyAocmVnZXgsIG1vZGUsIHN0cikge1xuICBjb25zdCBzZWdtZW50cyA9IFtdXG4gIGxldCByZXN1bHRcblxuICB3aGlsZSAoKHJlc3VsdCA9IHJlZ2V4LmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIGRhdGE6IHJlc3VsdFswXSxcbiAgICAgIGluZGV4OiByZXN1bHQuaW5kZXgsXG4gICAgICBtb2RlOiBtb2RlLFxuICAgICAgbGVuZ3RoOiByZXN1bHRbMF0ubGVuZ3RoXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBzZWdtZW50c1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgc2VyaWVzIG9mIHNlZ21lbnRzIHdpdGggdGhlIGFwcHJvcHJpYXRlXG4gKiBtb2RlcyBmcm9tIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBkYXRhU3RyIElucHV0IHN0cmluZ1xuICogQHJldHVybiB7QXJyYXl9ICAgICAgICAgIEFycmF5IG9mIG9iamVjdCB3aXRoIHNlZ21lbnRzIGRhdGFcbiAqL1xuZnVuY3Rpb24gZ2V0U2VnbWVudHNGcm9tU3RyaW5nIChkYXRhU3RyKSB7XG4gIGNvbnN0IG51bVNlZ3MgPSBnZXRTZWdtZW50cyhSZWdleC5OVU1FUklDLCBNb2RlLk5VTUVSSUMsIGRhdGFTdHIpXG4gIGNvbnN0IGFscGhhTnVtU2VncyA9IGdldFNlZ21lbnRzKFJlZ2V4LkFMUEhBTlVNRVJJQywgTW9kZS5BTFBIQU5VTUVSSUMsIGRhdGFTdHIpXG4gIGxldCBieXRlU2Vnc1xuICBsZXQga2FuamlTZWdzXG5cbiAgaWYgKFV0aWxzLmlzS2FuamlNb2RlRW5hYmxlZCgpKSB7XG4gICAgYnl0ZVNlZ3MgPSBnZXRTZWdtZW50cyhSZWdleC5CWVRFLCBNb2RlLkJZVEUsIGRhdGFTdHIpXG4gICAga2FuamlTZWdzID0gZ2V0U2VnbWVudHMoUmVnZXguS0FOSkksIE1vZGUuS0FOSkksIGRhdGFTdHIpXG4gIH0gZWxzZSB7XG4gICAgYnl0ZVNlZ3MgPSBnZXRTZWdtZW50cyhSZWdleC5CWVRFX0tBTkpJLCBNb2RlLkJZVEUsIGRhdGFTdHIpXG4gICAga2FuamlTZWdzID0gW11cbiAgfVxuXG4gIGNvbnN0IHNlZ3MgPSBudW1TZWdzLmNvbmNhdChhbHBoYU51bVNlZ3MsIGJ5dGVTZWdzLCBrYW5qaVNlZ3MpXG5cbiAgcmV0dXJuIHNlZ3NcbiAgICAuc29ydChmdW5jdGlvbiAoczEsIHMyKSB7XG4gICAgICByZXR1cm4gczEuaW5kZXggLSBzMi5pbmRleFxuICAgIH0pXG4gICAgLm1hcChmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBvYmouZGF0YSxcbiAgICAgICAgbW9kZTogb2JqLm1vZGUsXG4gICAgICAgIGxlbmd0aDogb2JqLmxlbmd0aFxuICAgICAgfVxuICAgIH0pXG59XG5cbi8qKlxuICogUmV0dXJucyBob3cgbWFueSBiaXRzIGFyZSBuZWVkZWQgdG8gZW5jb2RlIGEgc3RyaW5nIG9mXG4gKiBzcGVjaWZpZWQgbGVuZ3RoIHdpdGggdGhlIHNwZWNpZmllZCBtb2RlXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSBsZW5ndGggU3RyaW5nIGxlbmd0aFxuICogQHBhcmFtICB7TW9kZX0gbW9kZSAgICAgU2VnbWVudCBtb2RlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICBCaXQgbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIGdldFNlZ21lbnRCaXRzTGVuZ3RoIChsZW5ndGgsIG1vZGUpIHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBNb2RlLk5VTUVSSUM6XG4gICAgICByZXR1cm4gTnVtZXJpY0RhdGEuZ2V0Qml0c0xlbmd0aChsZW5ndGgpXG4gICAgY2FzZSBNb2RlLkFMUEhBTlVNRVJJQzpcbiAgICAgIHJldHVybiBBbHBoYW51bWVyaWNEYXRhLmdldEJpdHNMZW5ndGgobGVuZ3RoKVxuICAgIGNhc2UgTW9kZS5LQU5KSTpcbiAgICAgIHJldHVybiBLYW5qaURhdGEuZ2V0Qml0c0xlbmd0aChsZW5ndGgpXG4gICAgY2FzZSBNb2RlLkJZVEU6XG4gICAgICByZXR1cm4gQnl0ZURhdGEuZ2V0Qml0c0xlbmd0aChsZW5ndGgpXG4gIH1cbn1cblxuLyoqXG4gKiBNZXJnZXMgYWRqYWNlbnQgc2VnbWVudHMgd2hpY2ggaGF2ZSB0aGUgc2FtZSBtb2RlXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IHNlZ3MgQXJyYXkgb2Ygb2JqZWN0IHdpdGggc2VnbWVudHMgZGF0YVxuICogQHJldHVybiB7QXJyYXl9ICAgICAgQXJyYXkgb2Ygb2JqZWN0IHdpdGggc2VnbWVudHMgZGF0YVxuICovXG5mdW5jdGlvbiBtZXJnZVNlZ21lbnRzIChzZWdzKSB7XG4gIHJldHVybiBzZWdzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjdXJyKSB7XG4gICAgY29uc3QgcHJldlNlZyA9IGFjYy5sZW5ndGggLSAxID49IDAgPyBhY2NbYWNjLmxlbmd0aCAtIDFdIDogbnVsbFxuICAgIGlmIChwcmV2U2VnICYmIHByZXZTZWcubW9kZSA9PT0gY3Vyci5tb2RlKSB7XG4gICAgICBhY2NbYWNjLmxlbmd0aCAtIDFdLmRhdGEgKz0gY3Vyci5kYXRhXG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuXG4gICAgYWNjLnB1c2goY3VycilcbiAgICByZXR1cm4gYWNjXG4gIH0sIFtdKVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIG5vZGVzIGNvbWJpbmF0aW9uIHdoaWNoXG4gKiB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgYSBzZWdtZW50cyBncmFwaC5cbiAqXG4gKiBOb2RlcyBhcmUgZGl2aWRlZCBieSBncm91cHMuIEVhY2ggZ3JvdXAgd2lsbCBjb250YWluIGEgbGlzdCBvZiBhbGwgdGhlIG1vZGVzXG4gKiBpbiB3aGljaCBpcyBwb3NzaWJsZSB0byBlbmNvZGUgdGhlIGdpdmVuIHRleHQuXG4gKlxuICogRm9yIGV4YW1wbGUgdGhlIHRleHQgJzEyMzQ1JyBjYW4gYmUgZW5jb2RlZCBhcyBOdW1lcmljLCBBbHBoYW51bWVyaWMgb3IgQnl0ZS5cbiAqIFRoZSBncm91cCBmb3IgJzEyMzQ1JyB3aWxsIGNvbnRhaW4gdGhlbiAzIG9iamVjdHMsIG9uZSBmb3IgZWFjaFxuICogcG9zc2libGUgZW5jb2RpbmcgbW9kZS5cbiAqXG4gKiBFYWNoIG5vZGUgcmVwcmVzZW50cyBhIHBvc3NpYmxlIHNlZ21lbnQuXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IHNlZ3MgQXJyYXkgb2Ygb2JqZWN0IHdpdGggc2VnbWVudHMgZGF0YVxuICogQHJldHVybiB7QXJyYXl9ICAgICAgQXJyYXkgb2Ygb2JqZWN0IHdpdGggc2VnbWVudHMgZGF0YVxuICovXG5mdW5jdGlvbiBidWlsZE5vZGVzIChzZWdzKSB7XG4gIGNvbnN0IG5vZGVzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2VnID0gc2Vnc1tpXVxuXG4gICAgc3dpdGNoIChzZWcubW9kZSkge1xuICAgICAgY2FzZSBNb2RlLk5VTUVSSUM6XG4gICAgICAgIG5vZGVzLnB1c2goW3NlZyxcbiAgICAgICAgICB7IGRhdGE6IHNlZy5kYXRhLCBtb2RlOiBNb2RlLkFMUEhBTlVNRVJJQywgbGVuZ3RoOiBzZWcubGVuZ3RoIH0sXG4gICAgICAgICAgeyBkYXRhOiBzZWcuZGF0YSwgbW9kZTogTW9kZS5CWVRFLCBsZW5ndGg6IHNlZy5sZW5ndGggfVxuICAgICAgICBdKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBNb2RlLkFMUEhBTlVNRVJJQzpcbiAgICAgICAgbm9kZXMucHVzaChbc2VnLFxuICAgICAgICAgIHsgZGF0YTogc2VnLmRhdGEsIG1vZGU6IE1vZGUuQllURSwgbGVuZ3RoOiBzZWcubGVuZ3RoIH1cbiAgICAgICAgXSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgTW9kZS5LQU5KSTpcbiAgICAgICAgbm9kZXMucHVzaChbc2VnLFxuICAgICAgICAgIHsgZGF0YTogc2VnLmRhdGEsIG1vZGU6IE1vZGUuQllURSwgbGVuZ3RoOiBnZXRTdHJpbmdCeXRlTGVuZ3RoKHNlZy5kYXRhKSB9XG4gICAgICAgIF0pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIE1vZGUuQllURTpcbiAgICAgICAgbm9kZXMucHVzaChbXG4gICAgICAgICAgeyBkYXRhOiBzZWcuZGF0YSwgbW9kZTogTW9kZS5CWVRFLCBsZW5ndGg6IGdldFN0cmluZ0J5dGVMZW5ndGgoc2VnLmRhdGEpIH1cbiAgICAgICAgXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZXNcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBncmFwaCBmcm9tIGEgbGlzdCBvZiBub2Rlcy5cbiAqIEFsbCBzZWdtZW50cyBpbiBlYWNoIG5vZGUgZ3JvdXAgd2lsbCBiZSBjb25uZWN0ZWQgd2l0aCBhbGwgdGhlIHNlZ21lbnRzIG9mXG4gKiB0aGUgbmV4dCBncm91cCBhbmQgc28gb24uXG4gKlxuICogQXQgZWFjaCBjb25uZWN0aW9uIHdpbGwgYmUgYXNzaWduZWQgYSB3ZWlnaHQgZGVwZW5kaW5nIG9uIHRoZVxuICogc2VnbWVudCdzIGJ5dGUgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSAge0FycmF5fSBub2RlcyAgICBBcnJheSBvZiBvYmplY3Qgd2l0aCBzZWdtZW50cyBkYXRhXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHZlcnNpb24gUVIgQ29kZSB2ZXJzaW9uXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgR3JhcGggb2YgYWxsIHBvc3NpYmxlIHNlZ21lbnRzXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkR3JhcGggKG5vZGVzLCB2ZXJzaW9uKSB7XG4gIGNvbnN0IHRhYmxlID0ge31cbiAgY29uc3QgZ3JhcGggPSB7IHN0YXJ0OiB7fSB9XG4gIGxldCBwcmV2Tm9kZUlkcyA9IFsnc3RhcnQnXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBub2RlR3JvdXAgPSBub2Rlc1tpXVxuICAgIGNvbnN0IGN1cnJlbnROb2RlSWRzID0gW11cblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZUdyb3VwLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZUdyb3VwW2pdXG4gICAgICBjb25zdCBrZXkgPSAnJyArIGkgKyBqXG5cbiAgICAgIGN1cnJlbnROb2RlSWRzLnB1c2goa2V5KVxuICAgICAgdGFibGVba2V5XSA9IHsgbm9kZTogbm9kZSwgbGFzdENvdW50OiAwIH1cbiAgICAgIGdyYXBoW2tleV0gPSB7fVxuXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHByZXZOb2RlSWRzLmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGNvbnN0IHByZXZOb2RlSWQgPSBwcmV2Tm9kZUlkc1tuXVxuXG4gICAgICAgIGlmICh0YWJsZVtwcmV2Tm9kZUlkXSAmJiB0YWJsZVtwcmV2Tm9kZUlkXS5ub2RlLm1vZGUgPT09IG5vZGUubW9kZSkge1xuICAgICAgICAgIGdyYXBoW3ByZXZOb2RlSWRdW2tleV0gPVxuICAgICAgICAgICAgZ2V0U2VnbWVudEJpdHNMZW5ndGgodGFibGVbcHJldk5vZGVJZF0ubGFzdENvdW50ICsgbm9kZS5sZW5ndGgsIG5vZGUubW9kZSkgLVxuICAgICAgICAgICAgZ2V0U2VnbWVudEJpdHNMZW5ndGgodGFibGVbcHJldk5vZGVJZF0ubGFzdENvdW50LCBub2RlLm1vZGUpXG5cbiAgICAgICAgICB0YWJsZVtwcmV2Tm9kZUlkXS5sYXN0Q291bnQgKz0gbm9kZS5sZW5ndGhcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGFibGVbcHJldk5vZGVJZF0pIHRhYmxlW3ByZXZOb2RlSWRdLmxhc3RDb3VudCA9IG5vZGUubGVuZ3RoXG5cbiAgICAgICAgICBncmFwaFtwcmV2Tm9kZUlkXVtrZXldID0gZ2V0U2VnbWVudEJpdHNMZW5ndGgobm9kZS5sZW5ndGgsIG5vZGUubW9kZSkgK1xuICAgICAgICAgICAgNCArIE1vZGUuZ2V0Q2hhckNvdW50SW5kaWNhdG9yKG5vZGUubW9kZSwgdmVyc2lvbikgLy8gc3dpdGNoIGNvc3RcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByZXZOb2RlSWRzID0gY3VycmVudE5vZGVJZHNcbiAgfVxuXG4gIGZvciAobGV0IG4gPSAwOyBuIDwgcHJldk5vZGVJZHMubGVuZ3RoOyBuKyspIHtcbiAgICBncmFwaFtwcmV2Tm9kZUlkc1tuXV0uZW5kID0gMFxuICB9XG5cbiAgcmV0dXJuIHsgbWFwOiBncmFwaCwgdGFibGU6IHRhYmxlIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBzZWdtZW50IGZyb20gYSBzcGVjaWZpZWQgZGF0YSBhbmQgbW9kZS5cbiAqIElmIGEgbW9kZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbW9yZSBzdWl0YWJsZSB3aWxsIGJlIHVzZWQuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBkYXRhICAgICAgICAgICAgIElucHV0IGRhdGFcbiAqIEBwYXJhbSAge01vZGUgfCBTdHJpbmd9IG1vZGVzSGludCBEYXRhIG1vZGVcbiAqIEByZXR1cm4ge1NlZ21lbnR9ICAgICAgICAgICAgICAgICBTZWdtZW50XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2luZ2xlU2VnbWVudCAoZGF0YSwgbW9kZXNIaW50KSB7XG4gIGxldCBtb2RlXG4gIGNvbnN0IGJlc3RNb2RlID0gTW9kZS5nZXRCZXN0TW9kZUZvckRhdGEoZGF0YSlcblxuICBtb2RlID0gTW9kZS5mcm9tKG1vZGVzSGludCwgYmVzdE1vZGUpXG5cbiAgLy8gTWFrZSBzdXJlIGRhdGEgY2FuIGJlIGVuY29kZWRcbiAgaWYgKG1vZGUgIT09IE1vZGUuQllURSAmJiBtb2RlLmJpdCA8IGJlc3RNb2RlLmJpdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignXCInICsgZGF0YSArICdcIicgK1xuICAgICAgJyBjYW5ub3QgYmUgZW5jb2RlZCB3aXRoIG1vZGUgJyArIE1vZGUudG9TdHJpbmcobW9kZSkgK1xuICAgICAgJy5cXG4gU3VnZ2VzdGVkIG1vZGUgaXM6ICcgKyBNb2RlLnRvU3RyaW5nKGJlc3RNb2RlKSlcbiAgfVxuXG4gIC8vIFVzZSBNb2RlLkJZVEUgaWYgS2Fuamkgc3VwcG9ydCBpcyBkaXNhYmxlZFxuICBpZiAobW9kZSA9PT0gTW9kZS5LQU5KSSAmJiAhVXRpbHMuaXNLYW5qaU1vZGVFbmFibGVkKCkpIHtcbiAgICBtb2RlID0gTW9kZS5CWVRFXG4gIH1cblxuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlIE1vZGUuTlVNRVJJQzpcbiAgICAgIHJldHVybiBuZXcgTnVtZXJpY0RhdGEoZGF0YSlcblxuICAgIGNhc2UgTW9kZS5BTFBIQU5VTUVSSUM6XG4gICAgICByZXR1cm4gbmV3IEFscGhhbnVtZXJpY0RhdGEoZGF0YSlcblxuICAgIGNhc2UgTW9kZS5LQU5KSTpcbiAgICAgIHJldHVybiBuZXcgS2FuamlEYXRhKGRhdGEpXG5cbiAgICBjYXNlIE1vZGUuQllURTpcbiAgICAgIHJldHVybiBuZXcgQnl0ZURhdGEoZGF0YSlcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGxpc3Qgb2Ygc2VnbWVudHMgZnJvbSBhbiBhcnJheS5cbiAqIEFycmF5IGNhbiBjb250YWluIFN0cmluZ3Mgb3IgT2JqZWN0cyB3aXRoIHNlZ21lbnQncyBpbmZvLlxuICpcbiAqIEZvciBlYWNoIGl0ZW0gd2hpY2ggaXMgYSBzdHJpbmcsIHdpbGwgYmUgZ2VuZXJhdGVkIGEgc2VnbWVudCB3aXRoIHRoZSBnaXZlblxuICogc3RyaW5nIGFuZCB0aGUgbW9yZSBhcHByb3ByaWF0ZSBlbmNvZGluZyBtb2RlLlxuICpcbiAqIEZvciBlYWNoIGl0ZW0gd2hpY2ggaXMgYW4gb2JqZWN0LCB3aWxsIGJlIGdlbmVyYXRlZCBhIHNlZ21lbnQgd2l0aCB0aGUgZ2l2ZW5cbiAqIGRhdGEgYW5kIG1vZGUuXG4gKiBPYmplY3RzIG11c3QgY29udGFpbiBhdCBsZWFzdCB0aGUgcHJvcGVydHkgXCJkYXRhXCIuXG4gKiBJZiBwcm9wZXJ0eSBcIm1vZGVcIiBpcyBub3QgcHJlc2VudCwgdGhlIG1vcmUgc3VpdGFibGUgbW9kZSB3aWxsIGJlIHVzZWQuXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IGFycmF5IEFycmF5IG9mIG9iamVjdHMgd2l0aCBzZWdtZW50cyBkYXRhXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgQXJyYXkgb2YgU2VnbWVudHNcbiAqL1xuZXhwb3J0cy5mcm9tQXJyYXkgPSBmdW5jdGlvbiBmcm9tQXJyYXkgKGFycmF5KSB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgc2VnKSB7XG4gICAgaWYgKHR5cGVvZiBzZWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhY2MucHVzaChidWlsZFNpbmdsZVNlZ21lbnQoc2VnLCBudWxsKSlcbiAgICB9IGVsc2UgaWYgKHNlZy5kYXRhKSB7XG4gICAgICBhY2MucHVzaChidWlsZFNpbmdsZVNlZ21lbnQoc2VnLmRhdGEsIHNlZy5tb2RlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjXG4gIH0sIFtdKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhbiBvcHRpbWl6ZWQgc2VxdWVuY2Ugb2Ygc2VnbWVudHMgZnJvbSBhIHN0cmluZyxcbiAqIHdoaWNoIHdpbGwgcHJvZHVjZSB0aGUgc2hvcnRlc3QgcG9zc2libGUgYml0c3RyZWFtLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gZGF0YSAgICBJbnB1dCBzdHJpbmdcbiAqIEBwYXJhbSAge051bWJlcn0gdmVyc2lvbiBRUiBDb2RlIHZlcnNpb25cbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICBBcnJheSBvZiBzZWdtZW50c1xuICovXG5leHBvcnRzLmZyb21TdHJpbmcgPSBmdW5jdGlvbiBmcm9tU3RyaW5nIChkYXRhLCB2ZXJzaW9uKSB7XG4gIGNvbnN0IHNlZ3MgPSBnZXRTZWdtZW50c0Zyb21TdHJpbmcoZGF0YSwgVXRpbHMuaXNLYW5qaU1vZGVFbmFibGVkKCkpXG5cbiAgY29uc3Qgbm9kZXMgPSBidWlsZE5vZGVzKHNlZ3MpXG4gIGNvbnN0IGdyYXBoID0gYnVpbGRHcmFwaChub2RlcywgdmVyc2lvbilcbiAgY29uc3QgcGF0aCA9IGRpamtzdHJhLmZpbmRfcGF0aChncmFwaC5tYXAsICdzdGFydCcsICdlbmQnKVxuXG4gIGNvbnN0IG9wdGltaXplZFNlZ3MgPSBbXVxuICBmb3IgKGxldCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgb3B0aW1pemVkU2Vncy5wdXNoKGdyYXBoLnRhYmxlW3BhdGhbaV1dLm5vZGUpXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy5mcm9tQXJyYXkobWVyZ2VTZWdtZW50cyhvcHRpbWl6ZWRTZWdzKSlcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBzdHJpbmcgaW4gdmFyaW91cyBzZWdtZW50cyB3aXRoIHRoZSBtb2RlcyB3aGljaFxuICogYmVzdCByZXByZXNlbnQgdGhlaXIgY29udGVudC5cbiAqIFRoZSBwcm9kdWNlZCBzZWdtZW50cyBhcmUgZmFyIGZyb20gYmVpbmcgb3B0aW1pemVkLlxuICogVGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB0byBlc3RpbWF0ZSBhIFFSIENvZGUgdmVyc2lvblxuICogd2hpY2ggbWF5IGNvbnRhaW4gdGhlIGRhdGEuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBkYXRhIElucHV0IHN0cmluZ1xuICogQHJldHVybiB7QXJyYXl9ICAgICAgIEFycmF5IG9mIHNlZ21lbnRzXG4gKi9cbmV4cG9ydHMucmF3U3BsaXQgPSBmdW5jdGlvbiByYXdTcGxpdCAoZGF0YSkge1xuICByZXR1cm4gZXhwb3J0cy5mcm9tQXJyYXkoXG4gICAgZ2V0U2VnbWVudHNGcm9tU3RyaW5nKGRhdGEsIFV0aWxzLmlzS2FuamlNb2RlRW5hYmxlZCgpKVxuICApXG59XG4iLCAiY29uc3QgVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJylcbmNvbnN0IEVDTGV2ZWwgPSByZXF1aXJlKCcuL2Vycm9yLWNvcnJlY3Rpb24tbGV2ZWwnKVxuY29uc3QgQml0QnVmZmVyID0gcmVxdWlyZSgnLi9iaXQtYnVmZmVyJylcbmNvbnN0IEJpdE1hdHJpeCA9IHJlcXVpcmUoJy4vYml0LW1hdHJpeCcpXG5jb25zdCBBbGlnbm1lbnRQYXR0ZXJuID0gcmVxdWlyZSgnLi9hbGlnbm1lbnQtcGF0dGVybicpXG5jb25zdCBGaW5kZXJQYXR0ZXJuID0gcmVxdWlyZSgnLi9maW5kZXItcGF0dGVybicpXG5jb25zdCBNYXNrUGF0dGVybiA9IHJlcXVpcmUoJy4vbWFzay1wYXR0ZXJuJylcbmNvbnN0IEVDQ29kZSA9IHJlcXVpcmUoJy4vZXJyb3ItY29ycmVjdGlvbi1jb2RlJylcbmNvbnN0IFJlZWRTb2xvbW9uRW5jb2RlciA9IHJlcXVpcmUoJy4vcmVlZC1zb2xvbW9uLWVuY29kZXInKVxuY29uc3QgVmVyc2lvbiA9IHJlcXVpcmUoJy4vdmVyc2lvbicpXG5jb25zdCBGb3JtYXRJbmZvID0gcmVxdWlyZSgnLi9mb3JtYXQtaW5mbycpXG5jb25zdCBNb2RlID0gcmVxdWlyZSgnLi9tb2RlJylcbmNvbnN0IFNlZ21lbnRzID0gcmVxdWlyZSgnLi9zZWdtZW50cycpXG5cbi8qKlxuICogUVJDb2RlIGZvciBKYXZhU2NyaXB0XG4gKlxuICogbW9kaWZpZWQgYnkgUnlhbiBEYXkgZm9yIG5vZGVqcyBzdXBwb3J0XG4gKiBDb3B5cmlnaHQgKGMpIDIwMTEgUnlhbiBEYXlcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gKlxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFFSQ29kZSBmb3IgSmF2YVNjcmlwdFxuLy9cbi8vIENvcHlyaWdodCAoYykgMjAwOSBLYXp1aGlrbyBBcmFzZVxuLy9cbi8vIFVSTDogaHR0cDovL3d3dy5kLXByb2plY3QuY29tL1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbi8vICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbi8vXG4vLyBUaGUgd29yZCBcIlFSIENvZGVcIiBpcyByZWdpc3RlcmVkIHRyYWRlbWFyayBvZlxuLy8gREVOU08gV0FWRSBJTkNPUlBPUkFURURcbi8vICAgaHR0cDovL3d3dy5kZW5zby13YXZlLmNvbS9xcmNvZGUvZmFxcGF0ZW50LWUuaHRtbFxuLy9cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4qL1xuXG4vKipcbiAqIEFkZCBmaW5kZXIgcGF0dGVybnMgYml0cyB0byBtYXRyaXhcbiAqXG4gKiBAcGFyYW0gIHtCaXRNYXRyaXh9IG1hdHJpeCAgTW9kdWxlcyBtYXRyaXhcbiAqIEBwYXJhbSAge051bWJlcn0gICAgdmVyc2lvbiBRUiBDb2RlIHZlcnNpb25cbiAqL1xuZnVuY3Rpb24gc2V0dXBGaW5kZXJQYXR0ZXJuIChtYXRyaXgsIHZlcnNpb24pIHtcbiAgY29uc3Qgc2l6ZSA9IG1hdHJpeC5zaXplXG4gIGNvbnN0IHBvcyA9IEZpbmRlclBhdHRlcm4uZ2V0UG9zaXRpb25zKHZlcnNpb24pXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCByb3cgPSBwb3NbaV1bMF1cbiAgICBjb25zdCBjb2wgPSBwb3NbaV1bMV1cblxuICAgIGZvciAobGV0IHIgPSAtMTsgciA8PSA3OyByKyspIHtcbiAgICAgIGlmIChyb3cgKyByIDw9IC0xIHx8IHNpemUgPD0gcm93ICsgcikgY29udGludWVcblxuICAgICAgZm9yIChsZXQgYyA9IC0xOyBjIDw9IDc7IGMrKykge1xuICAgICAgICBpZiAoY29sICsgYyA8PSAtMSB8fCBzaXplIDw9IGNvbCArIGMpIGNvbnRpbnVlXG5cbiAgICAgICAgaWYgKChyID49IDAgJiYgciA8PSA2ICYmIChjID09PSAwIHx8IGMgPT09IDYpKSB8fFxuICAgICAgICAgIChjID49IDAgJiYgYyA8PSA2ICYmIChyID09PSAwIHx8IHIgPT09IDYpKSB8fFxuICAgICAgICAgIChyID49IDIgJiYgciA8PSA0ICYmIGMgPj0gMiAmJiBjIDw9IDQpKSB7XG4gICAgICAgICAgbWF0cml4LnNldChyb3cgKyByLCBjb2wgKyBjLCB0cnVlLCB0cnVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdHJpeC5zZXQocm93ICsgciwgY29sICsgYywgZmFsc2UsIHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgdGltaW5nIHBhdHRlcm4gYml0cyB0byBtYXRyaXhcbiAqXG4gKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgc2V0dXBBbGlnbm1lbnRQYXR0ZXJufVxuICpcbiAqIEBwYXJhbSAge0JpdE1hdHJpeH0gbWF0cml4IE1vZHVsZXMgbWF0cml4XG4gKi9cbmZ1bmN0aW9uIHNldHVwVGltaW5nUGF0dGVybiAobWF0cml4KSB7XG4gIGNvbnN0IHNpemUgPSBtYXRyaXguc2l6ZVxuXG4gIGZvciAobGV0IHIgPSA4OyByIDwgc2l6ZSAtIDg7IHIrKykge1xuICAgIGNvbnN0IHZhbHVlID0gciAlIDIgPT09IDBcbiAgICBtYXRyaXguc2V0KHIsIDYsIHZhbHVlLCB0cnVlKVxuICAgIG1hdHJpeC5zZXQoNiwgciwgdmFsdWUsIHRydWUpXG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgYWxpZ25tZW50IHBhdHRlcm5zIGJpdHMgdG8gbWF0cml4XG4gKlxuICogTm90ZTogdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgc2V0dXBUaW1pbmdQYXR0ZXJufVxuICpcbiAqIEBwYXJhbSAge0JpdE1hdHJpeH0gbWF0cml4ICBNb2R1bGVzIG1hdHJpeFxuICogQHBhcmFtICB7TnVtYmVyfSAgICB2ZXJzaW9uIFFSIENvZGUgdmVyc2lvblxuICovXG5mdW5jdGlvbiBzZXR1cEFsaWdubWVudFBhdHRlcm4gKG1hdHJpeCwgdmVyc2lvbikge1xuICBjb25zdCBwb3MgPSBBbGlnbm1lbnRQYXR0ZXJuLmdldFBvc2l0aW9ucyh2ZXJzaW9uKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgcm93ID0gcG9zW2ldWzBdXG4gICAgY29uc3QgY29sID0gcG9zW2ldWzFdXG5cbiAgICBmb3IgKGxldCByID0gLTI7IHIgPD0gMjsgcisrKSB7XG4gICAgICBmb3IgKGxldCBjID0gLTI7IGMgPD0gMjsgYysrKSB7XG4gICAgICAgIGlmIChyID09PSAtMiB8fCByID09PSAyIHx8IGMgPT09IC0yIHx8IGMgPT09IDIgfHxcbiAgICAgICAgICAociA9PT0gMCAmJiBjID09PSAwKSkge1xuICAgICAgICAgIG1hdHJpeC5zZXQocm93ICsgciwgY29sICsgYywgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXRyaXguc2V0KHJvdyArIHIsIGNvbCArIGMsIGZhbHNlLCB0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWRkIHZlcnNpb24gaW5mbyBiaXRzIHRvIG1hdHJpeFxuICpcbiAqIEBwYXJhbSAge0JpdE1hdHJpeH0gbWF0cml4ICBNb2R1bGVzIG1hdHJpeFxuICogQHBhcmFtICB7TnVtYmVyfSAgICB2ZXJzaW9uIFFSIENvZGUgdmVyc2lvblxuICovXG5mdW5jdGlvbiBzZXR1cFZlcnNpb25JbmZvIChtYXRyaXgsIHZlcnNpb24pIHtcbiAgY29uc3Qgc2l6ZSA9IG1hdHJpeC5zaXplXG4gIGNvbnN0IGJpdHMgPSBWZXJzaW9uLmdldEVuY29kZWRCaXRzKHZlcnNpb24pXG4gIGxldCByb3csIGNvbCwgbW9kXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxODsgaSsrKSB7XG4gICAgcm93ID0gTWF0aC5mbG9vcihpIC8gMylcbiAgICBjb2wgPSBpICUgMyArIHNpemUgLSA4IC0gM1xuICAgIG1vZCA9ICgoYml0cyA+PiBpKSAmIDEpID09PSAxXG5cbiAgICBtYXRyaXguc2V0KHJvdywgY29sLCBtb2QsIHRydWUpXG4gICAgbWF0cml4LnNldChjb2wsIHJvdywgbW9kLCB0cnVlKVxuICB9XG59XG5cbi8qKlxuICogQWRkIGZvcm1hdCBpbmZvIGJpdHMgdG8gbWF0cml4XG4gKlxuICogQHBhcmFtICB7Qml0TWF0cml4fSBtYXRyaXggICAgICAgICAgICAgICBNb2R1bGVzIG1hdHJpeFxuICogQHBhcmFtICB7RXJyb3JDb3JyZWN0aW9uTGV2ZWx9ICAgIGVycm9yQ29ycmVjdGlvbkxldmVsIEVycm9yIGNvcnJlY3Rpb24gbGV2ZWxcbiAqIEBwYXJhbSAge051bWJlcn0gICAgbWFza1BhdHRlcm4gICAgICAgICAgTWFzayBwYXR0ZXJuIHJlZmVyZW5jZSB2YWx1ZVxuICovXG5mdW5jdGlvbiBzZXR1cEZvcm1hdEluZm8gKG1hdHJpeCwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIG1hc2tQYXR0ZXJuKSB7XG4gIGNvbnN0IHNpemUgPSBtYXRyaXguc2l6ZVxuICBjb25zdCBiaXRzID0gRm9ybWF0SW5mby5nZXRFbmNvZGVkQml0cyhlcnJvckNvcnJlY3Rpb25MZXZlbCwgbWFza1BhdHRlcm4pXG4gIGxldCBpLCBtb2RcblxuICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykge1xuICAgIG1vZCA9ICgoYml0cyA+PiBpKSAmIDEpID09PSAxXG5cbiAgICAvLyB2ZXJ0aWNhbFxuICAgIGlmIChpIDwgNikge1xuICAgICAgbWF0cml4LnNldChpLCA4LCBtb2QsIHRydWUpXG4gICAgfSBlbHNlIGlmIChpIDwgOCkge1xuICAgICAgbWF0cml4LnNldChpICsgMSwgOCwgbW9kLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXRyaXguc2V0KHNpemUgLSAxNSArIGksIDgsIG1vZCwgdHJ1ZSlcbiAgICB9XG5cbiAgICAvLyBob3Jpem9udGFsXG4gICAgaWYgKGkgPCA4KSB7XG4gICAgICBtYXRyaXguc2V0KDgsIHNpemUgLSBpIC0gMSwgbW9kLCB0cnVlKVxuICAgIH0gZWxzZSBpZiAoaSA8IDkpIHtcbiAgICAgIG1hdHJpeC5zZXQoOCwgMTUgLSBpIC0gMSArIDEsIG1vZCwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgbWF0cml4LnNldCg4LCAxNSAtIGkgLSAxLCBtb2QsIHRydWUpXG4gICAgfVxuICB9XG5cbiAgLy8gZml4ZWQgbW9kdWxlXG4gIG1hdHJpeC5zZXQoc2l6ZSAtIDgsIDgsIDEsIHRydWUpXG59XG5cbi8qKlxuICogQWRkIGVuY29kZWQgZGF0YSBiaXRzIHRvIG1hdHJpeFxuICpcbiAqIEBwYXJhbSAge0JpdE1hdHJpeH0gIG1hdHJpeCBNb2R1bGVzIG1hdHJpeFxuICogQHBhcmFtICB7VWludDhBcnJheX0gZGF0YSAgIERhdGEgY29kZXdvcmRzXG4gKi9cbmZ1bmN0aW9uIHNldHVwRGF0YSAobWF0cml4LCBkYXRhKSB7XG4gIGNvbnN0IHNpemUgPSBtYXRyaXguc2l6ZVxuICBsZXQgaW5jID0gLTFcbiAgbGV0IHJvdyA9IHNpemUgLSAxXG4gIGxldCBiaXRJbmRleCA9IDdcbiAgbGV0IGJ5dGVJbmRleCA9IDBcblxuICBmb3IgKGxldCBjb2wgPSBzaXplIC0gMTsgY29sID4gMDsgY29sIC09IDIpIHtcbiAgICBpZiAoY29sID09PSA2KSBjb2wtLVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgMjsgYysrKSB7XG4gICAgICAgIGlmICghbWF0cml4LmlzUmVzZXJ2ZWQocm93LCBjb2wgLSBjKSkge1xuICAgICAgICAgIGxldCBkYXJrID0gZmFsc2VcblxuICAgICAgICAgIGlmIChieXRlSW5kZXggPCBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgZGFyayA9ICgoKGRhdGFbYnl0ZUluZGV4XSA+Pj4gYml0SW5kZXgpICYgMSkgPT09IDEpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWF0cml4LnNldChyb3csIGNvbCAtIGMsIGRhcmspXG4gICAgICAgICAgYml0SW5kZXgtLVxuXG4gICAgICAgICAgaWYgKGJpdEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgYnl0ZUluZGV4KytcbiAgICAgICAgICAgIGJpdEluZGV4ID0gN1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByb3cgKz0gaW5jXG5cbiAgICAgIGlmIChyb3cgPCAwIHx8IHNpemUgPD0gcm93KSB7XG4gICAgICAgIHJvdyAtPSBpbmNcbiAgICAgICAgaW5jID0gLWluY1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBlbmNvZGVkIGNvZGV3b3JkcyBmcm9tIGRhdGEgaW5wdXRcbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgdmVyc2lvbiAgICAgICAgICAgICAgUVIgQ29kZSB2ZXJzaW9uXG4gKiBAcGFyYW0gIHtFcnJvckNvcnJlY3Rpb25MZXZlbH0gICBlcnJvckNvcnJlY3Rpb25MZXZlbCBFcnJvciBjb3JyZWN0aW9uIGxldmVsXG4gKiBAcGFyYW0gIHtCeXRlRGF0YX0gZGF0YSAgICAgICAgICAgICAgICAgRGF0YSBpbnB1dFxuICogQHJldHVybiB7VWludDhBcnJheX0gICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBjb250YWluaW5nIGVuY29kZWQgY29kZXdvcmRzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURhdGEgKHZlcnNpb24sIGVycm9yQ29ycmVjdGlvbkxldmVsLCBzZWdtZW50cykge1xuICAvLyBQcmVwYXJlIGRhdGEgYnVmZmVyXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBCaXRCdWZmZXIoKVxuXG4gIHNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAvLyBwcmVmaXggZGF0YSB3aXRoIG1vZGUgaW5kaWNhdG9yICg0IGJpdHMpXG4gICAgYnVmZmVyLnB1dChkYXRhLm1vZGUuYml0LCA0KVxuXG4gICAgLy8gUHJlZml4IGRhdGEgd2l0aCBjaGFyYWN0ZXIgY291bnQgaW5kaWNhdG9yLlxuICAgIC8vIFRoZSBjaGFyYWN0ZXIgY291bnQgaW5kaWNhdG9yIGlzIGEgc3RyaW5nIG9mIGJpdHMgdGhhdCByZXByZXNlbnRzIHRoZVxuICAgIC8vIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGJlaW5nIGVuY29kZWQuXG4gICAgLy8gVGhlIGNoYXJhY3RlciBjb3VudCBpbmRpY2F0b3IgbXVzdCBiZSBwbGFjZWQgYWZ0ZXIgdGhlIG1vZGUgaW5kaWNhdG9yXG4gICAgLy8gYW5kIG11c3QgYmUgYSBjZXJ0YWluIG51bWJlciBvZiBiaXRzIGxvbmcsIGRlcGVuZGluZyBvbiB0aGUgUVIgdmVyc2lvblxuICAgIC8vIGFuZCBkYXRhIG1vZGVcbiAgICAvLyBAc2VlIHtAbGluayBNb2RlLmdldENoYXJDb3VudEluZGljYXRvcn0uXG4gICAgYnVmZmVyLnB1dChkYXRhLmdldExlbmd0aCgpLCBNb2RlLmdldENoYXJDb3VudEluZGljYXRvcihkYXRhLm1vZGUsIHZlcnNpb24pKVxuXG4gICAgLy8gYWRkIGJpbmFyeSBkYXRhIHNlcXVlbmNlIHRvIGJ1ZmZlclxuICAgIGRhdGEud3JpdGUoYnVmZmVyKVxuICB9KVxuXG4gIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBudW1iZXIgb2YgYml0c1xuICBjb25zdCB0b3RhbENvZGV3b3JkcyA9IFV0aWxzLmdldFN5bWJvbFRvdGFsQ29kZXdvcmRzKHZlcnNpb24pXG4gIGNvbnN0IGVjVG90YWxDb2Rld29yZHMgPSBFQ0NvZGUuZ2V0VG90YWxDb2Rld29yZHNDb3VudCh2ZXJzaW9uLCBlcnJvckNvcnJlY3Rpb25MZXZlbClcbiAgY29uc3QgZGF0YVRvdGFsQ29kZXdvcmRzQml0cyA9ICh0b3RhbENvZGV3b3JkcyAtIGVjVG90YWxDb2Rld29yZHMpICogOFxuXG4gIC8vIEFkZCBhIHRlcm1pbmF0b3IuXG4gIC8vIElmIHRoZSBiaXQgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIHJlcXVpcmVkIGJpdHMsXG4gIC8vIGEgdGVybWluYXRvciBvZiB1cCB0byBmb3VyIDBzIG11c3QgYmUgYWRkZWQgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHN0cmluZy5cbiAgLy8gSWYgdGhlIGJpdCBzdHJpbmcgaXMgbW9yZSB0aGFuIGZvdXIgYml0cyBzaG9ydGVyIHRoYW4gdGhlIHJlcXVpcmVkIG51bWJlciBvZiBiaXRzLFxuICAvLyBhZGQgZm91ciAwcyB0byB0aGUgZW5kLlxuICBpZiAoYnVmZmVyLmdldExlbmd0aEluQml0cygpICsgNCA8PSBkYXRhVG90YWxDb2Rld29yZHNCaXRzKSB7XG4gICAgYnVmZmVyLnB1dCgwLCA0KVxuICB9XG5cbiAgLy8gSWYgdGhlIGJpdCBzdHJpbmcgaXMgZmV3ZXIgdGhhbiBmb3VyIGJpdHMgc2hvcnRlciwgYWRkIG9ubHkgdGhlIG51bWJlciBvZiAwcyB0aGF0XG4gIC8vIGFyZSBuZWVkZWQgdG8gcmVhY2ggdGhlIHJlcXVpcmVkIG51bWJlciBvZiBiaXRzLlxuXG4gIC8vIEFmdGVyIGFkZGluZyB0aGUgdGVybWluYXRvciwgaWYgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBzdHJpbmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCxcbiAgLy8gcGFkIHRoZSBzdHJpbmcgb24gdGhlIHJpZ2h0IHdpdGggMHMgdG8gbWFrZSB0aGUgc3RyaW5nJ3MgbGVuZ3RoIGEgbXVsdGlwbGUgb2YgOC5cbiAgd2hpbGUgKGJ1ZmZlci5nZXRMZW5ndGhJbkJpdHMoKSAlIDggIT09IDApIHtcbiAgICBidWZmZXIucHV0Qml0KDApXG4gIH1cblxuICAvLyBBZGQgcGFkIGJ5dGVzIGlmIHRoZSBzdHJpbmcgaXMgc3RpbGwgc2hvcnRlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVxdWlyZWQgYml0cy5cbiAgLy8gRXh0ZW5kIHRoZSBidWZmZXIgdG8gZmlsbCB0aGUgZGF0YSBjYXBhY2l0eSBvZiB0aGUgc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG9cbiAgLy8gdGhlIFZlcnNpb24gYW5kIEVycm9yIENvcnJlY3Rpb24gTGV2ZWwgYnkgYWRkaW5nIHRoZSBQYWQgQ29kZXdvcmRzIDExMTAxMTAwICgweEVDKVxuICAvLyBhbmQgMDAwMTAwMDEgKDB4MTEpIGFsdGVybmF0ZWx5LlxuICBjb25zdCByZW1haW5pbmdCeXRlID0gKGRhdGFUb3RhbENvZGV3b3Jkc0JpdHMgLSBidWZmZXIuZ2V0TGVuZ3RoSW5CaXRzKCkpIC8gOFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbWFpbmluZ0J5dGU7IGkrKykge1xuICAgIGJ1ZmZlci5wdXQoaSAlIDIgPyAweDExIDogMHhFQywgOClcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVDb2Rld29yZHMoYnVmZmVyLCB2ZXJzaW9uLCBlcnJvckNvcnJlY3Rpb25MZXZlbClcbn1cblxuLyoqXG4gKiBFbmNvZGUgaW5wdXQgZGF0YSB3aXRoIFJlZWQtU29sb21vbiBhbmQgcmV0dXJuIGNvZGV3b3JkcyB3aXRoXG4gKiByZWxhdGl2ZSBlcnJvciBjb3JyZWN0aW9uIGJpdHNcbiAqXG4gKiBAcGFyYW0gIHtCaXRCdWZmZXJ9IGJpdEJ1ZmZlciAgICAgICAgICAgIERhdGEgdG8gZW5jb2RlXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgIHZlcnNpb24gICAgICAgICAgICAgIFFSIENvZGUgdmVyc2lvblxuICogQHBhcmFtICB7RXJyb3JDb3JyZWN0aW9uTGV2ZWx9IGVycm9yQ29ycmVjdGlvbkxldmVsIEVycm9yIGNvcnJlY3Rpb24gbGV2ZWxcbiAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9ICAgICAgICAgICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgZW5jb2RlZCBjb2Rld29yZHNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29kZXdvcmRzIChiaXRCdWZmZXIsIHZlcnNpb24sIGVycm9yQ29ycmVjdGlvbkxldmVsKSB7XG4gIC8vIFRvdGFsIGNvZGV3b3JkcyBmb3IgdGhpcyBRUiBjb2RlIHZlcnNpb24gKERhdGEgKyBFcnJvciBjb3JyZWN0aW9uKVxuICBjb25zdCB0b3RhbENvZGV3b3JkcyA9IFV0aWxzLmdldFN5bWJvbFRvdGFsQ29kZXdvcmRzKHZlcnNpb24pXG5cbiAgLy8gVG90YWwgbnVtYmVyIG9mIGVycm9yIGNvcnJlY3Rpb24gY29kZXdvcmRzXG4gIGNvbnN0IGVjVG90YWxDb2Rld29yZHMgPSBFQ0NvZGUuZ2V0VG90YWxDb2Rld29yZHNDb3VudCh2ZXJzaW9uLCBlcnJvckNvcnJlY3Rpb25MZXZlbClcblxuICAvLyBUb3RhbCBudW1iZXIgb2YgZGF0YSBjb2Rld29yZHNcbiAgY29uc3QgZGF0YVRvdGFsQ29kZXdvcmRzID0gdG90YWxDb2Rld29yZHMgLSBlY1RvdGFsQ29kZXdvcmRzXG5cbiAgLy8gVG90YWwgbnVtYmVyIG9mIGJsb2Nrc1xuICBjb25zdCBlY1RvdGFsQmxvY2tzID0gRUNDb2RlLmdldEJsb2Nrc0NvdW50KHZlcnNpb24sIGVycm9yQ29ycmVjdGlvbkxldmVsKVxuXG4gIC8vIENhbGN1bGF0ZSBob3cgbWFueSBibG9ja3MgZWFjaCBncm91cCBzaG91bGQgY29udGFpblxuICBjb25zdCBibG9ja3NJbkdyb3VwMiA9IHRvdGFsQ29kZXdvcmRzICUgZWNUb3RhbEJsb2Nrc1xuICBjb25zdCBibG9ja3NJbkdyb3VwMSA9IGVjVG90YWxCbG9ja3MgLSBibG9ja3NJbkdyb3VwMlxuXG4gIGNvbnN0IHRvdGFsQ29kZXdvcmRzSW5Hcm91cDEgPSBNYXRoLmZsb29yKHRvdGFsQ29kZXdvcmRzIC8gZWNUb3RhbEJsb2NrcylcblxuICBjb25zdCBkYXRhQ29kZXdvcmRzSW5Hcm91cDEgPSBNYXRoLmZsb29yKGRhdGFUb3RhbENvZGV3b3JkcyAvIGVjVG90YWxCbG9ja3MpXG4gIGNvbnN0IGRhdGFDb2Rld29yZHNJbkdyb3VwMiA9IGRhdGFDb2Rld29yZHNJbkdyb3VwMSArIDFcblxuICAvLyBOdW1iZXIgb2YgRUMgY29kZXdvcmRzIGlzIHRoZSBzYW1lIGZvciBib3RoIGdyb3Vwc1xuICBjb25zdCBlY0NvdW50ID0gdG90YWxDb2Rld29yZHNJbkdyb3VwMSAtIGRhdGFDb2Rld29yZHNJbkdyb3VwMVxuXG4gIC8vIEluaXRpYWxpemUgYSBSZWVkLVNvbG9tb24gZW5jb2RlciB3aXRoIGEgZ2VuZXJhdG9yIHBvbHlub21pYWwgb2YgZGVncmVlIGVjQ291bnRcbiAgY29uc3QgcnMgPSBuZXcgUmVlZFNvbG9tb25FbmNvZGVyKGVjQ291bnQpXG5cbiAgbGV0IG9mZnNldCA9IDBcbiAgY29uc3QgZGNEYXRhID0gbmV3IEFycmF5KGVjVG90YWxCbG9ja3MpXG4gIGNvbnN0IGVjRGF0YSA9IG5ldyBBcnJheShlY1RvdGFsQmxvY2tzKVxuICBsZXQgbWF4RGF0YVNpemUgPSAwXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJpdEJ1ZmZlci5idWZmZXIpXG5cbiAgLy8gRGl2aWRlIHRoZSBidWZmZXIgaW50byB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJsb2Nrc1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGVjVG90YWxCbG9ja3M7IGIrKykge1xuICAgIGNvbnN0IGRhdGFTaXplID0gYiA8IGJsb2Nrc0luR3JvdXAxID8gZGF0YUNvZGV3b3Jkc0luR3JvdXAxIDogZGF0YUNvZGV3b3Jkc0luR3JvdXAyXG5cbiAgICAvLyBleHRyYWN0IGEgYmxvY2sgb2YgZGF0YSBmcm9tIGJ1ZmZlclxuICAgIGRjRGF0YVtiXSA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGRhdGFTaXplKVxuXG4gICAgLy8gQ2FsY3VsYXRlIEVDIGNvZGV3b3JkcyBmb3IgdGhpcyBkYXRhIGJsb2NrXG4gICAgZWNEYXRhW2JdID0gcnMuZW5jb2RlKGRjRGF0YVtiXSlcblxuICAgIG9mZnNldCArPSBkYXRhU2l6ZVxuICAgIG1heERhdGFTaXplID0gTWF0aC5tYXgobWF4RGF0YVNpemUsIGRhdGFTaXplKVxuICB9XG5cbiAgLy8gQ3JlYXRlIGZpbmFsIGRhdGFcbiAgLy8gSW50ZXJsZWF2ZSB0aGUgZGF0YSBhbmQgZXJyb3IgY29ycmVjdGlvbiBjb2Rld29yZHMgZnJvbSBlYWNoIGJsb2NrXG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh0b3RhbENvZGV3b3JkcylcbiAgbGV0IGluZGV4ID0gMFxuICBsZXQgaSwgclxuXG4gIC8vIEFkZCBkYXRhIGNvZGV3b3Jkc1xuICBmb3IgKGkgPSAwOyBpIDwgbWF4RGF0YVNpemU7IGkrKykge1xuICAgIGZvciAociA9IDA7IHIgPCBlY1RvdGFsQmxvY2tzOyByKyspIHtcbiAgICAgIGlmIChpIDwgZGNEYXRhW3JdLmxlbmd0aCkge1xuICAgICAgICBkYXRhW2luZGV4KytdID0gZGNEYXRhW3JdW2ldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQXBwZWQgRUMgY29kZXdvcmRzXG4gIGZvciAoaSA9IDA7IGkgPCBlY0NvdW50OyBpKyspIHtcbiAgICBmb3IgKHIgPSAwOyByIDwgZWNUb3RhbEJsb2NrczsgcisrKSB7XG4gICAgICBkYXRhW2luZGV4KytdID0gZWNEYXRhW3JdW2ldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyoqXG4gKiBCdWlsZCBRUiBDb2RlIHN5bWJvbFxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gZGF0YSAgICAgICAgICAgICAgICAgSW5wdXQgc3RyaW5nXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHZlcnNpb24gICAgICAgICAgICAgIFFSIENvZGUgdmVyc2lvblxuICogQHBhcmFtICB7RXJyb3JDb3JyZXRpb25MZXZlbH0gZXJyb3JDb3JyZWN0aW9uTGV2ZWwgRXJyb3IgbGV2ZWxcbiAqIEBwYXJhbSAge01hc2tQYXR0ZXJufSBtYXNrUGF0dGVybiAgICAgTWFzayBwYXR0ZXJuXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb250YWluaW5nIHN5bWJvbCBkYXRhXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN5bWJvbCAoZGF0YSwgdmVyc2lvbiwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIG1hc2tQYXR0ZXJuKSB7XG4gIGxldCBzZWdtZW50c1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgc2VnbWVudHMgPSBTZWdtZW50cy5mcm9tQXJyYXkoZGF0YSlcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICBsZXQgZXN0aW1hdGVkVmVyc2lvbiA9IHZlcnNpb25cblxuICAgIGlmICghZXN0aW1hdGVkVmVyc2lvbikge1xuICAgICAgY29uc3QgcmF3U2VnbWVudHMgPSBTZWdtZW50cy5yYXdTcGxpdChkYXRhKVxuXG4gICAgICAvLyBFc3RpbWF0ZSBiZXN0IHZlcnNpb24gdGhhdCBjYW4gY29udGFpbiByYXcgc3BsaXR0ZWQgc2VnbWVudHNcbiAgICAgIGVzdGltYXRlZFZlcnNpb24gPSBWZXJzaW9uLmdldEJlc3RWZXJzaW9uRm9yRGF0YShyYXdTZWdtZW50cywgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpXG4gICAgfVxuXG4gICAgLy8gQnVpbGQgb3B0aW1pemVkIHNlZ21lbnRzXG4gICAgLy8gSWYgZXN0aW1hdGVkIHZlcnNpb24gaXMgdW5kZWZpbmVkLCB0cnkgd2l0aCB0aGUgaGlnaGVzdCB2ZXJzaW9uXG4gICAgc2VnbWVudHMgPSBTZWdtZW50cy5mcm9tU3RyaW5nKGRhdGEsIGVzdGltYXRlZFZlcnNpb24gfHwgNDApXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEnKVxuICB9XG5cbiAgLy8gR2V0IHRoZSBtaW4gdmVyc2lvbiB0aGF0IGNhbiBjb250YWluIGRhdGFcbiAgY29uc3QgYmVzdFZlcnNpb24gPSBWZXJzaW9uLmdldEJlc3RWZXJzaW9uRm9yRGF0YShzZWdtZW50cywgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpXG5cbiAgLy8gSWYgbm8gdmVyc2lvbiBpcyBmb3VuZCwgZGF0YSBjYW5ub3QgYmUgc3RvcmVkXG4gIGlmICghYmVzdFZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhbW91bnQgb2YgZGF0YSBpcyB0b28gYmlnIHRvIGJlIHN0b3JlZCBpbiBhIFFSIENvZGUnKVxuICB9XG5cbiAgLy8gSWYgbm90IHNwZWNpZmllZCwgdXNlIG1pbiB2ZXJzaW9uIGFzIGRlZmF1bHRcbiAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgdmVyc2lvbiA9IGJlc3RWZXJzaW9uXG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIGNhbiBjb250YWluIHRoZSBkYXRhXG4gIH0gZWxzZSBpZiAodmVyc2lvbiA8IGJlc3RWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcXG4nICtcbiAgICAgICdUaGUgY2hvc2VuIFFSIENvZGUgdmVyc2lvbiBjYW5ub3QgY29udGFpbiB0aGlzIGFtb3VudCBvZiBkYXRhLlxcbicgK1xuICAgICAgJ01pbmltdW0gdmVyc2lvbiByZXF1aXJlZCB0byBzdG9yZSBjdXJyZW50IGRhdGEgaXM6ICcgKyBiZXN0VmVyc2lvbiArICcuXFxuJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGRhdGFCaXRzID0gY3JlYXRlRGF0YSh2ZXJzaW9uLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgc2VnbWVudHMpXG5cbiAgLy8gQWxsb2NhdGUgbWF0cml4IGJ1ZmZlclxuICBjb25zdCBtb2R1bGVDb3VudCA9IFV0aWxzLmdldFN5bWJvbFNpemUodmVyc2lvbilcbiAgY29uc3QgbW9kdWxlcyA9IG5ldyBCaXRNYXRyaXgobW9kdWxlQ291bnQpXG5cbiAgLy8gQWRkIGZ1bmN0aW9uIG1vZHVsZXNcbiAgc2V0dXBGaW5kZXJQYXR0ZXJuKG1vZHVsZXMsIHZlcnNpb24pXG4gIHNldHVwVGltaW5nUGF0dGVybihtb2R1bGVzKVxuICBzZXR1cEFsaWdubWVudFBhdHRlcm4obW9kdWxlcywgdmVyc2lvbilcblxuICAvLyBBZGQgdGVtcG9yYXJ5IGR1bW15IGJpdHMgZm9yIGZvcm1hdCBpbmZvIGp1c3QgdG8gc2V0IHRoZW0gYXMgcmVzZXJ2ZWQuXG4gIC8vIFRoaXMgaXMgbmVlZGVkIHRvIHByZXZlbnQgdGhlc2UgYml0cyBmcm9tIGJlaW5nIG1hc2tlZCBieSB7QGxpbmsgTWFza1BhdHRlcm4uYXBwbHlNYXNrfVxuICAvLyBzaW5jZSB0aGUgbWFza2luZyBvcGVyYXRpb24gbXVzdCBiZSBwZXJmb3JtZWQgb25seSBvbiB0aGUgZW5jb2RpbmcgcmVnaW9uLlxuICAvLyBUaGVzZSBibG9ja3Mgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGNvcnJlY3QgdmFsdWVzIGxhdGVyIGluIGNvZGUuXG4gIHNldHVwRm9ybWF0SW5mbyhtb2R1bGVzLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgMClcblxuICBpZiAodmVyc2lvbiA+PSA3KSB7XG4gICAgc2V0dXBWZXJzaW9uSW5mbyhtb2R1bGVzLCB2ZXJzaW9uKVxuICB9XG5cbiAgLy8gQWRkIGRhdGEgY29kZXdvcmRzXG4gIHNldHVwRGF0YShtb2R1bGVzLCBkYXRhQml0cylcblxuICBpZiAoaXNOYU4obWFza1BhdHRlcm4pKSB7XG4gICAgLy8gRmluZCBiZXN0IG1hc2sgcGF0dGVyblxuICAgIG1hc2tQYXR0ZXJuID0gTWFza1BhdHRlcm4uZ2V0QmVzdE1hc2sobW9kdWxlcyxcbiAgICAgIHNldHVwRm9ybWF0SW5mby5iaW5kKG51bGwsIG1vZHVsZXMsIGVycm9yQ29ycmVjdGlvbkxldmVsKSlcbiAgfVxuXG4gIC8vIEFwcGx5IG1hc2sgcGF0dGVyblxuICBNYXNrUGF0dGVybi5hcHBseU1hc2sobWFza1BhdHRlcm4sIG1vZHVsZXMpXG5cbiAgLy8gUmVwbGFjZSBmb3JtYXQgaW5mbyBiaXRzIHdpdGggY29ycmVjdCB2YWx1ZXNcbiAgc2V0dXBGb3JtYXRJbmZvKG1vZHVsZXMsIGVycm9yQ29ycmVjdGlvbkxldmVsLCBtYXNrUGF0dGVybilcblxuICByZXR1cm4ge1xuICAgIG1vZHVsZXM6IG1vZHVsZXMsXG4gICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICBlcnJvckNvcnJlY3Rpb25MZXZlbDogZXJyb3JDb3JyZWN0aW9uTGV2ZWwsXG4gICAgbWFza1BhdHRlcm46IG1hc2tQYXR0ZXJuLFxuICAgIHNlZ21lbnRzOiBzZWdtZW50c1xuICB9XG59XG5cbi8qKlxuICogUVIgQ29kZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nIHwgQXJyYXl9IGRhdGEgICAgICAgICAgICAgICAgIElucHV0IGRhdGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zXG4gKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy52ZXJzaW9uICAgICAgICAgICAgICBRUiBDb2RlIHZlcnNpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmVycm9yQ29ycmVjdGlvbkxldmVsIEVycm9yIGNvcnJlY3Rpb24gbGV2ZWxcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMudG9TSklTRnVuYyAgICAgICAgIEhlbHBlciBmdW5jIHRvIGNvbnZlcnQgdXRmOCB0byBzamlzXG4gKi9cbmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlIChkYXRhLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3VuZGVmaW5lZCcgfHwgZGF0YSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGlucHV0IHRleHQnKVxuICB9XG5cbiAgbGV0IGVycm9yQ29ycmVjdGlvbkxldmVsID0gRUNMZXZlbC5NXG4gIGxldCB2ZXJzaW9uXG4gIGxldCBtYXNrXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIFVzZSBoaWdoZXIgZXJyb3IgY29ycmVjdGlvbiBsZXZlbCBhcyBkZWZhdWx0XG4gICAgZXJyb3JDb3JyZWN0aW9uTGV2ZWwgPSBFQ0xldmVsLmZyb20ob3B0aW9ucy5lcnJvckNvcnJlY3Rpb25MZXZlbCwgRUNMZXZlbC5NKVxuICAgIHZlcnNpb24gPSBWZXJzaW9uLmZyb20ob3B0aW9ucy52ZXJzaW9uKVxuICAgIG1hc2sgPSBNYXNrUGF0dGVybi5mcm9tKG9wdGlvbnMubWFza1BhdHRlcm4pXG5cbiAgICBpZiAob3B0aW9ucy50b1NKSVNGdW5jKSB7XG4gICAgICBVdGlscy5zZXRUb1NKSVNGdW5jdGlvbihvcHRpb25zLnRvU0pJU0Z1bmMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVN5bWJvbChkYXRhLCB2ZXJzaW9uLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgbWFzaylcbn1cbiIsICJmdW5jdGlvbiBoZXgycmdiYSAoaGV4KSB7XG4gIGlmICh0eXBlb2YgaGV4ID09PSAnbnVtYmVyJykge1xuICAgIGhleCA9IGhleC50b1N0cmluZygpXG4gIH1cblxuICBpZiAodHlwZW9mIGhleCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yIHNob3VsZCBiZSBkZWZpbmVkIGFzIGhleCBzdHJpbmcnKVxuICB9XG5cbiAgbGV0IGhleENvZGUgPSBoZXguc2xpY2UoKS5yZXBsYWNlKCcjJywgJycpLnNwbGl0KCcnKVxuICBpZiAoaGV4Q29kZS5sZW5ndGggPCAzIHx8IGhleENvZGUubGVuZ3RoID09PSA1IHx8IGhleENvZGUubGVuZ3RoID4gOCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXggY29sb3I6ICcgKyBoZXgpXG4gIH1cblxuICAvLyBDb252ZXJ0IGZyb20gc2hvcnQgdG8gbG9uZyBmb3JtIChmZmYgLT4gZmZmZmZmKVxuICBpZiAoaGV4Q29kZS5sZW5ndGggPT09IDMgfHwgaGV4Q29kZS5sZW5ndGggPT09IDQpIHtcbiAgICBoZXhDb2RlID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgaGV4Q29kZS5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBbYywgY11cbiAgICB9KSlcbiAgfVxuXG4gIC8vIEFkZCBkZWZhdWx0IGFscGhhIHZhbHVlXG4gIGlmIChoZXhDb2RlLmxlbmd0aCA9PT0gNikgaGV4Q29kZS5wdXNoKCdGJywgJ0YnKVxuXG4gIGNvbnN0IGhleFZhbHVlID0gcGFyc2VJbnQoaGV4Q29kZS5qb2luKCcnKSwgMTYpXG5cbiAgcmV0dXJuIHtcbiAgICByOiAoaGV4VmFsdWUgPj4gMjQpICYgMjU1LFxuICAgIGc6IChoZXhWYWx1ZSA+PiAxNikgJiAyNTUsXG4gICAgYjogKGhleFZhbHVlID4+IDgpICYgMjU1LFxuICAgIGE6IGhleFZhbHVlICYgMjU1LFxuICAgIGhleDogJyMnICsgaGV4Q29kZS5zbGljZSgwLCA2KS5qb2luKCcnKVxuICB9XG59XG5cbmV4cG9ydHMuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uIGdldE9wdGlvbnMgKG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge31cbiAgaWYgKCFvcHRpb25zLmNvbG9yKSBvcHRpb25zLmNvbG9yID0ge31cblxuICBjb25zdCBtYXJnaW4gPSB0eXBlb2Ygb3B0aW9ucy5tYXJnaW4gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgb3B0aW9ucy5tYXJnaW4gPT09IG51bGwgfHxcbiAgICBvcHRpb25zLm1hcmdpbiA8IDBcbiAgICA/IDRcbiAgICA6IG9wdGlvbnMubWFyZ2luXG5cbiAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoICYmIG9wdGlvbnMud2lkdGggPj0gMjEgPyBvcHRpb25zLndpZHRoIDogdW5kZWZpbmVkXG4gIGNvbnN0IHNjYWxlID0gb3B0aW9ucy5zY2FsZSB8fCA0XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgc2NhbGU6IHdpZHRoID8gNCA6IHNjYWxlLFxuICAgIG1hcmdpbjogbWFyZ2luLFxuICAgIGNvbG9yOiB7XG4gICAgICBkYXJrOiBoZXgycmdiYShvcHRpb25zLmNvbG9yLmRhcmsgfHwgJyMwMDAwMDBmZicpLFxuICAgICAgbGlnaHQ6IGhleDJyZ2JhKG9wdGlvbnMuY29sb3IubGlnaHQgfHwgJyNmZmZmZmZmZicpXG4gICAgfSxcbiAgICB0eXBlOiBvcHRpb25zLnR5cGUsXG4gICAgcmVuZGVyZXJPcHRzOiBvcHRpb25zLnJlbmRlcmVyT3B0cyB8fCB7fVxuICB9XG59XG5cbmV4cG9ydHMuZ2V0U2NhbGUgPSBmdW5jdGlvbiBnZXRTY2FsZSAocXJTaXplLCBvcHRzKSB7XG4gIHJldHVybiBvcHRzLndpZHRoICYmIG9wdHMud2lkdGggPj0gcXJTaXplICsgb3B0cy5tYXJnaW4gKiAyXG4gICAgPyBvcHRzLndpZHRoIC8gKHFyU2l6ZSArIG9wdHMubWFyZ2luICogMilcbiAgICA6IG9wdHMuc2NhbGVcbn1cblxuZXhwb3J0cy5nZXRJbWFnZVdpZHRoID0gZnVuY3Rpb24gZ2V0SW1hZ2VXaWR0aCAocXJTaXplLCBvcHRzKSB7XG4gIGNvbnN0IHNjYWxlID0gZXhwb3J0cy5nZXRTY2FsZShxclNpemUsIG9wdHMpXG4gIHJldHVybiBNYXRoLmZsb29yKChxclNpemUgKyBvcHRzLm1hcmdpbiAqIDIpICogc2NhbGUpXG59XG5cbmV4cG9ydHMucXJUb0ltYWdlRGF0YSA9IGZ1bmN0aW9uIHFyVG9JbWFnZURhdGEgKGltZ0RhdGEsIHFyLCBvcHRzKSB7XG4gIGNvbnN0IHNpemUgPSBxci5tb2R1bGVzLnNpemVcbiAgY29uc3QgZGF0YSA9IHFyLm1vZHVsZXMuZGF0YVxuICBjb25zdCBzY2FsZSA9IGV4cG9ydHMuZ2V0U2NhbGUoc2l6ZSwgb3B0cylcbiAgY29uc3Qgc3ltYm9sU2l6ZSA9IE1hdGguZmxvb3IoKHNpemUgKyBvcHRzLm1hcmdpbiAqIDIpICogc2NhbGUpXG4gIGNvbnN0IHNjYWxlZE1hcmdpbiA9IG9wdHMubWFyZ2luICogc2NhbGVcbiAgY29uc3QgcGFsZXR0ZSA9IFtvcHRzLmNvbG9yLmxpZ2h0LCBvcHRzLmNvbG9yLmRhcmtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzeW1ib2xTaXplOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN5bWJvbFNpemU7IGorKykge1xuICAgICAgbGV0IHBvc0RzdCA9IChpICogc3ltYm9sU2l6ZSArIGopICogNFxuICAgICAgbGV0IHB4Q29sb3IgPSBvcHRzLmNvbG9yLmxpZ2h0XG5cbiAgICAgIGlmIChpID49IHNjYWxlZE1hcmdpbiAmJiBqID49IHNjYWxlZE1hcmdpbiAmJlxuICAgICAgICBpIDwgc3ltYm9sU2l6ZSAtIHNjYWxlZE1hcmdpbiAmJiBqIDwgc3ltYm9sU2l6ZSAtIHNjYWxlZE1hcmdpbikge1xuICAgICAgICBjb25zdCBpU3JjID0gTWF0aC5mbG9vcigoaSAtIHNjYWxlZE1hcmdpbikgLyBzY2FsZSlcbiAgICAgICAgY29uc3QgalNyYyA9IE1hdGguZmxvb3IoKGogLSBzY2FsZWRNYXJnaW4pIC8gc2NhbGUpXG4gICAgICAgIHB4Q29sb3IgPSBwYWxldHRlW2RhdGFbaVNyYyAqIHNpemUgKyBqU3JjXSA/IDEgOiAwXVxuICAgICAgfVxuXG4gICAgICBpbWdEYXRhW3Bvc0RzdCsrXSA9IHB4Q29sb3IuclxuICAgICAgaW1nRGF0YVtwb3NEc3QrK10gPSBweENvbG9yLmdcbiAgICAgIGltZ0RhdGFbcG9zRHN0KytdID0gcHhDb2xvci5iXG4gICAgICBpbWdEYXRhW3Bvc0RzdF0gPSBweENvbG9yLmFcbiAgICB9XG4gIH1cbn1cbiIsICJjb25zdCBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuXG5mdW5jdGlvbiBjbGVhckNhbnZhcyAoY3R4LCBjYW52YXMsIHNpemUpIHtcbiAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpXG5cbiAgaWYgKCFjYW52YXMuc3R5bGUpIGNhbnZhcy5zdHlsZSA9IHt9XG4gIGNhbnZhcy5oZWlnaHQgPSBzaXplXG4gIGNhbnZhcy53aWR0aCA9IHNpemVcbiAgY2FudmFzLnN0eWxlLmhlaWdodCA9IHNpemUgKyAncHgnXG4gIGNhbnZhcy5zdHlsZS53aWR0aCA9IHNpemUgKyAncHgnXG59XG5cbmZ1bmN0aW9uIGdldENhbnZhc0VsZW1lbnQgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IGEgY2FudmFzIGVsZW1lbnQnKVxuICB9XG59XG5cbmV4cG9ydHMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyIChxckRhdGEsIGNhbnZhcywgb3B0aW9ucykge1xuICBsZXQgb3B0cyA9IG9wdGlvbnNcbiAgbGV0IGNhbnZhc0VsID0gY2FudmFzXG5cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAndW5kZWZpbmVkJyAmJiAoIWNhbnZhcyB8fCAhY2FudmFzLmdldENvbnRleHQpKSB7XG4gICAgb3B0cyA9IGNhbnZhc1xuICAgIGNhbnZhcyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjYW52YXNFbCA9IGdldENhbnZhc0VsZW1lbnQoKVxuICB9XG5cbiAgb3B0cyA9IFV0aWxzLmdldE9wdGlvbnMob3B0cylcbiAgY29uc3Qgc2l6ZSA9IFV0aWxzLmdldEltYWdlV2lkdGgocXJEYXRhLm1vZHVsZXMuc2l6ZSwgb3B0cylcblxuICBjb25zdCBjdHggPSBjYW52YXNFbC5nZXRDb250ZXh0KCcyZCcpXG4gIGNvbnN0IGltYWdlID0gY3R4LmNyZWF0ZUltYWdlRGF0YShzaXplLCBzaXplKVxuICBVdGlscy5xclRvSW1hZ2VEYXRhKGltYWdlLmRhdGEsIHFyRGF0YSwgb3B0cylcblxuICBjbGVhckNhbnZhcyhjdHgsIGNhbnZhc0VsLCBzaXplKVxuICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlLCAwLCAwKVxuXG4gIHJldHVybiBjYW52YXNFbFxufVxuXG5leHBvcnRzLnJlbmRlclRvRGF0YVVSTCA9IGZ1bmN0aW9uIHJlbmRlclRvRGF0YVVSTCAocXJEYXRhLCBjYW52YXMsIG9wdGlvbnMpIHtcbiAgbGV0IG9wdHMgPSBvcHRpb25zXG5cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAndW5kZWZpbmVkJyAmJiAoIWNhbnZhcyB8fCAhY2FudmFzLmdldENvbnRleHQpKSB7XG4gICAgb3B0cyA9IGNhbnZhc1xuICAgIGNhbnZhcyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKCFvcHRzKSBvcHRzID0ge31cblxuICBjb25zdCBjYW52YXNFbCA9IGV4cG9ydHMucmVuZGVyKHFyRGF0YSwgY2FudmFzLCBvcHRzKVxuXG4gIGNvbnN0IHR5cGUgPSBvcHRzLnR5cGUgfHwgJ2ltYWdlL3BuZydcbiAgY29uc3QgcmVuZGVyZXJPcHRzID0gb3B0cy5yZW5kZXJlck9wdHMgfHwge31cblxuICByZXR1cm4gY2FudmFzRWwudG9EYXRhVVJMKHR5cGUsIHJlbmRlcmVyT3B0cy5xdWFsaXR5KVxufVxuIiwgImNvbnN0IFV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmZ1bmN0aW9uIGdldENvbG9yQXR0cmliIChjb2xvciwgYXR0cmliKSB7XG4gIGNvbnN0IGFscGhhID0gY29sb3IuYSAvIDI1NVxuICBjb25zdCBzdHIgPSBhdHRyaWIgKyAnPVwiJyArIGNvbG9yLmhleCArICdcIidcblxuICByZXR1cm4gYWxwaGEgPCAxXG4gICAgPyBzdHIgKyAnICcgKyBhdHRyaWIgKyAnLW9wYWNpdHk9XCInICsgYWxwaGEudG9GaXhlZCgyKS5zbGljZSgxKSArICdcIidcbiAgICA6IHN0clxufVxuXG5mdW5jdGlvbiBzdmdDbWQgKGNtZCwgeCwgeSkge1xuICBsZXQgc3RyID0gY21kICsgeFxuICBpZiAodHlwZW9mIHkgIT09ICd1bmRlZmluZWQnKSBzdHIgKz0gJyAnICsgeVxuXG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gcXJUb1BhdGggKGRhdGEsIHNpemUsIG1hcmdpbikge1xuICBsZXQgcGF0aCA9ICcnXG4gIGxldCBtb3ZlQnkgPSAwXG4gIGxldCBuZXdSb3cgPSBmYWxzZVxuICBsZXQgbGluZUxlbmd0aCA9IDBcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2wgPSBNYXRoLmZsb29yKGkgJSBzaXplKVxuICAgIGNvbnN0IHJvdyA9IE1hdGguZmxvb3IoaSAvIHNpemUpXG5cbiAgICBpZiAoIWNvbCAmJiAhbmV3Um93KSBuZXdSb3cgPSB0cnVlXG5cbiAgICBpZiAoZGF0YVtpXSkge1xuICAgICAgbGluZUxlbmd0aCsrXG5cbiAgICAgIGlmICghKGkgPiAwICYmIGNvbCA+IDAgJiYgZGF0YVtpIC0gMV0pKSB7XG4gICAgICAgIHBhdGggKz0gbmV3Um93XG4gICAgICAgICAgPyBzdmdDbWQoJ00nLCBjb2wgKyBtYXJnaW4sIDAuNSArIHJvdyArIG1hcmdpbilcbiAgICAgICAgICA6IHN2Z0NtZCgnbScsIG1vdmVCeSwgMClcblxuICAgICAgICBtb3ZlQnkgPSAwXG4gICAgICAgIG5ld1JvdyA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmICghKGNvbCArIDEgPCBzaXplICYmIGRhdGFbaSArIDFdKSkge1xuICAgICAgICBwYXRoICs9IHN2Z0NtZCgnaCcsIGxpbmVMZW5ndGgpXG4gICAgICAgIGxpbmVMZW5ndGggPSAwXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vdmVCeSsrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhdGhcbn1cblxuZXhwb3J0cy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIgKHFyRGF0YSwgb3B0aW9ucywgY2IpIHtcbiAgY29uc3Qgb3B0cyA9IFV0aWxzLmdldE9wdGlvbnMob3B0aW9ucylcbiAgY29uc3Qgc2l6ZSA9IHFyRGF0YS5tb2R1bGVzLnNpemVcbiAgY29uc3QgZGF0YSA9IHFyRGF0YS5tb2R1bGVzLmRhdGFcbiAgY29uc3QgcXJjb2Rlc2l6ZSA9IHNpemUgKyBvcHRzLm1hcmdpbiAqIDJcblxuICBjb25zdCBiZyA9ICFvcHRzLmNvbG9yLmxpZ2h0LmFcbiAgICA/ICcnXG4gICAgOiAnPHBhdGggJyArIGdldENvbG9yQXR0cmliKG9wdHMuY29sb3IubGlnaHQsICdmaWxsJykgK1xuICAgICAgJyBkPVwiTTAgMGgnICsgcXJjb2Rlc2l6ZSArICd2JyArIHFyY29kZXNpemUgKyAnSDB6XCIvPidcblxuICBjb25zdCBwYXRoID1cbiAgICAnPHBhdGggJyArIGdldENvbG9yQXR0cmliKG9wdHMuY29sb3IuZGFyaywgJ3N0cm9rZScpICtcbiAgICAnIGQ9XCInICsgcXJUb1BhdGgoZGF0YSwgc2l6ZSwgb3B0cy5tYXJnaW4pICsgJ1wiLz4nXG5cbiAgY29uc3Qgdmlld0JveCA9ICd2aWV3Qm94PVwiJyArICcwIDAgJyArIHFyY29kZXNpemUgKyAnICcgKyBxcmNvZGVzaXplICsgJ1wiJ1xuXG4gIGNvbnN0IHdpZHRoID0gIW9wdHMud2lkdGggPyAnJyA6ICd3aWR0aD1cIicgKyBvcHRzLndpZHRoICsgJ1wiIGhlaWdodD1cIicgKyBvcHRzLndpZHRoICsgJ1wiICdcblxuICBjb25zdCBzdmdUYWcgPSAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgJyArIHdpZHRoICsgdmlld0JveCArICcgc2hhcGUtcmVuZGVyaW5nPVwiY3Jpc3BFZGdlc1wiPicgKyBiZyArIHBhdGggKyAnPC9zdmc+XFxuJ1xuXG4gIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYihudWxsLCBzdmdUYWcpXG4gIH1cblxuICByZXR1cm4gc3ZnVGFnXG59XG4iLCAiXG5jb25zdCBjYW5Qcm9taXNlID0gcmVxdWlyZSgnLi9jYW4tcHJvbWlzZScpXG5cbmNvbnN0IFFSQ29kZSA9IHJlcXVpcmUoJy4vY29yZS9xcmNvZGUnKVxuY29uc3QgQ2FudmFzUmVuZGVyZXIgPSByZXF1aXJlKCcuL3JlbmRlcmVyL2NhbnZhcycpXG5jb25zdCBTdmdSZW5kZXJlciA9IHJlcXVpcmUoJy4vcmVuZGVyZXIvc3ZnLXRhZy5qcycpXG5cbmZ1bmN0aW9uIHJlbmRlckNhbnZhcyAocmVuZGVyRnVuYywgY2FudmFzLCB0ZXh0LCBvcHRzLCBjYikge1xuICBjb25zdCBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXG4gIGNvbnN0IGFyZ3NOdW0gPSBhcmdzLmxlbmd0aFxuICBjb25zdCBpc0xhc3RBcmdDYiA9IHR5cGVvZiBhcmdzW2FyZ3NOdW0gLSAxXSA9PT0gJ2Z1bmN0aW9uJ1xuXG4gIGlmICghaXNMYXN0QXJnQ2IgJiYgIWNhblByb21pc2UoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2FsbGJhY2sgcmVxdWlyZWQgYXMgbGFzdCBhcmd1bWVudCcpXG4gIH1cblxuICBpZiAoaXNMYXN0QXJnQ2IpIHtcbiAgICBpZiAoYXJnc051bSA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVG9vIGZldyBhcmd1bWVudHMgcHJvdmlkZWQnKVxuICAgIH1cblxuICAgIGlmIChhcmdzTnVtID09PSAyKSB7XG4gICAgICBjYiA9IHRleHRcbiAgICAgIHRleHQgPSBjYW52YXNcbiAgICAgIGNhbnZhcyA9IG9wdHMgPSB1bmRlZmluZWRcbiAgICB9IGVsc2UgaWYgKGFyZ3NOdW0gPT09IDMpIHtcbiAgICAgIGlmIChjYW52YXMuZ2V0Q29udGV4dCAmJiB0eXBlb2YgY2IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNiID0gb3B0c1xuICAgICAgICBvcHRzID0gdW5kZWZpbmVkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYiA9IG9wdHNcbiAgICAgICAgb3B0cyA9IHRleHRcbiAgICAgICAgdGV4dCA9IGNhbnZhc1xuICAgICAgICBjYW52YXMgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGFyZ3NOdW0gPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBmZXcgYXJndW1lbnRzIHByb3ZpZGVkJylcbiAgICB9XG5cbiAgICBpZiAoYXJnc051bSA9PT0gMSkge1xuICAgICAgdGV4dCA9IGNhbnZhc1xuICAgICAgY2FudmFzID0gb3B0cyA9IHVuZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAoYXJnc051bSA9PT0gMiAmJiAhY2FudmFzLmdldENvbnRleHQpIHtcbiAgICAgIG9wdHMgPSB0ZXh0XG4gICAgICB0ZXh0ID0gY2FudmFzXG4gICAgICBjYW52YXMgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFFSQ29kZS5jcmVhdGUodGV4dCwgb3B0cylcbiAgICAgICAgcmVzb2x2ZShyZW5kZXJGdW5jKGRhdGEsIGNhbnZhcywgb3B0cykpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBRUkNvZGUuY3JlYXRlKHRleHQsIG9wdHMpXG4gICAgY2IobnVsbCwgcmVuZGVyRnVuYyhkYXRhLCBjYW52YXMsIG9wdHMpKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY2IoZSlcbiAgfVxufVxuXG5leHBvcnRzLmNyZWF0ZSA9IFFSQ29kZS5jcmVhdGVcbmV4cG9ydHMudG9DYW52YXMgPSByZW5kZXJDYW52YXMuYmluZChudWxsLCBDYW52YXNSZW5kZXJlci5yZW5kZXIpXG5leHBvcnRzLnRvRGF0YVVSTCA9IHJlbmRlckNhbnZhcy5iaW5kKG51bGwsIENhbnZhc1JlbmRlcmVyLnJlbmRlclRvRGF0YVVSTClcblxuLy8gb25seSBzdmcgZm9yIG5vdy5cbmV4cG9ydHMudG9TdHJpbmcgPSByZW5kZXJDYW52YXMuYmluZChudWxsLCBmdW5jdGlvbiAoZGF0YSwgXywgb3B0cykge1xuICByZXR1cm4gU3ZnUmVuZGVyZXIucmVuZGVyKGRhdGEsIG9wdHMpXG59KVxuIiwgImltcG9ydCB7IFBsdWdpbiwgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCwgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW1wb3J0IHsgUVJDb2RlLCB0b0NhbnZhcyB9IGZyb20gJ3FyY29kZSdcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFFyQ29kZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0XHJcblx0LyoqXHJcblx0KiBGdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBDb250ZW50LW9ubHkgUVIgY29kZSBibG9ja3NcclxuXHQqL1xyXG5cdHBvc3Rwcm9jZXNzb3JSYXcgPSBhc3luYyAoY29udGVudDogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQsIGN0eDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCkgPT4ge1xyXG5cdFx0Y29uc3QgZGVzdGluYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuXHRcdGlmKGNvbnRlbnQuZW5kc1dpdGgoXCJcXG5cIikpIHtcclxuXHRcdFx0Ly8gT2JzaWRpYW4gZ2l2ZXMgYW4gdW5wcmV0dHkgbGluZWJyZWFrIGF0IHRoZSBlbmQuIERvbid0IGVuY29kZSBpdCBpbiBvdXIgUVIgQ29kZSFcclxuXHRcdFx0Y29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIGNvbnRlbnQubGVuZ3RoIC0gMSk7XHJcblx0XHR9XHJcblx0XHR0b0NhbnZhcyhkZXN0aW5hdGlvbiwgY29udGVudCk7XHJcblx0XHRlbC5hcHBlbmRDaGlsZChkZXN0aW5hdGlvbik7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQqIEZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIEpTT04gbGlrZSBRUiBjb2RlIGJsb2Nrc1xyXG5cdCovXHJcblx0cG9zdHByb2Nlc3NvckNvbXBsZXggPSBhc3luYyAoY29udGVudDogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQsIGN0eDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCkgPT4ge1xyXG5cdFx0Y29uc3QgZGVzdGluYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuXHRcdGxldCBbdGV4dCwgcGFyYW1ldGVyc10gPSB0aGlzLnJlYWRQYXJhbWV0ZXJzKGNvbnRlbnQpO1xyXG5cdFx0dG9DYW52YXMoZGVzdGluYXRpb24sIHRleHQsIHBhcmFtZXRlcnMpO1xyXG5cdFx0ZWwuYXBwZW5kQ2hpbGQoZGVzdGluYXRpb24pO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHRcclxuXHRwcml2YXRlIHJlYWRQYXJhbWV0ZXJzKGpzb25TdHJpbmc6IGFueSkge1xyXG5cdFx0bGV0IHBhcmFtcyA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcblx0XHRsZXQgb3B0aW9uczoge1trOnN0cmluZ106IGFueX0gPSB7fTtcclxuXHRcdG9wdGlvbnMuY29sb3IgPSB7bGlnaHQ6IFwiI2ZmZmZmZlwiLCBkYXJrOiBcIiMwMDAwMDBcIn07XHJcblx0XHRvcHRpb25zLmVycm9yQ29ycmVjdGlvbkxldmVsID0gJ00nO1xyXG5cdFx0aWYgKHBhcmFtcy53aWR0aCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdG9wdGlvbnMud2lkdGggPSBwYXJhbXMud2lkdGg7XHJcblx0XHR9XHJcblx0XHRpZiAocGFyYW1zLmVycm9yQ29ycmVjdGlvbkxldmVsICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0b3B0aW9ucy5lcnJvckNvcnJlY3Rpb25MZXZlbCA9IHBhcmFtcy5lcnJvckNvcnJlY3Rpb25MZXZlbDtcclxuXHRcdH1cclxuXHRcdGlmIChwYXJhbXMubWFyZ2luICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0b3B0aW9ucy5tYXJnaW4gPSBwYXJhbXMubWFyZ2luO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHBhcmFtcy5kYXJrICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0b3B0aW9ucy5jb2xvci5kYXJrID0gcGFyYW1zLmRhcms7XHJcblx0XHR9XHJcblx0XHRpZiAocGFyYW1zLmxpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0b3B0aW9ucy5jb2xvci5saWdodCA9IHBhcmFtcy5saWdodDtcclxuXHRcdH1cclxuXHRcdHJldHVybiBbcGFyYW1zLnRleHQsIG9wdGlvbnNdO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25sb2FkKCkge1xyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKCdxcmNvZGUnLCB0aGlzLnBvc3Rwcm9jZXNzb3JSYXcpO1xyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKCdxcmNvZGUtY29tcGxleCcsIHRoaXMucG9zdHByb2Nlc3NvckNvbXBsZXgpO1xyXG5cdH1cclxufVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQSxvREFBQUEsU0FBQTtBQUlBLElBQUFBLFFBQU8sVUFBVSxXQUFZO0FBQzNCLGFBQU8sT0FBTyxZQUFZLGNBQWMsUUFBUSxhQUFhLFFBQVEsVUFBVTtBQUFBLElBQ2pGO0FBQUE7QUFBQTs7O0FDTkE7QUFBQTtBQUFBLFFBQUk7QUFDSixRQUFNLGtCQUFrQjtBQUFBLE1BQ3RCO0FBQUE7QUFBQSxNQUNBO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFDMUM7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUM3QztBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtB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QUFBQSxNQUNYO0FBQUEsTUFBRztBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDWDtBQUFBLE1BQUc7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQ1g7QUFBQSxNQUFHO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUNYO0FBQUEsTUFBRztBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDWDtBQUFBLE1BQUc7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQ1g7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUNaO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDWjtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQ1o7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUNaO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDWjtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQ1o7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUNaO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDWjtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQ1o7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUNaO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDWjtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQ1o7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUNaO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDWjtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQ1o7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUNaO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsSUFDZDtBQUVBLFFBQU0scUJBQXFCO0FBQUE7QUFBQSxNQUV6QjtBQUFBLE1BQUc7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQ1g7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUNaO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDWjtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQ1o7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUNaO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFDWjtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSztBQUFBLE1BQ2I7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUs7QUFBQSxNQUNiO0FBQUEsTUFBSTtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFDZDtBQUFBLE1BQUk7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQ2Q7QUFBQSxNQUFJO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUNkO0FBQUEsTUFBSTtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFDZDtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQ2Y7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUNmO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFDZjtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQ2Y7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUNmO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFDZjtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQ2Y7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUNmO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFDZjtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1B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Q0FBdUIsT0FBTyxTQUFpQixJQUFpQixRQUFzQztBQUNyRyxZQUFNLGNBQWMsU0FBUyxjQUFjLFFBQVE7QUFDbkQsVUFBSSxDQUFDLE1BQU0sVUFBVSxJQUFJLEtBQUssZUFBZSxPQUFPO0FBQ3BELGtDQUFTLGFBQWEsTUFBTSxVQUFVO0FBQ3RDLFNBQUcsWUFBWSxXQUFXO0FBQzFCO0FBQUEsSUFDRDtBQUFBO0FBQUEsRUFFUSxlQUFlLFlBQWlCO0FBQ3ZDLFFBQUksU0FBUyxLQUFLLE1BQU0sVUFBVTtBQUNsQyxRQUFJLFVBQTZCLENBQUM7QUFDbEMsWUFBUSxRQUFRLEVBQUMsT0FBTyxXQUFXLE1BQU0sVUFBUztBQUNsRCxZQUFRLHVCQUF1QjtBQUMvQixRQUFJLE9BQU8sVUFBVSxRQUFXO0FBQy9CLGNBQVEsUUFBUSxPQUFPO0FBQUEsSUFDeEI7QUFDQSxRQUFJLE9BQU8seUJBQXlCLFFBQVc7QUFDOUMsY0FBUSx1QkFBdUIsT0FBTztBQUFBLElBQ3ZDO0FBQ0EsUUFBSSxPQUFPLFdBQVcsUUFBVztBQUNoQyxjQUFRLFNBQVMsT0FBTztBQUFBLElBQ3pCO0FBQ0EsUUFBSSxPQUFPLFNBQVMsUUFBVztBQUM5QixjQUFRLE1BQU0sT0FBTyxPQUFPO0FBQUEsSUFDN0I7QUFDQSxRQUFJLE9BQU8sVUFBVSxRQUFXO0FBQy9CLGNBQVEsTUFBTSxRQUFRLE9BQU87QUFBQSxJQUM5QjtBQUNBLFdBQU8sQ0FBQyxPQUFPLE1BQU0sT0FBTztBQUFBLEVBQzdCO0FBQUEsRUFFQSxNQUFNLFNBQVM7QUFDZCxTQUFLLG1DQUFtQyxVQUFVLEtBQUssZ0JBQWdCO0FBQ3ZFLFNBQUssbUNBQW1DLGtCQUFrQixLQUFLLG9CQUFvQjtBQUFBLEVBQ3BGO0FBQ0Q7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicmVxdWlyZV91dGlscyIsICJRUkNvZGUiXQp9Cg==
|