UNPKG

convert

Version:

The smallest & fastest library for really easy, totally type-safe unit conversions in TypeScript & JavaScript

97 lines 15.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.convert = convert; const best_units_1 = require("../generated/best-units.cjs"); const parse_unit_1 = require("../generated/parse-unit.cjs"); // Importing MeasureKind will cause the entire enum to be included in the output, which increases bundle size // This workaround allows me to just hardcode the value, but ensures it doesn't become inaccurate if the enum changes const MeasureKindTime = 14; function convertTo(from, quantity, to) { let parsedTo = parse_unit_1.unitsObject[to]; if (!parsedTo) { throw new RangeError(`${to} is not a valid unit`); } let parsedFrom = parse_unit_1.unitsObject[from]; if (parsedFrom[0] !== parsedTo[0]) { if (parsedFrom[0] === MeasureKindTime && to === 'm') { // Going from time to meters, you meant to do minutes parsedTo = parse_unit_1.unitsObject.min; } else if (from === 'm' && parsedTo[0] === MeasureKindTime) { parsedFrom = parse_unit_1.unitsObject.min; } else { throw new RangeError(`Cannot convert between different measures: ${from} and ${to}`); } } const fromRatio = parsedFrom[1]; const toRatio = parsedTo[1]; if (typeof quantity === 'bigint') { if ((from in parse_unit_1.differences || to in parse_unit_1.differences) && parse_unit_1.differences[from] !== parse_unit_1.differences[to]) { throw new RangeError(`Conversion for ${from} to ${to} cannot be calculated as one of the units has a conversion difference which cannot be expressed with bigints`); } return ((quantity * BigInt(fromRatio)) / BigInt(toRatio)); } if (from in parse_unit_1.differences) { if (to in parse_unit_1.differences) { return ((quantity + parse_unit_1.differences[from]) * (fromRatio / toRatio) - parse_unit_1.differences[to]); } return ((quantity + parse_unit_1.differences[from]) * (fromRatio / toRatio)); } if (to in parse_unit_1.differences) { return (quantity * (fromRatio / toRatio) - parse_unit_1.differences[to]); } return (quantity * (fromRatio / toRatio)); } function convertToBest(quantity, from, kind) { const fromMeasure = parse_unit_1.unitsObject[from][0]; const best = best_units_1.bestUnits[kind === 'imperial' ? 1 : 0][fromMeasure]; const smallestUnit = best[0][0]; let bestUnit = smallestUnit; const baseQuantity = convertTo(from, quantity, smallestUnit); const absQuantity = baseQuantity < 0 ? -baseQuantity : baseQuantity; for (let i = 0; i < best.length; i++) { // biome-ignore lint/style/noNonNullAssertion: This is safe because we know the best array is not empty const bestEntry = best[i]; if (absQuantity >= bestEntry[1]) { bestUnit = bestEntry[0]; } else { break; } } const result = convertTo(from, quantity, bestUnit); return { quantity: result, unit: bestUnit, toString: (toFixed) => `${typeof result === 'bigint' || toFixed === undefined ? result : result.toFixed(toFixed)} ${bestUnit}`, }; } function convertToAny(to, kind) { if (to === 'best') { return convertToBest(this._quantity, this._from, kind ?? 'metric'); } return convertTo(this._from, this._quantity, to); } /** * Convert a given quantity of a unit into another unit. * * @param quantity - The quantity of the `from` unit you want to convert * @param from - The unit you are converting from * * @returns An object you can use to convert the provided quantity * * @public */ function convert(quantity, from) { if (!(from in parse_unit_1.unitsObject)) { throw new RangeError(`${from} is not a valid unit`); } return { to: convertToAny.bind({ _quantity: quantity, _from: from }), }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb252ZXJ0ZXJzL2NvbnZlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF3SUEsMEJBV0M7QUFsSkQsNERBQW9EO0FBQ3BELDREQUFtRTtBQUtuRSw2R0FBNkc7QUFDN0cscUhBQXFIO0FBQ3JILE1BQU0sZUFBZSxHQUFxQixFQUFFLENBQUM7QUFFN0MsU0FBUyxTQUFTLENBQTRCLElBQVksRUFBRSxRQUFXLEVBQUUsRUFBVTtJQUNsRixJQUFJLFFBQVEsR0FBRyx3QkFBVyxDQUFDLEVBQVUsQ0FBQyxDQUFDO0lBRXZDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQUksVUFBVSxHQUFHLHdCQUFXLENBQUMsSUFBWSxDQUFDLENBQUM7SUFFM0MsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssZUFBZSxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNyRCxxREFBcUQ7WUFDckQsUUFBUSxHQUFHLHdCQUFXLENBQUMsR0FBRyxDQUFDO1FBQzVCLENBQUM7YUFBTSxJQUFJLElBQUksS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLGVBQWUsRUFBRSxDQUFDO1lBQzVELFVBQVUsR0FBRyx3QkFBVyxDQUFDLEdBQUcsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNQLE1BQU0sSUFBSSxVQUFVLENBQUMsOENBQThDLElBQUksUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7SUFDRixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU1QixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLElBQ0MsQ0FBQyxJQUFJLElBQUksd0JBQVcsSUFBSSxFQUFFLElBQUksd0JBQVcsQ0FBQztZQUMxQyx3QkFBVyxDQUFDLElBQWdDLENBQUMsS0FBSyx3QkFBVyxDQUFDLEVBQThCLENBQUMsRUFDNUYsQ0FBQztZQUNGLE1BQU0sSUFBSSxVQUFVLENBQ25CLGtCQUFrQixJQUFJLE9BQU8sRUFBRSw4R0FBOEcsQ0FDN0ksQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLENBQUMsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUEwQixDQUFDO0lBQ3BGLENBQUM7SUFFRCxJQUFJLElBQUksSUFBSSx3QkFBVyxFQUFFLENBQUM7UUFDekIsSUFBSSxFQUFFLElBQUksd0JBQVcsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxDQUFFLFFBQW1CLEdBQUcsd0JBQVcsQ0FBQyxJQUFnQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7Z0JBQ3JHLHdCQUFXLENBQUMsRUFBOEIsQ0FBQyxDQUEwQixDQUFDO1FBQ3hFLENBQUM7UUFFRCxPQUFPLENBQUMsQ0FBRSxRQUFtQixHQUFHLHdCQUFXLENBQUMsSUFBZ0MsQ0FBQyxDQUFDO1lBQzdFLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUEwQixDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLEVBQUUsSUFBSSx3QkFBVyxFQUFFLENBQUM7UUFDdkIsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyx3QkFBVyxDQUFDLEVBQThCLENBQUMsQ0FBMEIsQ0FBQztJQUNsSCxDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBMEIsQ0FBQztBQUNwRSxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3JCLFFBQVcsRUFDWCxJQUFPLEVBQ1AsSUFBYztJQUVkLE1BQU0sV0FBVyxHQUFHLHdCQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsTUFBTSxJQUFJLEdBQUcsc0JBQVMsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRWpFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQyxJQUFJLFFBQVEsR0FBRyxZQUFtQyxDQUFDO0lBRW5ELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzdELE1BQU0sV0FBVyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFFcEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0Qyx1R0FBdUc7UUFDdkcsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBRTNCLElBQUksV0FBVyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUF3QixDQUFDO1FBQ2hELENBQUM7YUFBTSxDQUFDO1lBQ1AsTUFBTTtRQUNQLENBQUM7SUFDRixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFbkQsT0FBTztRQUNOLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLElBQUksRUFBRSxRQUFRO1FBQ2QsUUFBUSxFQUFFLENBQUMsT0FBZ0IsRUFBRSxFQUFFLENBQzlCLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLEVBQXVEO0tBQzdKLENBQUM7QUFDSCxDQUFDO0FBZ0JELFNBQVMsWUFBWSxDQUVwQixFQUE4QixFQUM5QixJQUFvQjtJQUVwQixJQUFJLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNuQixPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLE9BQU8sQ0FDdEIsUUFBVyxFQUNYLElBQU87SUFFUCxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksd0JBQVcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLElBQUksc0JBQXNCLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsT0FBTztRQUNOLEVBQUUsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDeEIsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCZXN0S2luZCwgTWVhc3VyZUtpbmQgfSBmcm9tICcuLi9jb252ZXJzaW9ucy90eXBlcyc7XG5pbXBvcnQgeyBiZXN0VW5pdHMgfSBmcm9tICcuLi9nZW5lcmF0ZWQvYmVzdC11bml0cyc7XG5pbXBvcnQgeyBkaWZmZXJlbmNlcywgdW5pdHNPYmplY3QgfSBmcm9tICcuLi9nZW5lcmF0ZWQvcGFyc2UtdW5pdCc7XG5pbXBvcnQgdHlwZSB7IEJlc3RDb252ZXJzaW9uLCBDb252ZXJ0ZXIgfSBmcm9tICcuLi90eXBlcy9jb252ZXJ0ZXInO1xuaW1wb3J0IHR5cGUgeyBCZXN0VW5pdHNGb3JVbml0LCBNZWFzdXJlc0J5VW5pdCwgVW5pdCB9IGZyb20gJy4uL3R5cGVzL3VuaXRzJztcbmltcG9ydCB0eXBlIHsgTGl0ZXJhbFRvUHJpbWl0aXZlIH0gZnJvbSAnLi4vdHlwZXMvdXRpbHMnO1xuXG4vLyBJbXBvcnRpbmcgTWVhc3VyZUtpbmQgd2lsbCBjYXVzZSB0aGUgZW50aXJlIGVudW0gdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCwgd2hpY2ggaW5jcmVhc2VzIGJ1bmRsZSBzaXplXG4vLyBUaGlzIHdvcmthcm91bmQgYWxsb3dzIG1lIHRvIGp1c3QgaGFyZGNvZGUgdGhlIHZhbHVlLCBidXQgZW5zdXJlcyBpdCBkb2Vzbid0IGJlY29tZSBpbmFjY3VyYXRlIGlmIHRoZSBlbnVtIGNoYW5nZXNcbmNvbnN0IE1lYXN1cmVLaW5kVGltZTogTWVhc3VyZUtpbmQuVGltZSA9IDE0O1xuXG5mdW5jdGlvbiBjb252ZXJ0VG88USBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oZnJvbTogc3RyaW5nLCBxdWFudGl0eTogUSwgdG86IHN0cmluZyk6IExpdGVyYWxUb1ByaW1pdGl2ZTxRPiB7XG5cdGxldCBwYXJzZWRUbyA9IHVuaXRzT2JqZWN0W3RvIGFzIFVuaXRdO1xuXG5cdGlmICghcGFyc2VkVG8pIHtcblx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHt0b30gaXMgbm90IGEgdmFsaWQgdW5pdGApO1xuXHR9XG5cblx0bGV0IHBhcnNlZEZyb20gPSB1bml0c09iamVjdFtmcm9tIGFzIFVuaXRdO1xuXG5cdGlmIChwYXJzZWRGcm9tWzBdICE9PSBwYXJzZWRUb1swXSkge1xuXHRcdGlmIChwYXJzZWRGcm9tWzBdID09PSBNZWFzdXJlS2luZFRpbWUgJiYgdG8gPT09ICdtJykge1xuXHRcdFx0Ly8gR29pbmcgZnJvbSB0aW1lIHRvIG1ldGVycywgeW91IG1lYW50IHRvIGRvIG1pbnV0ZXNcblx0XHRcdHBhcnNlZFRvID0gdW5pdHNPYmplY3QubWluO1xuXHRcdH0gZWxzZSBpZiAoZnJvbSA9PT0gJ20nICYmIHBhcnNlZFRvWzBdID09PSBNZWFzdXJlS2luZFRpbWUpIHtcblx0XHRcdHBhcnNlZEZyb20gPSB1bml0c09iamVjdC5taW47XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGRpZmZlcmVudCBtZWFzdXJlczogJHtmcm9tfSBhbmQgJHt0b31gKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBmcm9tUmF0aW8gPSBwYXJzZWRGcm9tWzFdO1xuXHRjb25zdCB0b1JhdGlvID0gcGFyc2VkVG9bMV07XG5cblx0aWYgKHR5cGVvZiBxdWFudGl0eSA9PT0gJ2JpZ2ludCcpIHtcblx0XHRpZiAoXG5cdFx0XHQoZnJvbSBpbiBkaWZmZXJlbmNlcyB8fCB0byBpbiBkaWZmZXJlbmNlcykgJiZcblx0XHRcdGRpZmZlcmVuY2VzW2Zyb20gYXMga2V5b2YgdHlwZW9mIGRpZmZlcmVuY2VzXSAhPT0gZGlmZmVyZW5jZXNbdG8gYXMga2V5b2YgdHlwZW9mIGRpZmZlcmVuY2VzXVxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoXG5cdFx0XHRcdGBDb252ZXJzaW9uIGZvciAke2Zyb219IHRvICR7dG99IGNhbm5vdCBiZSBjYWxjdWxhdGVkIGFzIG9uZSBvZiB0aGUgdW5pdHMgaGFzIGEgY29udmVyc2lvbiBkaWZmZXJlbmNlIHdoaWNoIGNhbm5vdCBiZSBleHByZXNzZWQgd2l0aCBiaWdpbnRzYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICgocXVhbnRpdHkgKiBCaWdJbnQoZnJvbVJhdGlvKSkgLyBCaWdJbnQodG9SYXRpbykpIGFzIExpdGVyYWxUb1ByaW1pdGl2ZTxRPjtcblx0fVxuXG5cdGlmIChmcm9tIGluIGRpZmZlcmVuY2VzKSB7XG5cdFx0aWYgKHRvIGluIGRpZmZlcmVuY2VzKSB7XG5cdFx0XHRyZXR1cm4gKCgocXVhbnRpdHkgYXMgbnVtYmVyKSArIGRpZmZlcmVuY2VzW2Zyb20gYXMga2V5b2YgdHlwZW9mIGRpZmZlcmVuY2VzXSkgKiAoZnJvbVJhdGlvIC8gdG9SYXRpbykgLVxuXHRcdFx0XHRkaWZmZXJlbmNlc1t0byBhcyBrZXlvZiB0eXBlb2YgZGlmZmVyZW5jZXNdKSBhcyBMaXRlcmFsVG9QcmltaXRpdmU8UT47XG5cdFx0fVxuXG5cdFx0cmV0dXJuICgoKHF1YW50aXR5IGFzIG51bWJlcikgKyBkaWZmZXJlbmNlc1tmcm9tIGFzIGtleW9mIHR5cGVvZiBkaWZmZXJlbmNlc10pICpcblx0XHRcdChmcm9tUmF0aW8gLyB0b1JhdGlvKSkgYXMgTGl0ZXJhbFRvUHJpbWl0aXZlPFE+O1xuXHR9XG5cblx0aWYgKHRvIGluIGRpZmZlcmVuY2VzKSB7XG5cdFx0cmV0dXJuIChxdWFudGl0eSAqIChmcm9tUmF0aW8gLyB0b1JhdGlvKSAtIGRpZmZlcmVuY2VzW3RvIGFzIGtleW9mIHR5cGVvZiBkaWZmZXJlbmNlc10pIGFzIExpdGVyYWxUb1ByaW1pdGl2ZTxRPjtcblx0fVxuXG5cdHJldHVybiAocXVhbnRpdHkgKiAoZnJvbVJhdGlvIC8gdG9SYXRpbykpIGFzIExpdGVyYWxUb1ByaW1pdGl2ZTxRPjtcbn1cblxuZnVuY3Rpb24gY29udmVydFRvQmVzdDxRIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50LCBVIGV4dGVuZHMgVW5pdD4oXG5cdHF1YW50aXR5OiBRLFxuXHRmcm9tOiBVLFxuXHRraW5kOiBCZXN0S2luZCxcbik6IEJlc3RDb252ZXJzaW9uPFEsIEJlc3RVbml0c0ZvclVuaXQ8VT4+IHtcblx0Y29uc3QgZnJvbU1lYXN1cmUgPSB1bml0c09iamVjdFtmcm9tXVswXTtcblx0Y29uc3QgYmVzdCA9IGJlc3RVbml0c1traW5kID09PSAnaW1wZXJpYWwnID8gMSA6IDBdW2Zyb21NZWFzdXJlXTtcblxuXHRjb25zdCBzbWFsbGVzdFVuaXQgPSBiZXN0WzBdWzBdO1xuXG5cdGxldCBiZXN0VW5pdCA9IHNtYWxsZXN0VW5pdCBhcyBCZXN0VW5pdHNGb3JVbml0PFU+O1xuXG5cdGNvbnN0IGJhc2VRdWFudGl0eSA9IGNvbnZlcnRUbyhmcm9tLCBxdWFudGl0eSwgc21hbGxlc3RVbml0KTtcblx0Y29uc3QgYWJzUXVhbnRpdHkgPSBiYXNlUXVhbnRpdHkgPCAwID8gLWJhc2VRdWFudGl0eSA6IGJhc2VRdWFudGl0eTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGJlc3QubGVuZ3RoOyBpKyspIHtcblx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIGtub3cgdGhlIGJlc3QgYXJyYXkgaXMgbm90IGVtcHR5XG5cdFx0Y29uc3QgYmVzdEVudHJ5ID0gYmVzdFtpXSE7XG5cblx0XHRpZiAoYWJzUXVhbnRpdHkgPj0gYmVzdEVudHJ5WzFdKSB7XG5cdFx0XHRiZXN0VW5pdCA9IGJlc3RFbnRyeVswXSBhcyBCZXN0VW5pdHNGb3JVbml0PFU+O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRjb25zdCByZXN1bHQgPSBjb252ZXJ0VG8oZnJvbSwgcXVhbnRpdHksIGJlc3RVbml0KTtcblxuXHRyZXR1cm4ge1xuXHRcdHF1YW50aXR5OiByZXN1bHQsXG5cdFx0dW5pdDogYmVzdFVuaXQsXG5cdFx0dG9TdHJpbmc6ICh0b0ZpeGVkPzogbnVtYmVyKSA9PlxuXHRcdFx0YCR7dHlwZW9mIHJlc3VsdCA9PT0gJ2JpZ2ludCcgfHwgdG9GaXhlZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogcmVzdWx0LnRvRml4ZWQodG9GaXhlZCl9ICR7YmVzdFVuaXR9YCBhcyBgJHtMaXRlcmFsVG9QcmltaXRpdmU8UT59ICR7QmVzdFVuaXRzRm9yVW5pdDxVPn1gLFxuXHR9O1xufVxuXG50eXBlIENvbnZlcnRlclRoaXM8USBleHRlbmRzIG51bWJlciB8IGJpZ2ludCwgVSBleHRlbmRzIFVuaXQ+ID0ge1xuXHRfcXVhbnRpdHk6IFE7XG5cdF9mcm9tOiBVO1xufTtcblxuZnVuY3Rpb24gY29udmVydFRvQW55PFEgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQsIFUgZXh0ZW5kcyBVbml0Pihcblx0dGhpczogQ29udmVydGVyVGhpczxRLCBVPixcblx0dG86IE1lYXN1cmVzQnlVbml0PFU+LFxuKTogTGl0ZXJhbFRvUHJpbWl0aXZlPFE+O1xuZnVuY3Rpb24gY29udmVydFRvQW55PFEgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQsIFUgZXh0ZW5kcyBVbml0LCBLIGV4dGVuZHMgQmVzdEtpbmQgPSAnbWV0cmljJz4oXG5cdHRoaXM6IENvbnZlcnRlclRoaXM8USwgVT4sXG5cdHRvOiAnYmVzdCcsXG5cdGtpbmQ/OiBLIHwgdW5kZWZpbmVkLFxuKTogQmVzdENvbnZlcnNpb248USwgQmVzdFVuaXRzRm9yVW5pdDxVPj47XG5mdW5jdGlvbiBjb252ZXJ0VG9Bbnk8USBleHRlbmRzIG51bWJlciB8IGJpZ2ludCwgVSBleHRlbmRzIFVuaXQsIEsgZXh0ZW5kcyBCZXN0S2luZCA9ICdtZXRyaWMnPihcblx0dGhpczogQ29udmVydGVyVGhpczxRLCBVPixcblx0dG86IE1lYXN1cmVzQnlVbml0PFU+IHwgJ2Jlc3QnLFxuXHRraW5kPzogSyB8IHVuZGVmaW5lZCxcbik6IExpdGVyYWxUb1ByaW1pdGl2ZTxRPiB8IEJlc3RDb252ZXJzaW9uPFEsIEJlc3RVbml0c0ZvclVuaXQ8VT4+IHtcblx0aWYgKHRvID09PSAnYmVzdCcpIHtcblx0XHRyZXR1cm4gY29udmVydFRvQmVzdCh0aGlzLl9xdWFudGl0eSwgdGhpcy5fZnJvbSwga2luZCA/PyAnbWV0cmljJyk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVydFRvKHRoaXMuX2Zyb20sIHRoaXMuX3F1YW50aXR5LCB0byk7XG59XG5cbi8qKlxuICogQ29udmVydCBhIGdpdmVuIHF1YW50aXR5IG9mIGEgdW5pdCBpbnRvIGFub3RoZXIgdW5pdC5cbiAqXG4gKiBAcGFyYW0gcXVhbnRpdHkgLSBUaGUgcXVhbnRpdHkgb2YgdGhlIGBmcm9tYCB1bml0IHlvdSB3YW50IHRvIGNvbnZlcnRcbiAqIEBwYXJhbSBmcm9tIC0gVGhlIHVuaXQgeW91IGFyZSBjb252ZXJ0aW5nIGZyb21cbiAqXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgeW91IGNhbiB1c2UgdG8gY29udmVydCB0aGUgcHJvdmlkZWQgcXVhbnRpdHlcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0PFEgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQsIFUgZXh0ZW5kcyBVbml0Pihcblx0cXVhbnRpdHk6IFEsXG5cdGZyb206IFUsXG4pOiBDb252ZXJ0ZXI8USwgTWVhc3VyZXNCeVVuaXQ8VT4+IHtcblx0aWYgKCEoZnJvbSBpbiB1bml0c09iamVjdCkpIHtcblx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHtmcm9tfSBpcyBub3QgYSB2YWxpZCB1bml0YCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHRvOiBjb252ZXJ0VG9BbnkuYmluZCh7IF9xdWFudGl0eTogcXVhbnRpdHksIF9mcm9tOiBmcm9tIH0pLFxuXHR9IGFzIENvbnZlcnRlcjxRLCBNZWFzdXJlc0J5VW5pdDxVPj47XG59XG4iXX0=