UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

878 lines • 88.5 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 _sprintfJs = require("sprintf-js");
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((0, _sprintfJs.sprintf)('Unsupported guid size %d', 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((0, _sprintfJs.sprintf)('Unsupported numeric dataLength %d', 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWV0YWRhdGFQYXJzZXIiLCJyZXF1aXJlIiwiX2RhdGFUeXBlIiwiX2ljb252TGl0ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3ByaW50ZkpzIiwiX2d1aWRQYXJzZXIiLCJfaGVscGVycyIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIk5VTEwiLCJNQVgiLCJUSFJFRV9BTkRfQV9USElSRCIsIk1PTkVZX0RJVklTT1IiLCJQTFBfTlVMTCIsIlVOS05PV05fUExQX0xFTiIsIkRFRkFVTFRfRU5DT0RJTkciLCJyZWFkVGlueUludCIsImJ1ZiIsIm9mZnNldCIsInJlYWRVSW50OCIsInJlYWRTbWFsbEludCIsInJlYWRJbnQxNkxFIiwicmVhZEludCIsInJlYWRJbnQzMkxFIiwicmVhZEJpZ0ludCIsInZhbHVlIiwicmVhZEJpZ0ludDY0TEUiLCJSZXN1bHQiLCJ0b1N0cmluZyIsInJlYWRSZWFsIiwicmVhZEZsb2F0TEUiLCJyZWFkRmxvYXQiLCJyZWFkRG91YmxlTEUiLCJyZWFkU21hbGxNb25leSIsInJlYWRNb25leSIsImhpZ2giLCJsb3ciLCJyZWFkVUludDMyTEUiLCJyZWFkQml0IiwicmVhZFZhbHVlIiwibWV0YWRhdGEiLCJvcHRpb25zIiwidHlwZSIsIm5hbWUiLCJkYXRhTGVuZ3RoIiwiRXJyb3IiLCJjb2RlcGFnZSIsImNvbGxhdGlvbiIsInJlYWRVSW50MTZMRSIsInJlYWRDaGFycyIsInJlYWROQ2hhcnMiLCJyZWFkQmluYXJ5IiwidGV4dFBvaW50ZXJMZW5ndGgiLCJyZWFkU21hbGxEYXRlVGltZSIsInVzZVVUQyIsInJlYWREYXRlVGltZSIsInJlYWRUaW1lIiwic2NhbGUiLCJyZWFkRGF0ZSIsInJlYWREYXRlVGltZTIiLCJyZWFkRGF0ZVRpbWVPZmZzZXQiLCJyZWFkTnVtZXJpYyIsInByZWNpc2lvbiIsInJlYWRVbmlxdWVJZGVudGlmaWVyIiwic3ByaW50ZiIsInJlYWRWYXJpYW50IiwiaXNQTFBTdHJlYW0iLCJkYXRhIiwibG93ZXJDYXNlR3VpZHMiLCJidWZmZXJUb0xvd2VyQ2FzZUd1aWQiLCJidWZmZXJUb1VwcGVyQ2FzZUd1aWQiLCJfcHJlY2lzaW9uIiwic2lnbiIsInJlYWRVTnVtZXJpYzY0TEUiLCJyZWFkVU51bWVyaWM5NkxFIiwicmVhZFVOdW1lcmljMTI4TEUiLCJNYXRoIiwicG93IiwiYmFzZVR5cGUiLCJUWVBFIiwicHJvcEJ5dGVzIiwicmVhZENvbGxhdGlvbiIsImxlbmd0aCIsIk5vdEVub3VnaERhdGFFcnJvciIsInNsaWNlIiwiaWNvbnYiLCJkZWNvZGUiLCJQTFBSZWFkZXIiLCJjb25zdHJ1Y3RvciIsImV4cGVjdGVkTGVuZ3RoIiwidW5kZWZpbmVkIiwiY2h1bmtzIiwiY2h1bmtSZW1haW5pbmciLCJyZWFkIiwicGFyc2VyIiwicmVhZEJpZ1VJbnQ2NExFIiwiYnVmZmVyIiwicG9zaXRpb24iLCJjaHVua0xlbmd0aCIsInN0YXJ0IiwiZW5kIiwibWluIiwicHVzaCIsInN1YmFycmF5IiwiTnVtYmVyIiwiQnVmZmVyIiwiY29uY2F0IiwiZXhwb3J0cyIsIlVUQ19FUE9DSF8xOTAwIiwiRGF0ZSIsIlVUQyIsIlVUQ19FUE9DSF8yMDAwIiwiTUlMTElTRUNPTkRTX1BFUl9EQVkiLCJkYXlzIiwibWludXRlcyIsInRocmVlSHVuZHJlZHRoc09mU2Vjb25kIiwibWlsbGlzZWNvbmRzIiwicm91bmQiLCJyZWFkVGltZVZhbHVlIiwicmVhZFVJbnQyNExFIiwicmVhZFVJbnQ0MExFIiwiaSIsImRhdGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ0aW1lIiwidHJ1bmMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi9zcmMvdmFsdWUtcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZXIsIHsgdHlwZSBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi90b2tlbi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IHR5cGUgTWV0YWRhdGEsIHJlYWRDb2xsYXRpb24gfSBmcm9tICcuL21ldGFkYXRhLXBhcnNlcic7XG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xuXG5pbXBvcnQgaWNvbnYgZnJvbSAnaWNvbnYtbGl0ZSc7XG5pbXBvcnQgeyBzcHJpbnRmIH0gZnJvbSAnc3ByaW50Zi1qcyc7XG5pbXBvcnQgeyBidWZmZXJUb0xvd2VyQ2FzZUd1aWQsIGJ1ZmZlclRvVXBwZXJDYXNlR3VpZCB9IGZyb20gJy4vZ3VpZC1wYXJzZXInO1xuaW1wb3J0IHsgTm90RW5vdWdoRGF0YUVycm9yLCBSZXN1bHQsIHJlYWRCaWdJbnQ2NExFLCByZWFkQmlnVUludDY0TEUsIHJlYWREb3VibGVMRSwgcmVhZEZsb2F0TEUsIHJlYWRJbnQxNkxFLCByZWFkSW50MzJMRSwgcmVhZFVJbnQxNkxFLCByZWFkVUludDMyTEUsIHJlYWRVSW50OCwgcmVhZFVJbnQyNExFLCByZWFkVUludDQwTEUsIHJlYWRVTnVtZXJpYzY0TEUsIHJlYWRVTnVtZXJpYzk2TEUsIHJlYWRVTnVtZXJpYzEyOExFIH0gZnJvbSAnLi90b2tlbi9oZWxwZXJzJztcblxuY29uc3QgTlVMTCA9ICgxIDw8IDE2KSAtIDE7XG5jb25zdCBNQVggPSAoMSA8PCAxNikgLSAxO1xuY29uc3QgVEhSRUVfQU5EX0FfVEhJUkQgPSAzICsgKDEgLyAzKTtcbmNvbnN0IE1PTkVZX0RJVklTT1IgPSAxMDAwMDtcbmNvbnN0IFBMUF9OVUxMID0gMHhGRkZGRkZGRkZGRkZGRkZGbjtcbmNvbnN0IFVOS05PV05fUExQX0xFTiA9IDB4RkZGRkZGRkZGRkZGRkZGRW47XG5jb25zdCBERUZBVUxUX0VOQ09ESU5HID0gJ3V0ZjgnO1xuXG5mdW5jdGlvbiByZWFkVGlueUludChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIHJldHVybiByZWFkVUludDgoYnVmLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkU21hbGxJbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZEludDE2TEUoYnVmLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkSW50KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgcmV0dXJuIHJlYWRJbnQzMkxFKGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZEJpZ0ludChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gIGxldCB2YWx1ZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZEJpZ0ludDY0TEUoYnVmLCBvZmZzZXQpKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdCh2YWx1ZS50b1N0cmluZygpLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkUmVhbChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIHJldHVybiByZWFkRmxvYXRMRShidWYsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIHJldHVybiByZWFkRG91YmxlTEUoYnVmLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkU21hbGxNb25leShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIGxldCB2YWx1ZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZEludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdCh2YWx1ZSAvIE1PTkVZX0RJVklTT1IsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRNb25leShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIGxldCBoaWdoO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBoaWdoIH0gPSByZWFkSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCBsb3c7XG4gICh7IG9mZnNldCwgdmFsdWU6IGxvdyB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoKGxvdyArICgweDEwMDAwMDAwMCAqIGhpZ2gpKSAvIE1PTkVZX0RJVklTT1IsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCaXQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PGJvb2xlYW4+IHtcbiAgbGV0IHZhbHVlO1xuICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdCghIXZhbHVlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBtZXRhZGF0YTogTWV0YWRhdGEsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMpOiBSZXN1bHQ8dW5rbm93bj4ge1xuICBjb25zdCB0eXBlID0gbWV0YWRhdGEudHlwZTtcblxuICBzd2l0Y2ggKHR5cGUubmFtZSkge1xuICAgIGNhc2UgJ051bGwnOlxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ1RpbnlJbnQnOiB7XG4gICAgICByZXR1cm4gcmVhZFRpbnlJbnQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ1NtYWxsSW50Jzoge1xuICAgICAgcmV0dXJuIHJlYWRTbWFsbEludChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnSW50Jzoge1xuICAgICAgcmV0dXJuIHJlYWRJbnQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0JpZ0ludCc6IHtcbiAgICAgIHJldHVybiByZWFkQmlnSW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdJbnROJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gcmVhZFRpbnlJbnQoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIHJlYWRTbWFsbEludChidWYsIG9mZnNldCk7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICByZXR1cm4gcmVhZEludChidWYsIG9mZnNldCk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gcmVhZEJpZ0ludChidWYsIG9mZnNldCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGFMZW5ndGggJyArIGRhdGFMZW5ndGggKyAnIGZvciBJbnROJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnUmVhbCc6IHtcbiAgICAgIHJldHVybiByZWFkUmVhbChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnRmxvYXQnOiB7XG4gICAgICByZXR1cm4gcmVhZEZsb2F0KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdGbG9hdE4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiByZWFkUmVhbChidWYsIG9mZnNldCk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gcmVhZEZsb2F0KGJ1Ziwgb2Zmc2V0KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIEZsb2F0TicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgJ1NtYWxsTW9uZXknOiB7XG4gICAgICByZXR1cm4gcmVhZFNtYWxsTW9uZXkoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ01vbmV5JzpcbiAgICAgIHJldHVybiByZWFkTW9uZXkoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnTW9uZXlOJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICByZXR1cm4gcmVhZFNtYWxsTW9uZXkoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWRNb25leShidWYsIG9mZnNldCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGFMZW5ndGggJyArIGRhdGFMZW5ndGggKyAnIGZvciBNb25leU4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdCaXQnOiB7XG4gICAgICByZXR1cm4gcmVhZEJpdChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnQml0Tic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIHJlYWRCaXQoYnVmLCBvZmZzZXQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgQml0TicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgJ1ZhckNoYXInOlxuICAgIGNhc2UgJ0NoYXInOiB7XG4gICAgICBjb25zdCBjb2RlcGFnZSA9IG1ldGFkYXRhLmNvbGxhdGlvbiEuY29kZXBhZ2UhO1xuXG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gTlVMTCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVhZENoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBjb2RlcGFnZSk7XG4gICAgfVxuXG4gICAgY2FzZSAnTlZhckNoYXInOlxuICAgIGNhc2UgJ05DaGFyJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IE5VTEwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWROQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGNhc2UgJ1ZhckJpbmFyeSc6XG4gICAgY2FzZSAnQmluYXJ5Jzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IE5VTEwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGNhc2UgJ1RleHQnOiB7XG4gICAgICBsZXQgdGV4dFBvaW50ZXJMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiB0ZXh0UG9pbnRlckxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmICh0ZXh0UG9pbnRlckxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBUZXh0cG9pbnRlclxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCB0ZXh0UG9pbnRlckxlbmd0aCkpO1xuXG4gICAgICAvLyBUaW1lc3RhbXBcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgOCkpO1xuXG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZENoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBtZXRhZGF0YS5jb2xsYXRpb24hLmNvZGVwYWdlISk7XG4gICAgfVxuXG4gICAgY2FzZSAnTlRleHQnOiB7XG4gICAgICBsZXQgdGV4dFBvaW50ZXJMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiB0ZXh0UG9pbnRlckxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmICh0ZXh0UG9pbnRlckxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBUZXh0cG9pbnRlclxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCB0ZXh0UG9pbnRlckxlbmd0aCkpO1xuXG4gICAgICAvLyBUaW1lc3RhbXBcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgOCkpO1xuXG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZE5DaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY2FzZSAnSW1hZ2UnOiB7XG4gICAgICBsZXQgdGV4dFBvaW50ZXJMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiB0ZXh0UG9pbnRlckxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmICh0ZXh0UG9pbnRlckxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBUZXh0cG9pbnRlclxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCB0ZXh0UG9pbnRlckxlbmd0aCkpO1xuXG4gICAgICAvLyBUaW1lc3RhbXBcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgOCkpO1xuXG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY2FzZSAnU21hbGxEYXRlVGltZSc6IHtcbiAgICAgIHJldHVybiByZWFkU21hbGxEYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lJzoge1xuICAgICAgcmV0dXJuIHJlYWREYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lTic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIHJlYWRTbWFsbERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gcmVhZERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGFMZW5ndGggJyArIGRhdGFMZW5ndGggKyAnIGZvciBEYXRlVGltZU4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdUaW1lJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWRUaW1lKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBtZXRhZGF0YS5zY2FsZSEsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWREYXRlKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG4gICAgfVxuXG4gICAgY2FzZSAnRGF0ZVRpbWUyJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWREYXRlVGltZTIoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIG1ldGFkYXRhLnNjYWxlISwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0Jzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWREYXRlVGltZU9mZnNldChidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgbWV0YWRhdGEuc2NhbGUhKTtcbiAgICB9XG5cbiAgICBjYXNlICdOdW1lcmljTic6XG4gICAgY2FzZSAnRGVjaW1hbE4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVhZE51bWVyaWMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIG1ldGFkYXRhLnByZWNpc2lvbiEsIG1ldGFkYXRhLnNjYWxlISk7XG4gICAgfVxuXG4gICAgY2FzZSAnVW5pcXVlSWRlbnRpZmllcic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDB4MTA6XG4gICAgICAgICAgcmV0dXJuIHJlYWRVbmlxdWVJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdVbnN1cHBvcnRlZCBndWlkIHNpemUgJWQnLCBkYXRhTGVuZ3RoISAtIDEpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdWYXJpYW50Jzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWRWYXJpYW50KGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHlwZSEnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQTFBTdHJlYW0obWV0YWRhdGE6IE1ldGFkYXRhKSB7XG4gIHN3aXRjaCAobWV0YWRhdGEudHlwZS5uYW1lKSB7XG4gICAgY2FzZSAnVmFyQ2hhcic6XG4gICAgY2FzZSAnTlZhckNoYXInOlxuICAgIGNhc2UgJ1ZhckJpbmFyeSc6IHtcbiAgICAgIHJldHVybiBtZXRhZGF0YS5kYXRhTGVuZ3RoID09PSBNQVg7XG4gICAgfVxuXG4gICAgY2FzZSAnWG1sJzoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY2FzZSAnVURUJzoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRVbmlxdWVJZGVudGlmaWVyKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDxzdHJpbmc+IHtcbiAgbGV0IGRhdGE7XG4gICh7IHZhbHVlOiBkYXRhLCBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDB4MTApKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChvcHRpb25zLmxvd2VyQ2FzZUd1aWRzID8gYnVmZmVyVG9Mb3dlckNhc2VHdWlkKGRhdGEpIDogYnVmZmVyVG9VcHBlckNhc2VHdWlkKGRhdGEpLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkTnVtZXJpYyhidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgX3ByZWNpc2lvbjogbnVtYmVyLCBzY2FsZTogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgc2lnbjtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogc2lnbiB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgc2lnbiA9IHNpZ24gPT09IDEgPyAxIDogLTE7XG5cbiAgbGV0IHZhbHVlO1xuICBpZiAoZGF0YUxlbmd0aCA9PT0gNSkge1xuICAgICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPT09IDkpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVU51bWVyaWM2NExFKGJ1Ziwgb2Zmc2V0KSk7XG4gIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTMpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVU51bWVyaWM5NkxFKGJ1Ziwgb2Zmc2V0KSk7XG4gIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTcpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVU51bWVyaWMxMjhMRShidWYsIG9mZnNldCkpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdVbnN1cHBvcnRlZCBudW1lcmljIGRhdGFMZW5ndGggJWQnLCBkYXRhTGVuZ3RoKSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3VsdCgodmFsdWUgKiBzaWduKSAvIE1hdGgucG93KDEwLCBzY2FsZSksIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRWYXJpYW50KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgZGF0YUxlbmd0aDogbnVtYmVyKTogUmVzdWx0PHVua25vd24+IHtcbiAgbGV0IGJhc2VUeXBlO1xuICAoeyB2YWx1ZTogYmFzZVR5cGUsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgY29uc3QgdHlwZSA9IFRZUEVbYmFzZVR5cGVdO1xuXG4gIGxldCBwcm9wQnl0ZXM7XG4gICh7IHZhbHVlOiBwcm9wQnl0ZXMsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgZGF0YUxlbmd0aCA9IGRhdGFMZW5ndGggLSBwcm9wQnl0ZXMgLSAyO1xuXG4gIHN3aXRjaCAodHlwZS5uYW1lKSB7XG4gICAgY2FzZSAnVW5pcXVlSWRlbnRpZmllcic6XG4gICAgICByZXR1cm4gcmVhZFVuaXF1ZUlkZW50aWZpZXIoYnVmLCBvZmZzZXQsIG9wdGlvbnMpO1xuXG4gICAgY2FzZSAnQml0JzpcbiAgICAgIHJldHVybiByZWFkQml0KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ1RpbnlJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRUaW55SW50KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ1NtYWxsSW50JzpcbiAgICAgIHJldHVybiByZWFkU21hbGxJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnSW50JzpcbiAgICAgIHJldHVybiByZWFkSW50KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ0JpZ0ludCc6XG4gICAgICByZXR1cm4gcmVhZEJpZ0ludChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdTbWFsbERhdGVUaW1lJzpcbiAgICAgIHJldHVybiByZWFkU21hbGxEYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuXG4gICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgcmV0dXJuIHJlYWREYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuXG4gICAgY2FzZSAnUmVhbCc6XG4gICAgICByZXR1cm4gcmVhZFJlYWwoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnRmxvYXQnOlxuICAgICAgcmV0dXJuIHJlYWRGbG9hdChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdTbWFsbE1vbmV5JzpcbiAgICAgIHJldHVybiByZWFkU21hbGxNb25leShidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdNb25leSc6XG4gICAgICByZXR1cm4gcmVhZE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuIHJlYWREYXRlKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG5cbiAgICBjYXNlICdUaW1lJzoge1xuICAgICAgbGV0IHNjYWxlO1xuICAgICAgKHsgdmFsdWU6IHNjYWxlLCBvZmZzZXQgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZFRpbWUoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIHNjYWxlLCBvcHRpb25zLnVzZVVUQyk7XG4gICAgfVxuXG4gICAgY2FzZSAnRGF0ZVRpbWUyJzoge1xuICAgICAgbGV0IHNjYWxlO1xuICAgICAgKHsgdmFsdWU6IHNjYWxlLCBvZmZzZXQgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lMihidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgc2NhbGUsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZU9mZnNldCc6IHtcbiAgICAgIGxldCBzY2FsZTtcbiAgICAgICh7IHZhbHVlOiBzY2FsZSwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWREYXRlVGltZU9mZnNldChidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgc2NhbGUpO1xuICAgIH1cblxuICAgIGNhc2UgJ1ZhckJpbmFyeSc6XG4gICAgY2FzZSAnQmluYXJ5Jzoge1xuICAgICAgLy8gbWF4TGVuZ3RoICh1bnVzZWQ/KVxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGNhc2UgJ051bWVyaWNOJzpcbiAgICBjYXNlICdEZWNpbWFsTic6IHtcbiAgICAgIGxldCBwcmVjaXNpb247XG4gICAgICAoeyB2YWx1ZTogcHJlY2lzaW9uLCBvZmZzZXQgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBsZXQgc2NhbGU7XG4gICAgICAoeyB2YWx1ZTogc2NhbGUsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkTnVtZXJpYyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgcHJlY2lzaW9uLCBzY2FsZSk7XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyQ2hhcic6XG4gICAgY2FzZSAnQ2hhcic6IHtcbiAgICAgIC8vIG1heExlbmd0aCAodW51c2VkPylcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGxldCBjb2xsYXRpb247XG4gICAgICAoeyB2YWx1ZTogY29sbGF0aW9uLCBvZmZzZXQgfSA9IHJlYWRDb2xsYXRpb24oYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWRDaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgY29sbGF0aW9uLmNvZGVwYWdlISk7XG4gICAgfVxuXG4gICAgY2FzZSAnTlZhckNoYXInOlxuICAgIGNhc2UgJ05DaGFyJzoge1xuICAgICAgLy8gbWF4TGVuZ3RoICh1bnVzZWQ/KVxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgLy8gY29sbGF0aW9uICh1bnVzZWQ/KVxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkQ29sbGF0aW9uKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkTkNoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHR5cGUhJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZEJpbmFyeShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlcik6IFJlc3VsdDxCdWZmZXI+IHtcbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyBkYXRhTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi5zbGljZShvZmZzZXQsIG9mZnNldCArIGRhdGFMZW5ndGgpLCBvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gcmVhZENoYXJzKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBjb2RlcGFnZTogc3RyaW5nKTogUmVzdWx0PHN0cmluZz4ge1xuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIGRhdGFMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIGRhdGFMZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoaWNvbnYuZGVjb2RlKGJ1Zi5zbGljZShvZmZzZXQsIG9mZnNldCArIGRhdGFMZW5ndGgpLCBjb2RlcGFnZSA/PyBERUZBVUxUX0VOQ09ESU5HKSwgb2Zmc2V0ICsgZGF0YUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJlYWROQ2hhcnMoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgZGF0YUxlbmd0aCkge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgZGF0YUxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3VsdChidWYudG9TdHJpbmcoJ3VjczInLCBvZmZzZXQsIG9mZnNldCArIGRhdGFMZW5ndGgpLCBvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhIFBMUCAocGFydGlhbGx5IGxlbmd0aC1wcmVmaXhlZCkgdmFsdWUuXG4gKlxuICogUExQIHZhbHVlcyBjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2UgYW5kIHNwYW4gbWFueSBjaHVua3Mgb2YgaW5jb21pbmcgZGF0YSxcbiAqIHNvIHRoZXkgYXJlIHJlYWQgaW5jcmVtZW50YWxseTogd2hhdGV2ZXIgcGFydCBvZiB0aGUgdmFsdWUgaXMgYXZhaWxhYmxlIGlzXG4gKiBjb25zdW1lZCByaWdodCBhd2F5LCBhbmQgdGhlIHJlYWRlcidzIHByb2dyZXNzIGlzIGtlcHQgYWNyb3NzIGNhbGxzLiBJZiB0aGVcbiAqIGF2YWlsYWJsZSBkYXRhIHJ1bnMgb3V0LCBgTm90RW5vdWdoRGF0YUVycm9yYCBpcyB0aHJvd24gYW5kIGByZWFkYCBjYW4gYmVcbiAqIGNhbGxlZCBhZ2FpbiBvbmNlIG1vcmUgZGF0YSBoYXMgYXJyaXZlZC5cbiAqL1xuY2xhc3MgUExQUmVhZGVyIHtcbiAgZGVjbGFyZSBtZXRhZGF0YTogTWV0YWRhdGE7XG5cbiAgLy8gVGhlIHZhbHVlJ3MgdG90YWwgbGVuZ3RoIGFzIGFubm91bmNlZCBieSB0aGUgc2VydmVyLCBvciBgdW5kZWZpbmVkYFxuICAvLyB3aGlsZSBpdCBoYXMgbm90IGJlZW4gcmVhZCB5ZXQuXG4gIGRlY2xhcmUgZXhwZWN0ZWRMZW5ndGg6IGJpZ2ludCB8IHVuZGVmaW5lZDtcblxuICBkZWNsYXJlIGNodW5rczogQnVmZmVyW107XG4gIGRlY2xhcmUgbGVuZ3RoOiBudW1iZXI7XG5cbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBjdXJyZW50IFBMUCBjaHVuayB0aGF0IGhhdmUgbm90IGJlZW4gcmVhZCB5ZXQuXG4gIGRlY2xhcmUgY2h1bmtSZW1haW5pbmc6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihtZXRhZGF0YTogTWV0YWRhdGEpIHtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgdGhpcy5leHBlY3RlZExlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmNodW5rUmVtYWluaW5nID0gMDtcbiAgfVxuXG4gIHJlYWQocGFyc2VyOiBQYXJzZXIpOiB1bmtub3duIHtcbiAgICBpZiAodGhpcy5leHBlY3RlZExlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCBvZmZzZXQgfSA9IHJlYWRCaWdVSW50NjRMRShwYXJzZXIuYnVmZmVyLCBwYXJzZXIucG9zaXRpb24pO1xuICAgICAgcGFyc2VyLnBvc2l0aW9uID0gb2Zmc2V0O1xuICAgICAgdGhpcy5leHBlY3RlZExlbmd0aCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4cGVjdGVkTGVuZ3RoID09PSBQTFBfTlVMTCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmICh0aGlzLmNodW5rUmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWU6IGNodW5rTGVuZ3RoLCBvZmZzZXQgfSA9IHJlYWRVSW50MzJMRShwYXJzZXIuYnVmZmVyLCBwYXJzZXIucG9zaXRpb24pO1xuICAgICAgICBwYXJzZXIucG9zaXRpb24gPSBvZmZzZXQ7XG5cbiAgICAgICAgaWYgKGNodW5rTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNodW5rUmVtYWluaW5nID0gY2h1bmtMZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1ZiA9IHBhcnNlci5idWZmZXI7XG4gICAgICBjb25zdCBzdGFydCA9IHBhcnNlci5wb3NpdGlvbjtcbiAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHN0YXJ0ICsgdGhpcy5jaHVua1JlbWFpbmluZywgYnVmLmxlbmd0aCk7XG4gICAgICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgICAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKHN0YXJ0ICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2h1bmtzLnB1c2goYnVmLnN1YmFycmF5KHN0YXJ0LCBlbmQpKTtcbiAgICAgIHRoaXMubGVuZ3RoICs9IGVuZCAtIHN0YXJ0O1xuICAgICAgdGhpcy5jaHVua1JlbWFpbmluZyAtPSBlbmQgLSBzdGFydDtcbiAgICAgIHBhcnNlci5wb3NpdGlvbiA9IGVuZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5leHBlY3RlZExlbmd0aCAhPT0gVU5LTk9XTl9QTFBfTEVOICYmIHRoaXMubGVuZ3RoICE9PSBOdW1iZXIodGhpcy5leHBlY3RlZExlbmd0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFydGlhbGx5IExlbmd0aC1wcmVmaXhlZCBCeXRlcyB1bm1hdGNoZWQgbGVuZ3RocyA6IGV4cGVjdGVkICcgKyB0aGlzLmV4cGVjdGVkTGVuZ3RoICsgJywgYnV0IGdvdCAnICsgdGhpcy5sZW5ndGggKyAnIGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgLy8gYEJ1ZmZlci5jb25jYXRgIGFsd2F5cyBjb3BpZXMsIHNvIHRoZSB2YWx1ZSBuZXZlciBrZWVwcyB0aGUgKHBvc3NpYmx5XG4gICAgLy8gbXVjaCBsYXJnZXIpIGluY29taW5nIGRhdGEgYnVmZmVycyBhbGl2ZS5cbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmNvbmNhdCh0aGlzLmNodW5rcywgdGhpcy5sZW5ndGgpO1xuXG4gICAgc3dpdGNoICh0aGlzLm1ldGFkYXRhLnR5cGUubmFtZSkge1xuICAgICAgY2FzZSAnTlZhckNoYXInOlxuICAgICAgY2FzZSAnWG1sJzpcbiAgICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoJ3VjczInKTtcblxuICAgICAgY2FzZSAnVmFyQ2hhcic6XG4gICAgICAgIHJldHVybiBpY29udi5kZWNvZGUoZGF0YSwgdGhpcy5tZXRhZGF0YS5jb2xsYXRpb24/LmNvZGVwYWdlID8/IERFRkFVTFRfRU5DT0RJTkcpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRXBvY2ggb2Zmc2V0cyBmb3IgYnVpbGRpbmcgVVRDIGBEYXRlYCB2YWx1ZXMgdmlhIHBsYWluIGFyaXRobWV0aWMsIHdoaWNoXG4vLyBhdm9pZHMgdGhlIChjb21wYXJhdGl2ZWx5IHNsb3cpIGBEYXRlLlVUQ2AgY2FsZW5kYXIgY2FsY3VsYXRpb25zLlxuLy9cbi8vIE5vdGUgdGhhdCB0aGUgZGF5IGNvbnN0YW50cyBpbiB0aGUgVVRDIGFuZCBsb2NhbCB0aW1lIGJyYW5jaGVzIGJlbG93IGRpZmZlclxuLy8gYnkgb25lLCBldmVuIHRob3VnaCBib3RoIGJyYW5jaGVzIGRlc2NyaWJlIHRoZSBzYW1lIGRhdGU6IGBkYXlzYCBhcnJpdmVzIGFzXG4vLyB0aGUgd2lyZS1mb3JtYXQgZGF5IGNvdW50IHNpbmNlIDAwMDEtMDEtMDEgKGUuZy4gMjAwMC0wMS0wMSBpcyA3MzAxMTkpLiBUaGVcbi8vIGxvY2FsIHRpbWUgYnJhbmNoZXMgcGFzcyBgZGF5cyAtIDczMDExOGAgYXMgdGhlICoxLWJhc2VkKiBkYXktb2YtbW9udGhcbi8vIGFyZ3VtZW50IG9mIGBuZXcgRGF0ZSgyMDAwLCAwLCAuLi4pYCwgd2hpbGUgdGhlIFVUQyBicmFuY2hlcyBtdWx0aXBseVxuLy8gYGRheXMgLSA3MzAxMTlgIGFzIGEgKjAtYmFzZWQqIGRheSBvZmZzZXQgZnJvbSBgVVRDX0VQT0NIXzIwMDBgLlxuY29uc3QgVVRDX0VQT0NIXzE5MDAgPSBEYXRlLlVUQygxOTAwLCAwLCAxKTtcbmNvbnN0IFVUQ19FUE9DSF8yMDAwID0gRGF0ZS5VVEMoMjAwMCwgMCwgMSk7XG5jb25zdCBNSUxMSVNFQ09ORFNfUEVSX0RBWSA9IDg2NDAwMDAwO1xuXG5mdW5jdGlvbiByZWFkU21hbGxEYXRlVGltZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbik6IFJlc3VsdDxEYXRlPiB7XG4gIGxldCBkYXlzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYXlzIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgbWludXRlcztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogbWludXRlcyB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IHZhbHVlO1xuICBpZiAodXNlVVRDKSB7XG4gICAgdmFsdWUgPSBuZXcgRGF0ZShVVENfRVBPQ0hfMTkwMCArIGRheXMgKiBNSUxMSVNFQ09ORFNfUEVSX0RBWSArIG1pbnV0ZXMgKiA2MDAwMCk7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBuZXcgRGF0ZSgxOTAwLCAwLCAxICsgZGF5cywgMCwgbWludXRlcyk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3VsdCh2YWx1ZSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZERhdGVUaW1lKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgdXNlVVRDOiBib29sZWFuKTogUmVzdWx0PERhdGU+IHtcbiAgbGV0IGRheXM7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRheXMgfSA9IHJlYWRJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IHRocmVlSHVuZHJlZHRoc09mU2Vjb25kO1xuICAoeyBvZmZzZXQsIHZhbHVlOiB0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCB9ID0gcmVhZEludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICBjb25zdCBtaWxsaXNlY29uZHMgPSBNYXRoLnJvdW5kKHRocmVlSHVuZHJlZHRoc09mU2Vjb25kICogVEhSRUVfQU5EX0FfVEhJUkQpO1xuXG4gIGxldCB2YWx1ZTtcbiAgaWYgKHVzZVVUQykge1xuICAgIHZhbHVlID0gbmV3IERhdGUoVVRDX0VQT0NIXzE5MDAgKyBkYXlzICogTUlMTElTRUNPTkRTX1BFUl9EQVkgKyBtaWxsaXNlY29uZHMpO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbmV3IERhdGUoMTkwMCwgMCwgMSArIGRheXMsIDAsIDAsIDAsIG1pbGxpc2Vjb25kcyk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3VsdCh2YWx1ZSwgb2Zmc2V0KTtcbn1cblxuaW50ZXJmYWNlIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YSBleHRlbmRzIERhdGUge1xuICBuYW5vc2Vjb25kc0RlbHRhOiBudW1iZXI7XG59XG5cbi8vIFJlYWRzIGEgYHRpbWVgIHZhbHVlLCByZXR1cm5lZCBpbiB1bml0cyBvZiAxMDAgbmFub3NlY29uZHMgc2luY2UgbWlkbmlnaHQuXG5mdW5jdGlvbiByZWFkVGltZVZhbHVlKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBzY2FsZTogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgdmFsdWU7XG5cbiAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgY2FzZSAzOiB7XG4gICAgICAoeyB2YWx1ZSwgb2Zmc2V0IH0gPSByZWFkVUludDI0TEUoYnVmLCBvZmZzZXQpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgNDoge1xuICAgICAgKHsgdmFsdWUsIG9mZnNldCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIDU6IHtcbiAgICAgICh7IHZhbHVlLCBvZmZzZXQgfSA9IHJlYWRVSW50NDBMRShidWYsIG9mZnNldCkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlYWNoYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzY2FsZSA8IDcpIHtcbiAgICBmb3IgKGxldCBpID0gc2NhbGU7IGkgPCA3OyBpKyspIHtcbiAgICAgIHZhbHVlICo9IDEwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KHZhbHVlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGltZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgc2NhbGU6IG51bWJlciwgdXNlVVRDOiBib29sZWFuKTogUmVzdWx0PERhdGVXaXRoTmFub3NlY29uZHNEZWx0YT4ge1xuICBsZXQgdmFsdWU7XG4gICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRUaW1lVmFsdWUoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIHNjYWxlKSk7XG5cbiAgbGV0IGRhdGU7XG4gIGlmICh1c2VVVEMpIHtcbiAgICBkYXRlID0gbmV3IERhdGUodmFsdWUgLyAxMDAwMCkgYXMgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhO1xuICB9IGVsc2Uge1xuICAgIGRhdGUgPSBuZXcgRGF0ZSgxOTcwLCAwLCAxLCAwLCAwLCAwLCB2YWx1ZSAvIDEwMDAwKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsICduYW5vc2Vjb25kc0RlbHRhJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiAodmFsdWUgJSAxMDAwMCkgLyAxZTdcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoZGF0ZSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZERhdGUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4pOiBSZXN1bHQ8RGF0ZT4ge1xuICBsZXQgZGF5cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF5cyB9ID0gcmVhZFVJbnQyNExFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgaWYgKHVzZVVUQykge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KG5ldyBEYXRlKFVUQ19FUE9DSF8yMDAwICsgKGRheXMgLSA3MzAxMTkpICogTUlMTElTRUNPTkRTX1BFUl9EQVkpLCBvZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KG5ldyBEYXRlKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgpLCBvZmZzZXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWREYXRlVGltZTIoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbik6IFJlc3VsdDxEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE+IHtcbiAgbGV0IHRpbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IHRpbWUgfSA9IHJlYWRUaW1lVmFsdWUoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGggLSAzLCBzY2FsZSkpO1xuXG4gIGxldCBkYXlzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYXlzIH0gPSByZWFkVUludDI0TEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgZGF0ZTtcbiAgaWYgKHVzZVVUQykge1xuICAgIGRhdGUgPSBuZXcgRGF0ZShVVENfRVBPQ0hfMjAwMCArIChkYXlzIC0gNzMwMTE5KSAqIE1JTExJU0VDT05EU19QRVJfREFZICsgTWF0aC50cnVuYyh0aW1lIC8gMTAwMDApKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH0gZWxzZSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgsIDAsIDAsIDAsIHRpbWUgLyAxMDAwMCkgYXMgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhO1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCAnbmFub3NlY29uZHNEZWx0YScsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogKHRpbWUgJSAxMDAwMCkgLyAxZTdcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoZGF0ZSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZERhdGVUaW1lT2Zmc2V0KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBzY2FsZTogbnVtYmVyKTogUmVzdWx0PERhdGVXaXRoTmFub3NlY29uZHNEZWx0YT4ge1xuICBsZXQgdGltZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdGltZSB9ID0gcmVhZFRpbWVWYWx1ZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCAtIDUsIHNjYWxlKSk7XG5cbiAgbGV0IGRheXM7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRheXMgfSA9IHJlYWRVSW50MjRMRShidWYsIG9mZnNldCkpO1xuXG4gIC8vIHRpbWUgb2Zmc2V0P1xuICAoeyBvZmZzZXQgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShVVENfRVBPQ0hfMjAwMCArIChkYXlzIC0gNzMwMTE5KSAqIE1JTExJU0VDT05EU19QRVJfREFZICsgTWF0aC50cnVuYyh0aW1lIC8gMTAwMDApKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCAnbmFub3NlY29uZHNEZWx0YScsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogKHRpbWUgJSAxMDAwMCkgLyAxZTdcbiAgfSk7XG4gIHJldHVybiBuZXcgUmVzdWx0KGRhdGUsIG9mZnNldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLnJlYWRWYWx1ZSA9IHJlYWRWYWx1ZTtcbm1vZHVsZS5leHBvcnRzLmlzUExQU3RyZWFtID0gaXNQTFBTdHJlYW07XG5tb2R1bGUuZXhwb3J0cy5QTFBSZWFkZXIgPSBQTFBSZWFkZXI7XG5cbmV4cG9ydCB7IHJlYWRWYWx1ZSwgaXNQTFBTdHJlYW0sIFBMUFJlYWRlciB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUNBLElBQUFBLGVBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFNB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