????

Your IP : 18.222.112.116


Current Path : C:/inetpub/vhost/binhdinhinvest.gdtvietnam.com/api/node_modules/tedious/lib/
Upload File :
Current File : C:/inetpub/vhost/binhdinhinvest.gdtvietnam.com/api/node_modules/tedious/lib/value-parser.js

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

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");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

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 = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
const UNKNOWN_PLP_LEN = Buffer.from([0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
const DEFAULT_ENCODING = 'utf8';

function readTinyInt(parser, callback) {
  parser.readUInt8(callback);
}

function readSmallInt(parser, callback) {
  parser.readInt16LE(callback);
}

function readInt(parser, callback) {
  parser.readInt32LE(callback);
}

function readBigInt(parser, callback) {
  parser.readBigInt64LE(value => {
    callback(value.toString());
  });
}

function readReal(parser, callback) {
  parser.readFloatLE(callback);
}

function readFloat(parser, callback) {
  parser.readDoubleLE(callback);
}

function readSmallMoney(parser, callback) {
  parser.readInt32LE(value => {
    callback(value / MONEY_DIVISOR);
  });
}

function readMoney(parser, callback) {
  parser.readInt32LE(high => {
    parser.readUInt32LE(low => {
      callback((low + 0x100000000 * high) / MONEY_DIVISOR);
    });
  });
}

function readBit(parser, callback) {
  parser.readUInt8(value => {
    callback(!!value);
  });
}

function valueParse(parser, metadata, options, callback) {
  const type = metadata.type;

  switch (type.name) {
    case 'Null':
      return callback(null);

    case 'TinyInt':
      return readTinyInt(parser, callback);

    case 'SmallInt':
      return readSmallInt(parser, callback);

    case 'Int':
      return readInt(parser, callback);

    case 'BigInt':
      return readBigInt(parser, callback);

    case 'IntN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 1:
            return readTinyInt(parser, callback);

          case 2:
            return readSmallInt(parser, callback);

          case 4:
            return readInt(parser, callback);

          case 8:
            return readBigInt(parser, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for IntN');
        }
      });

    case 'Real':
      return readReal(parser, callback);

    case 'Float':
      return readFloat(parser, callback);

    case 'FloatN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 4:
            return readReal(parser, callback);

          case 8:
            return readFloat(parser, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for FloatN');
        }
      });

    case 'SmallMoney':
      return readSmallMoney(parser, callback);

    case 'Money':
      return readMoney(parser, callback);

    case 'MoneyN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 4:
            return readSmallMoney(parser, callback);

          case 8:
            return readMoney(parser, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for MoneyN');
        }
      });

    case 'Bit':
      return readBit(parser, callback);

    case 'BitN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 1:
            return readBit(parser, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for BitN');
        }
      });

    case 'VarChar':
    case 'Char':
      const codepage = metadata.collation.codepage;

      if (metadata.dataLength === MAX) {
        return readMaxChars(parser, codepage, callback);
      } else {
        return parser.readUInt16LE(dataLength => {
          if (dataLength === NULL) {
            return callback(null);
          }

          readChars(parser, dataLength, codepage, callback);
        });
      }

    case 'NVarChar':
    case 'NChar':
      if (metadata.dataLength === MAX) {
        return readMaxNChars(parser, callback);
      } else {
        return parser.readUInt16LE(dataLength => {
          if (dataLength === NULL) {
            return callback(null);
          }

          readNChars(parser, dataLength, callback);
        });
      }

    case 'VarBinary':
    case 'Binary':
      if (metadata.dataLength === MAX) {
        return readMaxBinary(parser, callback);
      } else {
        return parser.readUInt16LE(dataLength => {
          if (dataLength === NULL) {
            return callback(null);
          }

          readBinary(parser, dataLength, callback);
        });
      }

    case 'Text':
      return parser.readUInt8(textPointerLength => {
        if (textPointerLength === 0) {
          return callback(null);
        }

        parser.readBuffer(textPointerLength, _textPointer => {
          parser.readBuffer(8, _timestamp => {
            parser.readUInt32LE(dataLength => {
              readChars(parser, dataLength, metadata.collation.codepage, callback);
            });
          });
        });
      });

    case 'NText':
      return parser.readUInt8(textPointerLength => {
        if (textPointerLength === 0) {
          return callback(null);
        }

        parser.readBuffer(textPointerLength, _textPointer => {
          parser.readBuffer(8, _timestamp => {
            parser.readUInt32LE(dataLength => {
              readNChars(parser, dataLength, callback);
            });
          });
        });
      });

    case 'Image':
      return parser.readUInt8(textPointerLength => {
        if (textPointerLength === 0) {
          return callback(null);
        }

        parser.readBuffer(textPointerLength, _textPointer => {
          parser.readBuffer(8, _timestamp => {
            parser.readUInt32LE(dataLength => {
              readBinary(parser, dataLength, callback);
            });
          });
        });
      });

    case 'Xml':
      return readMaxNChars(parser, callback);

    case 'SmallDateTime':
      return readSmallDateTime(parser, options.useUTC, callback);

    case 'DateTime':
      return readDateTime(parser, options.useUTC, callback);

    case 'DateTimeN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 4:
            return readSmallDateTime(parser, options.useUTC, callback);

          case 8:
            return readDateTime(parser, options.useUTC, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for DateTimeN');
        }
      });

    case 'Time':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readTime(parser, dataLength, metadata.scale, options.useUTC, callback);
        }
      });

    case 'Date':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readDate(parser, options.useUTC, callback);
        }
      });

    case 'DateTime2':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readDateTime2(parser, dataLength, metadata.scale, options.useUTC, callback);
        }
      });

    case 'DateTimeOffset':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readDateTimeOffset(parser, dataLength, metadata.scale, callback);
        }
      });

    case 'NumericN':
    case 'DecimalN':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readNumeric(parser, dataLength, metadata.precision, metadata.scale, callback);
        }
      });

    case 'UniqueIdentifier':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 0x10:
            return readUniqueIdentifier(parser, options, callback);

          default:
            throw new Error((0, _sprintfJs.sprintf)('Unsupported guid size %d', dataLength - 1));
        }
      });

    case 'UDT':
      return readMaxBinary(parser, callback);

    case 'Variant':
      return parser.readUInt32LE(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        }

        readVariant(parser, options, dataLength, callback);
      });

    default:
      throw new Error((0, _sprintfJs.sprintf)('Unrecognised type %s', type.name));
  }
}

function readUniqueIdentifier(parser, options, callback) {
  parser.readBuffer(0x10, data => {
    callback(options.lowerCaseGuids ? (0, _guidParser.bufferToLowerCaseGuid)(data) : (0, _guidParser.bufferToUpperCaseGuid)(data));
  });
}

function readNumeric(parser, dataLength, _precision, scale, callback) {
  parser.readUInt8(sign => {
    sign = sign === 1 ? 1 : -1;
    let readValue;

    if (dataLength === 5) {
      readValue = parser.readUInt32LE;
    } else if (dataLength === 9) {
      readValue = parser.readUNumeric64LE;
    } else if (dataLength === 13) {
      readValue = parser.readUNumeric96LE;
    } else if (dataLength === 17) {
      readValue = parser.readUNumeric128LE;
    } else {
      throw new Error((0, _sprintfJs.sprintf)('Unsupported numeric dataLength %d', dataLength));
    }

    readValue.call(parser, value => {
      callback(value * sign / Math.pow(10, scale));
    });
  });
}

function readVariant(parser, options, dataLength, callback) {
  return parser.readUInt8(baseType => {
    const type = _dataType.TYPE[baseType];
    return parser.readUInt8(propBytes => {
      dataLength = dataLength - propBytes - 2;

      switch (type.name) {
        case 'UniqueIdentifier':
          return readUniqueIdentifier(parser, options, callback);

        case 'Bit':
          return readBit(parser, callback);

        case 'TinyInt':
          return readTinyInt(parser, callback);

        case 'SmallInt':
          return readSmallInt(parser, callback);

        case 'Int':
          return readInt(parser, callback);

        case 'BigInt':
          return readBigInt(parser, callback);

        case 'SmallDateTime':
          return readSmallDateTime(parser, options.useUTC, callback);

        case 'DateTime':
          return readDateTime(parser, options.useUTC, callback);

        case 'Real':
          return readReal(parser, callback);

        case 'Float':
          return readFloat(parser, callback);

        case 'SmallMoney':
          return readSmallMoney(parser, callback);

        case 'Money':
          return readMoney(parser, callback);

        case 'Date':
          return readDate(parser, options.useUTC, callback);

        case 'Time':
          return parser.readUInt8(scale => {
            return readTime(parser, dataLength, scale, options.useUTC, callback);
          });

        case 'DateTime2':
          return parser.readUInt8(scale => {
            return readDateTime2(parser, dataLength, scale, options.useUTC, callback);
          });

        case 'DateTimeOffset':
          return parser.readUInt8(scale => {
            return readDateTimeOffset(parser, dataLength, scale, callback);
          });

        case 'VarBinary':
        case 'Binary':
          return parser.readUInt16LE(_maxLength => {
            readBinary(parser, dataLength, callback);
          });

        case 'NumericN':
        case 'DecimalN':
          return parser.readUInt8(precision => {
            parser.readUInt8(scale => {
              readNumeric(parser, dataLength, precision, scale, callback);
            });
          });

        case 'VarChar':
        case 'Char':
          return parser.readUInt16LE(_maxLength => {
            (0, _metadataParser.readCollation)(parser, collation => {
              readChars(parser, dataLength, collation.codepage, callback);
            });
          });

        case 'NVarChar':
        case 'NChar':
          return parser.readUInt16LE(_maxLength => {
            (0, _metadataParser.readCollation)(parser, _collation => {
              readNChars(parser, dataLength, callback);
            });
          });

        default:
          throw new Error('Invalid type!');
      }
    });
  });
}

function readBinary(parser, dataLength, callback) {
  return parser.readBuffer(dataLength, callback);
}

function readChars(parser, dataLength, codepage, callback) {
  if (codepage == null) {
    codepage = DEFAULT_ENCODING;
  }

  return parser.readBuffer(dataLength, data => {
    callback(_iconvLite.default.decode(data, codepage));
  });
}

function readNChars(parser, dataLength, callback) {
  parser.readBuffer(dataLength, data => {
    callback(data.toString('ucs2'));
  });
}

function readMaxBinary(parser, callback) {
  return readMax(parser, callback);
}

function readMaxChars(parser, codepage, callback) {
  if (codepage == null) {
    codepage = DEFAULT_ENCODING;
  }

  readMax(parser, data => {
    if (data) {
      callback(_iconvLite.default.decode(data, codepage));
    } else {
      callback(null);
    }
  });
}

function readMaxNChars(parser, callback) {
  readMax(parser, data => {
    if (data) {
      callback(data.toString('ucs2'));
    } else {
      callback(null);
    }
  });
}

function readMax(parser, callback) {
  parser.readBuffer(8, type => {
    if (type.equals(PLP_NULL)) {
      return callback(null);
    } else if (type.equals(UNKNOWN_PLP_LEN)) {
      return readMaxUnknownLength(parser, callback);
    } else {
      const low = type.readUInt32LE(0);
      const high = type.readUInt32LE(4);

      if (high >= 2 << 53 - 32) {
        console.warn('Read UInt64LE > 53 bits : high=' + high + ', low=' + low);
      }

      const expectedLength = low + 0x100000000 * high;
      return readMaxKnownLength(parser, expectedLength, callback);
    }
  });
}

function readMaxKnownLength(parser, totalLength, callback) {
  const data = Buffer.alloc(totalLength, 0);
  let offset = 0;

  function next(done) {
    parser.readUInt32LE(chunkLength => {
      if (!chunkLength) {
        return done();
      }

      parser.readBuffer(chunkLength, chunk => {
        chunk.copy(data, offset);
        offset += chunkLength;
        next(done);
      });
    });
  }

  next(() => {
    if (offset !== totalLength) {
      throw new Error('Partially Length-prefixed Bytes unmatched lengths : expected ' + totalLength + ', but got ' + offset + ' bytes');
    }

    callback(data);
  });
}

function readMaxUnknownLength(parser, callback) {
  const chunks = [];
  let length = 0;

  function next(done) {
    parser.readUInt32LE(chunkLength => {
      if (!chunkLength) {
        return done();
      }

      parser.readBuffer(chunkLength, chunk => {
        chunks.push(chunk);
        length += chunkLength;
        next(done);
      });
    });
  }

  next(() => {
    callback(Buffer.concat(chunks, length));
  });
}

function readSmallDateTime(parser, useUTC, callback) {
  parser.readUInt16LE(days => {
    parser.readUInt16LE(minutes => {
      let value;

      if (useUTC) {
        value = new Date(Date.UTC(1900, 0, 1 + days, 0, minutes));
      } else {
        value = new Date(1900, 0, 1 + days, 0, minutes);
      }

      callback(value);
    });
  });
}

function readDateTime(parser, useUTC, callback) {
  parser.readInt32LE(days => {
    parser.readUInt32LE(threeHundredthsOfSecond => {
      const milliseconds = Math.round(threeHundredthsOfSecond * THREE_AND_A_THIRD);
      let value;

      if (useUTC) {
        value = new Date(Date.UTC(1900, 0, 1 + days, 0, 0, 0, milliseconds));
      } else {
        value = new Date(1900, 0, 1 + days, 0, 0, 0, milliseconds);
      }

      callback(value);
    });
  });
}

function readTime(parser, dataLength, scale, useUTC, callback) {
  let readValue;

  switch (dataLength) {
    case 3:
      readValue = parser.readUInt24LE;
      break;

    case 4:
      readValue = parser.readUInt32LE;
      break;

    case 5:
      readValue = parser.readUInt40LE;
  }

  readValue.call(parser, value => {
    if (scale < 7) {
      for (let i = scale; i < 7; i++) {
        value *= 10;
      }
    }

    let date;

    if (useUTC) {
      date = new Date(Date.UTC(1970, 0, 1, 0, 0, 0, value / 10000));
    } else {
      date = new Date(1970, 0, 1, 0, 0, 0, value / 10000);
    }

    Object.defineProperty(date, 'nanosecondsDelta', {
      enumerable: false,
      value: value % 10000 / Math.pow(10, 7)
    });
    callback(date);
  });
}

function readDate(parser, useUTC, callback) {
  parser.readUInt24LE(days => {
    if (useUTC) {
      callback(new Date(Date.UTC(2000, 0, days - 730118)));
    } else {
      callback(new Date(2000, 0, days - 730118));
    }
  });
}

function readDateTime2(parser, dataLength, scale, useUTC, callback) {
  readTime(parser, dataLength - 3, scale, useUTC, time => {
    // TODO: 'input' is 'time', but TypeScript cannot find "time.nanosecondsDelta";
    parser.readUInt24LE(days => {
      let date;

      if (useUTC) {
        date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
      } else {
        date = new Date(2000, 0, days - 730118, time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
      }

      Object.defineProperty(date, 'nanosecondsDelta', {
        enumerable: false,
        value: time.nanosecondsDelta
      });
      callback(date);
    });
  });
}

function readDateTimeOffset(parser, dataLength, scale, callback) {
  readTime(parser, dataLength - 5, scale, true, time => {
    parser.readUInt24LE(days => {
      // offset
      parser.readInt16LE(() => {
        const date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
        Object.defineProperty(date, 'nanosecondsDelta', {
          enumerable: false,
          value: time.nanosecondsDelta
        });
        callback(date);
      });
    });
  });
}

var _default = valueParse;
exports.default = _default;
module.exports = valueParse;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMIiwiTUFYIiwiVEhSRUVfQU5EX0FfVEhJUkQiLCJNT05FWV9ESVZJU09SIiwiUExQX05VTEwiLCJCdWZmZXIiLCJmcm9tIiwiVU5LTk9XTl9QTFBfTEVOIiwiREVGQVVMVF9FTkNPRElORyIsInJlYWRUaW55SW50IiwicGFyc2VyIiwiY2FsbGJhY2siLCJyZWFkVUludDgiLCJyZWFkU21hbGxJbnQiLCJyZWFkSW50MTZMRSIsInJlYWRJbnQiLCJyZWFkSW50MzJMRSIsInJlYWRCaWdJbnQiLCJyZWFkQmlnSW50NjRMRSIsInZhbHVlIiwidG9TdHJpbmciLCJyZWFkUmVhbCIsInJlYWRGbG9hdExFIiwicmVhZEZsb2F0IiwicmVhZERvdWJsZUxFIiwicmVhZFNtYWxsTW9uZXkiLCJyZWFkTW9uZXkiLCJoaWdoIiwicmVhZFVJbnQzMkxFIiwibG93IiwicmVhZEJpdCIsInZhbHVlUGFyc2UiLCJtZXRhZGF0YSIsIm9wdGlvbnMiLCJ0eXBlIiwibmFtZSIsImRhdGFMZW5ndGgiLCJFcnJvciIsImNvZGVwYWdlIiwiY29sbGF0aW9uIiwicmVhZE1heENoYXJzIiwicmVhZFVJbnQxNkxFIiwicmVhZENoYXJzIiwicmVhZE1heE5DaGFycyIsInJlYWROQ2hhcnMiLCJyZWFkTWF4QmluYXJ5IiwicmVhZEJpbmFyeSIsInRleHRQb2ludGVyTGVuZ3RoIiwicmVhZEJ1ZmZlciIsIl90ZXh0UG9pbnRlciIsIl90aW1lc3RhbXAiLCJyZWFkU21hbGxEYXRlVGltZSIsInVzZVVUQyIsInJlYWREYXRlVGltZSIsInJlYWRUaW1lIiwic2NhbGUiLCJyZWFkRGF0ZSIsInJlYWREYXRlVGltZTIiLCJyZWFkRGF0ZVRpbWVPZmZzZXQiLCJyZWFkTnVtZXJpYyIsInByZWNpc2lvbiIsInJlYWRVbmlxdWVJZGVudGlmaWVyIiwicmVhZFZhcmlhbnQiLCJkYXRhIiwibG93ZXJDYXNlR3VpZHMiLCJfcHJlY2lzaW9uIiwic2lnbiIsInJlYWRWYWx1ZSIsInJlYWRVTnVtZXJpYzY0TEUiLCJyZWFkVU51bWVyaWM5NkxFIiwicmVhZFVOdW1lcmljMTI4TEUiLCJjYWxsIiwiTWF0aCIsInBvdyIsImJhc2VUeXBlIiwiVFlQRSIsInByb3BCeXRlcyIsIl9tYXhMZW5ndGgiLCJfY29sbGF0aW9uIiwiaWNvbnYiLCJkZWNvZGUiLCJyZWFkTWF4IiwiZXF1YWxzIiwicmVhZE1heFVua25vd25MZW5ndGgiLCJjb25zb2xlIiwid2FybiIsImV4cGVjdGVkTGVuZ3RoIiwicmVhZE1heEtub3duTGVuZ3RoIiwidG90YWxMZW5ndGgiLCJhbGxvYyIsIm9mZnNldCIsIm5leHQiLCJkb25lIiwiY2h1bmtMZW5ndGgiLCJjaHVuayIsImNvcHkiLCJjaHVua3MiLCJsZW5ndGgiLCJwdXNoIiwiY29uY2F0IiwiZGF5cyIsIm1pbnV0ZXMiLCJEYXRlIiwiVVRDIiwidGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQiLCJtaWxsaXNlY29uZHMiLCJyb3VuZCIsInJlYWRVSW50MjRMRSIsInJlYWRVSW50NDBMRSIsImkiLCJkYXRlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwidGltZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJuYW5vc2Vjb25kc0RlbHRhIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy92YWx1ZS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlciwgeyBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi90b2tlbi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IE1ldGFkYXRhLCByZWFkQ29sbGF0aW9uIH0gZnJvbSAnLi9tZXRhZGF0YS1wYXJzZXInO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4vZGF0YS10eXBlJztcblxuaW1wb3J0IGljb252IGZyb20gJ2ljb252LWxpdGUnO1xuaW1wb3J0IHsgc3ByaW50ZiB9IGZyb20gJ3NwcmludGYtanMnO1xuaW1wb3J0IHsgYnVmZmVyVG9Mb3dlckNhc2VHdWlkLCBidWZmZXJUb1VwcGVyQ2FzZUd1aWQgfSBmcm9tICcuL2d1aWQtcGFyc2VyJztcblxuY29uc3QgTlVMTCA9ICgxIDw8IDE2KSAtIDE7XG5jb25zdCBNQVggPSAoMSA8PCAxNikgLSAxO1xuY29uc3QgVEhSRUVfQU5EX0FfVEhJUkQgPSAzICsgKDEgLyAzKTtcbmNvbnN0IE1PTkVZX0RJVklTT1IgPSAxMDAwMDtcbmNvbnN0IFBMUF9OVUxMID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZdKTtcbmNvbnN0IFVOS05PV05fUExQX0xFTiA9IEJ1ZmZlci5mcm9tKFsweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGXSk7XG5jb25zdCBERUZBVUxUX0VOQ09ESU5HID0gJ3V0ZjgnO1xuXG5mdW5jdGlvbiByZWFkVGlueUludChwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZFVJbnQ4KGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcmVhZFNtYWxsSW50KHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHBhcnNlci5yZWFkSW50MTZMRShjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQocGFyc2VyOiBQYXJzZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRJbnQzMkxFKGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcmVhZEJpZ0ludChwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZEJpZ0ludDY0TEUoKHZhbHVlKSA9PiB7XG4gICAgY2FsbGJhY2sodmFsdWUudG9TdHJpbmcoKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkUmVhbChwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZEZsb2F0TEUoY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvYXQocGFyc2VyOiBQYXJzZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWREb3VibGVMRShjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTbWFsbE1vbmV5KHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHBhcnNlci5yZWFkSW50MzJMRSgodmFsdWUpID0+IHtcbiAgICBjYWxsYmFjayh2YWx1ZSAvIE1PTkVZX0RJVklTT1IpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZE1vbmV5KHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHBhcnNlci5yZWFkSW50MzJMRSgoaGlnaCkgPT4ge1xuICAgIHBhcnNlci5yZWFkVUludDMyTEUoKGxvdykgPT4ge1xuICAgICAgY2FsbGJhY2soKGxvdyArICgweDEwMDAwMDAwMCAqIGhpZ2gpKSAvIE1PTkVZX0RJVklTT1IpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZEJpdChwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZFVJbnQ4KCh2YWx1ZSkgPT4ge1xuICAgIGNhbGxiYWNrKCEhdmFsdWUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsdWVQYXJzZShwYXJzZXI6IFBhcnNlciwgbWV0YWRhdGE6IE1ldGFkYXRhLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gIGNvbnN0IHR5cGUgPSBtZXRhZGF0YS50eXBlO1xuXG4gIHN3aXRjaCAodHlwZS5uYW1lKSB7XG4gICAgY2FzZSAnTnVsbCc6XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG5cbiAgICBjYXNlICdUaW55SW50JzpcbiAgICAgIHJldHVybiByZWFkVGlueUludChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ1NtYWxsSW50JzpcbiAgICAgIHJldHVybiByZWFkU21hbGxJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdCaWdJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRCaWdJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdJbnROJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiByZWFkVGlueUludChwYXJzZXIsIGNhbGxiYWNrKTtcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gcmVhZFNtYWxsSW50KHBhcnNlciwgY2FsbGJhY2spO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiByZWFkSW50KHBhcnNlciwgY2FsbGJhY2spO1xuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiByZWFkQmlnSW50KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIEludE4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjYXNlICdSZWFsJzpcbiAgICAgIHJldHVybiByZWFkUmVhbChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ0Zsb2F0JzpcbiAgICAgIHJldHVybiByZWFkRmxvYXQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdGbG9hdE4nOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRSZWFsKHBhcnNlciwgY2FsbGJhY2spO1xuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiByZWFkRmxvYXQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgRmxvYXROJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnU21hbGxNb25leSc6XG4gICAgICByZXR1cm4gcmVhZFNtYWxsTW9uZXkocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdNb25leSc6XG4gICAgICByZXR1cm4gcmVhZE1vbmV5KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgY2FzZSAnTW9uZXlOJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiByZWFkU21hbGxNb25leShwYXJzZXIsIGNhbGxiYWNrKTtcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICByZXR1cm4gcmVhZE1vbmV5KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIE1vbmV5TicpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ0JpdCc6XG4gICAgICByZXR1cm4gcmVhZEJpdChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ0JpdE4nOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRCaXQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgQml0TicpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ1ZhckNoYXInOlxuICAgIGNhc2UgJ0NoYXInOlxuICAgICAgY29uc3QgY29kZXBhZ2UgPSBtZXRhZGF0YS5jb2xsYXRpb24hLmNvZGVwYWdlITtcbiAgICAgIGlmIChtZXRhZGF0YS5kYXRhTGVuZ3RoID09PSBNQVgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRNYXhDaGFycyhwYXJzZXIsIGNvZGVwYWdlLCBjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50MTZMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVhZENoYXJzKHBhcnNlciwgZGF0YUxlbmd0aCEsIGNvZGVwYWdlLCBjYWxsYmFjayk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgY2FzZSAnTlZhckNoYXInOlxuICAgIGNhc2UgJ05DaGFyJzpcbiAgICAgIGlmIChtZXRhZGF0YS5kYXRhTGVuZ3RoID09PSBNQVgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRNYXhOQ2hhcnMocGFyc2VyLCBjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50MTZMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVhZE5DaGFycyhwYXJzZXIsIGRhdGFMZW5ndGghLCBjYWxsYmFjayk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgY2FzZSAnVmFyQmluYXJ5JzpcbiAgICBjYXNlICdCaW5hcnknOlxuICAgICAgaWYgKG1ldGFkYXRhLmRhdGFMZW5ndGggPT09IE1BWCkge1xuICAgICAgICByZXR1cm4gcmVhZE1heEJpbmFyeShwYXJzZXIsIGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQxNkxFKChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGFMZW5ndGggPT09IE5VTEwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZWFkQmluYXJ5KHBhcnNlciwgZGF0YUxlbmd0aCEsIGNhbGxiYWNrKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICBjYXNlICdUZXh0JzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KCh0ZXh0UG9pbnRlckxlbmd0aCkgPT4ge1xuICAgICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJzZXIucmVhZEJ1ZmZlcih0ZXh0UG9pbnRlckxlbmd0aCwgKF90ZXh0UG9pbnRlcikgPT4ge1xuICAgICAgICAgIHBhcnNlci5yZWFkQnVmZmVyKDgsIChfdGltZXN0YW1wKSA9PiB7XG4gICAgICAgICAgICBwYXJzZXIucmVhZFVJbnQzMkxFKChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICAgIHJlYWRDaGFycyhwYXJzZXIsIGRhdGFMZW5ndGghLCBtZXRhZGF0YS5jb2xsYXRpb24hLmNvZGVwYWdlISwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBjYXNlICdOVGV4dCc6XG4gICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50OCgodGV4dFBvaW50ZXJMZW5ndGgpID0+IHtcbiAgICAgICAgaWYgKHRleHRQb2ludGVyTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFyc2VyLnJlYWRCdWZmZXIodGV4dFBvaW50ZXJMZW5ndGgsIChfdGV4dFBvaW50ZXIpID0+IHtcbiAgICAgICAgICBwYXJzZXIucmVhZEJ1ZmZlcig4LCAoX3RpbWVzdGFtcCkgPT4ge1xuICAgICAgICAgICAgcGFyc2VyLnJlYWRVSW50MzJMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICAgICAgICByZWFkTkNoYXJzKHBhcnNlciwgZGF0YUxlbmd0aCEsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnSW1hZ2UnOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKHRleHRQb2ludGVyTGVuZ3RoKSA9PiB7XG4gICAgICAgIGlmICh0ZXh0UG9pbnRlckxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcnNlci5yZWFkQnVmZmVyKHRleHRQb2ludGVyTGVuZ3RoLCAoX3RleHRQb2ludGVyKSA9PiB7XG4gICAgICAgICAgcGFyc2VyLnJlYWRCdWZmZXIoOCwgKF90aW1lc3RhbXApID0+IHtcbiAgICAgICAgICAgIHBhcnNlci5yZWFkVUludDMyTEUoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgICAgICAgcmVhZEJpbmFyeShwYXJzZXIsIGRhdGFMZW5ndGghLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ1htbCc6XG4gICAgICByZXR1cm4gcmVhZE1heE5DaGFycyhwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbERhdGVUaW1lKHBhcnNlciwgb3B0aW9ucy51c2VVVEMsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUocGFyc2VyLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuXG4gICAgY2FzZSAnRGF0ZVRpbWVOJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiByZWFkU21hbGxEYXRlVGltZShwYXJzZXIsIG9wdGlvbnMudXNlVVRDLCBjYWxsYmFjayk7XG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgcmV0dXJuIHJlYWREYXRlVGltZShwYXJzZXIsIG9wdGlvbnMudXNlVVRDLCBjYWxsYmFjayk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgRGF0ZVRpbWVOJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnVGltZSc6XG4gICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50OCgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVhZFRpbWUocGFyc2VyLCBkYXRhTGVuZ3RoISwgbWV0YWRhdGEuc2NhbGUhLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWREYXRlKHBhcnNlciwgb3B0aW9ucy51c2VVVEMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjYXNlICdEYXRlVGltZTInOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWREYXRlVGltZTIocGFyc2VyLCBkYXRhTGVuZ3RoISwgbWV0YWRhdGEuc2NhbGUhLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0JzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZWFkRGF0ZVRpbWVPZmZzZXQocGFyc2VyLCBkYXRhTGVuZ3RoISwgbWV0YWRhdGEuc2NhbGUhLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnTnVtZXJpY04nOlxuICAgIGNhc2UgJ0RlY2ltYWxOJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZWFkTnVtZXJpYyhwYXJzZXIsIGRhdGFMZW5ndGghLCBtZXRhZGF0YS5wcmVjaXNpb24hLCBtZXRhZGF0YS5zY2FsZSEsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgIGNhc2UgMHgxMDpcbiAgICAgICAgICAgIHJldHVybiByZWFkVW5pcXVlSWRlbnRpZmllcihwYXJzZXIsIG9wdGlvbnMsIGNhbGxiYWNrKTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignVW5zdXBwb3J0ZWQgZ3VpZCBzaXplICVkJywgZGF0YUxlbmd0aCEgLSAxKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnVURUJzpcbiAgICAgIHJldHVybiByZWFkTWF4QmluYXJ5KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgY2FzZSAnVmFyaWFudCc6XG4gICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50MzJMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRWYXJpYW50KHBhcnNlciwgb3B0aW9ucywgZGF0YUxlbmd0aCEsIGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdVbnJlY29nbmlzZWQgdHlwZSAlcycsIHR5cGUubmFtZSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRVbmlxdWVJZGVudGlmaWVyKHBhcnNlcjogUGFyc2VyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHBhcnNlci5yZWFkQnVmZmVyKDB4MTAsIChkYXRhKSA9PiB7XG4gICAgY2FsbGJhY2sob3B0aW9ucy5sb3dlckNhc2VHdWlkcyA/IGJ1ZmZlclRvTG93ZXJDYXNlR3VpZChkYXRhKSA6IGJ1ZmZlclRvVXBwZXJDYXNlR3VpZChkYXRhKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkTnVtZXJpYyhwYXJzZXI6IFBhcnNlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBfcHJlY2lzaW9uOiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRVSW50OCgoc2lnbikgPT4ge1xuICAgIHNpZ24gPSBzaWduID09PSAxID8gMSA6IC0xO1xuXG4gICAgbGV0IHJlYWRWYWx1ZTtcbiAgICBpZiAoZGF0YUxlbmd0aCA9PT0gNSkge1xuICAgICAgcmVhZFZhbHVlID0gcGFyc2VyLnJlYWRVSW50MzJMRTtcbiAgICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPT09IDkpIHtcbiAgICAgIHJlYWRWYWx1ZSA9IHBhcnNlci5yZWFkVU51bWVyaWM2NExFO1xuICAgIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTMpIHtcbiAgICAgIHJlYWRWYWx1ZSA9IHBhcnNlci5yZWFkVU51bWVyaWM5NkxFO1xuICAgIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTcpIHtcbiAgICAgIHJlYWRWYWx1ZSA9IHBhcnNlci5yZWFkVU51bWVyaWMxMjhMRTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHNwcmludGYoJ1Vuc3VwcG9ydGVkIG51bWVyaWMgZGF0YUxlbmd0aCAlZCcsIGRhdGFMZW5ndGgpKTtcbiAgICB9XG5cbiAgICByZWFkVmFsdWUuY2FsbChwYXJzZXIsICh2YWx1ZSkgPT4ge1xuICAgICAgY2FsbGJhY2soKHZhbHVlICogc2lnbikgLyBNYXRoLnBvdygxMCwgc2NhbGUpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRWYXJpYW50KHBhcnNlcjogUGFyc2VyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBkYXRhTGVuZ3RoOiBudW1iZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGJhc2VUeXBlKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IFRZUEVbYmFzZVR5cGVdO1xuXG4gICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKHByb3BCeXRlcykgPT4ge1xuICAgICAgZGF0YUxlbmd0aCA9IGRhdGFMZW5ndGggLSBwcm9wQnl0ZXMgLSAyO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUubmFtZSkge1xuICAgICAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzpcbiAgICAgICAgICByZXR1cm4gcmVhZFVuaXF1ZUlkZW50aWZpZXIocGFyc2VyLCBvcHRpb25zLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnQml0JzpcbiAgICAgICAgICByZXR1cm4gcmVhZEJpdChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdUaW55SW50JzpcbiAgICAgICAgICByZXR1cm4gcmVhZFRpbnlJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnU21hbGxJbnQnOlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnSW50JzpcbiAgICAgICAgICByZXR1cm4gcmVhZEludChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdCaWdJbnQnOlxuICAgICAgICAgIHJldHVybiByZWFkQmlnSW50KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxEYXRlVGltZShwYXJzZXIsIG9wdGlvbnMudXNlVVRDLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUocGFyc2VyLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuXG4gICAgICAgIGNhc2UgJ1JlYWwnOlxuICAgICAgICAgIHJldHVybiByZWFkUmVhbChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdGbG9hdCc6XG4gICAgICAgICAgcmV0dXJuIHJlYWRGbG9hdChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdTbWFsbE1vbmV5JzpcbiAgICAgICAgICByZXR1cm4gcmVhZFNtYWxsTW9uZXkocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnTW9uZXknOlxuICAgICAgICAgIHJldHVybiByZWFkTW9uZXkocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIHJlYWREYXRlKHBhcnNlciwgb3B0aW9ucy51c2VVVEMsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50OCgoc2NhbGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWFkVGltZShwYXJzZXIsIGRhdGFMZW5ndGgsIHNjYWxlLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ0RhdGVUaW1lMic6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKHNjYWxlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZERhdGVUaW1lMihwYXJzZXIsIGRhdGFMZW5ndGgsIHNjYWxlLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0JzpcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50OCgoc2NhbGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWFkRGF0ZVRpbWVPZmZzZXQocGFyc2VyLCBkYXRhTGVuZ3RoLCBzY2FsZSwgY2FsbGJhY2spO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ1ZhckJpbmFyeSc6XG4gICAgICAgIGNhc2UgJ0JpbmFyeSc6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDE2TEUoKF9tYXhMZW5ndGgpID0+IHtcbiAgICAgICAgICAgIHJlYWRCaW5hcnkocGFyc2VyLCBkYXRhTGVuZ3RoLCBjYWxsYmFjayk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSAnTnVtZXJpY04nOlxuICAgICAgICBjYXNlICdEZWNpbWFsTic6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKHByZWNpc2lvbikgPT4ge1xuICAgICAgICAgICAgcGFyc2VyLnJlYWRVSW50OCgoc2NhbGUpID0+IHtcbiAgICAgICAgICAgICAgcmVhZE51bWVyaWMocGFyc2VyLCBkYXRhTGVuZ3RoLCBwcmVjaXNpb24sIHNjYWxlLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdWYXJDaGFyJzpcbiAgICAgICAgY2FzZSAnQ2hhcic6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDE2TEUoKF9tYXhMZW5ndGgpID0+IHtcbiAgICAgICAgICAgIHJlYWRDb2xsYXRpb24ocGFyc2VyLCAoY29sbGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIHJlYWRDaGFycyhwYXJzZXIsIGRhdGFMZW5ndGgsIGNvbGxhdGlvbi5jb2RlcGFnZSEsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ05WYXJDaGFyJzpcbiAgICAgICAgY2FzZSAnTkNoYXInOlxuICAgICAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQxNkxFKChfbWF4TGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICByZWFkQ29sbGF0aW9uKHBhcnNlciwgKF9jb2xsYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgcmVhZE5DaGFycyhwYXJzZXIsIGRhdGFMZW5ndGgsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHR5cGUhJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkQmluYXJ5KHBhcnNlcjogUGFyc2VyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcmV0dXJuIHBhcnNlci5yZWFkQnVmZmVyKGRhdGFMZW5ndGgsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcmVhZENoYXJzKHBhcnNlcjogUGFyc2VyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIGNvZGVwYWdlOiBzdHJpbmcsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgaWYgKGNvZGVwYWdlID09IG51bGwpIHtcbiAgICBjb2RlcGFnZSA9IERFRkFVTFRfRU5DT0RJTkc7XG4gIH1cblxuICByZXR1cm4gcGFyc2VyLnJlYWRCdWZmZXIoZGF0YUxlbmd0aCwgKGRhdGEpID0+IHtcbiAgICBjYWxsYmFjayhpY29udi5kZWNvZGUoZGF0YSwgY29kZXBhZ2UpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWROQ2hhcnMocGFyc2VyOiBQYXJzZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZEJ1ZmZlcihkYXRhTGVuZ3RoLCAoZGF0YSkgPT4ge1xuICAgIGNhbGxiYWNrKGRhdGEudG9TdHJpbmcoJ3VjczInKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkTWF4QmluYXJ5KHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHJldHVybiByZWFkTWF4KHBhcnNlciwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiByZWFkTWF4Q2hhcnMocGFyc2VyOiBQYXJzZXIsIGNvZGVwYWdlOiBzdHJpbmcsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgaWYgKGNvZGVwYWdlID09IG51bGwpIHtcbiAgICBjb2RlcGFnZSA9IERFRkFVTFRfRU5DT0RJTkc7XG4gIH1cblxuICByZWFkTWF4KHBhcnNlciwgKGRhdGEpID0+IHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgY2FsbGJhY2soaWNvbnYuZGVjb2RlKGRhdGEsIGNvZGVwYWdlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRNYXhOQ2hhcnMocGFyc2VyOiBQYXJzZXIsIGNhbGxiYWNrOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZvaWQpIHtcbiAgcmVhZE1heChwYXJzZXIsIChkYXRhKSA9PiB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGNhbGxiYWNrKGRhdGEudG9TdHJpbmcoJ3VjczInKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRNYXgocGFyc2VyOiBQYXJzZXIsIGNhbGxiYWNrOiAodmFsdWU6IG51bGwgfCBCdWZmZXIpID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRCdWZmZXIoOCwgKHR5cGUpID0+IHtcbiAgICBpZiAodHlwZS5lcXVhbHMoUExQX05VTEwpKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhVTktOT1dOX1BMUF9MRU4pKSB7XG4gICAgICByZXR1cm4gcmVhZE1heFVua25vd25MZW5ndGgocGFyc2VyLCBjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvdyA9IHR5cGUucmVhZFVJbnQzMkxFKDApO1xuICAgICAgY29uc3QgaGlnaCA9IHR5cGUucmVhZFVJbnQzMkxFKDQpO1xuXG4gICAgICBpZiAoaGlnaCA+PSAoMiA8PCAoNTMgLSAzMikpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignUmVhZCBVSW50NjRMRSA+IDUzIGJpdHMgOiBoaWdoPScgKyBoaWdoICsgJywgbG93PScgKyBsb3cpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHBlY3RlZExlbmd0aCA9IGxvdyArICgweDEwMDAwMDAwMCAqIGhpZ2gpO1xuICAgICAgcmV0dXJuIHJlYWRNYXhLbm93bkxlbmd0aChwYXJzZXIsIGV4cGVjdGVkTGVuZ3RoLCBjYWxsYmFjayk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZE1heEtub3duTGVuZ3RoKHBhcnNlcjogUGFyc2VyLCB0b3RhbExlbmd0aDogbnVtYmVyLCBjYWxsYmFjazogKHZhbHVlOiBudWxsIHwgQnVmZmVyKSA9PiB2b2lkKSB7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2ModG90YWxMZW5ndGgsIDApO1xuXG4gIGxldCBvZmZzZXQgPSAwO1xuICBmdW5jdGlvbiBuZXh0KGRvbmU6IGFueSkge1xuICAgIHBhcnNlci5yZWFkVUludDMyTEUoKGNodW5rTGVuZ3RoKSA9PiB7XG4gICAgICBpZiAoIWNodW5rTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICB9XG5cbiAgICAgIHBhcnNlci5yZWFkQnVmZmVyKGNodW5rTGVuZ3RoLCAoY2h1bmspID0+IHtcbiAgICAgICAgY2h1bmsuY29weShkYXRhLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gY2h1bmtMZW5ndGg7XG5cbiAgICAgICAgbmV4dChkb25lKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmV4dCgoKSA9PiB7XG4gICAgaWYgKG9mZnNldCAhPT0gdG90YWxMZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFydGlhbGx5IExlbmd0aC1wcmVmaXhlZCBCeXRlcyB1bm1hdGNoZWQgbGVuZ3RocyA6IGV4cGVjdGVkICcgKyB0b3RhbExlbmd0aCArICcsIGJ1dCBnb3QgJyArIG9mZnNldCArICcgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhkYXRhKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRNYXhVbmtub3duTGVuZ3RoKHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiBudWxsIHwgQnVmZmVyKSA9PiB2b2lkKSB7XG4gIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcblxuICBsZXQgbGVuZ3RoID0gMDtcbiAgZnVuY3Rpb24gbmV4dChkb25lOiBhbnkpIHtcbiAgICBwYXJzZXIucmVhZFVJbnQzMkxFKChjaHVua0xlbmd0aCkgPT4ge1xuICAgICAgaWYgKCFjaHVua0xlbmd0aCkge1xuICAgICAgICByZXR1cm4gZG9uZSgpO1xuICAgICAgfVxuXG4gICAgICBwYXJzZXIucmVhZEJ1ZmZlcihjaHVua0xlbmd0aCwgKGNodW5rKSA9PiB7XG4gICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgbGVuZ3RoICs9IGNodW5rTGVuZ3RoO1xuXG4gICAgICAgIG5leHQoZG9uZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5leHQoKCkgPT4ge1xuICAgIGNhbGxiYWNrKEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBsZW5ndGgpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTbWFsbERhdGVUaW1lKHBhcnNlcjogUGFyc2VyLCB1c2VVVEM6IGJvb2xlYW4sIGNhbGxiYWNrOiAodmFsdWU6IERhdGUpID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRVSW50MTZMRSgoZGF5cykgPT4ge1xuICAgIHBhcnNlci5yZWFkVUludDE2TEUoKG1pbnV0ZXMpID0+IHtcbiAgICAgIGxldCB2YWx1ZTtcbiAgICAgIGlmICh1c2VVVEMpIHtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZShEYXRlLlVUQygxOTAwLCAwLCAxICsgZGF5cywgMCwgbWludXRlcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSgxOTAwLCAwLCAxICsgZGF5cywgMCwgbWludXRlcyk7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayh2YWx1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWUocGFyc2VyOiBQYXJzZXIsIHVzZVVUQzogYm9vbGVhbiwgY2FsbGJhY2s6ICh2YWx1ZTogRGF0ZSkgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZEludDMyTEUoKGRheXMpID0+IHtcbiAgICBwYXJzZXIucmVhZFVJbnQzMkxFKCh0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCkgPT4ge1xuICAgICAgY29uc3QgbWlsbGlzZWNvbmRzID0gTWF0aC5yb3VuZCh0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCAqIFRIUkVFX0FORF9BX1RISVJEKTtcblxuICAgICAgbGV0IHZhbHVlO1xuICAgICAgaWYgKHVzZVVUQykge1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKERhdGUuVVRDKDE5MDAsIDAsIDEgKyBkYXlzLCAwLCAwLCAwLCBtaWxsaXNlY29uZHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUoMTkwMCwgMCwgMSArIGRheXMsIDAsIDAsIDAsIG1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrKHZhbHVlKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmludGVyZmFjZSBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGEgZXh0ZW5kcyBEYXRlIHtcbiAgbmFub3NlY29uZHNEZWx0YTogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiByZWFkVGltZShwYXJzZXI6IFBhcnNlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBzY2FsZTogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4sIGNhbGxiYWNrOiAodmFsdWU6IERhdGVXaXRoTmFub3NlY29uZHNEZWx0YSkgPT4gdm9pZCkge1xuICBsZXQgcmVhZFZhbHVlOiBhbnk7XG4gIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgIGNhc2UgMzpcbiAgICAgIHJlYWRWYWx1ZSA9IHBhcnNlci5yZWFkVUludDI0TEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICByZWFkVmFsdWUgPSBwYXJzZXIucmVhZFVJbnQzMkxFO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA1OlxuICAgICAgcmVhZFZhbHVlID0gcGFyc2VyLnJlYWRVSW50NDBMRTtcbiAgfVxuXG4gIHJlYWRWYWx1ZSEuY2FsbChwYXJzZXIsICh2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgaWYgKHNjYWxlIDwgNykge1xuICAgICAgZm9yIChsZXQgaSA9IHNjYWxlOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgIHZhbHVlICo9IDEwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkYXRlO1xuICAgIGlmICh1c2VVVEMpIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygxOTcwLCAwLCAxLCAwLCAwLCAwLCB2YWx1ZSAvIDEwMDAwKSkgYXMgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gbmV3IERhdGUoMTk3MCwgMCwgMSwgMCwgMCwgMCwgdmFsdWUgLyAxMDAwMCkgYXMgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgJ25hbm9zZWNvbmRzRGVsdGEnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiAodmFsdWUgJSAxMDAwMCkgLyBNYXRoLnBvdygxMCwgNylcbiAgICB9KTtcbiAgICBjYWxsYmFjayhkYXRlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWREYXRlKHBhcnNlcjogUGFyc2VyLCB1c2VVVEM6IGJvb2xlYW4sIGNhbGxiYWNrOiAodmFsdWU6IERhdGUpID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRVSW50MjRMRSgoZGF5cykgPT4ge1xuICAgIGlmICh1c2VVVEMpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBEYXRlKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWUyKHBhcnNlcjogUGFyc2VyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbiwgY2FsbGJhY2s6ICh2YWx1ZTogRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhKSA9PiB2b2lkKSB7XG4gIHJlYWRUaW1lKHBhcnNlciwgZGF0YUxlbmd0aCAtIDMsIHNjYWxlLCB1c2VVVEMsICh0aW1lKSA9PiB7IC8vIFRPRE86ICdpbnB1dCcgaXMgJ3RpbWUnLCBidXQgVHlwZVNjcmlwdCBjYW5ub3QgZmluZCBcInRpbWUubmFub3NlY29uZHNEZWx0YVwiO1xuICAgIHBhcnNlci5yZWFkVUludDI0TEUoKGRheXMpID0+IHtcbiAgICAgIGxldCBkYXRlO1xuICAgICAgaWYgKHVzZVVUQykge1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoMjAwMCwgMCwgZGF5cyAtIDczMDExOCwgMCwgMCwgMCwgK3RpbWUpKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoMjAwMCwgMCwgZGF5cyAtIDczMDExOCwgdGltZS5nZXRIb3VycygpLCB0aW1lLmdldE1pbnV0ZXMoKSwgdGltZS5nZXRTZWNvbmRzKCksIHRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkpIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCAnbmFub3NlY29uZHNEZWx0YScsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiB0aW1lLm5hbm9zZWNvbmRzRGVsdGFcbiAgICAgIH0pO1xuICAgICAgY2FsbGJhY2soZGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWVPZmZzZXQocGFyc2VyOiBQYXJzZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgc2NhbGU6IG51bWJlciwgY2FsbGJhY2s6ICh2YWx1ZTogRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhKSA9PiB2b2lkKSB7XG4gIHJlYWRUaW1lKHBhcnNlciwgZGF0YUxlbmd0aCAtIDUsIHNjYWxlLCB0cnVlLCAodGltZSkgPT4ge1xuICAgIHBhcnNlci5yZWFkVUludDI0TEUoKGRheXMpID0+IHtcbiAgICAgIC8vIG9mZnNldFxuICAgICAgcGFyc2VyLnJlYWRJbnQxNkxFKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgsIDAsIDAsIDAsICt0aW1lKSkgYXMgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgJ25hbm9zZWNvbmRzRGVsdGEnLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IHRpbWUubmFub3NlY29uZHNEZWx0YVxuICAgICAgICB9KTtcbiAgICAgICAgY2FsbGJhY2soZGF0ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbHVlUGFyc2U7XG5tb2R1bGUuZXhwb3J0cyA9IHZhbHVlUGFyc2U7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLElBQUksR0FBRyxDQUFDLEtBQUssRUFBTixJQUFZLENBQXpCO0FBQ0EsTUFBTUMsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFOLElBQVksQ0FBeEI7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxJQUFLLElBQUksQ0FBbkM7QUFDQSxNQUFNQyxh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