UNPKG

@magic-xpa/utils

Version:

magic utils package

214 lines • 21.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ // In order to convert some functionality to Visual C#, the Java Language Conversion Assistant // creates "support classes" that duplicate the original functionality. // // Support classes replicate the functionality of the original code, but in some cases they are // substantially different architecturally. Although every effort is made to preserve the // original architecture of the application in the converted project, the user should be aware that // the primary goal of these support classes is to replicate functionality, and that at times // the architecture of the resulting solution may differ somewhat. import { StringBuilder, NString, NNumber, DateTime, RefParam } from "@magic-xpa/mscorelib"; /// <summary> /// Contains conversion support elements such as classes, interfaces and static methods. /// </summary> export class Misc { /// <summary> /// Writes the exception stack trace to the received stream /// </summary> /// <param name="throwable">Exception to obtain information from</param> /// <param name="stream">Output sream used to write to</param> /** * @param {?} throwable * @return {?} */ static WriteStackTrace(throwable) { console.log(throwable.Message); console.log(throwable.StackTrace); } /// <summary> /// Receives a byte array and returns it transformed in an byte array /// </summary> /// <param name="byteArray">Byte array to process</param> /// <returns>The transformed array</returns> /** * @param {?} byteArray * @return {?} */ static ToSByteArray(byteArray) { /** @type {?} */ let sbyteArray = null; if (byteArray !== null) { sbyteArray = new Int8Array(byteArray.length); for (let i = 0; i < byteArray.length; i = i + 1) { sbyteArray[i] = (/** @type {?} */ (byteArray[i])); } } return sbyteArray; } /// <summary> /// Receives sbyte array and returns it transformed in a byte array /// </summary> /// <param name="sbyteArray">sbyte array to process</param> /// <returns>The transformed array</returns> /** * @param {?} sbyteArray * @return {?} */ static ToByteArray(sbyteArray) { /** @type {?} */ let byteArray = null; if (sbyteArray !== null) { byteArray = new Uint8Array(sbyteArray.length); for (let i = 0; i < sbyteArray.length; i = i + 1) { byteArray[i] = (/** @type {?} */ (sbyteArray[i])); } } return byteArray; } /// <summary> Compares number of bytes in two byte arrays</summary> /// <param name="source"></param> /// <param name="destination"></param> /// <param name="numberOfBytes"></param> /// <returns> boolen true if equal</returns> /** * @param {?} source * @param {?} destination * @param {?} numberOfBytes * @return {?} */ static CompareByteArray(source, destination, numberOfBytes) { if (source.length >= numberOfBytes && destination.length >= numberOfBytes) { for (let len = 0; len < numberOfBytes; len++) { if (source[len] !== destination[len]) return false; } } else return false; return true; } /// <summary> /// Performs an unsigned bitwise right shift with the specified number /// </summary> /// <param name="number">Number to operate on</param> /// <param name="bits">Ammount of bits to shift</param> /// <returns>The resulting number from the shift operation</returns> // TODO: instead of calling URShift(number, bits), we can use((uint)number) >> bits. /** * @param {?} number * @param {?} bits * @return {?} */ static URShift(number, bits) { /** @type {?} */ let result; if (number >= 0) { result = number >> bits; } else { result = (number >> bits) + (2 << ~bits); } return result; } /// <summary> /// get system's time in milliseconds /// </summary> /// <returns></returns> /** * @return {?} */ static getSystemMilliseconds() { // TODO - check if we need this adjustment return Math.floor((DateTime.Now.Ticks - 621355968000000000) / 10000); } /// <summary> /// Compares 2 int arrays /// </summary> /// <param name="arrayOne"></param> /// <param name="arrayTwo"></param> /// <returns>true if arrays are equal else false</returns> /** * @param {?} arrayOne * @param {?} arrayTwo * @return {?} */ static CompareIntArrays(arrayOne, arrayTwo) { /** @type {?} */ let areEqual = false; if (arrayOne === arrayTwo) { areEqual = true; } else { if (arrayOne !== null && arrayTwo !== null) { if (arrayOne.length === arrayTwo.length) { for (let i = 0; i < arrayOne.length; i = i + 1) { if (arrayOne[i] !== arrayTwo[i]) { break; } areEqual = true; } } } } return areEqual; } /// <summary> /// Returns the comma separated string for the values passed in int array. /// </summary> /// <param name="values">Integer array</param> /// <returns>comma separated string</returns> /** * @param {?} intArray * @return {?} */ static GetCommaSeperatedString(intArray) { /** @type {?} */ let temp = new StringBuilder(); for (let val = 0; val < intArray.length; val = val + 1) { /** @type {?} */ let value = intArray[val]; if (temp.Length > 0) { temp.Append(","); } temp.Append(value); } return temp.ToString(); } /// <summary> /// Returns int array out of comma separated string /// </summary> /// <param name="value">comma separated string</param> /// <returns>Integer array</returns> /** * @param {?} commaSeparatedValue * @return {?} */ static GetIntArray(commaSeparatedValue) { /** @type {?} */ let intArray = new Array(0); if (!NString.IsNullOrEmpty(commaSeparatedValue)) { /** @type {?} */ let vals = commaSeparatedValue.split(','); intArray = new Array(vals.length); /** @type {?} */ let outInt = new RefParam(0); for (let iCtr = 0; iCtr < vals.length; iCtr = iCtr + 1) { /** @type {?} */ let _r = NNumber.TryParse(vals[iCtr], outInt); intArray[iCtr] = outInt.value; } } return intArray; } /** * @param {?} fileName * @return {?} */ static IsWebUrl(fileName) { return fileName.toLowerCase().startsWith("http"); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlzYy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtYWdpYy14cGEvdXRpbHMvIiwic291cmNlcyI6WyJzcmMvTWlzYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFVQSxPQUFPLEVBQ00sYUFBYSxFQUN4QixPQUFPLEVBQUUsT0FBTyxFQUNoQixRQUFRLEVBQUUsUUFBUSxFQUNuQixNQUFNLHNCQUFzQixDQUFDOzs7O0FBTzlCLE1BQU07Ozs7Ozs7Ozs7SUFPSixNQUFNLENBQUMsZUFBZSxDQUFDLFNBQW9CO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Ozs7Ozs7Ozs7SUFPRCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXFCOztZQUNuQyxVQUFVLEdBQWMsSUFBSTtRQUNoQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2QixVQUFVLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsbUJBQVEsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFBLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3BCLENBQUM7Ozs7Ozs7Ozs7SUFPRCxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQXFCOztZQUNsQyxTQUFTLEdBQWUsSUFBSTtRQUNoQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZ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O29CQUMzRCxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO2dCQUM3QyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7Ozs7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEluIG9yZGVyIHRvIGNvbnZlcnQgc29tZSBmdW5jdGlvbmFsaXR5IHRvIFZpc3VhbCBDIywgdGhlIEphdmEgTGFuZ3VhZ2UgQ29udmVyc2lvbiBBc3Npc3RhbnRcclxuLy8gY3JlYXRlcyBcInN1cHBvcnQgY2xhc3Nlc1wiIHRoYXQgZHVwbGljYXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbmFsaXR5LlxyXG4vL1xyXG4vLyBTdXBwb3J0IGNsYXNzZXMgcmVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBvcmlnaW5hbCBjb2RlLCBidXQgaW4gc29tZSBjYXNlcyB0aGV5IGFyZVxyXG4vLyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudCBhcmNoaXRlY3R1cmFsbHkuIEFsdGhvdWdoIGV2ZXJ5IGVmZm9ydCBpcyBtYWRlIHRvIHByZXNlcnZlIHRoZVxyXG4vLyBvcmlnaW5hbCBhcmNoaXRlY3R1cmUgb2YgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSBjb252ZXJ0ZWQgcHJvamVjdCwgdGhlIHVzZXIgc2hvdWxkIGJlIGF3YXJlIHRoYXRcclxuLy8gdGhlIHByaW1hcnkgZ29hbCBvZiB0aGVzZSBzdXBwb3J0IGNsYXNzZXMgaXMgdG8gcmVwbGljYXRlIGZ1bmN0aW9uYWxpdHksIGFuZCB0aGF0IGF0IHRpbWVzXHJcbi8vIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHJlc3VsdGluZyBzb2x1dGlvbiBtYXkgZGlmZmVyIHNvbWV3aGF0LlxyXG5cclxuXHJcbmltcG9ydCB7XHJcbiAgRXhjZXB0aW9uLCBTdHJpbmdCdWlsZGVyLFxyXG4gIE5TdHJpbmcsIE5OdW1iZXIsXHJcbiAgRGF0ZVRpbWUsIFJlZlBhcmFtXHJcbn0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcblxyXG5cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIENvbnRhaW5zIGNvbnZlcnNpb24gc3VwcG9ydCBlbGVtZW50cyBzdWNoIGFzIGNsYXNzZXMsIGludGVyZmFjZXMgYW5kIHN0YXRpYyBtZXRob2RzLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgTWlzYyB7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGVzIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2UgdG8gdGhlIHJlY2VpdmVkIHN0cmVhbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGhyb3dhYmxlXCI+RXhjZXB0aW9uIHRvIG9idGFpbiBpbmZvcm1hdGlvbiBmcm9tPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJlYW1cIj5PdXRwdXQgc3JlYW0gdXNlZCB0byB3cml0ZSB0bzwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlU3RhY2tUcmFjZSh0aHJvd2FibGU6IEV4Y2VwdGlvbik6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2codGhyb3dhYmxlLk1lc3NhZ2UpO1xyXG4gICAgY29uc29sZS5sb2codGhyb3dhYmxlLlN0YWNrVHJhY2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZWNlaXZlcyBhIGJ5dGUgYXJyYXkgYW5kIHJldHVybnMgaXQgdHJhbnNmb3JtZWQgaW4gYW4gYnl0ZSBhcnJheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYnl0ZUFycmF5XCI+Qnl0ZSBhcnJheSB0byBwcm9jZXNzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+VGhlIHRyYW5zZm9ybWVkIGFycmF5PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBUb1NCeXRlQXJyYXkoYnl0ZUFycmF5OiBVaW50OEFycmF5KTogSW50OEFycmF5IHtcclxuICAgIGxldCBzYnl0ZUFycmF5OiBJbnQ4QXJyYXkgPSBudWxsO1xyXG4gICAgaWYgKGJ5dGVBcnJheSAhPT0gbnVsbCkge1xyXG4gICAgICBzYnl0ZUFycmF5ID0gbmV3IEludDhBcnJheShieXRlQXJyYXkubGVuZ3RoKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGJ5dGVBcnJheS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIHNieXRlQXJyYXlbaV0gPSA8bnVtYmVyPmJ5dGVBcnJheVtpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNieXRlQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlY2VpdmVzIHNieXRlIGFycmF5IGFuZCByZXR1cm5zIGl0IHRyYW5zZm9ybWVkIGluIGEgYnl0ZSBhcnJheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2J5dGVBcnJheVwiPnNieXRlIGFycmF5IHRvIHByb2Nlc3M8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5UaGUgdHJhbnNmb3JtZWQgYXJyYXk8L3JldHVybnM+XHJcbiAgc3RhdGljIFRvQnl0ZUFycmF5KHNieXRlQXJyYXk6IEludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xyXG4gICAgbGV0IGJ5dGVBcnJheTogVWludDhBcnJheSA9IG51bGw7XHJcbiAgICBpZiAoc2J5dGVBcnJheSAhPT0gbnVsbCkge1xyXG4gICAgICBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShzYnl0ZUFycmF5Lmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzYnl0ZUFycmF5Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgYnl0ZUFycmF5W2ldID0gPG51bWJlcj5zYnl0ZUFycmF5W2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnl0ZUFycmF5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb21wYXJlcyBudW1iZXIgb2YgYnl0ZXMgaW4gdHdvIGJ5dGUgYXJyYXlzPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNvdXJjZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVzdGluYXRpb25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm51bWJlck9mQnl0ZXNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVuIHRydWUgaWYgZXF1YWw8L3JldHVybnM+XHJcbiAgc3RhdGljIENvbXBhcmVCeXRlQXJyYXkoc291cmNlOiBVaW50OEFycmF5LCBkZXN0aW5hdGlvbjogVWludDhBcnJheSwgbnVtYmVyT2ZCeXRlczogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoc291cmNlLmxlbmd0aCA+PSBudW1iZXJPZkJ5dGVzICYmIGRlc3RpbmF0aW9uLmxlbmd0aCA+PSBudW1iZXJPZkJ5dGVzKSB7XHJcbiAgICAgIGZvciAobGV0IGxlbjogbnVtYmVyID0gMDsgbGVuIDwgbnVtYmVyT2ZCeXRlczsgbGVuKyspIHtcclxuICAgICAgICBpZiAoc291cmNlW2xlbl0gIT09IGRlc3RpbmF0aW9uW2xlbl0pXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBQZXJmb3JtcyBhbiB1bnNpZ25lZCBiaXR3aXNlIHJpZ2h0IHNoaWZ0IHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm51bWJlclwiPk51bWJlciB0byBvcGVyYXRlIG9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJiaXRzXCI+QW1tb3VudCBvZiBiaXRzIHRvIHNoaWZ0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+VGhlIHJlc3VsdGluZyBudW1iZXIgZnJvbSB0aGUgc2hpZnQgb3BlcmF0aW9uPC9yZXR1cm5zPlxyXG4gIC8vIFRPRE86IGluc3RlYWQgb2YgY2FsbGluZyBVUlNoaWZ0KG51bWJlciwgYml0cyksIHdlIGNhbiB1c2UoKHVpbnQpbnVtYmVyKSA+PiBiaXRzLlxyXG4gIHN0YXRpYyBVUlNoaWZ0KG51bWJlcjogbnVtYmVyLCBiaXRzOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG4gICAgaWYgKG51bWJlciA+PSAwKSB7XHJcbiAgICAgIHJlc3VsdCA9IG51bWJlciA+PiBiaXRzO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IChudW1iZXIgPj4gYml0cykgKyAoMiA8PCB+Yml0cyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgc3lzdGVtJ3MgdGltZSBpbiBtaWxsaXNlY29uZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGdldFN5c3RlbU1pbGxpc2Vjb25kcygpOiBudW1iZXIge1xyXG4gICAgLy8gVE9ETyAtIGNoZWNrIGlmIHdlIG5lZWQgdGhpcyBhZGp1c3RtZW50XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoRGF0ZVRpbWUuTm93LlRpY2tzIC0gNjIxMzU1OTY4MDAwMDAwMDAwKSAvIDEwMDAwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ29tcGFyZXMgMiBpbnQgYXJyYXlzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhcnJheU9uZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYXJyYXlUd29cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cnVlIGlmIGFycmF5cyBhcmUgZXF1YWwgZWxzZSBmYWxzZTwvcmV0dXJucz5cclxuICBzdGF0aWMgQ29tcGFyZUludEFycmF5cyhhcnJheU9uZTogbnVtYmVyW10sIGFycmF5VHdvOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFyZUVxdWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoYXJyYXlPbmUgPT09IGFycmF5VHdvKSB7XHJcbiAgICAgIGFyZUVxdWFsID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoYXJyYXlPbmUgIT09IG51bGwgJiYgYXJyYXlUd28gIT09IG51bGwpIHtcclxuICAgICAgICBpZiAoYXJyYXlPbmUubGVuZ3RoID09PSBhcnJheVR3by5sZW5ndGgpIHtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhcnJheU9uZS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICBpZiAoYXJyYXlPbmVbaV0gIT09IGFycmF5VHdvW2ldKSB7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXJlRXF1YWwgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyZUVxdWFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRoZSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nIGZvciB0aGUgdmFsdWVzIHBhc3NlZCBpbiBpbnQgYXJyYXkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZXNcIj5JbnRlZ2VyIGFycmF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+Y29tbWEgc2VwYXJhdGVkIHN0cmluZzwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0Q29tbWFTZXBlcmF0ZWRTdHJpbmcoaW50QXJyYXk6IG51bWJlcltdKTogc3RyaW5nIHtcclxuICAgIGxldCB0ZW1wOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGZvciAobGV0IHZhbDogbnVtYmVyID0gMDsgdmFsIDwgaW50QXJyYXkubGVuZ3RoOyB2YWwgPSB2YWwgKyAxKSB7XHJcbiAgICAgIGxldCB2YWx1ZTogbnVtYmVyID0gaW50QXJyYXlbdmFsXTtcclxuICAgICAgaWYgKHRlbXAuTGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRlbXAuQXBwZW5kKFwiLFwiKTtcclxuICAgICAgfVxyXG4gICAgICB0ZW1wLkFwcGVuZCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcC5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIGludCBhcnJheSBvdXQgb2YgY29tbWEgc2VwYXJhdGVkIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj5jb21tYSBzZXBhcmF0ZWQgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+SW50ZWdlciBhcnJheTwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0SW50QXJyYXkoY29tbWFTZXBhcmF0ZWRWYWx1ZTogc3RyaW5nKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IGludEFycmF5OiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KDApO1xyXG5cclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KGNvbW1hU2VwYXJhdGVkVmFsdWUpKSB7XHJcbiAgICAgIGxldCB2YWxzOiBzdHJpbmdbXSA9IGNvbW1hU2VwYXJhdGVkVmFsdWUuc3BsaXQoJywnKTtcclxuICAgICAgaW50QXJyYXkgPSBuZXcgQXJyYXk8bnVtYmVyPih2YWxzLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgb3V0SW50OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtKDApO1xyXG4gICAgICBmb3IgKGxldCBpQ3RyOiBudW1iZXIgPSAwOyBpQ3RyIDwgdmFscy5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICAgIGxldCBfciA9IE5OdW1iZXIuVHJ5UGFyc2UodmFsc1tpQ3RyXSwgb3V0SW50KTtcclxuICAgICAgICBpbnRBcnJheVtpQ3RyXSA9IG91dEludC52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnRBcnJheTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBJc1dlYlVybChmaWxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmlsZU5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiaHR0cFwiKTtcclxuICB9XHJcbn1cclxuIl19