@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
598 lines (594 loc) • 68.8 kB
JavaScript
// To parse this data:
//
// import { Convert, Scrutins, ScrutinWrapper } from "./file";
//
// const scrutins = Convert.toScrutins(json);
// const scrutinWrapper = Convert.toScrutinWrapper(json);
//
// These functions will throw an error if the JSON doesn't
// match the expected interface, even if the JSON is valid.
export let ModePublicationDesVotes = /*#__PURE__*/function (ModePublicationDesVotes) {
ModePublicationDesVotes["DecompteDissidentsPositionGroupe"] = "DecompteDissidentsPositionGroupe";
ModePublicationDesVotes["DecompteNominatif"] = "DecompteNominatif";
return ModePublicationDesVotes;
}({});
export let Code = /*#__PURE__*/function (Code) {
Code["Adopt\xE9"] = "adopt\xE9";
Code["Rejet\xE9"] = "rejet\xE9";
return Code;
}({});
export let Libelle = /*#__PURE__*/function (Libelle) {
Libelle["LAssembl\xE9eNationaleAAdopt\xE9"] = "l'Assembl\xE9e nationale a adopt\xE9";
Libelle["LAssembl\xE9eNationaleNAPasAdopt\xE9"] = "L'Assembl\xE9e nationale n'a pas adopt\xE9";
Libelle["LeCongr\xE8sDuParlementAAdopt\xE9"] = "Le Congr\xE8s du Parlement a adopt\xE9";
Libelle["LeCongr\xE8sDuParlementNAPasAdopt\xE9"] = "Le Congr\xE8s du Parlement n'a pas adopt\xE9";
return Libelle;
}({});
export let CodeTypeVote = /*#__PURE__*/function (CodeTypeVote) {
CodeTypeVote["Moc"] = "MOC";
CodeTypeVote["Sat"] = "SAT";
CodeTypeVote["Spo"] = "SPO";
CodeTypeVote["Sps"] = "SPS";
CodeTypeVote["Ssg"] = "SSG";
return CodeTypeVote;
}({});
export let LibelleTypeVote = /*#__PURE__*/function (LibelleTypeVote) {
LibelleTypeVote["MotionDeCensure"] = "motion de censure";
LibelleTypeVote["ScrutinPublicOrdinaire"] = "scrutin public ordinaire";
LibelleTypeVote["ScrutinPublicSolennel"] = "scrutin public solennel";
LibelleTypeVote["Scrutin\xC0LaTribune"] = "scrutin \xE0 la tribune";
LibelleTypeVote["ScrutinSolennelCongr\xE8s"] = "Scrutin solennel congr\xE8s";
return LibelleTypeVote;
}({});
export let TypeMajorite = /*#__PURE__*/function (TypeMajorite) {
TypeMajorite["Majorit\xE9AbsolueDesSuffragesExprim\xE9s"] = "Majorit\xE9 absolue des suffrages exprim\xE9s";
TypeMajorite["majorit\xE9AbsolueDesSuffragesExprim\xE9s"] = "majorit\xE9 absolue des suffrages exprim\xE9s";
TypeMajorite["majorit\xE9DesMembresComposantLAssembl\xE9eNationale"] = "majorit\xE9 des membres composant l'Assembl\xE9e nationale";
TypeMajorite["majorit\xE9DesMembresComposantsComposantLAssembl\xE9e"] = "majorit\xE9 des membres composants composant l'Assembl\xE9e";
TypeMajorite["majorit\xE9DesMembresComposantsComposantLAssembl\xE9eNationale"] = "majorit\xE9 des membres composants composant l'Assembl\xE9e nationale";
TypeMajorite["Majorit\xE9RequisePourUnCongr\xE8s"] = "Majorit\xE9 requise pour un Congr\xE8s";
TypeMajorite["Majorit\xE9RequisePourUneMotionDeCensure"] = "Majorit\xE9 requise pour une motion de censure";
return TypeMajorite;
}({});
export let CausePositionVote = /*#__PURE__*/function (CausePositionVote) {
CausePositionVote["Mg"] = "MG";
CausePositionVote["Pan"] = "PAN";
CausePositionVote["Pse"] = "PSE";
return CausePositionVote;
}({});
export let PositionMajoritaire = /*#__PURE__*/function (PositionMajoritaire) {
PositionMajoritaire["Abstention"] = "abstention";
PositionMajoritaire["Contre"] = "contre";
PositionMajoritaire["Pour"] = "pour";
return PositionMajoritaire;
}({});
export let LieuVote = /*#__PURE__*/function (LieuVote) {
LieuVote["Congr\xE8s"] = "Congr\xE8s";
LieuVote["H\xE9micycle"] = "H\xE9micycle";
LieuVote["Salons"] = "Salons";
return LieuVote;
}({});
// Converts JSON strings to/from your types
// and asserts the results of JSON.parse at runtime
export class Convert {
static toScrutins(json) {
return cast(JSON.parse(json), r("Scrutins"));
}
static scrutinsToJson(value) {
return JSON.stringify(uncast(value, r("Scrutins")), null, 2);
}
static toScrutinWrapper(json) {
return cast(JSON.parse(json), r("ScrutinWrapper"));
}
static scrutinWrapperToJson(value) {
return JSON.stringify(uncast(value, r("ScrutinWrapper")), null, 2);
}
}
function invalidValue(typ, val, key = '') {
if (key) {
throw Error(`Invalid value for key "${key}". Expected type ${JSON.stringify(typ)} but got ${JSON.stringify(val)}`);
}
throw Error(`Invalid value ${JSON.stringify(val)} for type ${JSON.stringify(typ)}`);
}
function jsonToJSProps(typ) {
if (typ.jsonToJS === undefined) {
const map = {};
typ.props.forEach(p => map[p.json] = {
key: p.js,
typ: p.typ
});
typ.jsonToJS = map;
}
return typ.jsonToJS;
}
function jsToJSONProps(typ) {
if (typ.jsToJSON === undefined) {
const map = {};
typ.props.forEach(p => map[p.js] = {
key: p.json,
typ: p.typ
});
typ.jsToJSON = map;
}
return typ.jsToJSON;
}
function transform(val, typ, getProps, key = '') {
function transformPrimitive(typ, val) {
if (typeof typ === typeof val) return val;
return invalidValue(typ, val, key);
}
function transformUnion(typs, val) {
// val must validate against one typ in typs
const l = typs.length;
for (let i = 0; i < l; i++) {
const typ = typs[i];
try {
return transform(val, typ, getProps);
} catch (_) {}
}
return invalidValue(typs, val);
}
function transformEnum(cases, val) {
if (cases.indexOf(val) !== -1) return val;
return invalidValue(cases, val);
}
function transformArray(typ, val) {
// val must be an array with no invalid elements
if (!Array.isArray(val)) return invalidValue("array", val);
return val.map(el => transform(el, typ, getProps));
}
function transformDate(val) {
if (val === null) {
return null;
}
const d = new Date(val);
if (isNaN(d.valueOf())) {
return invalidValue("Date", val);
}
return d;
}
function transformObject(props, additional, val) {
if (val === null || typeof val !== "object" || Array.isArray(val)) {
return invalidValue("object", val);
}
const result = {};
Object.getOwnPropertyNames(props).forEach(key => {
const prop = props[key];
const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
result[prop.key] = transform(v, prop.typ, getProps, prop.key);
});
Object.getOwnPropertyNames(val).forEach(key => {
if (!Object.prototype.hasOwnProperty.call(props, key)) {
result[key] = transform(val[key], additional, getProps, key);
}
});
return result;
}
if (typ === "any") return val;
if (typ === null) {
if (val === null) return val;
return invalidValue(typ, val);
}
if (typ === false) return invalidValue(typ, val);
while (typeof typ === "object" && typ.ref !== undefined) {
typ = typeMap[typ.ref];
}
if (Array.isArray(typ)) return transformEnum(typ, val);
if (typeof typ === "object") {
return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val) : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val) : invalidValue(typ, val);
}
// Numbers can be parsed by Date but shouldn't be.
if (typ === Date && typeof val !== "number") return transformDate(val);
return transformPrimitive(typ, val);
}
function cast(val, typ) {
return transform(val, typ, jsonToJSProps);
}
function uncast(val, typ) {
return transform(val, typ, jsToJSONProps);
}
function a(typ) {
return {
arrayItems: typ
};
}
function u(...typs) {
return {
unionMembers: typs
};
}
function o(props, additional) {
return {
props,
additional
};
}
// function m(additional: any) {
// return { props: [], additional };
// }
function r(name) {
return {
ref: name
};
}
const typeMap = {
"Scrutins": o([{
json: "scrutins",
js: "scrutins",
typ: r("ScrutinsClass")
}], false),
"ScrutinsClass": o([{
json: "scrutin",
js: "scrutin",
typ: a(r("Scrutin"))
}], false),
"ScrutinWrapper": o([{
json: "scrutin",
js: "scrutin",
typ: r("Scrutin")
}], false),
"Scrutin": o([{
json: "@xmlns:xsi",
js: "@xmlns:xsi",
typ: ""
}, {
json: "uid",
js: "uid",
typ: ""
}, {
json: "numero",
js: "numero",
typ: ""
}, {
json: "organeRef",
js: "organeRef",
typ: ""
}, {
json: "legislature",
js: "legislature",
typ: ""
}, {
json: "sessionRef",
js: "sessionRef",
typ: ""
}, {
json: "seanceRef",
js: "seanceRef",
typ: ""
}, {
json: "dateScrutin",
js: "dateScrutin",
typ: Date
}, {
json: "quantiemeJourSeance",
js: "quantiemeJourSeance",
typ: ""
}, {
json: "typeVote",
js: "typeVote",
typ: r("TypeVote")
}, {
json: "sort",
js: "sort",
typ: r("Sort")
}, {
json: "titre",
js: "titre",
typ: ""
}, {
json: "demandeur",
js: "demandeur",
typ: r("Demandeur")
}, {
json: "objet",
js: "objet",
typ: r("Objet")
}, {
json: "modePublicationDesVotes",
js: "modePublicationDesVotes",
typ: r("ModePublicationDesVotes")
}, {
json: "syntheseVote",
js: "syntheseVote",
typ: r("SyntheseVote")
}, {
json: "ventilationVotes",
js: "ventilationVotes",
typ: r("VentilationVotes")
}, {
json: "miseAuPoint",
js: "miseAuPoint",
typ: u(r("MiseAuPoint"), null)
}, {
json: "lieuVote",
js: "lieuVote",
typ: u(undefined, r("LieuVote"))
}, {
json: "@xmlns",
js: "@xmlns",
typ: u(undefined, "")
}], false),
"Demandeur": o([{
json: "texte",
js: "texte",
typ: u(null, "")
}, {
json: "referenceLegislative",
js: "referenceLegislative",
typ: null
}], false),
"MiseAuPoint": o([{
json: "nonVotants",
js: "nonVotants",
typ: u(a(u(r("VotantsClass"), null)), null)
}, {
json: "pour",
js: "pour",
typ: u(undefined, u(r("VotantsClass"), null))
}, {
json: "contre",
js: "contre",
typ: u(undefined, u(r("VotantsClass"), null))
}, {
json: "abstentions",
js: "abstentions",
typ: u(a(u(r("VotantsClass"), null)), r("VotantsClass"), null)
}, {
json: "nonVotantsVolontaires",
js: "nonVotantsVolontaires",
typ: u(a(u(r("VotantsClass"), null)), r("VotantsClass"), null)
}, {
json: "pours",
js: "pours",
typ: u(undefined, u(r("VotantsClass"), null))
}, {
json: "contres",
js: "contres",
typ: u(undefined, u(r("VotantsClass"), null))
}, {
json: "dysfonctionnement",
js: "dysfonctionnement",
typ: u(undefined, r("Dysfonctionnement"))
}], false),
"Dysfonctionnement": o([{
json: "nonVotants",
js: "nonVotants",
typ: u(r("VotantsClass"), null)
}, {
json: "pour",
js: "pour",
typ: u(r("VotantsClass"), null)
}, {
json: "contre",
js: "contre",
typ: u(r("VotantsClass"), null)
}, {
json: "abstentions",
js: "abstentions",
typ: u(r("VotantsClass"), null)
}, {
json: "nonVotantsVolontaires",
js: "nonVotantsVolontaires",
typ: u(r("VotantsClass"), null)
}], false),
"Objet": o([{
json: "libelle",
js: "libelle",
typ: ""
}, {
json: "referenceLegislative",
js: "referenceLegislative",
typ: null
}, {
json: "dossierLegislatif",
js: "dossierLegislatif",
typ: u(undefined, null)
}], false),
"Sort": o([{
json: "code",
js: "code",
typ: r("Code")
}, {
json: "libelle",
js: "libelle",
typ: r("Libelle")
}], false),
"SyntheseVote": o([{
json: "nombreVotants",
js: "nombreVotants",
typ: ""
}, {
json: "suffragesExprimes",
js: "suffragesExprimes",
typ: ""
}, {
json: "nbrSuffragesRequis",
js: "nbrSuffragesRequis",
typ: ""
}, {
json: "annonce",
js: "annonce",
typ: r("Libelle")
}, {
json: "decompte",
js: "decompte",
typ: r("Decompte")
}], false),
"Decompte": o([{
json: "pour",
js: "pour",
typ: ""
}, {
json: "contre",
js: "contre",
typ: ""
}, {
json: "abstentions",
js: "abstentions",
typ: ""
}, {
json: "nonVotants",
js: "nonVotants",
typ: ""
}, {
json: "nonVotantsVolontaires",
js: "nonVotantsVolontaires",
typ: u(undefined, "")
}], false),
"TypeVote": o([{
json: "codeTypeVote",
js: "codeTypeVote",
typ: r("CodeTypeVote")
}, {
json: "libelleTypeVote",
js: "libelleTypeVote",
typ: r("LibelleTypeVote")
}, {
json: "typeMajorite",
js: "typeMajorite",
typ: r("TypeMajorite")
}], false),
"VentilationVotes": o([{
json: "organe",
js: "organe",
typ: r("Organe")
}], false),
"Organe": o([{
json: "organeRef",
js: "organeRef",
typ: ""
}, {
json: "groupes",
js: "groupes",
typ: r("Groupes")
}], false),
"Groupes": o([{
json: "groupe",
js: "groupe",
typ: a(r("Groupe"))
}], false),
"Groupe": o([{
json: "organeRef",
js: "organeRef",
typ: ""
}, {
json: "nombreMembresGroupe",
js: "nombreMembresGroupe",
typ: ""
}, {
json: "vote",
js: "vote",
typ: r("Vote")
}], false),
"Vote": o([{
json: "positionMajoritaire",
js: "positionMajoritaire",
typ: r("PositionMajoritaire")
}, {
json: "decompteVoix",
js: "decompteVoix",
typ: r("DecompteVoix")
}, {
json: "decompteNominatif",
js: "decompteNominatif",
typ: r("DecompteNominatif")
}], false),
"DecompteNominatif": o([{
json: "nonVotant",
js: "nonVotant",
typ: u(undefined, null)
}, {
json: "nonVotants",
js: "nonVotants",
typ: u(undefined, u(r("VotantsClass"), null, ""))
}, {
json: "pour",
js: "pour",
typ: u(undefined, u(r("VotantsClass"), null))
}, {
json: "contre",
js: "contre",
typ: u(undefined, u(r("VotantsClass"), null))
}, {
json: "abstention",
js: "abstention",
typ: u(undefined, u(r("VotantsClass"), null))
}, {
json: "abstentions",
js: "abstentions",
typ: u(undefined, u(r("VotantsClass"), null))
}, {
json: "pours",
js: "pours",
typ: u(undefined, u(r("VotantsClass"), null))
}, {
json: "contres",
js: "contres",
typ: u(undefined, u(r("VotantsClass"), null))
}], false),
"VotantsClass": o([{
json: "votant",
js: "votant",
typ: u(a(r("Votant")), r("Votant"))
}], false),
"Votant": o([{
json: "acteurRef",
js: "acteurRef",
typ: ""
}, {
json: "mandatRef",
js: "mandatRef",
typ: ""
}, {
json: "parDelegation",
js: "parDelegation",
typ: u(undefined, "")
}, {
json: "numPlace",
js: "numPlace",
typ: u(undefined, u("", null))
}, {
json: "causePositionVote",
js: "causePositionVote",
typ: u(undefined, r("CausePositionVote"))
}], false),
"DecompteVoix": o([{
json: "pour",
js: "pour",
typ: ""
}, {
json: "contre",
js: "contre",
typ: ""
}, {
json: "abstention",
js: "abstention",
typ: u(undefined, "")
}, {
json: "nonVotant",
js: "nonVotant",
typ: u(undefined, u("", null))
}, {
json: "nonVotants",
js: "nonVotants",
typ: u(undefined, "")
}, {
json: "abstentions",
js: "abstentions",
typ: u(undefined, "")
}, {
json: "nonVotantsVolontaires",
js: "nonVotantsVolontaires",
typ: u(undefined, "")
}], false),
"ModePublicationDesVotes": ["DecompteDissidentsPositionGroupe", "DecompteNominatif"],
"Code": ["adopté", "rejeté"],
"Libelle": ["l'Assemblée nationale a adopté", "L'Assemblée nationale n'a pas adopté", "Le Congrès du Parlement a adopté", "Le Congrès du Parlement n'a pas adopté"],
"CodeTypeVote": ["MOC", "SAT", "SPO", "SPS", "SSG"],
"LibelleTypeVote": ["motion de censure", "scrutin public ordinaire", "scrutin public solennel", "scrutin à la tribune", "Scrutin solennel congrès"],
"TypeMajorite": ["Majorité absolue des suffrages exprimés", "majorité absolue des suffrages exprimés", "majorité des membres composant l'Assemblée nationale", "majorité des membres composants composant l'Assemblée", "majorité des membres composants composant l'Assemblée nationale", "Majorité requise pour un Congrès", "Majorité requise pour une motion de censure"],
"CausePositionVote": ["MG", "PAN", "PSE"],
"PositionMajoritaire": ["abstention", "contre", "pour"],
"LieuVote": ["Congrès", "Hémicycle", "Salons"]
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlUHVibGljYXRpb25EZXNWb3RlcyIsIkNvZGUiLCJMaWJlbGxlIiwiQ29kZVR5cGVWb3RlIiwiTGliZWxsZVR5cGVWb3RlIiwiVHlwZU1ham9yaXRlIiwiQ2F1c2VQb3NpdGlvblZvdGUiLCJQb3NpdGlvbk1ham9yaXRhaXJlIiwiTGlldVZvdGUiLCJDb252ZXJ0IiwidG9TY3J1dGlucyIsImpzb24iLCJjYXN0IiwiSlNPTiIsInBhcnNlIiwiciIsInNjcnV0aW5zVG9Kc29uIiwidmFsdWUiLCJzdHJpbmdpZnkiLCJ1bmNhc3QiLCJ0b1NjcnV0aW5XcmFwcGVyIiwic2NydXRpbldyYXBwZXJUb0pzb24iLCJpbnZhbGlkVmFsdWUiLCJ0eXAiLCJ2YWwiLCJrZXkiLCJFcnJvciIsImpzb25Ub0pTUHJvcHMiLCJqc29uVG9KUyIsInVuZGVmaW5lZCIsIm1hcCIsInByb3BzIiwiZm9yRWFjaCIsInAiLCJqcyIsImpzVG9KU09OUHJvcHMiLCJqc1RvSlNPTiIsInRyYW5zZm9ybSIsImdldFByb3BzIiwidHJhbnNmb3JtUHJpbWl0aXZlIiwidHJhbnNmb3JtVW5pb24iLCJ0eXBzIiwibCIsImxlbmd0aCIsImkiLCJfIiwidHJhbnNmb3JtRW51bSIsImNhc2VzIiwiaW5kZXhPZiIsInRyYW5zZm9ybUFycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiZWwiLCJ0cmFuc2Zvcm1EYXRlIiwiZCIsIkRhdGUiLCJpc05hTiIsInZhbHVlT2YiLCJ0cmFuc2Zvcm1PYmplY3QiLCJhZGRpdGlvbmFsIiwicmVzdWx0IiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3AiLCJ2IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVmIiwidHlwZU1hcCIsInVuaW9uTWVtYmVycyIsImFycmF5SXRlbXMiLCJhIiwidSIsIm8iLCJuYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jhd190eXBlcy9zY3J1dGlucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUbyBwYXJzZSB0aGlzIGRhdGE6XG4vL1xuLy8gICBpbXBvcnQgeyBDb252ZXJ0LCBTY3J1dGlucywgU2NydXRpbldyYXBwZXIgfSBmcm9tIFwiLi9maWxlXCI7XG4vL1xuLy8gICBjb25zdCBzY3J1dGlucyA9IENvbnZlcnQudG9TY3J1dGlucyhqc29uKTtcbi8vICAgY29uc3Qgc2NydXRpbldyYXBwZXIgPSBDb252ZXJ0LnRvU2NydXRpbldyYXBwZXIoanNvbik7XG4vL1xuLy8gVGhlc2UgZnVuY3Rpb25zIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIEpTT04gZG9lc24ndFxuLy8gbWF0Y2ggdGhlIGV4cGVjdGVkIGludGVyZmFjZSwgZXZlbiBpZiB0aGUgSlNPTiBpcyB2YWxpZC5cblxuZXhwb3J0IGludGVyZmFjZSBTY3J1dGlucyB7XG4gICAgc2NydXRpbnM6IFNjcnV0aW5zQ2xhc3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NydXRpbnNDbGFzcyB7XG4gICAgc2NydXRpbjogU2NydXRpbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcnV0aW5XcmFwcGVyIHtcbiAgc2NydXRpbjogU2NydXRpblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcnV0aW4ge1xuICAgIFwiQHhtbG5zOnhzaVwiOiAgICAgICAgICAgIHN0cmluZztcbiAgICB1aWQ6ICAgICAgICAgICAgICAgICAgICAgc3RyaW5nO1xuICAgIG51bWVybzogICAgICAgICAgICAgICAgICBzdHJpbmc7XG4gICAgb3JnYW5lUmVmOiAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBsZWdpc2xhdHVyZTogICAgICAgICAgICAgc3RyaW5nO1xuICAgIHNlc3Npb25SZWY6ICAgICAgICAgICAgICBzdHJpbmc7XG4gICAgc2VhbmNlUmVmOiAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBkYXRlU2NydXRpbjogICAgICAgICAgICAgRGF0ZTtcbiAgICBxdWFudGllbWVKb3VyU2VhbmNlOiAgICAgc3RyaW5nO1xuICAgIHR5cGVWb3RlOiAgICAgICAgICAgICAgICBUeXBlVm90ZTtcbiAgICBzb3J0OiAgICAgICAgICAgICAgICAgICAgU29ydDtcbiAgICB0aXRyZTogICAgICAgICAgICAgICAgICAgc3RyaW5nO1xuICAgIGRlbWFuZGV1cjogICAgICAgICAgICAgICBEZW1hbmRldXI7XG4gICAgb2JqZXQ6ICAgICAgICAgICAgICAgICAgIE9iamV0O1xuICAgIG1vZGVQdWJsaWNhdGlvbkRlc1ZvdGVzOiBNb2RlUHVibGljYXRpb25EZXNWb3RlcztcbiAgICBzeW50aGVzZVZvdGU6ICAgICAgICAgICAgU3ludGhlc2VWb3RlO1xuICAgIHZlbnRpbGF0aW9uVm90ZXM6ICAgICAgICBWZW50aWxhdGlvblZvdGVzO1xuICAgIG1pc2VBdVBvaW50OiAgICAgICAgICAgICBNaXNlQXVQb2ludCB8IG51bGw7XG4gICAgbGlldVZvdGU/OiAgICAgICAgICAgICAgIExpZXVWb3RlO1xuICAgIFwiQHhtbG5zXCI/OiAgICAgICAgICAgICAgIHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZW1hbmRldXIge1xuICAgIHRleHRlOiAgICAgICAgICAgICAgICBudWxsIHwgc3RyaW5nO1xuICAgIHJlZmVyZW5jZUxlZ2lzbGF0aXZlOiBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pc2VBdVBvaW50IHtcbiAgICBub25Wb3RhbnRzOiAgICAgICAgICAgIEFycmF5PFZvdGFudHNDbGFzcyB8IG51bGw+IHwgbnVsbDtcbiAgICBwb3VyPzogICAgICAgICAgICAgICAgIFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgY29udHJlPzogICAgICAgICAgICAgICBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIGFic3RlbnRpb25zOiAgICAgICAgICAgQXJyYXk8Vm90YW50c0NsYXNzIHwgbnVsbD4gfCBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIG5vblZvdGFudHNWb2xvbnRhaXJlczogQXJyYXk8Vm90YW50c0NsYXNzIHwgbnVsbD4gfCBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIHBvdXJzPzogICAgICAgICAgICAgICAgVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBjb250cmVzPzogICAgICAgICAgICAgIFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgZHlzZm9uY3Rpb25uZW1lbnQ/OiAgICBEeXNmb25jdGlvbm5lbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeXNmb25jdGlvbm5lbWVudCB7XG4gICAgbm9uVm90YW50czogICAgICAgICAgICBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIHBvdXI6ICAgICAgICAgICAgICAgICAgVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBjb250cmU6ICAgICAgICAgICAgICAgIFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgYWJzdGVudGlvbnM6ICAgICAgICAgICBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIG5vblZvdGFudHNWb2xvbnRhaXJlczogVm90YW50c0NsYXNzIHwgbnVsbDtcbn1cblxuZXhwb3J0IGVudW0gTW9kZVB1YmxpY2F0aW9uRGVzVm90ZXMge1xuICAgIERlY29tcHRlRGlzc2lkZW50c1Bvc2l0aW9uR3JvdXBlID0gXCJEZWNvbXB0ZURpc3NpZGVudHNQb3NpdGlvbkdyb3VwZVwiLFxuICAgIERlY29tcHRlTm9taW5hdGlmID0gXCJEZWNvbXB0ZU5vbWluYXRpZlwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iamV0IHtcbiAgICBsaWJlbGxlOiAgICAgICAgICAgICAgc3RyaW5nO1xuICAgIHJlZmVyZW5jZUxlZ2lzbGF0aXZlOiBudWxsO1xuICAgIGRvc3NpZXJMZWdpc2xhdGlmPzogbnVsbFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnQge1xuICAgIGNvZGU6ICAgIENvZGU7XG4gICAgbGliZWxsZTogTGliZWxsZTtcbn1cblxuZXhwb3J0IGVudW0gQ29kZSB7XG4gICAgQWRvcHTDqSA9IFwiYWRvcHTDqVwiLFxuICAgIFJlamV0w6kgPSBcInJlamV0w6lcIixcbn1cblxuZXhwb3J0IGVudW0gTGliZWxsZSB7XG4gICAgTEFzc2VtYmzDqWVOYXRpb25hbGVBQWRvcHTDqSA9IFwibCdBc3NlbWJsw6llIG5hdGlvbmFsZSBhIGFkb3B0w6lcIixcbiAgICBMQXNzZW1ibMOpZU5hdGlvbmFsZU5BUGFzQWRvcHTDqSA9IFwiTCdBc3NlbWJsw6llIG5hdGlvbmFsZSBuJ2EgcGFzIGFkb3B0w6lcIixcbiAgICBMZUNvbmdyw6hzRHVQYXJsZW1lbnRBQWRvcHTDqSA9IFwiTGUgQ29uZ3LDqHMgZHUgUGFybGVtZW50IGEgYWRvcHTDqVwiLFxuICAgIExlQ29uZ3LDqHNEdVBhcmxlbWVudE5BUGFzQWRvcHTDqSA9IFwiTGUgQ29uZ3LDqHMgZHUgUGFybGVtZW50IG4nYSBwYXMgYWRvcHTDqVwiLFxuICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhlc2VWb3RlIHtcbiAgICBub21icmVWb3RhbnRzOiAgICAgIHN0cmluZztcbiAgICBzdWZmcmFnZXNFeHByaW1lczogIHN0cmluZztcbiAgICBuYnJTdWZmcmFnZXNSZXF1aXM6IHN0cmluZztcbiAgICBhbm5vbmNlOiAgICAgICAgICAgIExpYmVsbGU7XG4gICAgZGVjb21wdGU6ICAgICAgICAgICBEZWNvbXB0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWNvbXB0ZSB7XG4gICAgcG91cjogICAgICAgICAgICAgICAgICAgc3RyaW5nO1xuICAgIGNvbnRyZTogICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBhYnN0ZW50aW9uczogICAgICAgICAgICBzdHJpbmc7XG4gICAgbm9uVm90YW50czogICAgICAgICAgICAgc3RyaW5nO1xuICAgIG5vblZvdGFudHNWb2xvbnRhaXJlcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlVm90ZSB7XG4gICAgY29kZVR5cGVWb3RlOiAgICBDb2RlVHlwZVZvdGU7XG4gICAgbGliZWxsZVR5cGVWb3RlOiBMaWJlbGxlVHlwZVZvdGU7XG4gICAgdHlwZU1ham9yaXRlOiAgICBUeXBlTWFqb3JpdGU7XG59XG5cbmV4cG9ydCBlbnVtIENvZGVUeXBlVm90ZSB7XG4gICAgTW9jID0gXCJNT0NcIixcbiAgICBTYXQgPSBcIlNBVFwiLFxuICAgIFNwbyA9IFwiU1BPXCIsXG4gICAgU3BzID0gXCJTUFNcIixcbiAgICBTc2cgPSBcIlNTR1wiLFxufVxuXG5leHBvcnQgZW51bSBMaWJlbGxlVHlwZVZvdGUge1xuICAgIE1vdGlvbkRlQ2Vuc3VyZSA9IFwibW90aW9uIGRlIGNlbnN1cmVcIixcbiAgICBTY3J1dGluUHVibGljT3JkaW5haXJlID0gXCJzY3J1dGluIHB1YmxpYyBvcmRpbmFpcmVcIixcbiAgICBTY3J1dGluUHVibGljU29sZW5uZWwgPSBcInNjcnV0aW4gcHVibGljIHNvbGVubmVsXCIsXG4gICAgU2NydXRpbsOATGFUcmlidW5lID0gXCJzY3J1dGluIMOgIGxhIHRyaWJ1bmVcIixcbiAgICBTY3J1dGluU29sZW5uZWxDb25ncsOocyA9IFwiU2NydXRpbiBzb2xlbm5lbCBjb25ncsOoc1wiLFxufVxuXG5leHBvcnQgZW51bSBUeXBlTWFqb3JpdGUge1xuICAgIE1ham9yaXTDqUFic29sdWVEZXNTdWZmcmFnZXNFeHByaW3DqXMgPSBcIk1ham9yaXTDqSBhYnNvbHVlIGRlcyBzdWZmcmFnZXMgZXhwcmltw6lzXCIsXG4gICAgbWFqb3JpdMOpQWJzb2x1ZURlc1N1ZmZyYWdlc0V4cHJpbcOpcyA9IFwibWFqb3JpdMOpIGFic29sdWUgZGVzIHN1ZmZyYWdlcyBleHByaW3DqXNcIixcbiAgICBtYWpvcml0w6lEZXNNZW1icmVzQ29tcG9zYW50TEFzc2VtYmzDqWVOYXRpb25hbGUgPSBcIm1ham9yaXTDqSBkZXMgbWVtYnJlcyBjb21wb3NhbnQgbCdBc3NlbWJsw6llIG5hdGlvbmFsZVwiLFxuICAgIG1ham9yaXTDqURlc01lbWJyZXNDb21wb3NhbnRzQ29tcG9zYW50TEFzc2VtYmzDqWUgPSBcIm1ham9yaXTDqSBkZXMgbWVtYnJlcyBjb21wb3NhbnRzIGNvbXBvc2FudCBsJ0Fzc2VtYmzDqWVcIixcbiAgICBtYWpvcml0w6lEZXNNZW1icmVzQ29tcG9zYW50c0NvbXBvc2FudExBc3NlbWJsw6llTmF0aW9uYWxlID0gXCJtYWpvcml0w6kgZGVzIG1lbWJyZXMgY29tcG9zYW50cyBjb21wb3NhbnQgbCdBc3NlbWJsw6llIG5hdGlvbmFsZVwiLFxuICAgIE1ham9yaXTDqVJlcXVpc2VQb3VyVW5Db25ncsOocyA9IFwiTWFqb3JpdMOpIHJlcXVpc2UgcG91ciB1biBDb25ncsOoc1wiLFxuICAgIE1ham9yaXTDqVJlcXVpc2VQb3VyVW5lTW90aW9uRGVDZW5zdXJlID0gXCJNYWpvcml0w6kgcmVxdWlzZSBwb3VyIHVuZSBtb3Rpb24gZGUgY2Vuc3VyZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlbnRpbGF0aW9uVm90ZXMge1xuICAgIG9yZ2FuZTogT3JnYW5lO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuZSB7XG4gICAgb3JnYW5lUmVmOiBzdHJpbmc7XG4gICAgZ3JvdXBlczogICBHcm91cGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwZXMge1xuICAgIGdyb3VwZTogR3JvdXBlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBlIHtcbiAgICBvcmdhbmVSZWY6ICAgICAgICAgICBzdHJpbmc7XG4gICAgbm9tYnJlTWVtYnJlc0dyb3VwZTogc3RyaW5nO1xuICAgIHZvdGU6ICAgICAgICAgICAgICAgIFZvdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm90ZSB7XG4gICAgcG9zaXRpb25NYWpvcml0YWlyZTogUG9zaXRpb25NYWpvcml0YWlyZTtcbiAgICBkZWNvbXB0ZVZvaXg6ICAgICAgICBEZWNvbXB0ZVZvaXg7XG4gICAgZGVjb21wdGVOb21pbmF0aWY6ICAgRGVjb21wdGVOb21pbmF0aWY7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb21wdGVOb21pbmF0aWYge1xuICAgIG5vblZvdGFudD86ICAgbnVsbFxuICAgIG5vblZvdGFudHM/OiAgVm90YW50c0NsYXNzIHwgbnVsbCB8IHN0cmluZztcbiAgICBwb3VyPzogICAgICAgVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBjb250cmU/OiAgICAgVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBhYnN0ZW50aW9uPzogVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBhYnN0ZW50aW9ucz86IFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgcG91cnM/OiAgICAgIFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgY29udHJlcz86ICAgIFZvdGFudHNDbGFzcyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm90YW50c0NsYXNzIHtcbiAgICB2b3RhbnQ6IFZvdGFudFtdIHwgVm90YW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvdGFudCB7XG4gICAgYWN0ZXVyUmVmOiAgICAgIHN0cmluZztcbiAgICBtYW5kYXRSZWY6ICAgICAgc3RyaW5nO1xuICAgIHBhckRlbGVnYXRpb24/OiBzdHJpbmc7XG4gICAgbnVtUGxhY2U/OiAgICAgIHN0cmluZyB8IG51bGw7XG4gICAgY2F1c2VQb3NpdGlvblZvdGU/OiBDYXVzZVBvc2l0aW9uVm90ZTtcbn1cblxuZXhwb3J0IGVudW0gQ2F1c2VQb3NpdGlvblZvdGUge1xuICAgIE1nID0gXCJNR1wiLFxuICAgIFBhbiA9IFwiUEFOXCIsXG4gICAgUHNlID0gXCJQU0VcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWNvbXB0ZVZvaXgge1xuICAgIHBvdXI6ICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBjb250cmU6ICAgICAgICAgICAgICAgICBzdHJpbmc7XG4gICAgYWJzdGVudGlvbj86ICAgICAgICAgICAgc3RyaW5nO1xuICAgIG5vblZvdGFudD86ICAgICAgICAgICAgIHN0cmluZyB8IG51bGw7XG4gICAgbm9uVm90YW50cz86ICAgICAgICAgICAgc3RyaW5nO1xuICAgIGFic3RlbnRpb25zPzogICAgICAgICAgIHN0cmluZztcbiAgICBub25Wb3RhbnRzVm9sb250YWlyZXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFBvc2l0aW9uTWFqb3JpdGFpcmUge1xuICAgIEFic3RlbnRpb24gPSBcImFic3RlbnRpb25cIixcbiAgICBDb250cmUgPSBcImNvbnRyZVwiLFxuICAgIFBvdXIgPSBcInBvdXJcIixcbn1cblxuZXhwb3J0IGVudW0gTGlldVZvdGUge1xuICAgIENvbmdyw6hzID0gXCJDb25ncsOoc1wiLFxuICAgIEjDqW1pY3ljbGUgPSBcIkjDqW1pY3ljbGVcIixcbiAgICBTYWxvbnMgPSBcIlNhbG9uc1wiLFxufVxuXG4vLyBDb252ZXJ0cyBKU09OIHN0cmluZ3MgdG8vZnJvbSB5b3VyIHR5cGVzXG4vLyBhbmQgYXNzZXJ0cyB0aGUgcmVzdWx0cyBvZiBKU09OLnBhcnNlIGF0IHJ1bnRpbWVcbmV4cG9ydCBjbGFzcyBDb252ZXJ0IHtcbiAgICBwdWJsaWMgc3RhdGljIHRvU2NydXRpbnMoanNvbjogc3RyaW5nKTogU2NydXRpbnMge1xuICAgICAgICByZXR1cm4gY2FzdChKU09OLnBhcnNlKGpzb24pLCByKFwiU2NydXRpbnNcIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2NydXRpbnNUb0pzb24odmFsdWU6IFNjcnV0aW5zKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHVuY2FzdCh2YWx1ZSwgcihcIlNjcnV0aW5zXCIpKSwgbnVsbCwgMik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0b1NjcnV0aW5XcmFwcGVyKGpzb246IHN0cmluZyk6IFNjcnV0aW5XcmFwcGVyIHtcbiAgICAgICAgcmV0dXJuIGNhc3QoSlNPTi5wYXJzZShqc29uKSwgcihcIlNjcnV0aW5XcmFwcGVyXCIpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNjcnV0aW5XcmFwcGVyVG9Kc29uKHZhbHVlOiBTY3J1dGluV3JhcHBlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh1bmNhc3QodmFsdWUsIHIoXCJTY3J1dGluV3JhcHBlclwiKSksIG51bGwsIDIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaW52YWxpZFZhbHVlKHR5cDogYW55LCB2YWw6IGFueSwga2V5OiBhbnkgPSAnJyk6IG5ldmVyIHtcbiAgICBpZiAoa2V5KSB7XG4gICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIi4gRXhwZWN0ZWQgdHlwZSAke0pTT04uc3RyaW5naWZ5KHR5cCl9IGJ1dCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWwpfWApO1xuICAgIH1cbiAgICB0aHJvdyBFcnJvcihgSW52YWxpZCB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KHZhbCl9IGZvciB0eXBlICR7SlNPTi5zdHJpbmdpZnkodHlwKX1gLCApO1xufVxuXG5mdW5jdGlvbiBqc29uVG9KU1Byb3BzKHR5cDogYW55KTogYW55IHtcbiAgICBpZiAodHlwLmpzb25Ub0pTID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWFwOiBhbnkgPSB7fTtcbiAgICAgICAgdHlwLnByb3BzLmZvckVhY2goKHA6IGFueSkgPT4gbWFwW3AuanNvbl0gPSB7IGtleTogcC5qcywgdHlwOiBwLnR5cCB9KTtcbiAgICAgICAgdHlwLmpzb25Ub0pTID0gbWFwO1xuICAgIH1cbiAgICByZXR1cm4gdHlwLmpzb25Ub0pTO1xufVxuXG5mdW5jdGlvbiBqc1RvSlNPTlByb3BzKHR5cDogYW55KTogYW55IHtcbiAgICBpZiAodHlwLmpzVG9KU09OID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWFwOiBhbnkgPSB7fTtcbiAgICAgICAgdHlwLnByb3BzLmZvckVhY2goKHA6IGFueSkgPT4gbWFwW3AuanNdID0geyBrZXk6IHAuanNvbiwgdHlwOiBwLnR5cCB9KTtcbiAgICAgICAgdHlwLmpzVG9KU09OID0gbWFwO1xuICAgIH1cbiAgICByZXR1cm4gdHlwLmpzVG9KU09OO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm0odmFsOiBhbnksIHR5cDogYW55LCBnZXRQcm9wczogYW55LCBrZXk6IGFueSA9ICcnKTogYW55IHtcbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1QcmltaXRpdmUodHlwOiBzdHJpbmcsIHZhbDogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXAgPT09IHR5cGVvZiB2YWwpIHJldHVybiB2YWw7XG4gICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwsIGtleSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtVW5pb24odHlwczogYW55W10sIHZhbDogYW55KTogYW55IHtcbiAgICAgICAgLy8gdmFsIG11c3QgdmFsaWRhdGUgYWdhaW5zdCBvbmUgdHlwIGluIHR5cHNcbiAgICAgICAgY29uc3QgbCA9IHR5cHMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdHlwID0gdHlwc1tpXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybSh2YWwsIHR5cCwgZ2V0UHJvcHMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW52YWxpZFZhbHVlKHR5cHMsIHZhbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtRW51bShjYXNlczogc3RyaW5nW10sIHZhbDogYW55KTogYW55IHtcbiAgICAgICAgaWYgKGNhc2VzLmluZGV4T2YodmFsKSAhPT0gLTEpIHJldHVybiB2YWw7XG4gICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUoY2FzZXMsIHZhbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtQXJyYXkodHlwOiBhbnksIHZhbDogYW55KTogYW55IHtcbiAgICAgICAgLy8gdmFsIG11c3QgYmUgYW4gYXJyYXkgd2l0aCBubyBpbnZhbGlkIGVsZW1lbnRzXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gaW52YWxpZFZhbHVlKFwiYXJyYXlcIiwgdmFsKTtcbiAgICAgICAgcmV0dXJuIHZhbC5tYXAoZWwgPT4gdHJhbnNmb3JtKGVsLCB0eXAsIGdldFByb3BzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtRGF0ZSh2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgICBpZiAoaXNOYU4oZC52YWx1ZU9mKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbHVlKFwiRGF0ZVwiLCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybU9iamVjdChwcm9wczogeyBbazogc3RyaW5nXTogYW55IH0sIGFkZGl0aW9uYWw6IGFueSwgdmFsOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbHVlKFwib2JqZWN0XCIsIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvcHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1trZXldO1xuICAgICAgICAgICAgY29uc3QgdiA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGtleSkgPyB2YWxba2V5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJlc3VsdFtwcm9wLmtleV0gPSB0cmFuc2Zvcm0odiwgcHJvcC50eXAsIGdldFByb3BzLCBwcm9wLmtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWwpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0cmFuc2Zvcm0odmFsW2tleV0sIGFkZGl0aW9uYWwsIGdldFByb3BzLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodHlwID09PSBcImFueVwiKSByZXR1cm4gdmFsO1xuICAgIGlmICh0eXAgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuIHZhbDtcbiAgICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZSh0eXAsIHZhbCk7XG4gICAgfVxuICAgIGlmICh0eXAgPT09IGZhbHNlKSByZXR1cm4gaW52YWxpZFZhbHVlKHR5cCwgdmFsKTtcbiAgICB3aGlsZSAodHlwZW9mIHR5cCA9PT0gXCJvYmplY3RcIiAmJiB0eXAucmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHlwID0gdHlwZU1hcFt0eXAucmVmXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHlwKSkgcmV0dXJuIHRyYW5zZm9ybUVudW0odHlwLCB2YWwpO1xuICAgIGlmICh0eXBlb2YgdHlwID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiB0eXAuaGFzT3duUHJvcGVydHkoXCJ1bmlvbk1lbWJlcnNcIikgPyB0cmFuc2Zvcm1Vbmlvbih0eXAudW5pb25NZW1iZXJzLCB2YWwpXG4gICAgICAgICAgICA6IHR5cC5oYXNPd25Qcm9wZXJ0eShcImFycmF5SXRlbXNcIikgICAgPyB0cmFuc2Zvcm1BcnJheSh0eXAuYXJyYXlJdGVtcywgdmFsKVxuICAgICAgICAgICAgOiB0eXAuaGFzT3duUHJvcGVydHkoXCJwcm9wc1wiKSAgICAgICAgID8gdHJhbnNmb3JtT2JqZWN0KGdldFByb3BzKHR5cCksIHR5cC5hZGRpdGlvbmFsLCB2YWwpXG4gICAgICAgICAgICA6IGludmFsaWRWYWx1ZSh0eXAsIHZhbCk7XG4gICAgfVxuICAgIC8vIE51bWJlcnMgY2FuIGJlIHBhcnNlZCBieSBEYXRlIGJ1dCBzaG91bGRuJ3QgYmUuXG4gICAgaWYgKHR5cCA9PT0gRGF0ZSAmJiB0eXBlb2YgdmFsICE9PSBcIm51bWJlclwiKSByZXR1cm4gdHJhbnNmb3JtRGF0ZSh2YWwpO1xuICAgIHJldHVybiB0cmFuc2Zvcm1QcmltaXRpdmUodHlwLCB2YWwpO1xufVxuXG5mdW5jdGlvbiBjYXN0PFQ+KHZhbDogYW55LCB0eXA6IGFueSk6IFQge1xuICAgIHJldHVybiB0cmFuc2Zvcm0odmFsLCB0eXAsIGpzb25Ub0pTUHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1bmNhc3Q8VD4odmFsOiBULCB0eXA6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybSh2YWwsIHR5cCwganNUb0pTT05Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIGEodHlwOiBhbnkpIHtcbiAgICByZXR1cm4geyBhcnJheUl0ZW1zOiB0eXAgfTtcbn1cblxuZnVuY3Rpb24gdSguLi50eXBzOiBhbnlbXSkge1xuICAgIHJldHVybiB7IHVuaW9uTWVtYmVyczogdHlwcyB9O1xufVxuXG5mdW5jdGlvbiBvKHByb3BzOiBhbnlbXSwgYWRkaXRpb25hbDogYW55KSB7XG4gICAgcmV0dXJuIHsgcHJvcHMsIGFkZGl0aW9uYWwgfTtcbn1cblxuLy8gZnVuY3Rpb24gbShhZGRpdGlvbmFsOiBhbnkpIHtcbi8vICAgICByZXR1cm4geyBwcm9wczogW10sIGFkZGl0aW9uYWwgfTtcbi8vIH1cblxuZnVuY3Rpb24gcihuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4geyByZWY6IG5hbWUgfTtcbn1cblxuY29uc3QgdHlwZU1hcDogYW55ID0ge1xuICAgIFwiU2NydXRpbnNcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJzY3J1dGluc1wiLCBqczogXCJzY3J1dGluc1wiLCB0eXA6IHIoXCJTY3J1dGluc0NsYXNzXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiU2NydXRpbnNDbGFzc1wiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcInNjcnV0aW5cIiwganM6IFwic2NydXRpblwiLCB0eXA6IGEocihcIlNjcnV0aW5cIikpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiU2NydXRpbldyYXBwZXJcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJzY3J1dGluXCIsIGpzOiBcInNjcnV0aW5cIiwgdHlwOiByKFwiU2NydXRpblwiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIlNjcnV0aW5cIjogbyhbXG4gICAgICAgIHsganNvbjogXCJAeG1sbnM6eHNpXCIsIGpzOiBcIkB4bWxuczp4c2lcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJ1aWRcIiwganM6IFwidWlkXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwibnVtZXJvXCIsIGpzOiBcIm51bWVyb1wiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcIm9yZ2FuZVJlZlwiLCBqczogXCJvcmdhbmVSZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJsZWdpc2xhdHVyZVwiLCBqczogXCJsZWdpc2xhdHVyZVwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcInNlc3Npb25SZWZcIiwganM6IFwic2Vzc2lvblJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcInNlYW5jZVJlZlwiLCBqczogXCJzZWFuY2VSZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJkYXRlU2NydXRpblwiLCBqczogXCJkYXRlU2NydXRpblwiLCB0eXA6IERhdGUgfSxcbiAgICAgICAgeyBqc29uOiBcInF1YW50aWVtZUpvdXJTZWFuY2VcIiwganM6IFwicXVhbnRpZW1lSm91clNlYW5jZVwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcInR5cGVWb3RlXCIsIGpzOiBcInR5cGVWb3RlXCIsIHR5cDogcihcIlR5cGVWb3RlXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJzb3J0XCIsIGpzOiBcInNvcnRcIiwgdHlwOiByKFwiU29ydFwiKSB9LFxuICAgICAgICB7IGpzb246IFwidGl0cmVcIiwganM6IFwidGl0cmVcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJkZW1hbmRldXJcIiwganM6IFwiZGVtYW5kZXVyXCIsIHR5cDogcihcIkRlbWFuZGV1clwiKSB9LFxuICAgICAgICB7IGpzb246IFwib2JqZXRcIiwganM6IFwib2JqZXRcIiwgdHlwOiByKFwiT2JqZXRcIikgfSxcbiAgICAgICAgeyBqc29uOiBcIm1vZGVQdWJsaWNhdGlvbkRlc1ZvdGVzXCIsIGpzOiBcIm1vZGVQdWJsaWNhdGlvbkRlc1ZvdGVzXCIsIHR5cDogcihcIk1vZGVQdWJsaWNhdGlvbkRlc1ZvdGVzXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJzeW50aGVzZVZvdGVcIiwganM6IFwic3ludGhlc2VWb3RlXCIsIHR5cDogcihcIlN5bnRoZXNlVm90ZVwiKSB9LFxuICAgICAgICB7IGpzb246IFwidmVudGlsYXRpb25Wb3Rlc1wiLCBqczogXCJ2ZW50aWxhdGlvblZvdGVzXCIsIHR5cDogcihcIlZlbnRpbGF0aW9uVm90ZXNcIikgfSxcbiAgICAgICAgeyBqc29uOiBcIm1pc2VBdVBvaW50XCIsIGpzOiBcIm1pc2VBdVBvaW50XCIsIHR5cDogdShyKFwiTWlzZUF1UG9pbnRcIiksIG51bGwpIH0sXG4gICAgICAgIHsganNvbjogXCJsaWV1Vm90ZVwiLCBqczogXCJsaWV1Vm90ZVwiLCB0eXA6IHUodW5kZWZpbmVkLCByKFwiTGlldVZvdGVcIikpIH0sXG4gICAgICAgIHsganNvbjogXCJAeG1sbnNcIiwganM6IFwiQHhtbG5zXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiRGVtYW5kZXVyXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwidGV4dGVcIiwganM6IFwidGV4dGVcIiwgdHlwOiB1KG51bGwsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJyZWZlcmVuY2VMZWdpc2xhdGl2ZVwiLCBqczogXCJyZWZlcmVuY2VMZWdpc2xhdGl2ZVwiLCB0eXA6IG51bGwgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJNaXNlQXVQb2ludFwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudHNcIiwganM6IFwibm9uVm90YW50c1wiLCB0eXA6IHUoYSh1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcInBvdXJcIiwganM6IFwicG91clwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwiY29udHJlXCIsIGpzOiBcImNvbnRyZVwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwiYWJzdGVudGlvbnNcIiwganM6IFwiYWJzdGVudGlvbnNcIiwgdHlwOiB1KGEodShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSksIHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpIH0sXG4gICAgICAgIHsganNvbjogXCJub25Wb3RhbnRzVm9sb250YWlyZXNcIiwganM6IFwibm9uVm90YW50c1ZvbG9udGFpcmVzXCIsIHR5cDogdShhKHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkpLCByKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSB9LFxuICAgICAgICB7IGpzb246IFwicG91cnNcIiwganM6IFwicG91cnNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImNvbnRyZXNcIiwganM6IFwiY29udHJlc1wiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwiZHlzZm9uY3Rpb25uZW1lbnRcIiwganM6IFwiZHlzZm9uY3Rpb25uZW1lbnRcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIkR5c2ZvbmN0aW9ubmVtZW50XCIpKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkR5c2ZvbmN0aW9ubmVtZW50XCI6IG8oW1xuICAgICAgICB7IGpzb246IFwibm9uVm90YW50c1wiLCBqczogXCJub25Wb3RhbnRzXCIsIHR5cDogdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSB9LFxuICAgICAgICB7IGpzb246IFwicG91clwiLCBqczogXCJwb3VyXCIsIHR5cDogdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSB9LFxuICAgICAgICB7IGpzb246IFwiY29udHJlXCIsIGpzOiBcImNvbnRyZVwiLCB0eXA6IHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcImFic3RlbnRpb25zXCIsIGpzOiBcImFic3RlbnRpb25zXCIsIHR5cDogdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSB9LFxuICAgICAgICB7IGpzb246IFwibm9uVm90YW50c1ZvbG9udGFpcmVzXCIsIGpzOiBcIm5vblZvdGFudHNWb2xvbnRhaXJlc1wiLCB0eXA6IHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJPYmpldFwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImxpYmVsbGVcIiwganM6IFwibGliZWxsZVwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcInJlZmVyZW5jZUxlZ2lzbGF0aXZlXCIsIGpzOiBcInJlZmVyZW5jZUxlZ2lzbGF0aXZlXCIsIHR5cDogbnVsbCB9LFxuICAgICAgICB7IGpzb246IFwiZG9zc2llckxlZ2lzbGF0aWZcIiwganM6IFwiZG9zc2llckxlZ2lzbGF0aWZcIiwgdHlwOiB1KHVuZGVmaW5lZCwgbnVsbCkgfVxuICAgIF0sIGZhbHNlKSxcbiAgICBcIlNvcnRcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJjb2RlXCIsIGpzOiBcImNvZGVcIiwgdHlwOiByKFwiQ29kZVwiKSB9LFxuICAgICAgICB7IGpzb246IFwibGliZWxsZVwiLCBqczogXCJsaWJlbGxlXCIsIHR5cDogcihcIkxpYmVsbGVcIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJTeW50aGVzZVZvdGVcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJub21icmVWb3RhbnRzXCIsIGpzOiBcIm5vbWJyZVZvdGFudHNcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJzdWZmcmFnZXNFeHByaW1lc1wiLCBqczogXCJzdWZmcmFnZXNFeHByaW1lc1wiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcIm5iclN1ZmZyYWdlc1JlcXVpc1wiLCBqczogXCJuYnJTdWZmcmFnZXNSZXF1aXNcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJhbm5vbmNlXCIsIGpzOiBcImFubm9uY2VcIiwgdHlwOiByKFwiTGliZWxsZVwiKSB9LFxuICAgICAgICB7IGpzb246IFwiZGVjb21wdGVcIiwganM6IFwiZGVjb21wdGVcIiwgdHlwOiByKFwiRGVjb21wdGVcIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJEZWNvbXB0ZVwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcInBvdXJcIiwganM6IFwicG91clwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcImNvbnRyZVwiLCBqczogXCJjb250cmVcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJhYnN0ZW50aW9uc1wiLCBqczogXCJhYnN0ZW50aW9uc1wiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudHNcIiwganM6IFwibm9uVm90YW50c1wiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudHNWb2xvbnRhaXJlc1wiLCBqczogXCJub25Wb3RhbnRzVm9sb250YWlyZXNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgXCJcIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJUeXBlVm90ZVwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImNvZGVUeXBlVm90ZVwiLCBqczogXCJjb2RlVHlwZVZvdGVcIiwgdHlwOiByKFwiQ29kZVR5cGVWb3RlXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJsaWJlbGxlVHlwZVZvdGVcIiwganM6IFwibGliZWxsZVR5cGVWb3RlXCIsIHR5cDogcihcIkxpYmVsbGVUeXBlVm90ZVwiKSB9LFxuICAgICAgICB7IGpzb246IFwidHlwZU1ham9yaXRlXCIsIGpzOiBcInR5cGVNYWpvcml0ZVwiLCB0eXA6IHIoXCJUeXBlTWFqb3JpdGVcIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJWZW50aWxhdGlvblZvdGVzXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwib3JnYW5lXCIsIGpzOiBcIm9yZ2FuZVwiLCB0eXA6IHIoXCJPcmdhbmVcIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJPcmdhbmVcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJvcmdhbmVSZWZcIiwganM6IFwib3JnYW5lUmVmXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiZ3JvdXBlc1wiLCBqczogXCJncm91cGVzXCIsIHR5cDogcihcIkdyb3VwZXNcIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJHcm91cGVzXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwiZ3JvdXBlXCIsIGpzOiBcImdyb3VwZVwiLCB0eXA6IGEocihcIkdyb3VwZVwiKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJHcm91cGVcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJvcmdhbmVSZWZcIiwganM6IFwib3JnYW5lUmVmXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwibm9tYnJlTWVtYnJlc0dyb3VwZVwiLCBqczogXCJub21icmVNZW1icmVzR3JvdXBlXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwidm90ZVwiLCBqczogXCJ2b3RlXCIsIHR5cDogcihcIlZvdGVcIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJWb3RlXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwicG9zaXRpb25NYWpvcml0YWlyZVwiLCBqczogXCJwb3NpdGlvbk1ham9yaXRhaXJlXCIsIHR5cDogcihcIlBvc2l0aW9uTWFqb3JpdGFpcmVcIikgfSxcbiAgICAgICAgeyBqc29uOiBcImRlY29tcHRlVm9peFwiLCBqczogXCJkZWNvbXB0ZVZvaXhcIiwgdHlwOiByKFwiRGVjb21wdGVWb2l4XCIpIH0sXG4gICAgICAgIHsganNvbjogXCJkZWNvbXB0ZU5vbWluYXRpZlwiLCBqczogXCJkZWNvbXB0ZU5vbWluYXRpZlwiLCB0eXA6IHIoXCJEZWNvbXB0ZU5vbWluYXRpZlwiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkRlY29tcHRlTm9taW5hdGlmXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwibm9uVm90YW50XCIsIGpzOiBcIm5vblZvdGFudFwiLCB0eXA6IHUodW5kZWZpbmVkLCBudWxsKSB9LFxuICAgICAgICB7IGpzb246IFwibm9uVm90YW50c1wiLCBqczogXCJub25Wb3RhbnRzXCIsIHR5cDogdSh1bmRlZmluZWQsIHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCwgXCJcIikpIH0sXG4gICAgICAgIHsganNvbjogXCJwb3VyXCIsIGpzOiBcInBvdXJcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImNvbnRyZVwiLCBqczogXCJjb250cmVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImFic3RlbnRpb25cIiwganM6IFwiYWJzdGVudGlvblwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwiYWJzdGVudGlvbnNcIiwganM6IFwiYWJzdGVudGlvbnNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcInBvdXJzXCIsIGpzOiBcInBvdXJzXCIsIHR5cDogdSh1bmRlZmluZWQsIHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkpIH0sXG4gICAgICAgIHsganNvbjogXCJjb250cmVzXCIsIGpzOiBcImNvbnRyZXNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJWb3RhbnRzQ2xhc3NcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJ2b3RhbnRcIiwganM6IFwidm90YW50XCIsIHR5cDogdShhKHIoXCJWb3RhbnRcIikpLCByKFwiVm90YW50XCIpKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIlZvdGFudFwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImFjdGV1clJlZlwiLCBqczogXCJhY3RldXJSZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJtYW5kYXRSZWZcIiwganM6IFwibWFuZGF0UmVmXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwicGFyRGVsZWdhdGlvblwiLCBqczogXCJwYXJEZWxlZ2F0aW9uXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJudW1QbGFjZVwiLCBqczogXCJudW1QbGFjZVwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KFwiXCIsIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwiY2F1c2VQb3NpdGlvblZvdGVcIiwganM6IFwiY2F1c2VQb3NpdGlvblZvdGVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIkNhdXNlUG9zaXRpb25Wb3RlXCIpKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkRlY29tcHRlVm9peFwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcInBvdXJcIiwganM6IFwicG91clwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcImNvbnRyZVwiLCBqczogXCJjb250cmVcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJhYnN0ZW50aW9uXCIsIGpzOiBcImFic3RlbnRpb25cIiwgdHlwOiB1KHVuZGVmaW5lZCwgXCJcIikgfSxcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudFwiLCBqczogXCJub25Wb3RhbnRcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShcIlwiLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudHNcIiwganM6IFwibm9uVm90YW50c1wiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgICB7IGpzb246IFwiYWJzdGVudGlvbnNcIiwganM6IFwiYWJzdGVudGlvbnNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgXCJcIikgfSxcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudHNWb2xvbnRhaXJlc1wiLCBqczogXCJub25Wb3RhbnRzVm9sb250YWlyZXNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgXCJcIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJNb2RlUHVibGljYXRpb25EZXNWb3Rlc1wiOiBbXG4gICAgICAgIFwiRGVjb21wdGVEaXNzaWRlbnRzUG9zaXRpb25Hcm91cGVcIixcbiAgICAgICAgXCJEZWNvbXB0ZU5vbWluYXRpZlwiLFxuICAgIF0sXG4gICAgXCJDb2RlXCI6IFtcbiAgICAgICAgXCJhZG9wdMOpXCIsXG4gICAgICAgIFwicmVqZXTDqVwiLFxuICAgIF0sXG4gICAgXCJMaWJlbGxlXCI6IFtcbiAgICAgICAgXCJsJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlIGEgYWRvcHTDqVwiLFxuICAgICAgICBcIkwnQXNzZW1ibMOpZSBuYXRpb25hbGUgbidhIHBhcyBhZG9wdMOpXCIsXG4gICAgICAgIFwiTGUgQ29uZ3LDqHMgZHUgUGFybGVtZW50IGEgYWRvcHTDqVwiLFxuICAgICAgICBcIkxlIENvbmdyw6hzIGR1IFBhcmxlbWVudCBuJ2EgcGFzIGFkb3B0w6lcIixcbiAgICAgICAgICBdLFxuICAgIFwiQ29kZVR5cGVWb3RlXCI6IFtcbiAgICAgICAgXCJNT0NcIixcbiAgICAgICAgXCJTQVRcIixcbiAgICAgICAgXCJTUE9cIixcbiAgICAgICAgXCJTUFNcIixcbiAgICAgICAgXCJTU0dcIixcbiAgICBdLFxuICAgIFwiTGliZWxsZVR5cGVWb3RlXCI6IFtcbiAgICAgICAgXCJtb3Rpb24gZGUgY2Vuc3VyZVwiLFxuICAgICAgICBcInNjcnV0aW4gcHVibGljIG9yZGluYWlyZVwiLFxuICAgICAgICBcInNjcnV0aW4gcHVibGljIHNvbGVubmVsXCIsXG4gICAgICAgIFwic2NydXRpbiDDoCBsYSB0cmlidW5lXCIsXG4gICAgICAgIFwiU2NydXRpbiBzb2xlbm5lbCBjb25ncsOoc1wiLFxuICAgIF0sXG4gICAgXCJUeXBlTWFqb3JpdGVcIjogW1xuICAgICAgICBcIk1ham9yaXTDqSBhYnNvbHVlIGRlcyBzdWZmcmFnZXMgZXhwcmltw6lzXCIsXG4gICAgICAgIFwibWFqb3JpdMOpIGFic29sdWUgZGVzIHN1ZmZyYWdlcyBleHByaW3DqXNcIixcbiAgICAgICAgXCJtYWpvcml0w6kgZGVzIG1lbWJyZXMgY29tcG9zYW50IGwnQXNzZW1ibMOpZSBuYXRpb25hbGVcIixcbiAgICAgICAgXCJtYWpvcml0w6kgZGVzIG1lbWJyZXMgY29tcG9zYW50cyBjb21wb3NhbnQgbCdBc3NlbWJsw6llXCIsXG4gICAgICAgIFwibWFqb3JpdMOpIGRlcyBtZW1icmVzIGNvbXBvc2FudHMgY29tcG9zYW50IGwnQXNzZW1ibMOpZSBuYXRpb25hbGVcIixcbiAgICAgICAgXCJNYWpvcml0w6kgcmVxdWlzZSBwb3VyIHVuIENvbmdyw6hzXCIsXG4gICAgICAgIFwiTWFqb3JpdMOpIHJlcXVpc2UgcG91ciB1bmUgbW90aW9uIGRlIGNlbnN1cmVcIixcbiAgICBdLFxuICAgIFwiQ2F1c2VQb3NpdGlvblZvdGVcIjogW1xuICAgICAgICBcIk1HXCIsXG4gICAgICAgIFwiUEFOXCIsXG4gICAgICAgIFwiUFNFXCIsXG4gICAgXSxcbiAgICBcIlBvc2l0aW9uTWFqb3JpdGFpcmVcIjogW1xuICAgICAgICBcImFic3RlbnRpb25cIixcbiAgICAgICAgXCJjb250cmVcIixcbiAgICAgICAgXCJwb3VyXCIsXG4gICAgXSxcbiAgICBcIkxpZXVWb3RlXCI6IFtcbiAgICAgICAgXCJDb25ncsOoc1wiLFxuICAgICAgICBcIkjDqW1pY3ljbGVcIixcbiAgICAgICAgXCJTYWxvbnNcIixcbiAgICBdLFxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQTZEQSxXQUFZQSx1QkFBdUIsMEJBQXZCQSx1QkFBdUI7RUFBdkJBLHVCQUF1QjtFQUF2QkEsdUJBQXVCO0VBQUEsT0FBdkJBLHVCQUF1QjtBQUFBO0FBZ0JuQyxXQUFZQyxJQUFJLDBCQUFKQSxJQUFJO0VBQUpBLElBQUk7RUFBSkEsSUFBSTtFQUFBLE9BQUpBLElBQUk7QUFBQTtBQUtoQixXQUFZQyxPQUFPLDBCQUFQQSxPQUFPO0VBQVBBLE9BQU87RUFBUEEsT0FBTztFQUFQQSxPQUFPO0VBQVBBLE9BQU87RUFBQSxPQUFQQSxPQUFPO0FBQUE7QUE2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