UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

877 lines • 88.2 kB
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PLPReader = void 0;
exports.isPLPStream = isPLPStream;
exports.readValue = readValue;
var _metadataParser = require("./metadata-parser");
var _dataType = require("./data-type");
var _iconvLite = _interopRequireDefault(require("iconv-lite"));
var _guidParser = require("./guid-parser");
var _helpers = require("./token/helpers");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const NULL = (1 << 16) - 1;
const MAX = (1 << 16) - 1;
const THREE_AND_A_THIRD = 3 + 1 / 3;
const MONEY_DIVISOR = 10000;
const PLP_NULL = 0xFFFFFFFFFFFFFFFFn;
const UNKNOWN_PLP_LEN = 0xFFFFFFFFFFFFFFFEn;
const DEFAULT_ENCODING = 'utf8';
function readTinyInt(buf, offset) {
  return (0, _helpers.readUInt8)(buf, offset);
}
function readSmallInt(buf, offset) {
  return (0, _helpers.readInt16LE)(buf, offset);
}
function readInt(buf, offset) {
  return (0, _helpers.readInt32LE)(buf, offset);
}
function readBigInt(buf, offset) {
  let value;
  ({
    offset,
    value
  } = (0, _helpers.readBigInt64LE)(buf, offset));
  return new _helpers.Result(value.toString(), offset);
}
function readReal(buf, offset) {
  return (0, _helpers.readFloatLE)(buf, offset);
}
function readFloat(buf, offset) {
  return (0, _helpers.readDoubleLE)(buf, offset);
}
function readSmallMoney(buf, offset) {
  let value;
  ({
    offset,
    value
  } = (0, _helpers.readInt32LE)(buf, offset));
  return new _helpers.Result(value / MONEY_DIVISOR, offset);
}
function readMoney(buf, offset) {
  let high;
  ({
    offset,
    value: high
  } = (0, _helpers.readInt32LE)(buf, offset));
  let low;
  ({
    offset,
    value: low
  } = (0, _helpers.readUInt32LE)(buf, offset));
  return new _helpers.Result((low + 0x100000000 * high) / MONEY_DIVISOR, offset);
}
function readBit(buf, offset) {
  let value;
  ({
    offset,
    value
  } = (0, _helpers.readUInt8)(buf, offset));
  return new _helpers.Result(!!value, offset);
}
function readValue(buf, offset, metadata, options) {
  const type = metadata.type;
  switch (type.name) {
    case 'Null':
      return new _helpers.Result(null, offset);
    case 'TinyInt':
      {
        return readTinyInt(buf, offset);
      }
    case 'SmallInt':
      {
        return readSmallInt(buf, offset);
      }
    case 'Int':
      {
        return readInt(buf, offset);
      }
    case 'BigInt':
      {
        return readBigInt(buf, offset);
      }
    case 'IntN':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        switch (dataLength) {
          case 0:
            return new _helpers.Result(null, offset);
          case 1:
            return readTinyInt(buf, offset);
          case 2:
            return readSmallInt(buf, offset);
          case 4:
            return readInt(buf, offset);
          case 8:
            return readBigInt(buf, offset);
          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for IntN');
        }
      }
    case 'Real':
      {
        return readReal(buf, offset);
      }
    case 'Float':
      {
        return readFloat(buf, offset);
      }
    case 'FloatN':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        switch (dataLength) {
          case 0:
            return new _helpers.Result(null, offset);
          case 4:
            return readReal(buf, offset);
          case 8:
            return readFloat(buf, offset);
          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for FloatN');
        }
      }
    case 'SmallMoney':
      {
        return readSmallMoney(buf, offset);
      }
    case 'Money':
      return readMoney(buf, offset);
    case 'MoneyN':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        switch (dataLength) {
          case 0:
            return new _helpers.Result(null, offset);
          case 4:
            return readSmallMoney(buf, offset);
          case 8:
            return readMoney(buf, offset);
          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for MoneyN');
        }
      }
    case 'Bit':
      {
        return readBit(buf, offset);
      }
    case 'BitN':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        switch (dataLength) {
          case 0:
            return new _helpers.Result(null, offset);
          case 1:
            return readBit(buf, offset);
          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for BitN');
        }
      }
    case 'VarChar':
    case 'Char':
      {
        const codepage = metadata.collation.codepage;
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt16LE)(buf, offset));
        if (dataLength === NULL) {
          return new _helpers.Result(null, offset);
        }
        return readChars(buf, offset, dataLength, codepage);
      }
    case 'NVarChar':
    case 'NChar':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt16LE)(buf, offset));
        if (dataLength === NULL) {
          return new _helpers.Result(null, offset);
        }
        return readNChars(buf, offset, dataLength);
      }
    case 'VarBinary':
    case 'Binary':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt16LE)(buf, offset));
        if (dataLength === NULL) {
          return new _helpers.Result(null, offset);
        }
        return readBinary(buf, offset, dataLength);
      }
    case 'Text':
      {
        let textPointerLength;
        ({
          offset,
          value: textPointerLength
        } = (0, _helpers.readUInt8)(buf, offset));
        if (textPointerLength === 0) {
          return new _helpers.Result(null, offset);
        }

        // Textpointer
        ({
          offset
        } = readBinary(buf, offset, textPointerLength));

        // Timestamp
        ({
          offset
        } = readBinary(buf, offset, 8));
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt32LE)(buf, offset));
        return readChars(buf, offset, dataLength, metadata.collation.codepage);
      }
    case 'NText':
      {
        let textPointerLength;
        ({
          offset,
          value: textPointerLength
        } = (0, _helpers.readUInt8)(buf, offset));
        if (textPointerLength === 0) {
          return new _helpers.Result(null, offset);
        }

        // Textpointer
        ({
          offset
        } = readBinary(buf, offset, textPointerLength));

        // Timestamp
        ({
          offset
        } = readBinary(buf, offset, 8));
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt32LE)(buf, offset));
        return readNChars(buf, offset, dataLength);
      }
    case 'Image':
      {
        let textPointerLength;
        ({
          offset,
          value: textPointerLength
        } = (0, _helpers.readUInt8)(buf, offset));
        if (textPointerLength === 0) {
          return new _helpers.Result(null, offset);
        }

        // Textpointer
        ({
          offset
        } = readBinary(buf, offset, textPointerLength));

        // Timestamp
        ({
          offset
        } = readBinary(buf, offset, 8));
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt32LE)(buf, offset));
        return readBinary(buf, offset, dataLength);
      }
    case 'SmallDateTime':
      {
        return readSmallDateTime(buf, offset, options.useUTC);
      }
    case 'DateTime':
      {
        return readDateTime(buf, offset, options.useUTC);
      }
    case 'DateTimeN':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        switch (dataLength) {
          case 0:
            return new _helpers.Result(null, offset);
          case 4:
            return readSmallDateTime(buf, offset, options.useUTC);
          case 8:
            return readDateTime(buf, offset, options.useUTC);
          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for DateTimeN');
        }
      }
    case 'Time':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        if (dataLength === 0) {
          return new _helpers.Result(null, offset);
        }
        return readTime(buf, offset, dataLength, metadata.scale, options.useUTC);
      }
    case 'Date':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        if (dataLength === 0) {
          return new _helpers.Result(null, offset);
        }
        return readDate(buf, offset, options.useUTC);
      }
    case 'DateTime2':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        if (dataLength === 0) {
          return new _helpers.Result(null, offset);
        }
        return readDateTime2(buf, offset, dataLength, metadata.scale, options.useUTC);
      }
    case 'DateTimeOffset':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        if (dataLength === 0) {
          return new _helpers.Result(null, offset);
        }
        return readDateTimeOffset(buf, offset, dataLength, metadata.scale);
      }
    case 'NumericN':
    case 'DecimalN':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        if (dataLength === 0) {
          return new _helpers.Result(null, offset);
        }
        return readNumeric(buf, offset, dataLength, metadata.precision, metadata.scale);
      }
    case 'UniqueIdentifier':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt8)(buf, offset));
        switch (dataLength) {
          case 0:
            return new _helpers.Result(null, offset);
          case 0x10:
            return readUniqueIdentifier(buf, offset, options);
          default:
            throw new Error(`Unsupported guid size ${dataLength - 1}`);
        }
      }
    case 'Variant':
      {
        let dataLength;
        ({
          offset,
          value: dataLength
        } = (0, _helpers.readUInt32LE)(buf, offset));
        if (dataLength === 0) {
          return new _helpers.Result(null, offset);
        }
        return readVariant(buf, offset, options, dataLength);
      }
    default:
      {
        throw new Error('Invalid type!');
      }
  }
}
function isPLPStream(metadata) {
  switch (metadata.type.name) {
    case 'VarChar':
    case 'NVarChar':
    case 'VarBinary':
      {
        return metadata.dataLength === MAX;
      }
    case 'Xml':
      {
        return true;
      }
    case 'UDT':
      {
        return true;
      }
  }
}
function readUniqueIdentifier(buf, offset, options) {
  let data;
  ({
    value: data,
    offset
  } = readBinary(buf, offset, 0x10));
  return new _helpers.Result(options.lowerCaseGuids ? (0, _guidParser.bufferToLowerCaseGuid)(data) : (0, _guidParser.bufferToUpperCaseGuid)(data), offset);
}
function readNumeric(buf, offset, dataLength, _precision, scale) {
  let sign;
  ({
    offset,
    value: sign
  } = (0, _helpers.readUInt8)(buf, offset));
  sign = sign === 1 ? 1 : -1;
  let value;
  if (dataLength === 5) {
    ({
      offset,
      value
    } = (0, _helpers.readUInt32LE)(buf, offset));
  } else if (dataLength === 9) {
    ({
      offset,
      value
    } = (0, _helpers.readUNumeric64LE)(buf, offset));
  } else if (dataLength === 13) {
    ({
      offset,
      value
    } = (0, _helpers.readUNumeric96LE)(buf, offset));
  } else if (dataLength === 17) {
    ({
      offset,
      value
    } = (0, _helpers.readUNumeric128LE)(buf, offset));
  } else {
    throw new Error(`Unsupported numeric dataLength ${dataLength}`);
  }
  return new _helpers.Result(value * sign / Math.pow(10, scale), offset);
}
function readVariant(buf, offset, options, dataLength) {
  let baseType;
  ({
    value: baseType,
    offset
  } = (0, _helpers.readUInt8)(buf, offset));
  const type = _dataType.TYPE[baseType];
  let propBytes;
  ({
    value: propBytes,
    offset
  } = (0, _helpers.readUInt8)(buf, offset));
  dataLength = dataLength - propBytes - 2;
  switch (type.name) {
    case 'UniqueIdentifier':
      return readUniqueIdentifier(buf, offset, options);
    case 'Bit':
      return readBit(buf, offset);
    case 'TinyInt':
      return readTinyInt(buf, offset);
    case 'SmallInt':
      return readSmallInt(buf, offset);
    case 'Int':
      return readInt(buf, offset);
    case 'BigInt':
      return readBigInt(buf, offset);
    case 'SmallDateTime':
      return readSmallDateTime(buf, offset, options.useUTC);
    case 'DateTime':
      return readDateTime(buf, offset, options.useUTC);
    case 'Real':
      return readReal(buf, offset);
    case 'Float':
      return readFloat(buf, offset);
    case 'SmallMoney':
      return readSmallMoney(buf, offset);
    case 'Money':
      return readMoney(buf, offset);
    case 'Date':
      return readDate(buf, offset, options.useUTC);
    case 'Time':
      {
        let scale;
        ({
          value: scale,
          offset
        } = (0, _helpers.readUInt8)(buf, offset));
        return readTime(buf, offset, dataLength, scale, options.useUTC);
      }
    case 'DateTime2':
      {
        let scale;
        ({
          value: scale,
          offset
        } = (0, _helpers.readUInt8)(buf, offset));
        return readDateTime2(buf, offset, dataLength, scale, options.useUTC);
      }
    case 'DateTimeOffset':
      {
        let scale;
        ({
          value: scale,
          offset
        } = (0, _helpers.readUInt8)(buf, offset));
        return readDateTimeOffset(buf, offset, dataLength, scale);
      }
    case 'VarBinary':
    case 'Binary':
      {
        // maxLength (unused?)
        ({
          offset
        } = (0, _helpers.readUInt16LE)(buf, offset));
        return readBinary(buf, offset, dataLength);
      }
    case 'NumericN':
    case 'DecimalN':
      {
        let precision;
        ({
          value: precision,
          offset
        } = (0, _helpers.readUInt8)(buf, offset));
        let scale;
        ({
          value: scale,
          offset
        } = (0, _helpers.readUInt8)(buf, offset));
        return readNumeric(buf, offset, dataLength, precision, scale);
      }
    case 'VarChar':
    case 'Char':
      {
        // maxLength (unused?)
        ({
          offset
        } = (0, _helpers.readUInt16LE)(buf, offset));
        let collation;
        ({
          value: collation,
          offset
        } = (0, _metadataParser.readCollation)(buf, offset));
        return readChars(buf, offset, dataLength, collation.codepage);
      }
    case 'NVarChar':
    case 'NChar':
      {
        // maxLength (unused?)
        ({
          offset
        } = (0, _helpers.readUInt16LE)(buf, offset));

        // collation (unused?)
        ({
          offset
        } = (0, _metadataParser.readCollation)(buf, offset));
        return readNChars(buf, offset, dataLength);
      }
    default:
      throw new Error('Invalid type!');
  }
}
function readBinary(buf, offset, dataLength) {
  if (buf.length < offset + dataLength) {
    throw new _helpers.NotEnoughDataError(offset + dataLength);
  }
  return new _helpers.Result(buf.slice(offset, offset + dataLength), offset + dataLength);
}
function readChars(buf, offset, dataLength, codepage) {
  if (buf.length < offset + dataLength) {
    throw new _helpers.NotEnoughDataError(offset + dataLength);
  }
  return new _helpers.Result(_iconvLite.default.decode(buf.slice(offset, offset + dataLength), codepage ?? DEFAULT_ENCODING), offset + dataLength);
}
function readNChars(buf, offset, dataLength) {
  if (buf.length < offset + dataLength) {
    throw new _helpers.NotEnoughDataError(offset + dataLength);
  }
  return new _helpers.Result(buf.toString('ucs2', offset, offset + dataLength), offset + dataLength);
}

/**
 * Reads a PLP (partially length-prefixed) value.
 *
 * PLP values can be arbitrarily large and span many chunks of incoming data,
 * so they are read incrementally: whatever part of the value is available is
 * consumed right away, and the reader's progress is kept across calls. If the
 * available data runs out, `NotEnoughDataError` is thrown and `read` can be
 * called again once more data has arrived.
 */
class PLPReader {
  // The value's total length as announced by the server, or `undefined`
  // while it has not been read yet.

  // Number of bytes of the current PLP chunk that have not been read yet.

  constructor(metadata) {
    this.metadata = metadata;
    this.expectedLength = undefined;
    this.chunks = [];
    this.length = 0;
    this.chunkRemaining = 0;
  }
  read(parser) {
    if (this.expectedLength === undefined) {
      const {
        value,
        offset
      } = (0, _helpers.readBigUInt64LE)(parser.buffer, parser.position);
      parser.position = offset;
      this.expectedLength = value;
    }
    if (this.expectedLength === PLP_NULL) {
      return null;
    }
    while (true) {
      if (this.chunkRemaining === 0) {
        const {
          value: chunkLength,
          offset
        } = (0, _helpers.readUInt32LE)(parser.buffer, parser.position);
        parser.position = offset;
        if (chunkLength === 0) {
          break;
        }
        this.chunkRemaining = chunkLength;
      }
      const buf = parser.buffer;
      const start = parser.position;
      const end = Math.min(start + this.chunkRemaining, buf.length);
      if (start === end) {
        throw new _helpers.NotEnoughDataError(start + 1);
      }
      this.chunks.push(buf.subarray(start, end));
      this.length += end - start;
      this.chunkRemaining -= end - start;
      parser.position = end;
    }
    if (this.expectedLength !== UNKNOWN_PLP_LEN && this.length !== Number(this.expectedLength)) {
      throw new Error('Partially Length-prefixed Bytes unmatched lengths : expected ' + this.expectedLength + ', but got ' + this.length + ' bytes');
    }

    // `Buffer.concat` always copies, so the value never keeps the (possibly
    // much larger) incoming data buffers alive.
    const data = Buffer.concat(this.chunks, this.length);
    switch (this.metadata.type.name) {
      case 'NVarChar':
      case 'Xml':
        return data.toString('ucs2');
      case 'VarChar':
        return _iconvLite.default.decode(data, this.metadata.collation?.codepage ?? DEFAULT_ENCODING);
      default:
        return data;
    }
  }
}

// Epoch offsets for building UTC `Date` values via plain arithmetic, which
// avoids the (comparatively slow) `Date.UTC` calendar calculations.
//
// Note that the day constants in the UTC and local time branches below differ
// by one, even though both branches describe the same date: `days` arrives as
// the wire-format day count since 0001-01-01 (e.g. 2000-01-01 is 730119). The
// local time branches pass `days - 730118` as the *1-based* day-of-month
// argument of `new Date(2000, 0, ...)`, while the UTC branches multiply
// `days - 730119` as a *0-based* day offset from `UTC_EPOCH_2000`.
exports.PLPReader = PLPReader;
const UTC_EPOCH_1900 = Date.UTC(1900, 0, 1);
const UTC_EPOCH_2000 = Date.UTC(2000, 0, 1);
const MILLISECONDS_PER_DAY = 86400000;
function readSmallDateTime(buf, offset, useUTC) {
  let days;
  ({
    offset,
    value: days
  } = (0, _helpers.readUInt16LE)(buf, offset));
  let minutes;
  ({
    offset,
    value: minutes
  } = (0, _helpers.readUInt16LE)(buf, offset));
  let value;
  if (useUTC) {
    value = new Date(UTC_EPOCH_1900 + days * MILLISECONDS_PER_DAY + minutes * 60000);
  } else {
    value = new Date(1900, 0, 1 + days, 0, minutes);
  }
  return new _helpers.Result(value, offset);
}
function readDateTime(buf, offset, useUTC) {
  let days;
  ({
    offset,
    value: days
  } = (0, _helpers.readInt32LE)(buf, offset));
  let threeHundredthsOfSecond;
  ({
    offset,
    value: threeHundredthsOfSecond
  } = (0, _helpers.readInt32LE)(buf, offset));
  const milliseconds = Math.round(threeHundredthsOfSecond * THREE_AND_A_THIRD);
  let value;
  if (useUTC) {
    value = new Date(UTC_EPOCH_1900 + days * MILLISECONDS_PER_DAY + milliseconds);
  } else {
    value = new Date(1900, 0, 1 + days, 0, 0, 0, milliseconds);
  }
  return new _helpers.Result(value, offset);
}
// Reads a `time` value, returned in units of 100 nanoseconds since midnight.
function readTimeValue(buf, offset, dataLength, scale) {
  let value;
  switch (dataLength) {
    case 3:
      {
        ({
          value,
          offset
        } = (0, _helpers.readUInt24LE)(buf, offset));
        break;
      }
    case 4:
      {
        ({
          value,
          offset
        } = (0, _helpers.readUInt32LE)(buf, offset));
        break;
      }
    case 5:
      {
        ({
          value,
          offset
        } = (0, _helpers.readUInt40LE)(buf, offset));
        break;
      }
    default:
      {
        throw new Error('unreachable');
      }
  }
  if (scale < 7) {
    for (let i = scale; i < 7; i++) {
      value *= 10;
    }
  }
  return new _helpers.Result(value, offset);
}
function readTime(buf, offset, dataLength, scale, useUTC) {
  let value;
  ({
    offset,
    value
  } = readTimeValue(buf, offset, dataLength, scale));
  let date;
  if (useUTC) {
    date = new Date(value / 10000);
  } else {
    date = new Date(1970, 0, 1, 0, 0, 0, value / 10000);
  }
  Object.defineProperty(date, 'nanosecondsDelta', {
    enumerable: false,
    value: value % 10000 / 1e7
  });
  return new _helpers.Result(date, offset);
}
function readDate(buf, offset, useUTC) {
  let days;
  ({
    offset,
    value: days
  } = (0, _helpers.readUInt24LE)(buf, offset));
  if (useUTC) {
    return new _helpers.Result(new Date(UTC_EPOCH_2000 + (days - 730119) * MILLISECONDS_PER_DAY), offset);
  } else {
    return new _helpers.Result(new Date(2000, 0, days - 730118), offset);
  }
}
function readDateTime2(buf, offset, dataLength, scale, useUTC) {
  let time;
  ({
    offset,
    value: time
  } = readTimeValue(buf, offset, dataLength - 3, scale));
  let days;
  ({
    offset,
    value: days
  } = (0, _helpers.readUInt24LE)(buf, offset));
  let date;
  if (useUTC) {
    date = new Date(UTC_EPOCH_2000 + (days - 730119) * MILLISECONDS_PER_DAY + Math.trunc(time / 10000));
  } else {
    date = new Date(2000, 0, days - 730118, 0, 0, 0, time / 10000);
  }
  Object.defineProperty(date, 'nanosecondsDelta', {
    enumerable: false,
    value: time % 10000 / 1e7
  });
  return new _helpers.Result(date, offset);
}
function readDateTimeOffset(buf, offset, dataLength, scale) {
  let time;
  ({
    offset,
    value: time
  } = readTimeValue(buf, offset, dataLength - 5, scale));
  let days;
  ({
    offset,
    value: days
  } = (0, _helpers.readUInt24LE)(buf, offset));

  // time offset?
  ({
    offset
  } = (0, _helpers.readUInt16LE)(buf, offset));
  const date = new Date(UTC_EPOCH_2000 + (days - 730119) * MILLISECONDS_PER_DAY + Math.trunc(time / 10000));
  Object.defineProperty(date, 'nanosecondsDelta', {
    enumerable: false,
    value: time % 10000 / 1e7
  });
  return new _helpers.Result(date, offset);
}
module.exports.readValue = readValue;
module.exports.isPLPStream = isPLPStream;
module.exports.PLPReader = PLPReader;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWV0YWRhdGFQYXJzZXIiLCJyZXF1aXJlIiwiX2RhdGFUeXBlIiwiX2ljb252TGl0ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZ3VpZFBhcnNlciIsIl9oZWxwZXJzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTlVMTCIsIk1BWCIsIlRIUkVFX0FORF9BX1RISVJEIiwiTU9ORVlfRElWSVNPUiIsIlBMUF9OVUxMIiwiVU5LTk9XTl9QTFBfTEVOIiwiREVGQVVMVF9FTkNPRElORyIsInJlYWRUaW55SW50IiwiYnVmIiwib2Zmc2V0IiwicmVhZFVJbnQ4IiwicmVhZFNtYWxsSW50IiwicmVhZEludDE2TEUiLCJyZWFkSW50IiwicmVhZEludDMyTEUiLCJyZWFkQmlnSW50IiwidmFsdWUiLCJyZWFkQmlnSW50NjRMRSIsIlJlc3VsdCIsInRvU3RyaW5nIiwicmVhZFJlYWwiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdCIsInJlYWREb3VibGVMRSIsInJlYWRTbWFsbE1vbmV5IiwicmVhZE1vbmV5IiwiaGlnaCIsImxvdyIsInJlYWRVSW50MzJMRSIsInJlYWRCaXQiLCJyZWFkVmFsdWUiLCJtZXRhZGF0YSIsIm9wdGlvbnMiLCJ0eXBlIiwibmFtZSIsImRhdGFMZW5ndGgiLCJFcnJvciIsImNvZGVwYWdlIiwiY29sbGF0aW9uIiwicmVhZFVJbnQxNkxFIiwicmVhZENoYXJzIiwicmVhZE5DaGFycyIsInJlYWRCaW5hcnkiLCJ0ZXh0UG9pbnRlckxlbmd0aCIsInJlYWRTbWFsbERhdGVUaW1lIiwidXNlVVRDIiwicmVhZERhdGVUaW1lIiwicmVhZFRpbWUiLCJzY2FsZSIsInJlYWREYXRlIiwicmVhZERhdGVUaW1lMiIsInJlYWREYXRlVGltZU9mZnNldCIsInJlYWROdW1lcmljIiwicHJlY2lzaW9uIiwicmVhZFVuaXF1ZUlkZW50aWZpZXIiLCJyZWFkVmFyaWFudCIsImlzUExQU3RyZWFtIiwiZGF0YSIsImxvd2VyQ2FzZUd1aWRzIiwiYnVmZmVyVG9Mb3dlckNhc2VHdWlkIiwiYnVmZmVyVG9VcHBlckNhc2VHdWlkIiwiX3ByZWNpc2lvbiIsInNpZ24iLCJyZWFkVU51bWVyaWM2NExFIiwicmVhZFVOdW1lcmljOTZMRSIsInJlYWRVTnVtZXJpYzEyOExFIiwiTWF0aCIsInBvdyIsImJhc2VUeXBlIiwiVFlQRSIsInByb3BCeXRlcyIsInJlYWRDb2xsYXRpb24iLCJsZW5ndGgiLCJOb3RFbm91Z2hEYXRhRXJyb3IiLCJzbGljZSIsImljb252IiwiZGVjb2RlIiwiUExQUmVhZGVyIiwiY29uc3RydWN0b3IiLCJleHBlY3RlZExlbmd0aCIsInVuZGVmaW5lZCIsImNodW5rcyIsImNodW5rUmVtYWluaW5nIiwicmVhZCIsInBhcnNlciIsInJlYWRCaWdVSW50NjRMRSIsImJ1ZmZlciIsInBvc2l0aW9uIiwiY2h1bmtMZW5ndGgiLCJzdGFydCIsImVuZCIsIm1pbiIsInB1c2giLCJzdWJhcnJheSIsIk51bWJlciIsIkJ1ZmZlciIsImNvbmNhdCIsImV4cG9ydHMiLCJVVENfRVBPQ0hfMTkwMCIsIkRhdGUiLCJVVEMiLCJVVENfRVBPQ0hfMjAwMCIsIk1JTExJU0VDT05EU19QRVJfREFZIiwiZGF5cyIsIm1pbnV0ZXMiLCJ0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCIsIm1pbGxpc2Vjb25kcyIsInJvdW5kIiwicmVhZFRpbWVWYWx1ZSIsInJlYWRVSW50MjRMRSIsInJlYWRVSW50NDBMRSIsImkiLCJkYXRlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwidGltZSIsInRydW5jIiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3ZhbHVlLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFyc2VyLCB7IHR5cGUgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vdG9rZW4vc3RyZWFtLXBhcnNlcic7XG5pbXBvcnQgeyB0eXBlIE1ldGFkYXRhLCByZWFkQ29sbGF0aW9uIH0gZnJvbSAnLi9tZXRhZGF0YS1wYXJzZXInO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4vZGF0YS10eXBlJztcblxuaW1wb3J0IGljb252IGZyb20gJ2ljb252LWxpdGUnO1xuaW1wb3J0IHsgYnVmZmVyVG9Mb3dlckNhc2VHdWlkLCBidWZmZXJUb1VwcGVyQ2FzZUd1aWQgfSBmcm9tICcuL2d1aWQtcGFyc2VyJztcbmltcG9ydCB7IE5vdEVub3VnaERhdGFFcnJvciwgUmVzdWx0LCByZWFkQmlnSW50NjRMRSwgcmVhZEJpZ1VJbnQ2NExFLCByZWFkRG91YmxlTEUsIHJlYWRGbG9hdExFLCByZWFkSW50MTZMRSwgcmVhZEludDMyTEUsIHJlYWRVSW50MTZMRSwgcmVhZFVJbnQzMkxFLCByZWFkVUludDgsIHJlYWRVSW50MjRMRSwgcmVhZFVJbnQ0MExFLCByZWFkVU51bWVyaWM2NExFLCByZWFkVU51bWVyaWM5NkxFLCByZWFkVU51bWVyaWMxMjhMRSB9IGZyb20gJy4vdG9rZW4vaGVscGVycyc7XG5cbmNvbnN0IE5VTEwgPSAoMSA8PCAxNikgLSAxO1xuY29uc3QgTUFYID0gKDEgPDwgMTYpIC0gMTtcbmNvbnN0IFRIUkVFX0FORF9BX1RISVJEID0gMyArICgxIC8gMyk7XG5jb25zdCBNT05FWV9ESVZJU09SID0gMTAwMDA7XG5jb25zdCBQTFBfTlVMTCA9IDB4RkZGRkZGRkZGRkZGRkZGRm47XG5jb25zdCBVTktOT1dOX1BMUF9MRU4gPSAweEZGRkZGRkZGRkZGRkZGRkVuO1xuY29uc3QgREVGQVVMVF9FTkNPRElORyA9ICd1dGY4JztcblxuZnVuY3Rpb24gcmVhZFRpbnlJbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFNtYWxsSW50KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgcmV0dXJuIHJlYWRJbnQxNkxFKGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZEludChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIHJldHVybiByZWFkSW50MzJMRShidWYsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCaWdJbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PHN0cmluZz4ge1xuICBsZXQgdmFsdWU7XG4gICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRCaWdJbnQ2NExFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUudG9TdHJpbmcoKSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFJlYWwoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZEZsb2F0TEUoYnVmLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvYXQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZERvdWJsZUxFKGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFNtYWxsTW9uZXkoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgdmFsdWU7XG4gICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUgLyBNT05FWV9ESVZJU09SLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkTW9uZXkoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgaGlnaDtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogaGlnaCB9ID0gcmVhZEludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgbG93O1xuICAoeyBvZmZzZXQsIHZhbHVlOiBsb3cgfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KChsb3cgKyAoMHgxMDAwMDAwMDAgKiBoaWdoKSkgLyBNT05FWV9ESVZJU09SLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkQml0KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxib29sZWFuPiB7XG4gIGxldCB2YWx1ZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoISF2YWx1ZSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbWV0YWRhdGE6IE1ldGFkYXRhLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKTogUmVzdWx0PHVua25vd24+IHtcbiAgY29uc3QgdHlwZSA9IG1ldGFkYXRhLnR5cGU7XG5cbiAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICBjYXNlICdOdWxsJzpcbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICBjYXNlICdUaW55SW50Jzoge1xuICAgICAgcmV0dXJuIHJlYWRUaW55SW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdTbWFsbEludCc6IHtcbiAgICAgIHJldHVybiByZWFkU21hbGxJbnQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0ludCc6IHtcbiAgICAgIHJldHVybiByZWFkSW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdCaWdJbnQnOiB7XG4gICAgICByZXR1cm4gcmVhZEJpZ0ludChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnSW50Tic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIHJlYWRUaW55SW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxJbnQoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIHJlYWRJbnQoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWRCaWdJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgSW50TicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgJ1JlYWwnOiB7XG4gICAgICByZXR1cm4gcmVhZFJlYWwoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0Zsb2F0Jzoge1xuICAgICAgcmV0dXJuIHJlYWRGbG9hdChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnRmxvYXROJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICByZXR1cm4gcmVhZFJlYWwoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWRGbG9hdChidWYsIG9mZnNldCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGFMZW5ndGggJyArIGRhdGFMZW5ndGggKyAnIGZvciBGbG9hdE4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdTbWFsbE1vbmV5Jzoge1xuICAgICAgcmV0dXJuIHJlYWRTbWFsbE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdNb25leSc6XG4gICAgICByZXR1cm4gcmVhZE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ01vbmV5Tic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIHJlYWRTbWFsbE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHJldHVybiByZWFkTW9uZXkoYnVmLCBvZmZzZXQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgTW9uZXlOJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnQml0Jzoge1xuICAgICAgcmV0dXJuIHJlYWRCaXQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0JpdE4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiByZWFkQml0KGJ1Ziwgb2Zmc2V0KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIEJpdE4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdWYXJDaGFyJzpcbiAgICBjYXNlICdDaGFyJzoge1xuICAgICAgY29uc3QgY29kZXBhZ2UgPSBtZXRhZGF0YS5jb2xsYXRpb24hLmNvZGVwYWdlITtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IE5VTEwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWRDaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgY29kZXBhZ2UpO1xuICAgIH1cblxuICAgIGNhc2UgJ05WYXJDaGFyJzpcbiAgICBjYXNlICdOQ2hhcic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkTkNoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJCaW5hcnknOlxuICAgIGNhc2UgJ0JpbmFyeSc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjYXNlICdUZXh0Jzoge1xuICAgICAgbGV0IHRleHRQb2ludGVyTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdGV4dFBvaW50ZXJMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGV4dHBvaW50ZXJcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgdGV4dFBvaW50ZXJMZW5ndGgpKTtcblxuICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDgpKTtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWRDaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgbWV0YWRhdGEuY29sbGF0aW9uIS5jb2RlcGFnZSEpO1xuICAgIH1cblxuICAgIGNhc2UgJ05UZXh0Jzoge1xuICAgICAgbGV0IHRleHRQb2ludGVyTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdGV4dFBvaW50ZXJMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGV4dHBvaW50ZXJcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgdGV4dFBvaW50ZXJMZW5ndGgpKTtcblxuICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDgpKTtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWROQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGNhc2UgJ0ltYWdlJzoge1xuICAgICAgbGV0IHRleHRQb2ludGVyTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdGV4dFBvaW50ZXJMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGV4dHBvaW50ZXJcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgdGV4dFBvaW50ZXJMZW5ndGgpKTtcblxuICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDgpKTtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOiB7XG4gICAgICByZXR1cm4gcmVhZFNtYWxsRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZSc6IHtcbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZU4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxEYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWREYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgRGF0ZVRpbWVOJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnVGltZSc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkVGltZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgbWV0YWRhdGEuc2NhbGUhLCBvcHRpb25zLnVzZVVUQyk7XG4gICAgfVxuXG4gICAgY2FzZSAnRGF0ZSc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lMic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUyKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBtZXRhZGF0YS5zY2FsZSEsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZU9mZnNldCc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWVPZmZzZXQoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIG1ldGFkYXRhLnNjYWxlISk7XG4gICAgfVxuXG4gICAgY2FzZSAnTnVtZXJpY04nOlxuICAgIGNhc2UgJ0RlY2ltYWxOJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWROdW1lcmljKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBtZXRhZGF0YS5wcmVjaXNpb24hLCBtZXRhZGF0YS5zY2FsZSEpO1xuICAgIH1cblxuICAgIGNhc2UgJ1VuaXF1ZUlkZW50aWZpZXInOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSAweDEwOlxuICAgICAgICAgIHJldHVybiByZWFkVW5pcXVlSWRlbnRpZmllcihidWYsIG9mZnNldCwgb3B0aW9ucyk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGd1aWQgc2l6ZSAke2RhdGFMZW5ndGghIC0gMX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdWYXJpYW50Jzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWRWYXJpYW50KGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHlwZSEnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQTFBTdHJlYW0obWV0YWRhdGE6IE1ldGFkYXRhKSB7XG4gIHN3aXRjaCAobWV0YWRhdGEudHlwZS5uYW1lKSB7XG4gICAgY2FzZSAnVmFyQ2hhcic6XG4gICAgY2FzZSAnTlZhckNoYXInOlxuICAgIGNhc2UgJ1ZhckJpbmFyeSc6IHtcbiAgICAgIHJldHVybiBtZXRhZGF0YS5kYXRhTGVuZ3RoID09PSBNQVg7XG4gICAgfVxuXG4gICAgY2FzZSAnWG1sJzoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY2FzZSAnVURUJzoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRVbmlxdWVJZGVudGlmaWVyKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDxzdHJpbmc+IHtcbiAgbGV0IGRhdGE7XG4gICh7IHZhbHVlOiBkYXRhLCBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDB4MTApKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChvcHRpb25zLmxvd2VyQ2FzZUd1aWRzID8gYnVmZmVyVG9Mb3dlckNhc2VHdWlkKGRhdGEpIDogYnVmZmVyVG9VcHBlckNhc2VHdWlkKGRhdGEpLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkTnVtZXJpYyhidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgX3ByZWNpc2lvbjogbnVtYmVyLCBzY2FsZTogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgc2lnbjtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogc2lnbiB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgc2lnbiA9IHNpZ24gPT09IDEgPyAxIDogLTE7XG5cbiAgbGV0IHZhbHVlO1xuICBpZiAoZGF0YUxlbmd0aCA9PT0gNSkge1xuICAgICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPT09IDkpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVU51bWVyaWM2NExFKGJ1Ziwgb2Zmc2V0KSk7XG4gIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTMpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVU51bWVyaWM5NkxFKGJ1Ziwgb2Zmc2V0KSk7XG4gIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTcpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVU51bWVyaWMxMjhMRShidWYsIG9mZnNldCkpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbnVtZXJpYyBkYXRhTGVuZ3RoICR7ZGF0YUxlbmd0aH1gKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KCh2YWx1ZSAqIHNpZ24pIC8gTWF0aC5wb3coMTAsIHNjYWxlKSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhcmlhbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBkYXRhTGVuZ3RoOiBudW1iZXIpOiBSZXN1bHQ8dW5rbm93bj4ge1xuICBsZXQgYmFzZVR5cGU7XG4gICh7IHZhbHVlOiBiYXNlVHlwZSwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBjb25zdCB0eXBlID0gVFlQRVtiYXNlVHlwZV07XG5cbiAgbGV0IHByb3BCeXRlcztcbiAgKHsgdmFsdWU6IHByb3BCeXRlcywgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBkYXRhTGVuZ3RoID0gZGF0YUxlbmd0aCAtIHByb3BCeXRlcyAtIDI7XG5cbiAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzpcbiAgICAgIHJldHVybiByZWFkVW5pcXVlSWRlbnRpZmllcihidWYsIG9mZnNldCwgb3B0aW9ucyk7XG5cbiAgICBjYXNlICdCaXQnOlxuICAgICAgcmV0dXJuIHJlYWRCaXQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnVGlueUludCc6XG4gICAgICByZXR1cm4gcmVhZFRpbnlJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnU21hbGxJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbEludChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnQmlnSW50JzpcbiAgICAgIHJldHVybiByZWFkQmlnSW50KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG5cbiAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG5cbiAgICBjYXNlICdSZWFsJzpcbiAgICAgIHJldHVybiByZWFkUmVhbChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdGbG9hdCc6XG4gICAgICByZXR1cm4gcmVhZEZsb2F0KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ1NtYWxsTW9uZXknOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ01vbmV5JzpcbiAgICAgIHJldHVybiByZWFkTW9uZXkoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gcmVhZERhdGUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcblxuICAgIGNhc2UgJ1RpbWUnOiB7XG4gICAgICBsZXQgc2NhbGU7XG4gICAgICAoeyB2YWx1ZTogc2NhbGUsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkVGltZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgc2NhbGUsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZTInOiB7XG4gICAgICBsZXQgc2NhbGU7XG4gICAgICAoeyB2YWx1ZTogc2NhbGUsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUyKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBzY2FsZSwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0Jzoge1xuICAgICAgbGV0IHNjYWxlO1xuICAgICAgKHsgdmFsdWU6IHNjYWxlLCBvZmZzZXQgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lT2Zmc2V0KGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBzY2FsZSk7XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyQmluYXJ5JzpcbiAgICBjYXNlICdCaW5hcnknOiB7XG4gICAgICAvLyBtYXhMZW5ndGggKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY2FzZSAnTnVtZXJpY04nOlxuICAgIGNhc2UgJ0RlY2ltYWxOJzoge1xuICAgICAgbGV0IHByZWNpc2lvbjtcbiAgICAgICh7IHZhbHVlOiBwcmVjaXNpb24sIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGxldCBzY2FsZTtcbiAgICAgICh7IHZhbHVlOiBzY2FsZSwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWROdW1lcmljKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBwcmVjaXNpb24sIHNjYWxlKTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJDaGFyJzpcbiAgICBjYXNlICdDaGFyJzoge1xuICAgICAgLy8gbWF4TGVuZ3RoICh1bnVzZWQ/KVxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgbGV0IGNvbGxhdGlvbjtcbiAgICAgICh7IHZhbHVlOiBjb2xsYXRpb24sIG9mZnNldCB9ID0gcmVhZENvbGxhdGlvbihidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZENoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBjb2xsYXRpb24uY29kZXBhZ2UhKTtcbiAgICB9XG5cbiAgICBjYXNlICdOVmFyQ2hhcic6XG4gICAgY2FzZSAnTkNoYXInOiB7XG4gICAgICAvLyBtYXhMZW5ndGggKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICAvLyBjb2xsYXRpb24gKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRDb2xsYXRpb24oYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWROQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHlwZSEnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkQmluYXJ5KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyKTogUmVzdWx0PEJ1ZmZlcj4ge1xuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIGRhdGFMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIGRhdGFMZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZGF0YUxlbmd0aCksIG9mZnNldCArIGRhdGFMZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZWFkQ2hhcnMoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIGNvZGVwYWdlOiBzdHJpbmcpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgZGF0YUxlbmd0aCkge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgZGF0YUxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3VsdChpY29udi5kZWNvZGUoYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZGF0YUxlbmd0aCksIGNvZGVwYWdlID8/IERFRkFVTFRfRU5DT0RJTkcpLCBvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gcmVhZE5DaGFycyhidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlcik6IFJlc3VsdDxzdHJpbmc+IHtcbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyBkYXRhTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi50b1N0cmluZygndWNzMicsIG9mZnNldCwgb2Zmc2V0ICsgZGF0YUxlbmd0aCksIG9mZnNldCArIGRhdGFMZW5ndGgpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgUExQIChwYXJ0aWFsbHkgbGVuZ3RoLXByZWZpeGVkKSB2YWx1ZS5cbiAqXG4gKiBQTFAgdmFsdWVzIGNhbiBiZSBhcmJpdHJhcmlseSBsYXJnZSBhbmQgc3BhbiBtYW55IGNodW5rcyBvZiBpbmNvbWluZyBkYXRhLFxuICogc28gdGhleSBhcmUgcmVhZCBpbmNyZW1lbnRhbGx5OiB3aGF0ZXZlciBwYXJ0IG9mIHRoZSB2YWx1ZSBpcyBhdmFpbGFibGUgaXNcbiAqIGNvbnN1bWVkIHJpZ2h0IGF3YXksIGFuZCB0aGUgcmVhZGVyJ3MgcHJvZ3Jlc3MgaXMga2VwdCBhY3Jvc3MgY2FsbHMuIElmIHRoZVxuICogYXZhaWxhYmxlIGRhdGEgcnVucyBvdXQsIGBOb3RFbm91Z2hEYXRhRXJyb3JgIGlzIHRocm93biBhbmQgYHJlYWRgIGNhbiBiZVxuICogY2FsbGVkIGFnYWluIG9uY2UgbW9yZSBkYXRhIGhhcyBhcnJpdmVkLlxuICovXG5jbGFzcyBQTFBSZWFkZXIge1xuICBkZWNsYXJlIG1ldGFkYXRhOiBNZXRhZGF0YTtcblxuICAvLyBUaGUgdmFsdWUncyB0b3RhbCBsZW5ndGggYXMgYW5ub3VuY2VkIGJ5IHRoZSBzZXJ2ZXIsIG9yIGB1bmRlZmluZWRgXG4gIC8vIHdoaWxlIGl0IGhhcyBub3QgYmVlbiByZWFkIHlldC5cbiAgZGVjbGFyZSBleHBlY3RlZExlbmd0aDogYmlnaW50IHwgdW5kZWZpbmVkO1xuXG4gIGRlY2xhcmUgY2h1bmtzOiBCdWZmZXJbXTtcbiAgZGVjbGFyZSBsZW5ndGg6IG51bWJlcjtcblxuICAvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgdGhlIGN1cnJlbnQgUExQIGNodW5rIHRoYXQgaGF2ZSBub3QgYmVlbiByZWFkIHlldC5cbiAgZGVjbGFyZSBjaHVua1JlbWFpbmluZzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG1ldGFkYXRhOiBNZXRhZGF0YSkge1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0aGlzLmV4cGVjdGVkTGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuY2h1bmtSZW1haW5pbmcgPSAwO1xuICB9XG5cbiAgcmVhZChwYXJzZXI6IFBhcnNlcik6IHVua25vd24ge1xuICAgIGlmICh0aGlzLmV4cGVjdGVkTGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIG9mZnNldCB9ID0gcmVhZEJpZ1VJbnQ2NExFKHBhcnNlci5idWZmZXIsIHBhcnNlci5wb3NpdGlvbik7XG4gICAgICBwYXJzZXIucG9zaXRpb24gPSBvZmZzZXQ7XG4gICAgICB0aGlzLmV4cGVjdGVkTGVuZ3RoID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZXhwZWN0ZWRMZW5ndGggPT09IFBMUF9OVUxMKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMuY2h1bmtSZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZTogY2h1bmtMZW5ndGgsIG9mZnNldCB9ID0gcmVhZFVJbnQzMkxFKHBhcnNlci5idWZmZXIsIHBhcnNlci5wb3NpdGlvbik7XG4gICAgICAgIHBhcnNlci5wb3NpdGlvbiA9IG9mZnNldDtcblxuICAgICAgICBpZiAoY2h1bmtMZW5ndGggPT09IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2h1bmtSZW1haW5pbmcgPSBjaHVua0xlbmd0aDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnVmID0gcGFyc2VyLmJ1ZmZlcjtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcGFyc2VyLnBvc2l0aW9uO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RhcnQgKyB0aGlzLmNodW5rUmVtYWluaW5nLCBidWYubGVuZ3RoKTtcbiAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Ioc3RhcnQgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaHVua3MucHVzaChidWYuc3ViYXJyYXkoc3RhcnQsIGVuZCkpO1xuICAgICAgdGhpcy5sZW5ndGggKz0gZW5kIC0gc3RhcnQ7XG4gICAgICB0aGlzLmNodW5rUmVtYWluaW5nIC09IGVuZCAtIHN0YXJ0O1xuICAgICAgcGFyc2VyLnBvc2l0aW9uID0gZW5kO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4cGVjdGVkTGVuZ3RoICE9PSBVTktOT1dOX1BMUF9MRU4gJiYgdGhpcy5sZW5ndGggIT09IE51bWJlcih0aGlzLmV4cGVjdGVkTGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJ0aWFsbHkgTGVuZ3RoLXByZWZpeGVkIEJ5dGVzIHVubWF0Y2hlZCBsZW5ndGhzIDogZXhwZWN0ZWQgJyArIHRoaXMuZXhwZWN0ZWRMZW5ndGggKyAnLCBidXQgZ290ICcgKyB0aGlzLmxlbmd0aCArICcgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICAvLyBgQnVmZmVyLmNvbmNhdGAgYWx3YXlzIGNvcGllcywgc28gdGhlIHZhbHVlIG5ldmVyIGtlZXBzIHRoZSAocG9zc2libHlcbiAgICAvLyBtdWNoIGxhcmdlcikgaW5jb21pbmcgZGF0YSBidWZmZXJzIGFsaXZlLlxuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuY29uY2F0KHRoaXMuY2h1bmtzLCB0aGlzLmxlbmd0aCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMubWV0YWRhdGEudHlwZS5uYW1lKSB7XG4gICAgICBjYXNlICdOVmFyQ2hhcic6XG4gICAgICBjYXNlICdYbWwnOlxuICAgICAgICByZXR1cm4gZGF0YS50b1N0cmluZygndWNzMicpO1xuXG4gICAgICBjYXNlICdWYXJDaGFyJzpcbiAgICAgICAgcmV0dXJuIGljb252LmRlY29kZShkYXRhLCB0aGlzLm1ldGFkYXRhLmNvbGxhdGlvbj8uY29kZXBhZ2UgPz8gREVGQVVMVF9FTkNPRElORyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxufVxuXG4vLyBFcG9jaCBvZmZzZXRzIGZvciBidWlsZGluZyBVVEMgYERhdGVgIHZhbHVlcyB2aWEgcGxhaW4gYXJpdGhtZXRpYywgd2hpY2hcbi8vIGF2b2lkcyB0aGUgKGNvbXBhcmF0aXZlbHkgc2xvdykgYERhdGUuVVRDYCBjYWxlbmRhciBjYWxjdWxhdGlvbnMuXG4vL1xuLy8gTm90ZSB0aGF0IHRoZSBkYXkgY29uc3RhbnRzIGluIHRoZSBVVEMgYW5kIGxvY2FsIHRpbWUgYnJhbmNoZXMgYmVsb3cgZGlmZmVyXG4vLyBieSBvbmUsIGV2ZW4gdGhvdWdoIGJvdGggYnJhbmNoZXMgZGVzY3JpYmUgdGhlIHNhbWUgZGF0ZTogYGRheXNgIGFycml2ZXMgYXNcbi8vIHRoZSB3aXJlLWZvcm1hdCBkYXkgY291bnQgc2luY2UgMDAwMS0wMS0wMSAoZS5nLiAyMDAwLTAxLTAxIGlzIDczMDExOSkuIFRoZVxuLy8gbG9jYWwgdGltZSBicmFuY2hlcyBwYXNzIGBkYXlzIC0gNzMwMTE4YCBhcyB0aGUgKjEtYmFzZWQqIGRheS1vZi1tb250aFxuLy8gYXJndW1lbnQgb2YgYG5ldyBEYXRlKDIwMDAsIDAsIC4uLilgLCB3aGlsZSB0aGUgVVRDIGJyYW5jaGVzIG11bHRpcGx5XG4vLyBgZGF5cyAtIDczMDExOWAgYXMgYSAqMC1iYXNlZCogZGF5IG9mZnNldCBmcm9tIGBVVENfRVBPQ0hfMjAwMGAuXG5jb25zdCBVVENfRVBPQ0hfMTkwMCA9IERhdGUuVVRDKDE5MDAsIDAsIDEpO1xuY29uc3QgVVRDX0VQT0NIXzIwMDAgPSBEYXRlLlVUQygyMDAwLCAwLCAxKTtcbmNvbnN0IE1JTExJU0VDT05EU19QRVJfREFZID0gODY0MDAwMDA7XG5cbmZ1bmN0aW9uIHJlYWRTbWFsbERhdGVUaW1lKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgdXNlVVRDOiBib29sZWFuKTogUmVzdWx0PERhdGU+IHtcbiAgbGV0IGRheXM7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRheXMgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCBtaW51dGVzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBtaW51dGVzIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgdmFsdWU7XG4gIGlmICh1c2VVVEMpIHtcbiAgICB2YWx1ZSA9IG5ldyBEYXRlKFVUQ19FUE9DSF8xOTAwICsgZGF5cyAqIE1JTExJU0VDT05EU19QRVJfREFZICsgbWludXRlcyAqIDYwMDAwKTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5ldyBEYXRlKDE5MDAsIDAsIDEgKyBkYXlzLCAwLCBtaW51dGVzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KHZhbHVlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4pOiBSZXN1bHQ8RGF0ZT4ge1xuICBsZXQgZGF5cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF5cyB9ID0gcmVhZEludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgdGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQ7XG4gICh7IG9mZnNldCwgdmFsdWU6IHRocmVlSHVuZHJlZHRoc09mU2Vjb25kIH0gPSByZWFkSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IE1hdGgucm91bmQodGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQgKiBUSFJFRV9BTkRfQV9USElSRCk7XG5cbiAgbGV0IHZhbHVlO1xuICBpZiAodXNlVVRDKSB7XG4gICAgdmFsdWUgPSBuZXcgRGF0ZShVVENfRVBPQ0hfMTkwMCArIGRheXMgKiBNSUxMSVNFQ09ORFNfUEVSX0RBWSArIG1pbGxpc2Vjb25kcyk7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBuZXcgRGF0ZSgxOTAwLCAwLCAxICsgZGF5cywgMCwgMCwgMCwgbWlsbGlzZWNvbmRzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KHZhbHVlLCBvZmZzZXQpO1xufVxuXG5pbnRlcmZhY2UgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhIGV4dGVuZHMgRGF0ZSB7XG4gIG5hbm9zZWNvbmRzRGVsdGE6IG51bWJlcjtcbn1cblxuLy8gUmVhZHMgYSBgdGltZWAgdmFsdWUsIHJldHVybmVkIGluIHVuaXRzIG9mIDEwMCBuYW5vc2Vjb25kcyBzaW5jZSBtaWRuaWdodC5cbmZ1bmN0aW9uIHJlYWRUaW1lVmFsdWUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIGxldCB2YWx1ZTtcblxuICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICBjYXNlIDM6IHtcbiAgICAgICh7IHZhbHVlLCBvZmZzZXQgfSA9IHJlYWRVSW50MjRMRShidWYsIG9mZnNldCkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSA0OiB7XG4gICAgICAoeyB2YWx1ZSwgb2Zmc2V0IH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgNToge1xuICAgICAgKHsgdmFsdWUsIG9mZnNldCB9ID0gcmVhZFVJbnQ0MExFKGJ1Ziwgb2Zmc2V0KSk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VucmVhY2hhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNjYWxlIDwgNykge1xuICAgIGZvciAobGV0IGkgPSBzY2FsZTsgaSA8IDc7IGkrKykge1xuICAgICAgdmFsdWUgKj0gMTA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaW1lKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBzY2FsZTogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4pOiBSZXN1bHQ8RGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhPiB7XG4gIGxldCB2YWx1ZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZFRpbWVWYWx1ZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgc2NhbGUpKTtcblxuICBsZXQgZGF0ZTtcbiAgaWYgKHVzZVVUQykge1xuICAgIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSAvIDEwMDAwKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH0gZWxzZSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDEsIDAsIDAsIDAsIHZhbHVlIC8gMTAwMDApIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgJ25hbm9zZWNvbmRzRGVsdGEnLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6ICh2YWx1ZSAlIDEwMDAwKSAvIDFlN1xuICB9KTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChkYXRlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbik6IFJlc3VsdDxEYXRlPiB7XG4gIGxldCBkYXlzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYXlzIH0gPSByZWFkVUludDI0TEUoYnVmLCBvZmZzZXQpKTtcblxuICBpZiAodXNlVVRDKSB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQobmV3IERhdGUoVVRDX0VQT0NIXzIwMDAgKyAoZGF5cyAtIDczMDExOSkgKiBNSUxMSVNFQ09ORFNfUEVSX0RBWSksIG9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQobmV3IERhdGUoMjAwMCwgMCwgZGF5cyAtIDczMDExOCksIG9mZnNldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZERhdGVUaW1lMihidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgc2NhbGU6IG51bWJlciwgdXNlVVRDOiBib29sZWFuKTogUmVzdWx0PERhdGVXaXRoTmFub3NlY29uZHNEZWx0YT4ge1xuICBsZXQgdGltZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdGltZSB9ID0gcmVhZFRpbWVWYWx1ZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCAtIDMsIHNjYWxlKSk7XG5cbiAgbGV0IGRheXM7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRheXMgfSA9IHJlYWRVSW50MjRMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCBkYXRlO1xuICBpZiAodXNlVVRDKSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKFVUQ19FUE9DSF8yMDAwICsgKGRheXMgLSA3MzAxMTkpICogTUlMTElTRUNPTkRTX1BFUl9EQVkgKyBNYXRoLnRydW5jKHRpbWUgLyAxMDAwMCkpIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlID0gbmV3IERhdGUoMjAwMCwgMCwgZGF5cyAtIDczMDExOCwgMCwgMCwgMCwgdGltZSAvIDEwMDAwKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsICduYW5vc2Vjb25kc0RlbHRhJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiAodGltZSAlIDEwMDAwKSAvIDFlN1xuICB9KTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChkYXRlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWVPZmZzZXQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpOiBSZXN1bHQ8RGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhPiB7XG4gIGxldCB0aW1lO1xuICAoeyBvZmZzZXQsIHZhbHVlOiB0aW1lIH0gPSByZWFkVGltZVZhbHVlKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoIC0gNSwgc2NhbGUpKTtcblxuICBsZXQgZGF5cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF5cyB9ID0gcmVhZFVJbnQyNExFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgLy8gdGltZSBvZmZzZXQ/XG4gICh7IG9mZnNldCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFVUQ19FUE9DSF8yMDAwICsgKGRheXMgLSA3MzAxMTkpICogTUlMTElTRUNPTkRTX1BFUl9EQVkgKyBNYXRoLnRydW5jKHRpbWUgLyAxMDAwMCkpIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsICduYW5vc2Vjb25kc0RlbHRhJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiAodGltZSAlIDEwMDAwKSAvIDFlN1xuICB9KTtcbiAgcmV0dXJuIG5ldyBSZXN1bHQoZGF0ZSwgb2Zmc2V0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMucmVhZFZhbHVlID0gcmVhZFZhbHVlO1xubW9kdWxlLmV4cG9ydHMuaXNQTFBTdHJlYW0gPSBpc1BMUFN0cmVhbTtcbm1vZHVsZS5leHBvcnRzLlBMUFJlYWRlciA9IFBMUFJlYWRlcjtcblxuZXhwb3J0IHsgcmVhZFZhbHVlLCBpc1BMUFN0cmVhbSwgUExQUmVhZGVyIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQ0EsSUFBQUEsZUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsVUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBSixPQUFBO0FB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QUFFYSxJQUFJLEdBQUcsS0FBSyxDQUE2QjtFQUM1RjtFQUNBSCxNQUFNLENBQUNDLGNBQWMsQ0FBQ0YsSUFBSSxFQUFFLGtCQUFrQixFQUFFO0lBQzlDRyxVQUFVLEVBQUUsS0FBSztJQUNqQm5HLEtBQUssRUFBR29HLElBQUksR0FBRyxLQUFLLEdBQUk7RUFDMUIsQ0FBQyxDQUFDO0VBRUYsT0FBTyxJQUFJbEcsZUFBTSxDQUFDOEYsSUFBSSxFQUFFdkcsTUFBTSxDQUFDO0FBQ2pDO0FBRUEsU0FBUzBDLGtCQUFrQkEsQ0FBQzNDLEdBQVcsRUFBRUMsTUFBYyxFQUFFMEIsVUFBa0IsRUFBRWEsS0FBYSxFQUFvQztFQUM1SCxJQUFJb0UsSUFBSTtFQUNSLENBQUM7SUFBRTNHLE1BQU07SUFBRU8sS0FBSyxFQUFFb0c7RUFBSyxDQUFDLEdBQUdSLGFBQWEsQ0FBQ3BHLEdBQUcsRUFBRUMsTUFBTSxFQUFFMEIsVUFBVSxHQUFHLENBQUMsRUFBRWEsS0FBSyxDQUFDO0VBRTVFLElBQUl1RCxJQUFJO0VBQ1IsQ0FBQztJQUFFOUYsTUFBTTtJQUFFTyxLQUFLLEVBQUV1RjtFQUFLLENBQUMsR0FBRyxJQUFBTSxxQkFBWSxFQUFDckcsR0FBRyxFQUFFQyxNQUFNLENBQUM7O0VBRXBEO0VBQ0EsQ0FBQztJQUFFQTtFQUFPLENBQUMsR0FBRyxJQUFBOEIscUJBQVksRUFBQy9CLEdBQUcsRUFBRUMsTUFBTSxDQUFDO0VBRXZDLE1BQU11RyxJQUFJLEdBQUcsSUFBSWIsSUFBSSxDQUFDRSxjQUFjLEdBQUcsQ0FBQ0UsSUFBSSxHQUFHLE1BQU0sSUFBSUQsb0JBQW9CLEdBQUdwQyxJQUFJLENBQUNtRCxLQUFLLENBQUNELElBQUksR0FBRyxLQUFLLENBQUMsQ0FBNkI7RUFDcklILE1BQU0sQ0FBQ0MsY0FBYyxDQUFDRixJQUFJLEVBQUUsa0JBQWtCLEVBQUU7SUFDOUNHLFVBQVUsRUFBRSxLQUFLO0lBQ2pCbkcsS0FBSyxFQUFHb0csSUFBSSxHQUFHLEtBQUssR0FBSTtFQUMxQixDQUFDLENBQUM7RUFDRixPQUFPLElBQUlsRyxlQUFNLENBQUM4RixJQUFJLEVBQUV2RyxNQUFNLENBQUM7QUFDakM7QUFFQTZHLE1BQU0sQ0FBQ3JCLE9BQU8sQ0FBQ25FLFNBQVMsR0FBR0EsU0FBUztBQUNwQ3dGLE1BQU0sQ0FBQ3JCLE9BQU8sQ0FBQ3pDLFdBQVcsR0FBR0EsV0FBVztBQUN4QzhELE1BQU0sQ0FBQ3JCLE9BQU8sQ0FBQ3BCLFNBQVMsR0FBR0EsU0FBUyIsImlnbm9yZUxpc3QiOltdfQ==