@openfisca/json-model
Version:
Library to handle informations extracted in JSON or YAML format from OpenFisca parameters, variables, etc
246 lines (239 loc) • 28.9 kB
JavaScript
export class Instant {
constructor(year, month = 1, day = 1) {
this.year = year;
this.month = month;
this.day = day;
}
get date() {
return new Date(this.toString());
}
static fromString(value) {
const [year, month, day] = value.split("-");
return new Instant(parseInt(year), month === undefined ? 1 : parseInt(month), day === undefined ? 1 : parseInt(day));
}
/// Shift the given instant from `offset` units.
offset(offset, unit) {
let {
year,
month,
day
} = this;
if (offset === "first-of") {
if (unit === "month") {
day = 1;
} else if (unit === "year") {
month = 1;
day = 1;
}
} else if (offset === "last-of") {
if (unit === "month") {
day = getMonthLastDay(year, month);
} else if (unit === "year") {
month = 12;
day = 31;
}
} else if (unit === "day") {
day += offset;
if (offset < 0) {
while (day < 1) {
month -= 1;
if (month === 0) {
year -= 1;
month = 12;
day += getMonthLastDay(year, month);
}
}
} else if (offset > 0) {
let monthLastDay = getMonthLastDay(year, month);
while (day > monthLastDay) {
month += 1;
if (month === 13) {
year += 1;
month = 1;
}
day -= monthLastDay;
monthLastDay = getMonthLastDay(year, month);
}
}
} else if (unit === "month") {
month += offset;
if (offset < 0) {
while (month < 1) {
year -= 1;
month += 12;
}
} else if (offset > 0) {
while (month > 12) {
year += 1;
month -= 12;
}
}
const monthLastDay = getMonthLastDay(year, month);
if (day > monthLastDay) {
day = monthLastDay;
}
} else if (unit === "year") {
year += offset;
// # Handle february month of leap year.
const monthLastDay = getMonthLastDay(year, month);
if (day > monthLastDay) {
day = monthLastDay;
}
}
return new Instant(year, month, day);
}
/// Create a new period starting at instant.
period(unit, size) {
return new Period(unit, this, size);
}
toString() {
return `${this.year.toString()}-${this.month.toString().padStart(2, "0")}-${this.day.toString().padStart(2, "0")}`;
}
}
export class Period {
constructor(unit, start, size = 1) {
this.unit = unit;
this.start = start;
this.size = size;
}
get days() {
return Math.round((this.stop.date.getTime() - this.start.date.getTime()) / (1000 * 60 * 60 * 24)) + 1;
}
get first_day() {
return this.start.period("day");
}
get first_month() {
return this.start.offset("first-of", "month").period("month");
}
static fromString(value) {
const match = value.match(periodRegExp);
const [,, unit, start, monthAndDaySuffix, daySuffix,, size] = match;
return new Period(unit === undefined ? monthAndDaySuffix === undefined ? "year" : daySuffix === undefined ? "month" : "day" : unit, Instant.fromString(start), size === undefined ? 1 : parseInt(size));
}
get last_3_months() {
return this.first_month.start.period("month", 3).offset(-3);
}
get last_month() {
return this.first_month.offset(-1);
}
get last_year() {
return this.start.offset("first-of", "year").period("year").offset(-1);
}
get n_2() {
return this.start.offset("first-of", "year").period("year").offset(-2);
}
/// Shift the given period from `offset` units.
offset(offset, unit) {
return new Period(this.unit, this.start.offset(offset, unit === undefined ? this.unit : unit), this.size);
}
get stop() {
const {
unit,
start,
size
} = this;
let {
year,
month,
day
} = start;
if (unit === "eternity") {
return new Instant(9999, 12, 31);
}
if (unit === "day") {
if (size > 1) {
day += size - 1;
let monthLastDay = getMonthLastDay(year, month);
while (day > monthLastDay) {
month += 1;
if (month === 13) {
year += 1;
month = 1;
}
day -= monthLastDay;
monthLastDay = getMonthLastDay(year, month);
}
}
} else {
if (unit === "month") {
month += size;
while (month > 12) {
year += 1;
month -= 12;
}
} else {
console.assert(unit === "year", `Invalid unit: "${unit}"`);
year += size;
}
day -= 1;
if (day < 1) {
month -= 1;
if (month === 0) {
year -= 1;
month = 12;
}
day += getMonthLastDay(year, month);
} else {
const monthLastDay = getMonthLastDay(year, month);
if (day > monthLastDay) {
month += 1;
if (month === 13) {
year += 1;
month = 1;
}
day -= monthLastDay;
}
}
}
return new Instant(year, month, day);
}
get this_year() {
return this.start.offset("first-of", "year").period("year");
}
toString() {
const {
unit,
start,
size
} = this;
if (unit === "eternity") {
return "ETERNITY";
}
const {
year,
month,
day
} = start;
// 1 year long period
if (unit === "month" && size === 12 || unit === "year" && size === 1) {
return month === 1 ?
// civil year starting from january
year.toString() :
// rolling year
`year:${year.toString()}-${month.toString().padStart(2, "0")}`;
}
// simple month
if (unit === "month" && size === 1) {
return `${year.toString()}-${month.toString().padStart(2, "0")}`;
}
// several civil years
if (unit === "year" && month === 1) {
return `${unit}:${year.toString()}:${size}`;
}
if (unit === "day") {
return size === 1 ? `${year.toString()}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}` : `${unit}:${year.toString()}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}:${size}`;
}
// complex monthly period
return `${unit}:${year.toString()}-${month.toString().padStart(2, "0")}:${size}`;
}
}
export const dateRegExp = /^(0001-01-01|[12]\d{3}-(0[1-9]|1[012])-(0[1-9]|[12]\d|3[01]))$/;
export const instantRegExp = /^(0001-01-01|[12]\d{3}(-(0[1-9]|1[012])(-(0[1-9]|[12]\d|3[01]))?)?)$/;
const periodRegExp = /^((day|month|year):)?(\d{4}(-\d{1,2}(-\d{1,2})?)?)(:(\d+))?$/;
function getMonthLastDay(year, month) {
return new Date(year, month /* - 1 + 1 */, 0).getDate();
}
export function sortValueByInstantDescending(valueByInstant) {
return Object.entries(valueByInstant).sort(([instant1], [instant2]) => instant2.localeCompare(instant1));
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnN0YW50IiwiY29uc3RydWN0b3IiLCJ5ZWFyIiwibW9udGgiLCJkYXkiLCJkYXRlIiwiRGF0ZSIsInRvU3RyaW5nIiwiZnJvbVN0cmluZyIsInZhbHVlIiwic3BsaXQiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsIm9mZnNldCIsInVuaXQiLCJnZXRNb250aExhc3REYXkiLCJtb250aExhc3REYXkiLCJwZXJpb2QiLCJzaXplIiwiUGVyaW9kIiwicGFkU3RhcnQiLCJzdGFydCIsImRheXMiLCJNYXRoIiwicm91bmQiLCJzdG9wIiwiZ2V0VGltZSIsImZpcnN0X2RheSIsImZpcnN0X21vbnRoIiwibWF0Y2giLCJwZXJpb2RSZWdFeHAiLCJtb250aEFuZERheVN1ZmZpeCIsImRheVN1ZmZpeCIsImxhc3RfM19tb250aHMiLCJsYXN0X21vbnRoIiwibGFzdF95ZWFyIiwibl8yIiwiY29uc29sZSIsImFzc2VydCIsInRoaXNfeWVhciIsImRhdGVSZWdFeHAiLCJpbnN0YW50UmVnRXhwIiwiZ2V0RGF0ZSIsInNvcnRWYWx1ZUJ5SW5zdGFudERlc2NlbmRpbmciLCJ2YWx1ZUJ5SW5zdGFudCIsIk9iamVjdCIsImVudHJpZXMiLCJzb3J0IiwiaW5zdGFudDEiLCJpbnN0YW50MiIsImxvY2FsZUNvbXBhcmUiXSwic291cmNlcyI6WyIuLi9zcmMvcGVyaW9kcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgSW5zdGFudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSB5ZWFyOiBudW1iZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IG1vbnRoOiBudW1iZXIgPSAxLFxuICAgIHB1YmxpYyByZWFkb25seSBkYXk6IG51bWJlciA9IDEsXG4gICkge31cblxuICBnZXQgZGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy50b1N0cmluZygpKVxuICB9XG5cbiAgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IEluc3RhbnQge1xuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHZhbHVlLnNwbGl0KFwiLVwiKVxuICAgIHJldHVybiBuZXcgSW5zdGFudChcbiAgICAgIHBhcnNlSW50KHllYXIpLFxuICAgICAgbW9udGggPT09IHVuZGVmaW5lZCA/IDEgOiBwYXJzZUludChtb250aCksXG4gICAgICBkYXkgPT09IHVuZGVmaW5lZCA/IDEgOiBwYXJzZUludChkYXkpLFxuICAgIClcbiAgfVxuXG4gIC8vLyBTaGlmdCB0aGUgZ2l2ZW4gaW5zdGFudCBmcm9tIGBvZmZzZXRgIHVuaXRzLlxuICBvZmZzZXQob2Zmc2V0OiBcImZpcnN0LW9mXCIgfCBcImxhc3Qtb2ZcIiB8IG51bWJlciwgdW5pdDogUGVyaW9kVW5pdCk6IEluc3RhbnQge1xuICAgIGxldCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IHRoaXNcbiAgICBpZiAob2Zmc2V0ID09PSBcImZpcnN0LW9mXCIpIHtcbiAgICAgIGlmICh1bml0ID09PSBcIm1vbnRoXCIpIHtcbiAgICAgICAgZGF5ID0gMVxuICAgICAgfSBlbHNlIGlmICh1bml0ID09PSBcInllYXJcIikge1xuICAgICAgICBtb250aCA9IDFcbiAgICAgICAgZGF5ID0gMVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09PSBcImxhc3Qtb2ZcIikge1xuICAgICAgaWYgKHVuaXQgPT09IFwibW9udGhcIikge1xuICAgICAgICBkYXkgPSBnZXRNb250aExhc3REYXkoeWVhciwgbW9udGgpXG4gICAgICB9IGVsc2UgaWYgKHVuaXQgPT09IFwieWVhclwiKSB7XG4gICAgICAgIG1vbnRoID0gMTJcbiAgICAgICAgZGF5ID0gMzFcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHVuaXQgPT09IFwiZGF5XCIpIHtcbiAgICAgIGRheSArPSBvZmZzZXRcbiAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgIHdoaWxlIChkYXkgPCAxKSB7XG4gICAgICAgICAgbW9udGggLT0gMVxuICAgICAgICAgIGlmIChtb250aCA9PT0gMCkge1xuICAgICAgICAgICAgeWVhciAtPSAxXG4gICAgICAgICAgICBtb250aCA9IDEyXG4gICAgICAgICAgICBkYXkgKz0gZ2V0TW9udGhMYXN0RGF5KHllYXIsIG1vbnRoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICAgIGxldCBtb250aExhc3REYXkgPSBnZXRNb250aExhc3REYXkoeWVhciwgbW9udGgpXG4gICAgICAgIHdoaWxlIChkYXkgPiBtb250aExhc3REYXkpIHtcbiAgICAgICAgICBtb250aCArPSAxXG4gICAgICAgICAgaWYgKG1vbnRoID09PSAxMykge1xuICAgICAgICAgICAgeWVhciArPSAxXG4gICAgICAgICAgICBtb250aCA9IDFcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF5IC09IG1vbnRoTGFzdERheVxuICAgICAgICAgIG1vbnRoTGFzdERheSA9IGdldE1vbnRoTGFzdERheSh5ZWFyLCBtb250aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gXCJtb250aFwiKSB7XG4gICAgICBtb250aCArPSBvZmZzZXRcbiAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgIHdoaWxlIChtb250aCA8IDEpIHtcbiAgICAgICAgICB5ZWFyIC09IDFcbiAgICAgICAgICBtb250aCArPSAxMlxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgd2hpbGUgKG1vbnRoID4gMTIpIHtcbiAgICAgICAgICB5ZWFyICs9IDFcbiAgICAgICAgICBtb250aCAtPSAxMlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBtb250aExhc3REYXkgPSBnZXRNb250aExhc3REYXkoeWVhciwgbW9udGgpXG4gICAgICBpZiAoZGF5ID4gbW9udGhMYXN0RGF5KSB7XG4gICAgICAgIGRheSA9IG1vbnRoTGFzdERheVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gXCJ5ZWFyXCIpIHtcbiAgICAgIHllYXIgKz0gb2Zmc2V0XG4gICAgICAvLyAjIEhhbmRsZSBmZWJydWFyeSBtb250aCBvZiBsZWFwIHllYXIuXG4gICAgICBjb25zdCBtb250aExhc3REYXkgPSBnZXRNb250aExhc3REYXkoeWVhciwgbW9udGgpXG4gICAgICBpZiAoZGF5ID4gbW9udGhMYXN0RGF5KSB7XG4gICAgICAgIGRheSA9IG1vbnRoTGFzdERheVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEluc3RhbnQoeWVhciwgbW9udGgsIGRheSlcbiAgfVxuXG4gIC8vLyBDcmVhdGUgYSBuZXcgcGVyaW9kIHN0YXJ0aW5nIGF0IGluc3RhbnQuXG4gIHBlcmlvZCh1bml0OiBQZXJpb2RVbml0LCBzaXplPzogbnVtYmVyKTogUGVyaW9kIHtcbiAgICByZXR1cm4gbmV3IFBlcmlvZCh1bml0LCB0aGlzLCBzaXplKVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy55ZWFyLnRvU3RyaW5nKCl9LSR7dGhpcy5tb250aFxuICAgICAgLnRvU3RyaW5nKClcbiAgICAgIC5wYWRTdGFydCgyLCBcIjBcIil9LSR7dGhpcy5kYXkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9YFxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQZXJpb2Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgdW5pdDogUGVyaW9kVW5pdCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnQ6IEluc3RhbnQsXG4gICAgcHVibGljIHJlYWRvbmx5IHNpemU6IG51bWJlciA9IDEsXG4gICkge31cblxuICBnZXQgZGF5cygpOiBudW1iZXIge1xuICAgIHJldHVybiAoXG4gICAgICBNYXRoLnJvdW5kKFxuICAgICAgICAodGhpcy5zdG9wLmRhdGUuZ2V0VGltZSgpIC0gdGhpcy5zdGFydC5kYXRlLmdldFRpbWUoKSkgL1xuICAgICAgICAgICgxMDAwICogNjAgKiA2MCAqIDI0KSxcbiAgICAgICkgKyAxXG4gICAgKVxuICB9XG5cbiAgZ2V0IGZpcnN0X2RheSgpOiBQZXJpb2Qge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0LnBlcmlvZChcImRheVwiKVxuICB9XG5cbiAgZ2V0IGZpcnN0X21vbnRoKCk6IFBlcmlvZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnQub2Zmc2V0KFwiZmlyc3Qtb2ZcIiwgXCJtb250aFwiKS5wZXJpb2QoXCJtb250aFwiKVxuICB9XG5cbiAgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFBlcmlvZCB7XG4gICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5tYXRjaChwZXJpb2RSZWdFeHApIVxuICAgIGNvbnN0IFssICwgdW5pdCwgc3RhcnQsIG1vbnRoQW5kRGF5U3VmZml4LCBkYXlTdWZmaXgsICwgc2l6ZV0gPSBtYXRjaFxuICAgIHJldHVybiBuZXcgUGVyaW9kKFxuICAgICAgdW5pdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbW9udGhBbmREYXlTdWZmaXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gXCJ5ZWFyXCJcbiAgICAgICAgICA6IGRheVN1ZmZpeCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IFwibW9udGhcIlxuICAgICAgICAgICAgOiBcImRheVwiXG4gICAgICAgIDogKHVuaXQgYXMgUGVyaW9kVW5pdCksXG4gICAgICBJbnN0YW50LmZyb21TdHJpbmcoc3RhcnQpLFxuICAgICAgc2l6ZSA9PT0gdW5kZWZpbmVkID8gMSA6IHBhcnNlSW50KHNpemUpLFxuICAgIClcbiAgfVxuXG4gIGdldCBsYXN0XzNfbW9udGhzKCk6IFBlcmlvZCB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RfbW9udGguc3RhcnQucGVyaW9kKFwibW9udGhcIiwgMykub2Zmc2V0KC0zKVxuICB9XG5cbiAgZ2V0IGxhc3RfbW9udGgoKTogUGVyaW9kIHtcbiAgICByZXR1cm4gdGhpcy5maXJzdF9tb250aC5vZmZzZXQoLTEpXG4gIH1cblxuICBnZXQgbGFzdF95ZWFyKCk6IFBlcmlvZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnQub2Zmc2V0KFwiZmlyc3Qtb2ZcIiwgXCJ5ZWFyXCIpLnBlcmlvZChcInllYXJcIikub2Zmc2V0KC0xKVxuICB9XG5cbiAgZ2V0IG5fMigpOiBQZXJpb2Qge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0Lm9mZnNldChcImZpcnN0LW9mXCIsIFwieWVhclwiKS5wZXJpb2QoXCJ5ZWFyXCIpLm9mZnNldCgtMilcbiAgfVxuXG4gIC8vLyBTaGlmdCB0aGUgZ2l2ZW4gcGVyaW9kIGZyb20gYG9mZnNldGAgdW5pdHMuXG4gIG9mZnNldChvZmZzZXQ6IFwiZmlyc3Qtb2ZcIiB8IFwibGFzdC1vZlwiIHwgbnVtYmVyLCB1bml0PzogUGVyaW9kVW5pdCk6IFBlcmlvZCB7XG4gICAgcmV0dXJuIG5ldyBQZXJpb2QoXG4gICAgICB0aGlzLnVuaXQsXG4gICAgICB0aGlzLnN0YXJ0Lm9mZnNldChvZmZzZXQsIHVuaXQgPT09IHVuZGVmaW5lZCA/IHRoaXMudW5pdCA6IHVuaXQpLFxuICAgICAgdGhpcy5zaXplLFxuICAgIClcbiAgfVxuXG4gIGdldCBzdG9wKCk6IEluc3RhbnQge1xuICAgIGNvbnN0IHsgdW5pdCwgc3RhcnQsIHNpemUgfSA9IHRoaXNcbiAgICBsZXQgeyB5ZWFyLCBtb250aCwgZGF5IH0gPSBzdGFydFxuXG4gICAgaWYgKHVuaXQgPT09IFwiZXRlcm5pdHlcIikge1xuICAgICAgcmV0dXJuIG5ldyBJbnN0YW50KDk5OTksIDEyLCAzMSlcbiAgICB9XG4gICAgaWYgKHVuaXQgPT09IFwiZGF5XCIpIHtcbiAgICAgIGlmIChzaXplID4gMSkge1xuICAgICAgICBkYXkgKz0gc2l6ZSAtIDFcbiAgICAgICAgbGV0IG1vbnRoTGFzdERheSA9IGdldE1vbnRoTGFzdERheSh5ZWFyLCBtb250aClcbiAgICAgICAgd2hpbGUgKGRheSA+IG1vbnRoTGFzdERheSkge1xuICAgICAgICAgIG1vbnRoICs9IDFcbiAgICAgICAgICBpZiAobW9udGggPT09IDEzKSB7XG4gICAgICAgICAgICB5ZWFyICs9IDFcbiAgICAgICAgICAgIG1vbnRoID0gMVxuICAgICAgICAgIH1cbiAgICAgICAgICBkYXkgLT0gbW9udGhMYXN0RGF5XG4gICAgICAgICAgbW9udGhMYXN0RGF5ID0gZ2V0TW9udGhMYXN0RGF5KHllYXIsIG1vbnRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1bml0ID09PSBcIm1vbnRoXCIpIHtcbiAgICAgICAgbW9udGggKz0gc2l6ZVxuICAgICAgICB3aGlsZSAobW9udGggPiAxMikge1xuICAgICAgICAgIHllYXIgKz0gMVxuICAgICAgICAgIG1vbnRoIC09IDEyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuYXNzZXJ0KHVuaXQgPT09IFwieWVhclwiLCBgSW52YWxpZCB1bml0OiBcIiR7dW5pdH1cImApXG4gICAgICAgIHllYXIgKz0gc2l6ZVxuICAgICAgfVxuICAgICAgZGF5IC09IDFcbiAgICAgIGlmIChkYXkgPCAxKSB7XG4gICAgICAgIG1vbnRoIC09IDFcbiAgICAgICAgaWYgKG1vbnRoID09PSAwKSB7XG4gICAgICAgICAgeWVhciAtPSAxXG4gICAgICAgICAgbW9udGggPSAxMlxuICAgICAgICB9XG4gICAgICAgIGRheSArPSBnZXRNb250aExhc3REYXkoeWVhciwgbW9udGgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtb250aExhc3REYXkgPSBnZXRNb250aExhc3REYXkoeWVhciwgbW9udGgpXG4gICAgICAgIGlmIChkYXkgPiBtb250aExhc3REYXkpIHtcbiAgICAgICAgICBtb250aCArPSAxXG4gICAgICAgICAgaWYgKG1vbnRoID09PSAxMykge1xuICAgICAgICAgICAgeWVhciArPSAxXG4gICAgICAgICAgICBtb250aCA9IDFcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF5IC09IG1vbnRoTGFzdERheVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW5zdGFudCh5ZWFyLCBtb250aCwgZGF5KVxuICB9XG5cbiAgZ2V0IHRoaXNfeWVhcigpOiBQZXJpb2Qge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0Lm9mZnNldChcImZpcnN0LW9mXCIsIFwieWVhclwiKS5wZXJpb2QoXCJ5ZWFyXCIpXG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgdW5pdCwgc3RhcnQsIHNpemUgfSA9IHRoaXNcbiAgICBpZiAodW5pdCA9PT0gXCJldGVybml0eVwiKSB7XG4gICAgICByZXR1cm4gXCJFVEVSTklUWVwiXG4gICAgfVxuICAgIGNvbnN0IHsgeWVhciwgbW9udGgsIGRheSB9ID0gc3RhcnRcblxuICAgIC8vIDEgeWVhciBsb25nIHBlcmlvZFxuICAgIGlmICgodW5pdCA9PT0gXCJtb250aFwiICYmIHNpemUgPT09IDEyKSB8fCAodW5pdCA9PT0gXCJ5ZWFyXCIgJiYgc2l6ZSA9PT0gMSkpIHtcbiAgICAgIHJldHVybiBtb250aCA9PT0gMVxuICAgICAgICA/IC8vICBjaXZpbCB5ZWFyIHN0YXJ0aW5nIGZyb20gamFudWFyeVxuICAgICAgICAgIHllYXIudG9TdHJpbmcoKVxuICAgICAgICA6IC8vIHJvbGxpbmcgeWVhclxuICAgICAgICAgIGB5ZWFyOiR7eWVhci50b1N0cmluZygpfS0ke21vbnRoLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfWBcbiAgICB9XG5cbiAgICAvLyBzaW1wbGUgbW9udGhcbiAgICBpZiAodW5pdCA9PT0gXCJtb250aFwiICYmIHNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBgJHt5ZWFyLnRvU3RyaW5nKCl9LSR7bW9udGgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9YFxuICAgIH1cblxuICAgIC8vIHNldmVyYWwgY2l2aWwgeWVhcnNcbiAgICBpZiAodW5pdCA9PT0gXCJ5ZWFyXCIgJiYgbW9udGggPT09IDEpIHtcbiAgICAgIHJldHVybiBgJHt1bml0fToke3llYXIudG9TdHJpbmcoKX06JHtzaXplfWBcbiAgICB9XG5cbiAgICBpZiAodW5pdCA9PT0gXCJkYXlcIikge1xuICAgICAgcmV0dXJuIHNpemUgPT09IDFcbiAgICAgICAgPyBgJHt5ZWFyLnRvU3RyaW5nKCl9LSR7bW9udGgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LSR7ZGF5XG4gICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgLnBhZFN0YXJ0KDIsIFwiMFwiKX1gXG4gICAgICAgIDogYCR7dW5pdH06JHt5ZWFyLnRvU3RyaW5nKCl9LSR7bW9udGgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LSR7ZGF5XG4gICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgLnBhZFN0YXJ0KDIsIFwiMFwiKX06JHtzaXplfWBcbiAgICB9XG5cbiAgICAvLyBjb21wbGV4IG1vbnRobHkgcGVyaW9kXG4gICAgcmV0dXJuIGAke3VuaXR9OiR7eWVhci50b1N0cmluZygpfS0ke21vbnRoXG4gICAgICAudG9TdHJpbmcoKVxuICAgICAgLnBhZFN0YXJ0KDIsIFwiMFwiKX06JHtzaXplfWBcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBQZXJpb2RVbml0ID0gXCJkYXlcIiB8IFwiZXRlcm5pdHlcIiB8IFwibW9udGhcIiB8IFwieWVhclwiXG5cbmV4cG9ydCBjb25zdCBkYXRlUmVnRXhwID1cbiAgL14oMDAwMS0wMS0wMXxbMTJdXFxkezN9LSgwWzEtOV18MVswMTJdKS0oMFsxLTldfFsxMl1cXGR8M1swMV0pKSQvXG5leHBvcnQgY29uc3QgaW5zdGFudFJlZ0V4cCA9XG4gIC9eKDAwMDEtMDEtMDF8WzEyXVxcZHszfSgtKDBbMS05XXwxWzAxMl0pKC0oMFsxLTldfFsxMl1cXGR8M1swMV0pKT8pPykkL1xuY29uc3QgcGVyaW9kUmVnRXhwID1cbiAgL14oKGRheXxtb250aHx5ZWFyKTopPyhcXGR7NH0oLVxcZHsxLDJ9KC1cXGR7MSwyfSk/KT8pKDooXFxkKykpPyQvXG5cbmZ1bmN0aW9uIGdldE1vbnRoTGFzdERheSh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLyogLSAxICsgMSAqLywgMCkuZ2V0RGF0ZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0VmFsdWVCeUluc3RhbnREZXNjZW5kaW5nPFQ+KHZhbHVlQnlJbnN0YW50OiB7XG4gIFtpbnN0YW50OiBzdHJpbmddOiBUXG59KTogW3N0cmluZywgVF1bXSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh2YWx1ZUJ5SW5zdGFudCkuc29ydCgoW2luc3RhbnQxXSwgW2luc3RhbnQyXSkgPT5cbiAgICBpbnN0YW50Mi5sb2NhbGVDb21wYXJlKGluc3RhbnQxKSxcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU1BLE9BQU8sQ0FBQztFQUNuQkMsV0FBV0EsQ0FDT0MsSUFBWSxFQUNaQyxLQUFhLEdBQUcsQ0FBQyxFQUNqQkMsR0FBVyxHQUFHLENBQUMsRUFDL0I7SUFBQSxLQUhnQkYsSUFBWSxHQUFaQSxJQUFZO0lBQUEsS0FDWkMsS0FBYSxHQUFiQSxLQUFhO0lBQUEsS0FDYkMsR0FBVyxHQUFYQSxHQUFXO0VBQzFCO0VBRUgsSUFBSUMsSUFBSUEsQ0FBQSxFQUFHO0lBQ1QsT0FBTyxJQUFJQyxJQUFJLENBQUMsSUFBSSxDQUFDQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0VBQ2xDO0VBRUEsT0FBT0MsVUFBVUEsQ0FBQ0MsS0FBYSxFQUFXO0lBQ3hDLE1BQU0sQ0FBQ1AsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLEdBQUcsQ0FBQyxHQUFHSyxLQUFLLENBQUNDLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDM0MsT0FBTyxJQUFJVixPQUFPLENBQ2hCVyxRQUFRLENBQUNULElBQUksQ0FBQyxFQUNkQyxLQUFLLEtBQUtTLFNBQVMsR0FBRyxDQUFDLEdBQUdELFFBQVEsQ0FBQ1IsS0FBSyxDQUFDLEVBQ3pDQyxHQUFHLEtBQUtRLFNBQVMsR0FBRyxDQUFDLEdBQUdELFFBQVEsQ0FBQ1AsR0FBRyxDQUN0QyxDQUFDO0VBQ0g7O0VBRUE7RUFDQVMsTUFBTUEsQ0FBQ0EsTUFBdUMsRUFBRUMsSUFBZ0IsRUFBVztJQUN6RSxJQUFJO01BQUVaLElBQUk7TUFBRUMsS0FBSztNQUFFQztJQUFJLENBQUMsR0FBRyxJQUFJO0lBQy9CLElBQUlTLE1BQU0sS0FBSyxVQUFVLEVBQUU7TUFDekIsSUFBSUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtRQUNwQlYsR0FBRyxHQUFHLENBQUM7TUFDVCxDQUFDLE1BQU0sSUFBSVUsSUFBSSxLQUFLLE1BQU0sRUFBRTtRQUMxQlgsS0FBSyxHQUFHLENBQUM7UUFDVEMsR0FBRyxHQUFHLENBQUM7TUFDVDtJQUNGLENBQUMsTUFBTSxJQUFJUyxNQUFNLEtBQUssU0FBUyxFQUFFO01BQy9CLElBQUlDLElBQUksS0FBSyxPQUFPLEVBQUU7UUFDcEJWLEdBQUcsR0FBR1csZUFBZSxDQUFDYixJQUFJLEVBQUVDLEtBQUssQ0FBQztNQUNwQyxDQUFDLE1BQU0sSUFBSVcsSUFBSSxLQUFLLE1BQU0sRUFBRTtRQUMxQlgsS0FBSyxHQUFHLEVBQUU7UUFDVkMsR0FBRyxHQUFHLEVBQUU7TUFDVjtJQUNGLENBQUMsTUFBTSxJQUFJVSxJQUFJLEtBQUssS0FBSyxFQUFFO01BQ3pCVixHQUFHLElBQUlTLE1BQU07TUFDYixJQUFJQSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ2QsT0FBT1QsR0FBRyxHQUFHLENBQUMsRUFBRTtVQUNkRCxLQUFLLElBQUksQ0FBQztVQUNWLElBQUlBLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDZkQsSUFBSSxJQUFJLENBQUM7WUFDVEMsS0FBSyxHQUFHLEVBQUU7WUFDVkMsR0FBRyxJQUFJVyxlQUFlLENBQUNiLElBQUksRUFBRUMsS0FBSyxDQUFDO1VBQ3JDO1FBQ0Y7TUFDRixDQUFDLE1BQU0sSUFBSVUsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNyQixJQUFJRyxZQUFZLEdBQUdELGVBQWUsQ0FBQ2IsSUFBSSxFQUFFQyxLQUFLLENBQUM7UUFDL0MsT0FBT0MsR0FBRyxHQUFHWSxZQUFZLEVBQUU7VUFDekJiLEtBQUssSUFBSSxDQUFDO1VBQ1YsSUFBSUEsS0FBSyxLQUFLLEVBQUUsRUFBRTtZQUNoQkQsSUFBSSxJQUFJLENBQUM7WUFDVEMsS0FBSyxHQUFHLENBQUM7VUFDWDtVQUNBQyxHQUFHLElBQUlZLFlBQVk7VUFDbkJBLFlBQVksR0FBR0QsZUFBZSxDQUFDYixJQUFJLEVBQUVDLEtBQUssQ0FBQztRQUM3QztNQUNGO0lBQ0YsQ0FBQyxNQUFNLElBQUlXLElBQUksS0FBSyxPQUFPLEVBQUU7TUFDM0JYLEtBQUssSUFBSVUsTUFBTTtNQUNmLElBQUlBLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDZCxPQUFPVixLQUFLLEdBQUcsQ0FBQyxFQUFFO1VBQ2hCRCxJQUFJLElBQUksQ0FBQztVQUNUQyxLQUFLLElBQUksRUFBRTtRQUNiO01BQ0YsQ0FBQyxNQUFNLElBQUlVLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDckIsT0FBT1YsS0FBSyxHQUFHLEVBQUUsRUFBRTtVQUNqQkQsSUFBSSxJQUFJLENBQUM7VUFDVEMsS0FBSyxJQUFJLEVBQUU7UUFDYjtNQUNGO01BQ0EsTUFBTWEsWUFBWSxHQUFHRCxlQUFlLENBQUNiLElBQUksRUFBRUMsS0FBSyxDQUFDO01BQ2pELElBQUlDLEdBQUcsR0FBR1ksWUFBWSxFQUFFO1FBQ3RCWixHQUFHLEdBQUdZLFlBQVk7TUFDcEI7SUFDRixDQUFDLE1BQU0sSUFBSUYsSUFBSSxLQUFLLE1BQU0sRUFBRTtNQUMxQlosSUFBSSxJQUFJVyxNQUFNO01BQ2Q7TUFDQSxNQUFNRyxZQUFZLEdBQUdELGVBQWUsQ0FBQ2IsSUFBSSxFQUFFQyxLQUFLLENBQUM7TUFDakQsSUFBSUMsR0FBRyxHQUFHWSxZQUFZLEVBQUU7UUFDdEJaLEdBQUcsR0FBR1ksWUFBWTtNQUNwQjtJQUNGO0lBQ0EsT0FBTyxJQUFJaEIsT0FBTyxDQUFDRSxJQUFJLEVBQUVDLEtBQUssRUFBRUMsR0FBRyxDQUFDO0VBQ3RDOztFQUVBO0VBQ0FhLE1BQU1BLENBQUNILElBQWdCLEVBQUVJLElBQWEsRUFBVTtJQUM5QyxPQUFPLElBQUlDLE1BQU0sQ0FBQ0wsSUFBSSxFQUFFLElBQUksRUFBRUksSUFBSSxDQUFDO0VBQ3JDO0VBRUFYLFFBQVFBLENBQUEsRUFBVztJQUNqQixPQUFPLEdBQUcsSUFBSSxDQUFDTCxJQUFJLENBQUNLLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDSixLQUFLLENBQ3pDSSxRQUFRLENBQUMsQ0FBQyxDQUNWYSxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQ2hCLEdBQUcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQ2EsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtFQUMvRDtBQUNGO0FBRUEsT0FBTyxNQUFNRCxNQUFNLENBQUM7RUFDbEJsQixXQUFXQSxDQUNPYSxJQUFnQixFQUNoQk8sS0FBYyxFQUNkSCxJQUFZLEdBQUcsQ0FBQyxFQUNoQztJQUFBLEtBSGdCSixJQUFnQixHQUFoQkEsSUFBZ0I7SUFBQSxLQUNoQk8sS0FBYyxHQUFkQSxLQUFjO0lBQUEsS0FDZEgsSUFBWSxHQUFaQSxJQUFZO0VBQzNCO0VBRUgsSUFBSUksSUFBSUEsQ0FBQSxFQUFXO0lBQ2pCLE9BQ0VDLElBQUksQ0FBQ0MsS0FBSyxDQUNSLENBQUMsSUFBSSxDQUFDQyxJQUFJLENBQUNwQixJQUFJLENBQUNxQixPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQ0wsS0FBSyxDQUFDaEIsSUFBSSxDQUFDcUIsT0FBTyxDQUFDLENBQUMsS0FDbEQsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUN4QixDQUFDLEdBQUcsQ0FBQztFQUVUO0VBRUEsSUFBSUMsU0FBU0EsQ0FBQSxFQUFXO0lBQ3RCLE9BQU8sSUFBSSxDQUFDTixLQUFLLENBQUNKLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDakM7RUFFQSxJQUFJVyxXQUFXQSxDQUFBLEVBQVc7SUFDeEIsT0FBTyxJQUFJLENBQUNQLEtBQUssQ0FBQ1IsTUFBTSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQztFQUMvRDtFQUVBLE9BQU9ULFVBQVVBLENBQUNDLEtBQWEsRUFBVTtJQUN2QyxNQUFNb0IsS0FBSyxHQUFHcEIsS0FBSyxDQUFDb0IsS0FBSyxDQUFDQyxZQUFZLENBQUU7SUFDeEMsTUFBTSxJQUFLaEIsSUFBSSxFQUFFTyxLQUFLLEVBQUVVLGlCQUFpQixFQUFFQyxTQUFTLEdBQUlkLElBQUksQ0FBQyxHQUFHVyxLQUFLO0lBQ3JFLE9BQU8sSUFBSVYsTUFBTSxDQUNmTCxJQUFJLEtBQUtGLFNBQVMsR0FDZG1CLGlCQUFpQixLQUFLbkIsU0FBUyxHQUM3QixNQUFNLEdBQ05vQixTQUFTLEtBQUtwQixTQUFTLEdBQ3JCLE9BQU8sR0FDUCxLQUFLLEdBQ1JFLElBQW1CLEVBQ3hCZCxPQUFPLENBQUNRLFVBQVUsQ0FBQ2EsS0FBSyxDQUFDLEVBQ3pCSCxJQUFJLEtBQUtOLFNBQVMsR0FBRyxDQUFDLEdBQUdELFFBQVEsQ0FBQ08sSUFBSSxDQUN4QyxDQUFDO0VBQ0g7RUFFQSxJQUFJZSxhQUFhQSxDQUFBLEVBQVc7SUFDMUIsT0FBTyxJQUFJLENBQUNMLFdBQVcsQ0FBQ1AsS0FBSyxDQUFDSixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDSixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDN0Q7RUFFQSxJQUFJcUIsVUFBVUEsQ0FBQSxFQUFXO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDTixXQUFXLENBQUNmLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQztFQUVBLElBQUlzQixTQUFTQSxDQUFBLEVBQVc7SUFDdEIsT0FBTyxJQUFJLENBQUNkLEtBQUssQ0FBQ1IsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDSixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDeEU7RUFFQSxJQUFJdUIsR0FBR0EsQ0FBQSxFQUFXO0lBQ2hCLE9BQU8sSUFBSSxDQUFDZixLQUFLLENBQUNSLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQ0osTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3hFOztFQUVBO0VBQ0FBLE1BQU1BLENBQUNBLE1BQXVDLEVBQUVDLElBQWlCLEVBQVU7SUFDekUsT0FBTyxJQUFJSyxNQUFNLENBQ2YsSUFBSSxDQUFDTCxJQUFJLEVBQ1QsSUFBSSxDQUFDTyxLQUFLLENBQUNSLE1BQU0sQ0FBQ0EsTUFBTSxFQUFFQyxJQUFJLEtBQUtGLFNBQVMsR0FBRyxJQUFJLENBQUNFLElBQUksR0FBR0EsSUFBSSxDQUFDLEVBQ2hFLElBQUksQ0FBQ0ksSUFDUCxDQUFDO0VBQ0g7RUFFQSxJQUFJTyxJQUFJQSxDQUFBLEVBQVk7SUFDbEIsTUFBTTtNQUFFWCxJQUFJO01BQUVPLEtBQUs7TUFBRUg7SUFBSyxDQUFDLEdBQUcsSUFBSTtJQUNsQyxJQUFJO01BQUVoQixJQUFJO01BQUVDLEtBQUs7TUFBRUM7SUFBSSxDQUFDLEdBQUdpQixLQUFLO0lBRWhDLElBQUlQLElBQUksS0FBSyxVQUFVLEVBQUU7TUFDdkIsT0FBTyxJQUFJZCxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDbEM7SUFDQSxJQUFJYyxJQUFJLEtBQUssS0FBSyxFQUFFO01BQ2xCLElBQUlJLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDWmQsR0FBRyxJQUFJYyxJQUFJLEdBQUcsQ0FBQztRQUNmLElBQUlGLFlBQVksR0FBR0QsZUFBZSxDQUFDYixJQUFJLEVBQUVDLEtBQUssQ0FBQztRQUMvQyxPQUFPQyxHQUFHLEdBQUdZLFlBQVksRUFBRTtVQUN6QmIsS0FBSyxJQUFJLENBQUM7VUFDVixJQUFJQSxLQUFLLEtBQUssRUFBRSxFQUFFO1lBQ2hCRCxJQUFJLElBQUksQ0FBQztZQUNUQyxLQUFLLEdBQUcsQ0FBQztVQUNYO1VBQ0FDLEdBQUcsSUFBSVksWUFBWTtVQUNuQkEsWUFBWSxHQUFHRCxlQUFlLENBQUNiLElBQUksRUFBRUMsS0FBSyxDQUFDO1FBQzdDO01BQ0Y7SUFDRixDQUFDLE1BQU07TUFDTCxJQUFJVyxJQUFJLEtBQUssT0FBTyxFQUFFO1FBQ3BCWCxLQUFLLElBQUllLElBQUk7UUFDYixPQUFPZixLQUFLLEdBQUcsRUFBRSxFQUFFO1VBQ2pCRCxJQUFJLElBQUksQ0FBQztVQUNUQyxLQUFLLElBQUksRUFBRTtRQUNiO01BQ0YsQ0FBQyxNQUFNO1FBQ0xrQyxPQUFPLENBQUNDLE1BQU0sQ0FBQ3hCLElBQUksS0FBSyxNQUFNLEVBQUUsa0JBQWtCQSxJQUFJLEdBQUcsQ0FBQztRQUMxRFosSUFBSSxJQUFJZ0IsSUFBSTtNQUNkO01BQ0FkLEdBQUcsSUFBSSxDQUFDO01BQ1IsSUFBSUEsR0FBRyxHQUFHLENBQUMsRUFBRTtRQUNYRCxLQUFLLElBQUksQ0FBQztRQUNWLElBQUlBLEtBQUssS0FBSyxDQUFDLEVBQUU7VUFDZkQsSUFBSSxJQUFJLENBQUM7VUFDVEMsS0FBSyxHQUFHLEVBQUU7UUFDWjtRQUNBQyxHQUFHLElBQUlXLGVBQWUsQ0FBQ2IsSUFBSSxFQUFFQyxLQUFLLENBQUM7TUFDckMsQ0FBQyxNQUFNO1FBQ0wsTUFBTWEsWUFBWSxHQUFHRCxlQUFlLENBQUNiLElBQUksRUFBRUMsS0FBSyxDQUFDO1FBQ2pELElBQUlDLEdBQUcsR0FBR1ksWUFBWSxFQUFFO1VBQ3RCYixLQUFLLElBQUksQ0FBQztVQUNWLElBQUlBLEtBQUssS0FBSyxFQUFFLEVBQUU7WUFDaEJELElBQUksSUFBSSxDQUFDO1lBQ1RDLEtBQUssR0FBRyxDQUFDO1VBQ1g7VUFDQUMsR0FBRyxJQUFJWSxZQUFZO1FBQ3JCO01BQ0Y7SUFDRjtJQUNBLE9BQU8sSUFBSWhCLE9BQU8sQ0FBQ0UsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLEdBQUcsQ0FBQztFQUN0QztFQUVBLElBQUltQyxTQUFTQSxDQUFBLEVBQVc7SUFDdEIsT0FBTyxJQUFJLENBQUNsQixLQUFLLENBQUNSLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUM7RUFDN0Q7RUFFQVYsUUFBUUEsQ0FBQSxFQUFXO0lBQ2pCLE1BQU07TUFBRU8sSUFBSTtNQUFFTyxLQUFLO01BQUVIO0lBQUssQ0FBQyxHQUFHLElBQUk7SUFDbEMsSUFBSUosSUFBSSxLQUFLLFVBQVUsRUFBRTtNQUN2QixPQUFPLFVBQVU7SUFDbkI7SUFDQSxNQUFNO01BQUVaLElBQUk7TUFBRUMsS0FBSztNQUFFQztJQUFJLENBQUMsR0FBR2lCLEtBQUs7O0lBRWxDO0lBQ0EsSUFBS1AsSUFBSSxLQUFLLE9BQU8sSUFBSUksSUFBSSxLQUFLLEVBQUUsSUFBTUosSUFBSSxLQUFLLE1BQU0sSUFBSUksSUFBSSxLQUFLLENBQUUsRUFBRTtNQUN4RSxPQUFPZixLQUFLLEtBQUssQ0FBQztNQUNkO01BQ0FELElBQUksQ0FBQ0ssUUFBUSxDQUFDLENBQUM7TUFDZjtNQUNBLFFBQVFMLElBQUksQ0FBQ0ssUUFBUSxDQUFDLENBQUMsSUFBSUosS0FBSyxDQUFDSSxRQUFRLENBQUMsQ0FBQyxDQUFDYSxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO0lBQ3BFOztJQUVBO0lBQ0EsSUFBSU4sSUFBSSxLQUFLLE9BQU8sSUFBSUksSUFBSSxLQUFLLENBQUMsRUFBRTtNQUNsQyxPQUFPLEdBQUdoQixJQUFJLENBQUNLLFFBQVEsQ0FBQyxDQUFDLElBQUlKLEtBQUssQ0FBQ0ksUUFBUSxDQUFDLENBQUMsQ0FBQ2EsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtJQUNsRTs7SUFFQTtJQUNBLElBQUlOLElBQUksS0FBSyxNQUFNLElBQUlYLEtBQUssS0FBSyxDQUFDLEVBQUU7TUFDbEMsT0FBTyxHQUFHVyxJQUFJLElBQUlaLElBQUksQ0FBQ0ssUUFBUSxDQUFDLENBQUMsSUFBSVcsSUFBSSxFQUFFO0lBQzdDO0lBRUEsSUFBSUosSUFBSSxLQUFLLEtBQUssRUFBRTtNQUNsQixPQUFPSSxJQUFJLEtBQUssQ0FBQyxHQUNiLEdBQUdoQixJQUFJLENBQUNLLFFBQVEsQ0FBQyxDQUFDLElBQUlKLEtBQUssQ0FBQ0ksUUFBUSxDQUFDLENBQUMsQ0FBQ2EsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSWhCLEdBQUcsQ0FDM0RHLFFBQVEsQ0FBQyxDQUFDLENBQ1ZhLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FDckIsR0FBR04sSUFBSSxJQUFJWixJQUFJLENBQUNLLFFBQVEsQ0FBQyxDQUFDLElBQUlKLEtBQUssQ0FBQ0ksUUFBUSxDQUFDLENBQUMsQ0FBQ2EsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSWhCLEdBQUcsQ0FDbkVHLFFBQVEsQ0FBQyxDQUFDLENBQ1ZhLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUlGLElBQUksRUFBRTtJQUNuQzs7SUFFQTtJQUNBLE9BQU8sR0FBR0osSUFBSSxJQUFJWixJQUFJLENBQUNLLFFBQVEsQ0FBQyxDQUFDLElBQUlKLEtBQUssQ0FDdkNJLFFBQVEsQ0FBQyxDQUFDLENBQ1ZhLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUlGLElBQUksRUFBRTtFQUMvQjtBQUNGO0FBSUEsT0FBTyxNQUFNc0IsVUFBVSxHQUNyQixnRUFBZ0U7QUFDbEUsT0FBTyxNQUFNQyxhQUFhLEdBQ3hCLHNFQUFzRTtBQUN4RSxNQUFNWCxZQUFZLEdBQ2hCLDhEQUE4RDtBQUVoRSxTQUFTZixlQUFlQSxDQUFDYixJQUFZLEVBQUVDLEtBQWEsRUFBVTtFQUM1RCxPQUFPLElBQUlHLElBQUksQ0FBQ0osSUFBSSxFQUFFQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQ3VDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pEO0FBRUEsT0FBTyxTQUFTQyw0QkFBNEJBLENBQUlDLGNBRS9DLEVBQWlCO0VBQ2hCLE9BQU9DLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDRixjQUFjLENBQUMsQ0FBQ0csSUFBSSxDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLEVBQUUsQ0FBQ0MsUUFBUSxDQUFDLEtBQ2hFQSxRQUFRLENBQUNDLGFBQWEsQ0FBQ0YsUUFBUSxDQUNqQyxDQUFDO0FBQ0giLCJpZ25vcmVMaXN0IjpbXX0=