@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
575 lines (571 loc) • 69.6 kB
JavaScript
// To parse this data:
//
// import { Convert, Reunion, Agendas } from "./file";
//
// const reunion = Convert.toReunion(json);
// const agendas = Convert.toAgendas(json);
//
// These functions will throw an error if the JSON doesn't
// match the expected interface, even if the JSON is valid.
export let ReunionXsiType = /*#__PURE__*/function (ReunionXsiType) {
ReunionXsiType["ReunionCommissionType"] = "reunionCommission_type";
ReunionXsiType["ReunionInitParlementaireType"] = "reunionInitParlementaire_type";
ReunionXsiType["SeanceType"] = "seance_type";
return ReunionXsiType;
}({});
export let PointOdjXsiType = /*#__PURE__*/function (PointOdjXsiType) {
PointOdjXsiType["PodjReunionType"] = "podjReunion_type";
PointOdjXsiType["PodjSeanceConfPresType"] = "podjSeanceConfPres_type";
return PointOdjXsiType;
}({});
export let EtatCycleDeVie = /*#__PURE__*/function (EtatCycleDeVie) {
EtatCycleDeVie["Annul\xE9"] = "Annul\xE9";
EtatCycleDeVie["Confirm\xE9"] = "Confirm\xE9";
EtatCycleDeVie["Eventuel"] = "Eventuel";
EtatCycleDeVie["Supprim\xE9"] = "Supprim\xE9";
return EtatCycleDeVie;
}({});
export let NatureTravauxOdj = /*#__PURE__*/function (NatureTravauxOdj) {
NatureTravauxOdj["Odjpr"] = "ODJPR";
NatureTravauxOdj["Odjsn"] = "ODJSN";
return NatureTravauxOdj;
}({});
export let Procedure = /*#__PURE__*/function (Procedure) {
Procedure["DiscussionG\xE9n\xE9raleCommune"] = "discussion g\xE9n\xE9rale commune";
Procedure["Proc\xE9dureDExamenSimplifi\xE9eArticle103"] = "proc\xE9dure d'examen simplifi\xE9e-Article 103";
Procedure["Proc\xE9dureDExamenSimplifi\xE9eArticle106"] = "proc\xE9dure d'examen simplifi\xE9e-Article 106";
Procedure["Proc\xE9dureDExamenSimplifi\xE9eArticle107"] = "proc\xE9dure d'examen simplifi\xE9e-Article 107";
Procedure["Proc\xE9dureDeL\xE9gislationEnCommissionArticle1071"] = "proc\xE9dure de l\xE9gislation en commission-Article 107-1";
return Procedure;
}({});
export let TypePointOdj = /*#__PURE__*/function (TypePointOdj) {
TypePointOdj["AmendementsArt88"] = "Amendements (Art. 88)";
TypePointOdj["AmendementsArt91"] = "Amendements (Art. 91)";
TypePointOdj["Audition"] = "Audition";
TypePointOdj["AuditionMinistre"] = "Audition ministre";
TypePointOdj["AuditionMinistreOuverte\xC0LaPresse"] = "Audition ministre ouverte \xE0 la presse";
TypePointOdj["AuditionOuverte\xC0LaPresse"] = "Audition ouverte \xE0 la presse";
TypePointOdj["Communication"] = "Communication";
TypePointOdj["ConstitutionDeMissionDInformation"] = "Constitution de mission d'information";
TypePointOdj["Discussion"] = "Discussion";
TypePointOdj["D\xE9batDInitiativeParlementaire"] = "D\xE9bat d'initiative parlementaire";
TypePointOdj["D\xE9clarationDuGouvernementSuivieDUnD\xE9bat"] = "D\xE9claration du Gouvernement suivie d'un d\xE9bat";
TypePointOdj["EchangesDeVues"] = "Echanges de vues";
TypePointOdj["Examen"] = "Examen";
TypePointOdj["ExplicationsDeVoteDesGroupesEtVoteParScrutinPublic"] = "Explications de vote des groupes et vote par scrutin public";
TypePointOdj["ExplicationsDeVoteEtVoteParScrutinPublic"] = "Explications de vote et vote par scrutin public";
TypePointOdj["FixationDeLOrdreDuJour"] = "Fixation de l'ordre du jour";
TypePointOdj["NominationBureau"] = "Nomination bureau";
TypePointOdj["NominationCandidatsOrganismeExtraparlementaire"] = "Nomination candidats organisme extraparlementaire";
TypePointOdj["NominationDUnMembreDUneMissionDInformation"] = "Nomination d'un membre d'une mission d'information";
TypePointOdj["NominationRapporteur"] = "Nomination rapporteur";
TypePointOdj["NominationRapporteurDApplication"] = "Nomination rapporteur d'application";
TypePointOdj["NominationRapporteurDInformation"] = "Nomination rapporteur d'information";
TypePointOdj["NominationRapporteurPourAvis"] = "Nomination rapporteur pour avis";
TypePointOdj["OuvertureEtCl\xF4tureDeSession"] = "Ouverture et cl\xF4ture de session";
TypePointOdj["QuestionsAuGouvernement"] = "Questions au Gouvernement";
TypePointOdj["QuestionsOralesSansD\xE9bat"] = "Questions orales sans d\xE9bat";
TypePointOdj["Rapport"] = "Rapport";
TypePointOdj["RapportDInformation"] = "Rapport d'information";
TypePointOdj["RapportPourAvis"] = "Rapport pour avis";
TypePointOdj["SeancesReserveesGroupeOppositionOuMinoritaire"] = "S\xE9ances r\xE9serv\xE9es \xE0 un groupe de l'opposition ou minoritaire";
TypePointOdj["SuiteDeLaDiscussion"] = "Suite de la discussion";
TypePointOdj["TableRonde"] = "Table ronde";
TypePointOdj["VoteParScrutinPublic"] = "Vote par scrutin public";
TypePointOdj["VoteSolennel"] = "Vote solennel";
return TypePointOdj;
}({});
export let FormatReunion = /*#__PURE__*/function (FormatReunion) {
FormatReunion["AuditionExterne"] = "AuditionExterne";
FormatReunion["AuditionParPresidentCommission"] = "AuditionParPresidentCommission";
FormatReunion["AuditionParRapporteur"] = "AuditionParRapporteur";
FormatReunion["Ordinaire"] = "Ordinaire";
return FormatReunion;
}({});
export let Quantieme = /*#__PURE__*/function (Quantieme) {
Quantieme["Deuxi\xE8me"] = "Deuxi\xE8me";
Quantieme["Premi\xE8re"] = "Premi\xE8re";
Quantieme["Troisi\xE8me"] = "Troisi\xE8me";
Quantieme["Unique"] = "Unique";
return Quantieme;
}({});
export let Presence = /*#__PURE__*/function (Presence) {
Presence["Absent"] = "absent";
Presence["Excus\xE9"] = "excus\xE9";
Presence["Pr\xE9sent"] = "pr\xE9sent";
return Presence;
}({});
export let Civ = /*#__PURE__*/function (Civ) {
Civ["M"] = "M.";
Civ["Mme"] = "Mme";
return Civ;
}({});
export let PersonneAuditionneeXsiType = /*#__PURE__*/function (PersonneAuditionneeXsiType) {
PersonneAuditionneeXsiType["IdActeurType"] = "IdActeur_type";
PersonneAuditionneeXsiType["IdPersonneExterneType"] = "IdPersonneExterne_type";
return PersonneAuditionneeXsiType;
}({});
export let TypeReunion = /*#__PURE__*/function (TypeReunion) {
TypeReunion["Dep"] = "DEP";
// Député
TypeReunion["Ga"] = "GA";
// Groupe d'amitié
TypeReunion["Ge"] = "GE";
// Groupe d'étude
TypeReunion["Gevi"] = "GEVI";
// Groupe d'étude à vocation internationale
TypeReunion["Gp"] = "GP";
// Groupe parlementaire
TypeReunion["H\xE9Aur\xE9lien"] = "H\xC9 Aur\xE9lien";
return TypeReunion;
}({});
// Converts JSON strings to/from your types
// and asserts the results of JSON.parse at runtime
export class Convert {
static toAgendas(json) {
return cast(JSON.parse(json), r("Agendas"));
}
static agendasToJson(value) {
return JSON.stringify(uncast(value, r("Agendas")), null, 2);
}
static toReunion(json) {
return cast(JSON.parse(json), r("Reunion"));
}
static reunionToJson(value) {
return JSON.stringify(uncast(value, r("Reunion")), 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) {
var 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) {
var 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 = {
Agendas: o([{
json: "reunions",
js: "reunions",
typ: a(r("Reunion"))
}], false),
Reunion: o([{
json: "schemaVersion",
js: "schemaVersion",
typ: u(undefined, "")
}, {
json: "xsiType",
js: "xsiType",
typ: u(undefined, r("ReunionXsiType"))
}, {
json: "uid",
js: "uid",
typ: ""
}, {
json: "timestampDebut",
js: "timestampDebut",
typ: Date
}, {
json: "timestampFin",
js: "timestampFin",
typ: u(undefined, Date)
}, {
json: "lieu",
js: "lieu",
typ: u(undefined, r("Lieu"))
}, {
json: "cycleDeVie",
js: "cycleDeVie",
typ: r("CycleDeVie")
}, {
json: "demandeurs",
js: "demandeurs",
typ: u(undefined, r("Demandeurs"))
}, {
json: "organeReuniRef",
js: "organeReuniRef",
typ: u(undefined, "")
}, {
json: "typeReunion",
js: "typeReunion",
typ: u(undefined, r("TypeReunion"))
}, {
json: "participants",
js: "participants",
typ: u(undefined, r("Participants"))
}, {
json: "sessionRef",
js: "sessionRef",
typ: u(undefined, "")
}, {
json: "ouverturePresse",
js: "ouverturePresse",
typ: u(undefined, false)
}, {
json: "odj",
js: "odj",
typ: u(undefined, r("Odj"))
}, {
json: "compteRenduRef",
js: "compteRenduRef",
typ: u(undefined, "")
}, {
json: "identifiants",
js: "identifiants",
typ: u(undefined, r("Identifiants"))
}, {
json: "formatReunion",
js: "formatReunion",
typ: u(undefined, r("FormatReunion"))
}, {
json: "infosReunionsInternationale",
js: "infosReunionsInternationale",
typ: u(undefined, r("InfosReunionsInternationale"))
}, {
json: "captationVideo",
js: "captationVideo",
typ: u(undefined, false)
}, {
json: "visioConference",
js: "visioConference",
typ: u(undefined, "")
}], false),
Odj: o([{
json: "convocationOdj",
js: "convocationOdj",
typ: u(undefined, a(""))
}, {
json: "resumeOdj",
js: "resumeOdj",
typ: u(undefined, a(""))
}, {
json: "pointsOdj",
js: "pointsOdj",
typ: u(undefined, a(r("PointOdj")))
}], false),
PointOdj: o([{
json: "xsiType",
js: "xsiType",
typ: r("PointOdjXsiType")
}, {
json: "uid",
js: "uid",
typ: ""
}, {
json: "cycleDeVie",
js: "cycleDeVie",
typ: r("CycleDeVie")
}, {
json: "objet",
js: "objet",
typ: ""
}, {
json: "procedure",
js: "procedure",
typ: u(undefined, r("Procedure"))
}, {
json: "dossiersLegislatifsRefs",
js: "dossiersLegislatifsRefs",
typ: u(undefined, a(""))
}, {
json: "typePointOdj",
js: "typePointOdj",
typ: r("TypePointOdj")
}, {
json: "comiteSecret",
js: "comiteSecret",
typ: false
}, {
json: "natureTravauxOdj",
js: "natureTravauxOdj",
typ: u(undefined, r("NatureTravauxOdj"))
}, {
json: "dateConfPres",
js: "dateConfPres",
typ: u(undefined, Date)
}, {
json: "dateLettreMinistre",
js: "dateLettreMinistre",
typ: u(undefined, Date)
}], false),
CycleDeVie: o([{
json: "etat",
js: "etat",
typ: r("EtatCycleDeVie")
}, {
json: "chrono",
js: "chrono",
typ: r("Chrono")
}], false),
Chrono: o([{
json: "creation",
js: "creation",
typ: Date
}, {
json: "cloture",
js: "cloture",
typ: u(undefined, Date)
}], false),
Demandeurs: o([{
json: "acteurs",
js: "acteurs",
typ: u(undefined, a(r("DemandeurActeur")))
}, {
json: "organe",
js: "organe",
typ: u(undefined, r("DemandeurOrgane"))
}], false),
DemandeurActeur: o([{
json: "nom",
js: "nom",
typ: u(undefined, "")
}, {
json: "acteurRef",
js: "acteurRef",
typ: ""
}], false),
DemandeurOrgane: o([{
json: "nom",
js: "nom",
typ: ""
}, {
json: "organeRef",
js: "organeRef",
typ: ""
}], false),
Identifiants: o([{
json: "numSeanceJo",
js: "numSeanceJo",
typ: u(undefined, "")
}, {
json: "idJo",
js: "idJo",
typ: u(undefined, "")
}, {
json: "quantieme",
js: "quantieme",
typ: r("Quantieme")
}, {
json: "dateSeance",
js: "dateSeance",
typ: Date
}], false),
InfosReunionsInternationale: o([{
json: "estReunionInternationale",
js: "estReunionInternationale",
typ: false
}, {
json: "listePays",
js: "listePays",
typ: u(undefined, a(""))
}, {
json: "informationsComplementaires",
js: "informationsComplementaires",
typ: u(undefined, "")
}], false),
Lieu: o([{
json: "code",
js: "code",
typ: u(undefined, "")
}, {
json: "libelleCourt",
js: "libelleCourt",
typ: u(undefined, "")
}, {
json: "libelleLong",
js: "libelleLong",
typ: u(undefined, "")
}, {
json: "lieuRef",
js: "lieuRef",
typ: u(undefined, "")
}], false),
Participants: o([{
json: "participantsInternes",
js: "participantsInternes",
typ: u(undefined, a(r("ParticipantInterne")))
}, {
json: "personnesAuditionnees",
js: "personnesAuditionnees",
typ: u(undefined, a(r("PersonneAuditionnee")))
}], false),
ParticipantInterne: o([{
json: "acteurRef",
js: "acteurRef",
typ: ""
}, {
json: "presence",
js: "presence",
typ: r("Presence")
}], false),
PersonneAuditionnee: o([{
json: "xsiType",
js: "xsiType",
typ: r("PersonneAuditionneeXsiType")
}, {
json: "uid",
js: "uid",
typ: ""
}, {
json: "ident",
js: "ident",
typ: r("Ident")
}, {
json: "dateNais",
js: "dateNais",
typ: u(undefined, Date)
}], false),
Ident: o([{
json: "civ",
js: "civ",
typ: r("Civ")
}, {
json: "prenom",
js: "prenom",
typ: ""
}, {
json: "nom",
js: "nom",
typ: ""
}, {
json: "alpha",
js: "alpha",
typ: u(undefined, "")
}, {
json: "trigramme",
js: "trigramme",
typ: u(undefined, "")
}], false),
ReunionXsiType: ["reunionCommission_type", "reunionInitParlementaire_type", "seance_type"],
PointOdjXsiType: ["podjReunion_type", "podjSeanceConfPres_type"],
EtatCycleDeVie: ["Annulé", "Confirmé", "Eventuel", "Supprimé"],
NatureTravauxOdj: ["ODJPR", "ODJSN"],
Procedure: ["discussion générale commune", "procédure d'examen simplifiée-Article 103", "procédure d'examen simplifiée-Article 106", "procédure d'examen simplifiée-Article 107", "procédure de législation en commission-Article 107-1"],
TypePointOdj: ["Amendements (Art. 88)", "Amendements (Art. 91)", "Audition", "Audition ministre", "Audition ministre ouverte à la presse", "Audition ouverte à la presse", "Communication", "Constitution de mission d'information", "Discussion", "Débat d'initiative parlementaire", "Déclaration du Gouvernement suivie d'un débat", "Echanges de vues", "Examen", "Explications de vote des groupes et vote par scrutin public", "Explications de vote et vote par scrutin public", "Fixation de l'ordre du jour", "Nomination bureau", "Nomination candidats organisme extraparlementaire", "Nomination d'un membre d'une mission d'information", "Nomination rapporteur", "Nomination rapporteur d'application", "Nomination rapporteur d'information", "Nomination rapporteur pour avis", "Ouverture et clôture de session", "Questions au Gouvernement", "Questions orales sans débat", "Rapport", "Rapport d'information", "Rapport pour avis", "Séances réservées à un groupe de l'opposition ou minoritaire", "Suite de la discussion", "Table ronde", "Vote par scrutin public", "Vote solennel"],
FormatReunion: ["AuditionExterne", "AuditionParPresidentCommission", "AuditionParRapporteur", "Ordinaire"],
Quantieme: ["Deuxième", "Première", "Troisième", "Unique"],
Presence: ["absent", "excusé", "présent"],
Civ: ["M.", "Mme"],
PersonneAuditionneeXsiType: ["IdActeur_type", "IdPersonneExterne_type"],
TypeReunion: ["DEP", "GA", "GE", "GEVI", "GP", "HÉ Aurélien"]
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXVuaW9uWHNpVHlwZSIsIlBvaW50T2RqWHNpVHlwZSIsIkV0YXRDeWNsZURlVmllIiwiTmF0dXJlVHJhdmF1eE9kaiIsIlByb2NlZHVyZSIsIlR5cGVQb2ludE9kaiIsIkZvcm1hdFJldW5pb24iLCJRdWFudGllbWUiLCJQcmVzZW5jZSIsIkNpdiIsIlBlcnNvbm5lQXVkaXRpb25uZWVYc2lUeXBlIiwiVHlwZVJldW5pb24iLCJDb252ZXJ0IiwidG9BZ2VuZGFzIiwianNvbiIsImNhc3QiLCJKU09OIiwicGFyc2UiLCJyIiwiYWdlbmRhc1RvSnNvbiIsInZhbHVlIiwic3RyaW5naWZ5IiwidW5jYXN0IiwidG9SZXVuaW9uIiwicmV1bmlvblRvSnNvbiIsImludmFsaWRWYWx1ZSIsInR5cCIsInZhbCIsImtleSIsIkVycm9yIiwianNvblRvSlNQcm9wcyIsImpzb25Ub0pTIiwidW5kZWZpbmVkIiwibWFwIiwicHJvcHMiLCJmb3JFYWNoIiwicCIsImpzIiwianNUb0pTT05Qcm9wcyIsImpzVG9KU09OIiwidHJhbnNmb3JtIiwiZ2V0UHJvcHMiLCJ0cmFuc2Zvcm1QcmltaXRpdmUiLCJ0cmFuc2Zvcm1VbmlvbiIsInR5cHMiLCJsIiwibGVuZ3RoIiwiaSIsIl8iLCJ0cmFuc2Zvcm1FbnVtIiwiY2FzZXMiLCJpbmRleE9mIiwidHJhbnNmb3JtQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJlbCIsInRyYW5zZm9ybURhdGUiLCJkIiwiRGF0ZSIsImlzTmFOIiwidmFsdWVPZiIsInRyYW5zZm9ybU9iamVjdCIsImFkZGl0aW9uYWwiLCJyZXN1bHQiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvcCIsInYiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJyZWYiLCJ0eXBlTWFwIiwidW5pb25NZW1iZXJzIiwiYXJyYXlJdGVtcyIsImEiLCJ1IiwibyIsIm5hbWUiLCJBZ2VuZGFzIiwiUmV1bmlvbiIsIk9kaiIsIlBvaW50T2RqIiwiQ3ljbGVEZVZpZSIsIkNocm9ubyIsIkRlbWFuZGV1cnMiLCJEZW1hbmRldXJBY3RldXIiLCJEZW1hbmRldXJPcmdhbmUiLCJJZGVudGlmaWFudHMiLCJJbmZvc1JldW5pb25zSW50ZXJuYXRpb25hbGUiLCJMaWV1IiwiUGFydGljaXBhbnRzIiwiUGFydGljaXBhbnRJbnRlcm5lIiwiUGVyc29ubmVBdWRpdGlvbm5lZSIsIklkZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2FnZW5kYXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVG8gcGFyc2UgdGhpcyBkYXRhOlxuLy9cbi8vICAgaW1wb3J0IHsgQ29udmVydCwgUmV1bmlvbiwgQWdlbmRhcyB9IGZyb20gXCIuL2ZpbGVcIjtcbi8vXG4vLyAgIGNvbnN0IHJldW5pb24gPSBDb252ZXJ0LnRvUmV1bmlvbihqc29uKTtcbi8vICAgY29uc3QgYWdlbmRhcyA9IENvbnZlcnQudG9BZ2VuZGFzKGpzb24pO1xuLy9cbi8vIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSBKU09OIGRvZXNuJ3Rcbi8vIG1hdGNoIHRoZSBleHBlY3RlZCBpbnRlcmZhY2UsIGV2ZW4gaWYgdGhlIEpTT04gaXMgdmFsaWQuXG5cbmltcG9ydCB7IEFjdGV1ciwgT3JnYW5lIH0gZnJvbSBcIi4vYWN0ZXVyc19ldF9vcmdhbmVzXCJcblxuZXhwb3J0IGludGVyZmFjZSBBZ2VuZGFzIHtcbiAgcmV1bmlvbnM6IFJldW5pb25bXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldW5pb24ge1xuICBzY2hlbWFWZXJzaW9uPzogc3RyaW5nXG4gIHhzaVR5cGU/OiBSZXVuaW9uWHNpVHlwZVxuICB1aWQ6IHN0cmluZ1xuICB0aW1lc3RhbXBEZWJ1dDogRGF0ZVxuICB0aW1lc3RhbXBGaW4/OiBEYXRlXG4gIGxpZXU/OiBMaWV1XG4gIGN5Y2xlRGVWaWU6IEN5Y2xlRGVWaWVcbiAgZGVtYW5kZXVycz86IERlbWFuZGV1cnNcbiAgb3JnYW5lUmV1bmlSZWY/OiBzdHJpbmdcbiAgb3JnYW5lUmV1bmk/OiBPcmdhbmUgLy8gQWRkZWQgYnkgVHJpY290ZXVzZXNcbiAgdHlwZVJldW5pb24/OiBUeXBlUmV1bmlvblxuICBwYXJ0aWNpcGFudHM/OiBQYXJ0aWNpcGFudHNcbiAgc2Vzc2lvblJlZj86IHN0cmluZ1xuICBvdXZlcnR1cmVQcmVzc2U/OiBib29sZWFuXG4gIG9kaj86IE9kalxuICBjb21wdGVSZW5kdVJlZj86IHN0cmluZ1xuICBpZGVudGlmaWFudHM/OiBJZGVudGlmaWFudHNcbiAgZm9ybWF0UmV1bmlvbj86IEZvcm1hdFJldW5pb25cbiAgaW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlPzogSW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlXG4gIGNhcHRhdGlvblZpZGVvPzogYm9vbGVhblxuICB2aXNpb0NvbmZlcmVuY2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGVudW0gUmV1bmlvblhzaVR5cGUge1xuICBSZXVuaW9uQ29tbWlzc2lvblR5cGUgPSBcInJldW5pb25Db21taXNzaW9uX3R5cGVcIixcbiAgUmV1bmlvbkluaXRQYXJsZW1lbnRhaXJlVHlwZSA9IFwicmV1bmlvbkluaXRQYXJsZW1lbnRhaXJlX3R5cGVcIixcbiAgU2VhbmNlVHlwZSA9IFwic2VhbmNlX3R5cGVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPZGoge1xuICBjb252b2NhdGlvbk9kaj86IHN0cmluZ1tdXG4gIHJlc3VtZU9kaj86IHN0cmluZ1tdXG4gIHBvaW50c09kaj86IFBvaW50T2RqW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb2ludE9kaiB7XG4gIHhzaVR5cGU6IFBvaW50T2RqWHNpVHlwZVxuICB1aWQ6IHN0cmluZ1xuICBjeWNsZURlVmllOiBDeWNsZURlVmllXG4gIG9iamV0OiBzdHJpbmdcbiAgcHJvY2VkdXJlPzogUHJvY2VkdXJlXG4gIGRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzPzogc3RyaW5nW11cbiAgdHlwZVBvaW50T2RqOiBUeXBlUG9pbnRPZGpcbiAgY29taXRlU2VjcmV0OiBib29sZWFuXG4gIG5hdHVyZVRyYXZhdXhPZGo/OiBOYXR1cmVUcmF2YXV4T2RqXG4gIGRhdGVDb25mUHJlcz86IERhdGVcbiAgZGF0ZUxldHRyZU1pbmlzdHJlPzogRGF0ZVxufVxuXG5leHBvcnQgZW51bSBQb2ludE9kalhzaVR5cGUge1xuICBQb2RqUmV1bmlvblR5cGUgPSBcInBvZGpSZXVuaW9uX3R5cGVcIixcbiAgUG9kalNlYW5jZUNvbmZQcmVzVHlwZSA9IFwicG9kalNlYW5jZUNvbmZQcmVzX3R5cGVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDeWNsZURlVmllIHtcbiAgZXRhdDogRXRhdEN5Y2xlRGVWaWVcbiAgY2hyb25vOiBDaHJvbm9cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaHJvbm8ge1xuICBjcmVhdGlvbjogRGF0ZVxuICBjbG90dXJlPzogRGF0ZVxufVxuXG5leHBvcnQgZW51bSBFdGF0Q3ljbGVEZVZpZSB7XG4gIEFubnVsw6kgPSBcIkFubnVsw6lcIixcbiAgQ29uZmlybcOpID0gXCJDb25maXJtw6lcIixcbiAgRXZlbnR1ZWwgPSBcIkV2ZW50dWVsXCIsXG4gIFN1cHByaW3DqSA9IFwiU3VwcHJpbcOpXCIsXG59XG5cbmV4cG9ydCBlbnVtIE5hdHVyZVRyYXZhdXhPZGoge1xuICBPZGpwciA9IFwiT0RKUFJcIixcbiAgT2Rqc24gPSBcIk9ESlNOXCIsXG59XG5cbmV4cG9ydCBlbnVtIFByb2NlZHVyZSB7XG4gIERpc2N1c3Npb25Hw6luw6lyYWxlQ29tbXVuZSA9IFwiZGlzY3Vzc2lvbiBnw6luw6lyYWxlIGNvbW11bmVcIixcbiAgUHJvY8OpZHVyZURFeGFtZW5TaW1wbGlmacOpZUFydGljbGUxMDMgPSBcInByb2PDqWR1cmUgZCdleGFtZW4gc2ltcGxpZmnDqWUtQXJ0aWNsZSAxMDNcIixcbiAgUHJvY8OpZHVyZURFeGFtZW5TaW1wbGlmacOpZUFydGljbGUxMDYgPSBcInByb2PDqWR1cmUgZCdleGFtZW4gc2ltcGxpZmnDqWUtQXJ0aWNsZSAxMDZcIixcbiAgUHJvY8OpZHVyZURFeGFtZW5TaW1wbGlmacOpZUFydGljbGUxMDcgPSBcInByb2PDqWR1cmUgZCdleGFtZW4gc2ltcGxpZmnDqWUtQXJ0aWNsZSAxMDdcIixcbiAgUHJvY8OpZHVyZURlTMOpZ2lzbGF0aW9uRW5Db21taXNzaW9uQXJ0aWNsZTEwNzEgPSBcInByb2PDqWR1cmUgZGUgbMOpZ2lzbGF0aW9uIGVuIGNvbW1pc3Npb24tQXJ0aWNsZSAxMDctMVwiLFxufVxuXG5leHBvcnQgZW51bSBUeXBlUG9pbnRPZGoge1xuICBBbWVuZGVtZW50c0FydDg4ID0gXCJBbWVuZGVtZW50cyAoQXJ0LiA4OClcIixcbiAgQW1lbmRlbWVudHNBcnQ5MSA9IFwiQW1lbmRlbWVudHMgKEFydC4gOTEpXCIsXG4gIEF1ZGl0aW9uID0gXCJBdWRpdGlvblwiLFxuICBBdWRpdGlvbk1pbmlzdHJlID0gXCJBdWRpdGlvbiBtaW5pc3RyZVwiLFxuICBBdWRpdGlvbk1pbmlzdHJlT3V2ZXJ0ZcOATGFQcmVzc2UgPSBcIkF1ZGl0aW9uIG1pbmlzdHJlIG91dmVydGUgw6AgbGEgcHJlc3NlXCIsXG4gIEF1ZGl0aW9uT3V2ZXJ0ZcOATGFQcmVzc2UgPSBcIkF1ZGl0aW9uIG91dmVydGUgw6AgbGEgcHJlc3NlXCIsXG4gIENvbW11bmljYXRpb24gPSBcIkNvbW11bmljYXRpb25cIixcbiAgQ29uc3RpdHV0aW9uRGVNaXNzaW9uREluZm9ybWF0aW9uID0gXCJDb25zdGl0dXRpb24gZGUgbWlzc2lvbiBkJ2luZm9ybWF0aW9uXCIsXG4gIERpc2N1c3Npb24gPSBcIkRpc2N1c3Npb25cIixcbiAgRMOpYmF0REluaXRpYXRpdmVQYXJsZW1lbnRhaXJlID0gXCJEw6liYXQgZCdpbml0aWF0aXZlIHBhcmxlbWVudGFpcmVcIixcbiAgRMOpY2xhcmF0aW9uRHVHb3V2ZXJuZW1lbnRTdWl2aWVEVW5Ew6liYXQgPSBcIkTDqWNsYXJhdGlvbiBkdSBHb3V2ZXJuZW1lbnQgc3VpdmllIGQndW4gZMOpYmF0XCIsXG4gIEVjaGFuZ2VzRGVWdWVzID0gXCJFY2hhbmdlcyBkZSB2dWVzXCIsXG4gIEV4YW1lbiA9IFwiRXhhbWVuXCIsXG4gIEV4cGxpY2F0aW9uc0RlVm90ZURlc0dyb3VwZXNFdFZvdGVQYXJTY3J1dGluUHVibGljID0gXCJFeHBsaWNhdGlvbnMgZGUgdm90ZSBkZXMgZ3JvdXBlcyBldCB2b3RlIHBhciBzY3J1dGluIHB1YmxpY1wiLFxuICBFeHBsaWNhdGlvbnNEZVZvdGVFdFZvdGVQYXJTY3J1dGluUHVibGljID0gXCJFeHBsaWNhdGlvbnMgZGUgdm90ZSBldCB2b3RlIHBhciBzY3J1dGluIHB1YmxpY1wiLFxuICBGaXhhdGlvbkRlTE9yZHJlRHVKb3VyID0gXCJGaXhhdGlvbiBkZSBsJ29yZHJlIGR1IGpvdXJcIixcbiAgTm9taW5hdGlvbkJ1cmVhdSA9IFwiTm9taW5hdGlvbiBidXJlYXVcIixcbiAgTm9taW5hdGlvbkNhbmRpZGF0c09yZ2FuaXNtZUV4dHJhcGFybGVtZW50YWlyZSA9IFwiTm9taW5hdGlvbiBjYW5kaWRhdHMgb3JnYW5pc21lIGV4dHJhcGFybGVtZW50YWlyZVwiLFxuICBOb21pbmF0aW9uRFVuTWVtYnJlRFVuZU1pc3Npb25ESW5mb3JtYXRpb24gPSBcIk5vbWluYXRpb24gZCd1biBtZW1icmUgZCd1bmUgbWlzc2lvbiBkJ2luZm9ybWF0aW9uXCIsXG4gIE5vbWluYXRpb25SYXBwb3J0ZXVyID0gXCJOb21pbmF0aW9uIHJhcHBvcnRldXJcIixcbiAgTm9taW5hdGlvblJhcHBvcnRldXJEQXBwbGljYXRpb24gPSBcIk5vbWluYXRpb24gcmFwcG9ydGV1ciBkJ2FwcGxpY2F0aW9uXCIsXG4gIE5vbWluYXRpb25SYXBwb3J0ZXVyREluZm9ybWF0aW9uID0gXCJOb21pbmF0aW9uIHJhcHBvcnRldXIgZCdpbmZvcm1hdGlvblwiLFxuICBOb21pbmF0aW9uUmFwcG9ydGV1clBvdXJBdmlzID0gXCJOb21pbmF0aW9uIHJhcHBvcnRldXIgcG91ciBhdmlzXCIsXG4gIE91dmVydHVyZUV0Q2zDtHR1cmVEZVNlc3Npb24gPSBcIk91dmVydHVyZSBldCBjbMO0dHVyZSBkZSBzZXNzaW9uXCIsXG4gIFF1ZXN0aW9uc0F1R291dmVybmVtZW50ID0gXCJRdWVzdGlvbnMgYXUgR291dmVybmVtZW50XCIsXG4gIFF1ZXN0aW9uc09yYWxlc1NhbnNEw6liYXQgPSBcIlF1ZXN0aW9ucyBvcmFsZXMgc2FucyBkw6liYXRcIixcbiAgUmFwcG9ydCA9IFwiUmFwcG9ydFwiLFxuICBSYXBwb3J0REluZm9ybWF0aW9uID0gXCJSYXBwb3J0IGQnaW5mb3JtYXRpb25cIixcbiAgUmFwcG9ydFBvdXJBdmlzID0gXCJSYXBwb3J0IHBvdXIgYXZpc1wiLFxuICBTZWFuY2VzUmVzZXJ2ZWVzR3JvdXBlT3Bwb3NpdGlvbk91TWlub3JpdGFpcmUgPSBcIlPDqWFuY2VzIHLDqXNlcnbDqWVzIMOgIHVuIGdyb3VwZSBkZSBsJ29wcG9zaXRpb24gb3UgbWlub3JpdGFpcmVcIixcbiAgU3VpdGVEZUxhRGlzY3Vzc2lvbiA9IFwiU3VpdGUgZGUgbGEgZGlzY3Vzc2lvblwiLFxuICBUYWJsZVJvbmRlID0gXCJUYWJsZSByb25kZVwiLFxuICBWb3RlUGFyU2NydXRpblB1YmxpYyA9IFwiVm90ZSBwYXIgc2NydXRpbiBwdWJsaWNcIixcbiAgVm90ZVNvbGVubmVsID0gXCJWb3RlIHNvbGVubmVsXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVtYW5kZXVycyB7XG4gIGFjdGV1cnM/OiBEZW1hbmRldXJBY3RldXJbXVxuICBvcmdhbmU/OiBEZW1hbmRldXJPcmdhbmVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZW1hbmRldXJBY3RldXIge1xuICBub20/OiBzdHJpbmdcbiAgYWN0ZXVyUmVmOiBzdHJpbmdcbiAgYWN0ZXVyPzogQWN0ZXVyIC8vIEFkZGVkIGJ5IFRyaWNvdGV1c2VzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVtYW5kZXVyT3JnYW5lIHtcbiAgbm9tOiBzdHJpbmdcbiAgb3JnYW5lUmVmOiBzdHJpbmdcbiAgb3JnYW5lPzogT3JnYW5lIC8vIEFkZGVkIGJ5IFRyaWNvdGV1c2VzXG59XG5cbmV4cG9ydCBlbnVtIEZvcm1hdFJldW5pb24ge1xuICBBdWRpdGlvbkV4dGVybmUgPSBcIkF1ZGl0aW9uRXh0ZXJuZVwiLFxuICBBdWRpdGlvblBhclByZXNpZGVudENvbW1pc3Npb24gPSBcIkF1ZGl0aW9uUGFyUHJlc2lkZW50Q29tbWlzc2lvblwiLFxuICBBdWRpdGlvblBhclJhcHBvcnRldXIgPSBcIkF1ZGl0aW9uUGFyUmFwcG9ydGV1clwiLFxuICBPcmRpbmFpcmUgPSBcIk9yZGluYWlyZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aWZpYW50cyB7XG4gIG51bVNlYW5jZUpvPzogc3RyaW5nXG4gIGlkSm8/OiBzdHJpbmdcbiAgcXVhbnRpZW1lOiBRdWFudGllbWVcbiAgZGF0ZVNlYW5jZTogc3RyaW5nXG59XG5cbmV4cG9ydCBlbnVtIFF1YW50aWVtZSB7XG4gIERldXhpw6htZSA9IFwiRGV1eGnDqG1lXCIsXG4gIFByZW1pw6hyZSA9IFwiUHJlbWnDqHJlXCIsXG4gIFRyb2lzacOobWUgPSBcIlRyb2lzacOobWVcIixcbiAgVW5pcXVlID0gXCJVbmlxdWVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmZvc1JldW5pb25zSW50ZXJuYXRpb25hbGUge1xuICBlc3RSZXVuaW9uSW50ZXJuYXRpb25hbGU6IGJvb2xlYW5cbiAgbGlzdGVQYXlzPzogc3RyaW5nW11cbiAgaW5mb3JtYXRpb25zQ29tcGxlbWVudGFpcmVzPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlldSB7XG4gIGNvZGU/OiBzdHJpbmdcbiAgbGliZWxsZUNvdXJ0Pzogc3RyaW5nXG4gIGxpYmVsbGVMb25nPzogc3RyaW5nXG4gIGxpZXVSZWY/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWNpcGFudHMge1xuICBwYXJ0aWNpcGFudHNJbnRlcm5lcz86IFBhcnRpY2lwYW50SW50ZXJuZVtdXG4gIHBlcnNvbm5lc0F1ZGl0aW9ubmVlcz86IFBlcnNvbm5lQXVkaXRpb25uZWVbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpY2lwYW50SW50ZXJuZSB7XG4gIGFjdGV1clJlZjogc3RyaW5nXG4gIGFjdGV1cj86IEFjdGV1ciAvLyBBZGRlZCBieSBUcmljb3RldXNlc1xuICBwcmVzZW5jZTogUHJlc2VuY2Vcbn1cblxuZXhwb3J0IGVudW0gUHJlc2VuY2Uge1xuICBBYnNlbnQgPSBcImFic2VudFwiLFxuICBFeGN1c8OpID0gXCJleGN1c8OpXCIsXG4gIFByw6lzZW50ID0gXCJwcsOpc2VudFwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbm5lQXVkaXRpb25uZWUge1xuICB4c2lUeXBlOiBQZXJzb25uZUF1ZGl0aW9ubmVlWHNpVHlwZVxuICB1aWQ6IHN0cmluZ1xuICBpZGVudDogSWRlbnRcbiAgZGF0ZU5haXM/OiBEYXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnQge1xuICBjaXY6IENpdlxuICBwcmVub206IHN0cmluZ1xuICBub206IHN0cmluZ1xuICBhbHBoYT86IHN0cmluZ1xuICB0cmlncmFtbWU/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGVudW0gQ2l2IHtcbiAgTSA9IFwiTS5cIixcbiAgTW1lID0gXCJNbWVcIixcbn1cblxuZXhwb3J0IGVudW0gUGVyc29ubmVBdWRpdGlvbm5lZVhzaVR5cGUge1xuICBJZEFjdGV1clR5cGUgPSBcIklkQWN0ZXVyX3R5cGVcIixcbiAgSWRQZXJzb25uZUV4dGVybmVUeXBlID0gXCJJZFBlcnNvbm5lRXh0ZXJuZV90eXBlXCIsXG59XG5cbmV4cG9ydCBlbnVtIFR5cGVSZXVuaW9uIHtcbiAgRGVwID0gXCJERVBcIiwgLy8gRMOpcHV0w6lcbiAgR2EgPSBcIkdBXCIsIC8vIEdyb3VwZSBkJ2FtaXRpw6lcbiAgR2UgPSBcIkdFXCIsIC8vIEdyb3VwZSBkJ8OpdHVkZVxuICBHZXZpID0gXCJHRVZJXCIsIC8vIEdyb3VwZSBkJ8OpdHVkZSDDoCB2b2NhdGlvbiBpbnRlcm5hdGlvbmFsZVxuICBHcCA9IFwiR1BcIiwgLy8gR3JvdXBlIHBhcmxlbWVudGFpcmVcbiAgSMOpQXVyw6lsaWVuID0gXCJIw4kgQXVyw6lsaWVuXCIsXG59XG5cbi8vIENvbnZlcnRzIEpTT04gc3RyaW5ncyB0by9mcm9tIHlvdXIgdHlwZXNcbi8vIGFuZCBhc3NlcnRzIHRoZSByZXN1bHRzIG9mIEpTT04ucGFyc2UgYXQgcnVudGltZVxuZXhwb3J0IGNsYXNzIENvbnZlcnQge1xuICBwdWJsaWMgc3RhdGljIHRvQWdlbmRhcyhqc29uOiBzdHJpbmcpOiBBZ2VuZGFzIHtcbiAgICByZXR1cm4gY2FzdChKU09OLnBhcnNlKGpzb24pLCByKFwiQWdlbmRhc1wiKSlcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWdlbmRhc1RvSnNvbih2YWx1ZTogQWdlbmRhcyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHVuY2FzdCh2YWx1ZSwgcihcIkFnZW5kYXNcIikpLCBudWxsLCAyKVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1JldW5pb24oanNvbjogc3RyaW5nKTogUmV1bmlvbiB7XG4gICAgcmV0dXJuIGNhc3QoSlNPTi5wYXJzZShqc29uKSwgcihcIlJldW5pb25cIikpXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHJldW5pb25Ub0pzb24odmFsdWU6IFJldW5pb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh1bmNhc3QodmFsdWUsIHIoXCJSZXVuaW9uXCIpKSwgbnVsbCwgMilcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkVmFsdWUodHlwOiBhbnksIHZhbDogYW55LCBrZXk6IGFueSA9IFwiXCIpOiBuZXZlciB7XG4gIGlmIChrZXkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIi4gRXhwZWN0ZWQgdHlwZSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB0eXAsXG4gICAgICApfSBidXQgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsKX1gLFxuICAgIClcbiAgfVxuICB0aHJvdyBFcnJvcihcbiAgICBgSW52YWxpZCB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KHZhbCl9IGZvciB0eXBlICR7SlNPTi5zdHJpbmdpZnkodHlwKX1gLFxuICApXG59XG5cbmZ1bmN0aW9uIGpzb25Ub0pTUHJvcHModHlwOiBhbnkpOiBhbnkge1xuICBpZiAodHlwLmpzb25Ub0pTID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgbWFwOiBhbnkgPSB7fVxuICAgIHR5cC5wcm9wcy5mb3JFYWNoKChwOiBhbnkpID0+IChtYXBbcC5qc29uXSA9IHsga2V5OiBwLmpzLCB0eXA6IHAudHlwIH0pKVxuICAgIHR5cC5qc29uVG9KUyA9IG1hcFxuICB9XG4gIHJldHVybiB0eXAuanNvblRvSlNcbn1cblxuZnVuY3Rpb24ganNUb0pTT05Qcm9wcyh0eXA6IGFueSk6IGFueSB7XG4gIGlmICh0eXAuanNUb0pTT04gPT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBtYXA6IGFueSA9IHt9XG4gICAgdHlwLnByb3BzLmZvckVhY2goKHA6IGFueSkgPT4gKG1hcFtwLmpzXSA9IHsga2V5OiBwLmpzb24sIHR5cDogcC50eXAgfSkpXG4gICAgdHlwLmpzVG9KU09OID0gbWFwXG4gIH1cbiAgcmV0dXJuIHR5cC5qc1RvSlNPTlxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm0odmFsOiBhbnksIHR5cDogYW55LCBnZXRQcm9wczogYW55LCBrZXk6IGFueSA9IFwiXCIpOiBhbnkge1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1QcmltaXRpdmUodHlwOiBzdHJpbmcsIHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodHlwZW9mIHR5cCA9PT0gdHlwZW9mIHZhbCkgcmV0dXJuIHZhbFxuICAgIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwsIGtleSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybVVuaW9uKHR5cHM6IGFueVtdLCB2YWw6IGFueSk6IGFueSB7XG4gICAgLy8gdmFsIG11c3QgdmFsaWRhdGUgYWdhaW5zdCBvbmUgdHlwIGluIHR5cHNcbiAgICBjb25zdCBsID0gdHlwcy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgY29uc3QgdHlwID0gdHlwc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybSh2YWwsIHR5cCwgZ2V0UHJvcHMpXG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH1cbiAgICByZXR1cm4gaW52YWxpZFZhbHVlKHR5cHMsIHZhbClcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybUVudW0oY2FzZXM6IHN0cmluZ1tdLCB2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKGNhc2VzLmluZGV4T2YodmFsKSAhPT0gLTEpIHJldHVybiB2YWxcbiAgICByZXR1cm4gaW52YWxpZFZhbHVlKGNhc2VzLCB2YWwpXG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1BcnJheSh0eXA6IGFueSwgdmFsOiBhbnkpOiBhbnkge1xuICAgIC8vIHZhbCBtdXN0IGJlIGFuIGFycmF5IHdpdGggbm8gaW52YWxpZCBlbGVtZW50c1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gaW52YWxpZFZhbHVlKFwiYXJyYXlcIiwgdmFsKVxuICAgIHJldHVybiB2YWwubWFwKChlbCkgPT4gdHJhbnNmb3JtKGVsLCB0eXAsIGdldFByb3BzKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybURhdGUodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWwpXG4gICAgaWYgKGlzTmFOKGQudmFsdWVPZigpKSkge1xuICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZShcIkRhdGVcIiwgdmFsKVxuICAgIH1cbiAgICByZXR1cm4gZFxuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT2JqZWN0KFxuICAgIHByb3BzOiB7IFtrOiBzdHJpbmddOiBhbnkgfSxcbiAgICBhZGRpdGlvbmFsOiBhbnksXG4gICAgdmFsOiBhbnksXG4gICk6IGFueSB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZShcIm9iamVjdFwiLCB2YWwpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge31cbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm9wcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBwcm9wID0gcHJvcHNba2V5XVxuICAgICAgY29uc3QgdiA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGtleSlcbiAgICAgICAgPyB2YWxba2V5XVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgcmVzdWx0W3Byb3Aua2V5XSA9IHRyYW5zZm9ybSh2LCBwcm9wLnR5cCwgZ2V0UHJvcHMsIHByb3Aua2V5KVxuICAgIH0pXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJhbnNmb3JtKHZhbFtrZXldLCBhZGRpdGlvbmFsLCBnZXRQcm9wcywga2V5KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgaWYgKHR5cCA9PT0gXCJhbnlcIikgcmV0dXJuIHZhbFxuICBpZiAodHlwID09PSBudWxsKSB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuIHZhbFxuICAgIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwpXG4gIH1cbiAgLy8gaWYgKHR5cCA9PT0gZmFsc2UpIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwpXG4gIHdoaWxlICh0eXBlb2YgdHlwID09PSBcIm9iamVjdFwiICYmIHR5cC5yZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIHR5cCA9IHR5cGVNYXBbdHlwLnJlZl1cbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh0eXApKSByZXR1cm4gdHJhbnNmb3JtRW51bSh0eXAsIHZhbClcbiAgaWYgKHR5cGVvZiB0eXAgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gdHlwLmhhc093blByb3BlcnR5KFwidW5pb25NZW1iZXJzXCIpXG4gICAgICA/IHRyYW5zZm9ybVVuaW9uKHR5cC51bmlvbk1lbWJlcnMsIHZhbClcbiAgICAgIDogdHlwLmhhc093blByb3BlcnR5KFwiYXJyYXlJdGVtc1wiKVxuICAgICAgICA/IHRyYW5zZm9ybUFycmF5KHR5cC5hcnJheUl0ZW1zLCB2YWwpXG4gICAgICAgIDogdHlwLmhhc093blByb3BlcnR5KFwicHJvcHNcIilcbiAgICAgICAgICA/IHRyYW5zZm9ybU9iamVjdChnZXRQcm9wcyh0eXApLCB0eXAuYWRkaXRpb25hbCwgdmFsKVxuICAgICAgICAgIDogaW52YWxpZFZhbHVlKHR5cCwgdmFsKVxuICB9XG4gIC8vIE51bWJlcnMgY2FuIGJlIHBhcnNlZCBieSBEYXRlIGJ1dCBzaG91bGRuJ3QgYmUuXG4gIGlmICh0eXAgPT09IERhdGUgJiYgdHlwZW9mIHZhbCAhPT0gXCJudW1iZXJcIikgcmV0dXJuIHRyYW5zZm9ybURhdGUodmFsKVxuICByZXR1cm4gdHJhbnNmb3JtUHJpbWl0aXZlKHR5cCwgdmFsKVxufVxuXG5mdW5jdGlvbiBjYXN0PFQ+KHZhbDogYW55LCB0eXA6IGFueSk6IFQge1xuICByZXR1cm4gdHJhbnNmb3JtKHZhbCwgdHlwLCBqc29uVG9KU1Byb3BzKVxufVxuXG5mdW5jdGlvbiB1bmNhc3Q8VD4odmFsOiBULCB0eXA6IGFueSk6IGFueSB7XG4gIHJldHVybiB0cmFuc2Zvcm0odmFsLCB0eXAsIGpzVG9KU09OUHJvcHMpXG59XG5cbmZ1bmN0aW9uIGEodHlwOiBhbnkpIHtcbiAgcmV0dXJuIHsgYXJyYXlJdGVtczogdHlwIH1cbn1cblxuZnVuY3Rpb24gdSguLi50eXBzOiBhbnlbXSkge1xuICByZXR1cm4geyB1bmlvbk1lbWJlcnM6IHR5cHMgfVxufVxuXG5mdW5jdGlvbiBvKHByb3BzOiBhbnlbXSwgYWRkaXRpb25hbDogYW55KSB7XG4gIHJldHVybiB7IHByb3BzLCBhZGRpdGlvbmFsIH1cbn1cblxuLy8gZnVuY3Rpb24gbShhZGRpdGlvbmFsOiBhbnkpIHtcbi8vICAgcmV0dXJuIHsgcHJvcHM6IFtdLCBhZGRpdGlvbmFsIH1cbi8vIH1cblxuZnVuY3Rpb24gcihuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHsgcmVmOiBuYW1lIH1cbn1cblxuY29uc3QgdHlwZU1hcDogYW55ID0ge1xuICBBZ2VuZGFzOiBvKFxuICAgIFt7IGpzb246IFwicmV1bmlvbnNcIiwganM6IFwicmV1bmlvbnNcIiwgdHlwOiBhKHIoXCJSZXVuaW9uXCIpKSB9XSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgUmV1bmlvbjogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwic2NoZW1hVmVyc2lvblwiLCBqczogXCJzY2hlbWFWZXJzaW9uXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwieHNpVHlwZVwiLFxuICAgICAgICBqczogXCJ4c2lUeXBlXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIHIoXCJSZXVuaW9uWHNpVHlwZVwiKSksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcInVpZFwiLCBqczogXCJ1aWRcIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwidGltZXN0YW1wRGVidXRcIiwganM6IFwidGltZXN0YW1wRGVidXRcIiwgdHlwOiBEYXRlIH0sXG4gICAgICB7IGpzb246IFwidGltZXN0YW1wRmluXCIsIGpzOiBcInRpbWVzdGFtcEZpblwiLCB0eXA6IHUodW5kZWZpbmVkLCBEYXRlKSB9LFxuICAgICAgeyBqc29uOiBcImxpZXVcIiwganM6IFwibGlldVwiLCB0eXA6IHUodW5kZWZpbmVkLCByKFwiTGlldVwiKSkgfSxcbiAgICAgIHsganNvbjogXCJjeWNsZURlVmllXCIsIGpzOiBcImN5Y2xlRGVWaWVcIiwgdHlwOiByKFwiQ3ljbGVEZVZpZVwiKSB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImRlbWFuZGV1cnNcIixcbiAgICAgICAganM6IFwiZGVtYW5kZXVyc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCByKFwiRGVtYW5kZXVyc1wiKSksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcIm9yZ2FuZVJldW5pUmVmXCIsIGpzOiBcIm9yZ2FuZVJldW5pUmVmXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwidHlwZVJldW5pb25cIixcbiAgICAgICAganM6IFwidHlwZVJldW5pb25cIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgcihcIlR5cGVSZXVuaW9uXCIpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwicGFydGljaXBhbnRzXCIsXG4gICAgICAgIGpzOiBcInBhcnRpY2lwYW50c1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCByKFwiUGFydGljaXBhbnRzXCIpKSxcbiAgICAgIH0sXG4gICAgICB7IGpzb246IFwic2Vzc2lvblJlZlwiLCBqczogXCJzZXNzaW9uUmVmXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwib3V2ZXJ0dXJlUHJlc3NlXCIsXG4gICAgICAgIGpzOiBcIm91dmVydHVyZVByZXNzZVwiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBmYWxzZSksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcIm9kalwiLCBqczogXCJvZGpcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIk9kalwiKSkgfSxcbiAgICAgIHsganNvbjogXCJjb21wdGVSZW5kdVJlZlwiLCBqczogXCJjb21wdGVSZW5kdVJlZlwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImlkZW50aWZpYW50c1wiLFxuICAgICAgICBqczogXCJpZGVudGlmaWFudHNcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgcihcIklkZW50aWZpYW50c1wiKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImZvcm1hdFJldW5pb25cIixcbiAgICAgICAganM6IFwiZm9ybWF0UmV1bmlvblwiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCByKFwiRm9ybWF0UmV1bmlvblwiKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZVwiLFxuICAgICAgICBqczogXCJpbmZvc1JldW5pb25zSW50ZXJuYXRpb25hbGVcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgcihcIkluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZVwiKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImNhcHRhdGlvblZpZGVvXCIsXG4gICAgICAgIGpzOiBcImNhcHRhdGlvblZpZGVvXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGZhbHNlKSxcbiAgICAgIH0sXG4gICAgICB7IGpzb246IFwidmlzaW9Db25mZXJlbmNlXCIsIGpzOiBcInZpc2lvQ29uZmVyZW5jZVwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIE9kajogbyhcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiY29udm9jYXRpb25PZGpcIixcbiAgICAgICAganM6IFwiY29udm9jYXRpb25PZGpcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgYShcIlwiKSksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcInJlc3VtZU9kalwiLCBqczogXCJyZXN1bWVPZGpcIiwgdHlwOiB1KHVuZGVmaW5lZCwgYShcIlwiKSkgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJwb2ludHNPZGpcIixcbiAgICAgICAganM6IFwicG9pbnRzT2RqXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGEocihcIlBvaW50T2RqXCIpKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIFBvaW50T2RqOiBvKFxuICAgIFtcbiAgICAgIHsganNvbjogXCJ4c2lUeXBlXCIsIGpzOiBcInhzaVR5cGVcIiwgdHlwOiByKFwiUG9pbnRPZGpYc2lUeXBlXCIpIH0sXG4gICAgICB7IGpzb246IFwidWlkXCIsIGpzOiBcInVpZFwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJjeWNsZURlVmllXCIsIGpzOiBcImN5Y2xlRGVWaWVcIiwgdHlwOiByKFwiQ3ljbGVEZVZpZVwiKSB9LFxuICAgICAgeyBqc29uOiBcIm9iamV0XCIsIGpzOiBcIm9iamV0XCIsIHR5cDogXCJcIiB9LFxuICAgICAgeyBqc29uOiBcInByb2NlZHVyZVwiLCBqczogXCJwcm9jZWR1cmVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIlByb2NlZHVyZVwiKSkgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJkb3NzaWVyc0xlZ2lzbGF0aWZzUmVmc1wiLFxuICAgICAgICBqczogXCJkb3NzaWVyc0xlZ2lzbGF0aWZzUmVmc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKFwiXCIpKSxcbiAgICAgIH0sXG4gICAgICB7IGpzb246IFwidHlwZVBvaW50T2RqXCIsIGpzOiBcInR5cGVQb2ludE9kalwiLCB0eXA6IHIoXCJUeXBlUG9pbnRPZGpcIikgfSxcbiAgICAgIHsganNvbjogXCJjb21pdGVTZWNyZXRcIiwganM6IFwiY29taXRlU2VjcmV0XCIsIHR5cDogZmFsc2UgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJuYXR1cmVUcmF2YXV4T2RqXCIsXG4gICAgICAgIGpzOiBcIm5hdHVyZVRyYXZhdXhPZGpcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgcihcIk5hdHVyZVRyYXZhdXhPZGpcIikpLFxuICAgICAgfSxcbiAgICAgIHsganNvbjogXCJkYXRlQ29uZlByZXNcIiwganM6IFwiZGF0ZUNvbmZQcmVzXCIsIHR5cDogdSh1bmRlZmluZWQsIERhdGUpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiZGF0ZUxldHRyZU1pbmlzdHJlXCIsXG4gICAgICAgIGpzOiBcImRhdGVMZXR0cmVNaW5pc3RyZVwiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBEYXRlKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgQ3ljbGVEZVZpZTogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwiZXRhdFwiLCBqczogXCJldGF0XCIsIHR5cDogcihcIkV0YXRDeWNsZURlVmllXCIpIH0sXG4gICAgICB7IGpzb246IFwiY2hyb25vXCIsIGpzOiBcImNocm9ub1wiLCB0eXA6IHIoXCJDaHJvbm9cIikgfSxcbiAgICBdLFxuICAgIGZhbHNlLFxuICApLFxuICBDaHJvbm86IG8oXG4gICAgW1xuICAgICAgeyBqc29uOiBcImNyZWF0aW9uXCIsIGpzOiBcImNyZWF0aW9uXCIsIHR5cDogRGF0ZSB9LFxuICAgICAgeyBqc29uOiBcImNsb3R1cmVcIiwganM6IFwiY2xvdHVyZVwiLCB0eXA6IHUodW5kZWZpbmVkLCBEYXRlKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIERlbWFuZGV1cnM6IG8oXG4gICAgW1xuICAgICAge1xuICAgICAgICBqc29uOiBcImFjdGV1cnNcIixcbiAgICAgICAganM6IFwiYWN0ZXVyc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKHIoXCJEZW1hbmRldXJBY3RldXJcIikpKSxcbiAgICAgIH0sXG4gICAgICB7IGpzb246IFwib3JnYW5lXCIsIGpzOiBcIm9yZ2FuZVwiLCB0eXA6IHUodW5kZWZpbmVkLCByKFwiRGVtYW5kZXVyT3JnYW5lXCIpKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIERlbWFuZGV1ckFjdGV1cjogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwibm9tXCIsIGpzOiBcIm5vbVwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcImFjdGV1clJlZlwiLCBqczogXCJhY3RldXJSZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgRGVtYW5kZXVyT3JnYW5lOiBvKFxuICAgIFtcbiAgICAgIHsganNvbjogXCJub21cIiwganM6IFwibm9tXCIsIHR5cDogXCJcIiB9LFxuICAgICAgeyBqc29uOiBcIm9yZ2FuZVJlZlwiLCBqczogXCJvcmdhbmVSZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgSWRlbnRpZmlhbnRzOiBvKFxuICAgIFtcbiAgICAgIHsganNvbjogXCJudW1TZWFuY2VKb1wiLCBqczogXCJudW1TZWFuY2VKb1wiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcImlkSm9cIiwganM6IFwiaWRKb1wiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcInF1YW50aWVtZVwiLCBqczogXCJxdWFudGllbWVcIiwgdHlwOiByKFwiUXVhbnRpZW1lXCIpIH0sXG4gICAgICB7IGpzb246IFwiZGF0ZVNlYW5jZVwiLCBqczogXCJkYXRlU2VhbmNlXCIsIHR5cDogRGF0ZSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIEluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZTogbyhcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiZXN0UmV1bmlvbkludGVybmF0aW9uYWxlXCIsXG4gICAgICAgIGpzOiBcImVzdFJldW5pb25JbnRlcm5hdGlvbmFsZVwiLFxuICAgICAgICB0eXA6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsganNvbjogXCJsaXN0ZVBheXNcIiwganM6IFwibGlzdGVQYXlzXCIsIHR5cDogdSh1bmRlZmluZWQsIGEoXCJcIikpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiaW5mb3JtYXRpb25zQ29tcGxlbWVudGFpcmVzXCIsXG4gICAgICAgIGpzOiBcImluZm9ybWF0aW9uc0NvbXBsZW1lbnRhaXJlc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgTGlldTogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwiY29kZVwiLCBqczogXCJjb2RlXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7IGpzb246IFwibGliZWxsZUNvdXJ0XCIsIGpzOiBcImxpYmVsbGVDb3VydFwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcImxpYmVsbGVMb25nXCIsIGpzOiBcImxpYmVsbGVMb25nXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7IGpzb246IFwibGlldVJlZlwiLCBqczogXCJsaWV1UmVmXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgUGFydGljaXBhbnRzOiBvKFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJwYXJ0aWNpcGFudHNJbnRlcm5lc1wiLFxuICAgICAgICBqczogXCJwYXJ0aWNpcGFudHNJbnRlcm5lc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKHIoXCJQYXJ0aWNpcGFudEludGVybmVcIikpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwicGVyc29ubmVzQXVkaXRpb25uZWVzXCIsXG4gICAgICAgIGpzOiBcInBlcnNvbm5lc0F1ZGl0aW9ubmVlc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKHIoXCJQZXJzb25uZUF1ZGl0aW9ubmVlXCIpKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIFBhcnRpY2lwYW50SW50ZXJuZTogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwiYWN0ZXVyUmVmXCIsIGpzOiBcImFjdGV1clJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJwcmVzZW5jZVwiLCBqczogXCJwcmVzZW5jZVwiLCB0eXA6IHIoXCJQcmVzZW5jZVwiKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIFBlcnNvbm5lQXVkaXRpb25uZWU6IG8oXG4gICAgW1xuICAgICAgeyBqc29uOiBcInhzaVR5cGVcIiwganM6IFwieHNpVHlwZVwiLCB0eXA6IHIoXCJQZXJzb25uZUF1ZGl0aW9ubmVlWHNpVHlwZVwiKSB9LFxuICAgICAgeyBqc29uOiBcInVpZFwiLCBqczogXCJ1aWRcIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwiaWRlbnRcIiwganM6IFwiaWRlbnRcIiwgdHlwOiByKFwiSWRlbnRcIikgfSxcbiAgICAgIHsganNvbjogXCJkYXRlTmFpc1wiLCBqczogXCJkYXRlTmFpc1wiLCB0eXA6IHUodW5kZWZpbmVkLCBEYXRlKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIElkZW50OiBvKFxuICAgIFtcbiAgICAgIHsganNvbjogXCJjaXZcIiwganM6IFwiY2l2XCIsIHR5cDogcihcIkNpdlwiKSB9LFxuICAgICAgeyBqc29uOiBcInByZW5vbVwiLCBqczogXCJwcmVub21cIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwibm9tXCIsIGpzOiBcIm5vbVwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJhbHBoYVwiLCBqczogXCJhbHBoYVwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcInRyaWdyYW1tZVwiLCBqczogXCJ0cmlncmFtbWVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgXCJcIikgfSxcbiAgICBdLFxuICAgIGZhbHNlLFxuICApLFxuICBSZXVuaW9uWHNpVHlwZTogW1xuICAgIFwicmV1bmlvbkNvbW1pc3Npb25fdHlwZVwiLFxuICAgIFwicmV1bmlvbkluaXRQYXJsZW1lbnRhaXJlX3R5cGVcIixcbiAgICBcInNlYW5jZV90eXBlXCIsXG4gIF0sXG4gIFBvaW50T2RqWHNpVHlwZTogW1wicG9kalJldW5pb25fdHlwZVwiLCBcInBvZGpTZWFuY2VDb25mUHJlc190eXBlXCJdLFxuICBFdGF0Q3ljbGVEZVZpZTogW1wiQW5udWzDqVwiLCBcIkNvbmZpcm3DqVwiLCBcIkV2ZW50dWVsXCIsIFwiU3VwcHJpbcOpXCJdLFxuICBOYXR1cmVUcmF2YXV4T2RqOiBbXCJPREpQUlwiLCBcIk9ESlNOXCJdLFxuICBQcm9jZWR1cmU6IFtcbiAgICBcImRpc2N1c3Npb24gZ8OpbsOpcmFsZSBjb21tdW5lXCIsXG4gICAgXCJwcm9jw6lkdXJlIGQnZXhhbWVuIHNpbXBsaWZpw6llLUFydGljbGUgMTAzXCIsXG4gICAgXCJwcm9jw6lkdXJlIGQnZXhhbWVuIHNpbXBsaWZpw6llLUFydGljbGUgMTA2XCIsXG4gICAgXCJwcm9jw6lkdXJlIGQnZXhhbWVuIHNpbXBsaWZpw6llLUFydGljbGUgMTA3XCIsXG4gICAgXCJwcm9jw6lkdXJlIGRlIGzDqWdpc2xhdGlvbiBlbiBjb21taXNzaW9uLUFydGljbGUgMTA3LTFcIixcbiAgXSxcbiAgVHlwZVBvaW50T2RqOiBbXG4gICAgXCJBbWVuZGVtZW50cyAoQXJ0LiA4OClcIixcbiAgICBcIkFtZW5kZW1lbnRzIChBcnQuIDkxKVwiLFxuICAgIFwiQXVkaXRpb25cIixcbiAgICBcIkF1ZGl0aW9uIG1pbmlzdHJlXCIsXG4gICAgXCJBdWRpdGlvbiBtaW5pc3RyZSBvdXZlcnRlIMOgIGxhIHByZXNzZVwiLFxuICAgIFwiQXVkaXRpb24gb3V2ZXJ0ZSDDoCBsYSBwcmVzc2VcIixcbiAgICBcIkNvbW11bmljYXRpb25cIixcbiAgICBcIkNvbnN0aXR1dGlvbiBkZSBtaXNzaW9uIGQnaW5mb3JtYXRpb25cIixcbiAgICBcIkRpc2N1c3Npb25cIixcbiAgICBcIkTDqWJhdCBkJ2luaXRpYXRpdmUgcGFybGVtZW50YWlyZVwiLFxuICAgIFwiRMOpY2xhcmF0aW9uIGR1IEdvdXZlcm5lbWVudCBzdWl2aWUgZCd1biBkw6liYXRcIixcbiAgICBcIkVjaGFuZ2VzIGRlIHZ1ZXNcIixcbiAgICBcIkV4YW1lblwiLFxuICAgIFwiRXhwbGljYXRpb25zIGRlIHZvdGUgZGVzIGdyb3VwZXMgZXQgdm90ZSBwYXIgc2NydXRpbiBwdWJsaWNcIixcbiAgICBcIkV4cGxpY2F0aW9ucyBkZSB2b3RlIGV0IHZvdGUgcGFyIHNjcnV0aW4gcHVibGljXCIsXG4gICAgXCJGaXhhdGlvbiBkZSBsJ29yZHJlIGR1IGpvdXJcIixcbiAgICBcIk5vbWluYXRpb24gYnVyZWF1XCIsXG4gICAgXCJOb21pbmF0aW9uIGNhbmRpZGF0cyBvcmdhbmlzbWUgZXh0cmFwYXJsZW1lbnRhaXJlXCIsXG4gICAgXCJOb21pbmF0aW9uIGQndW4gbWVtYnJlIGQndW5lIG1pc3Npb24gZCdpbmZvcm1hdGlvblwiLFxuICAgIFwiTm9taW5hdGlvbiByYXBwb3J0ZXVyXCIsXG4gICAgXCJOb21pbmF0aW9uIHJhcHBvcnRldXIgZCdhcHBsaWNhdGlvblwiLFxuICAgIFwiTm9taW5hdGlvbiByYXBwb3J0ZXVyIGQnaW5mb3JtYXRpb25cIixcbiAgICBcIk5vbWluYXRpb24gcmFwcG9ydGV1ciBwb3VyIGF2aXNcIixcbiAgICBcIk91dmVydHVyZSBldCBjbMO0dHVyZSBkZSBzZXNzaW9uXCIsXG4gICAgXCJRdWVzdGlvbnMgYXUgR291dmVybmVtZW50XCIsXG4gICAgXCJRdWVzdGlvbnMgb3JhbGVzIHNhbnMgZMOpYmF0XCIsXG4gICAgXCJSYXBwb3J0XCIsXG4gICAgXCJSYXBwb3J0IGQnaW5mb3JtYXRpb25cIixcbiAgICBcIlJhcHBvcnQgcG91ciBhdmlzXCIsXG4gICAgXCJTw6lhbmNlcyByw6lzZXJ2w6llcyDDoCB1biBncm91cGUgZGUgbCdvcHBvc2l0aW9uIG91IG1pbm9yaXRhaXJlXCIsXG4gICAgXCJTdWl0ZSBkZSBsYSBkaXNjdXNzaW9uXCIsXG4gICAgXCJUYWJsZSByb25kZVwiLFxuICAgIFwiVm90ZSBwYXIgc2NydXRpbiBwdWJsaWNcIixcbiAgICBcIlZvdGUgc29sZW5uZWxcIixcbiAgXSxcbiAgRm9ybWF0UmV1bmlvbjogW1xuICAgIFwiQXVkaXRpb25FeHRlcm5lXCIsXG4gICAgXCJBdWRpdGlvblBhclByZXNpZGVudENvbW1pc3Npb25cIixcbiAgICBcIkF1ZGl0aW9uUGFyUmFwcG9ydGV1clwiLFxuICAgIFwiT3JkaW5haXJlXCIsXG4gIF0sXG4gIFF1YW50aWVtZTogW1wiRGV1eGnDqG1lXCIsIFwiUHJlbWnDqHJlXCIsIFwiVHJvaXNpw6htZVwiLCBcIlVuaXF1ZVwiXSxcbiAgUHJlc2VuY2U6IFtcImFic2VudFwiLCBcImV4Y3Vzw6lcIiwgXCJwcsOpc2VudFwiXSxcbiAgQ2l2OiBbXCJNLlwiLCBcIk1tZVwiXSxcbiAgUGVyc29ubmVBdWRpdGlvbm5lZVhzaVR5cGU6IFtcIklkQWN0ZXVyX3R5cGVcIiwgXCJJZFBlcnNvbm5lRXh0ZXJuZV90eXBlXCJdLFxuICBUeXBlUmV1bmlvbjogW1wiREVQXCIsIFwiR0FcIiwgXCJHRVwiLCBcIkdFVklcIiwgXCJHUFwiLCBcIkjDiSBBdXLDqWxpZW5cIl0sXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFnQ0EsV0FBWUEsY0FBYywwQkFBZEEsY0FBYztFQUFkQSxjQUFjO0VBQWRBLGNBQWM7RUFBZEEsY0FBYztFQUFBLE9BQWRBLGNBQWM7QUFBQTtBQTBCMUIsV0FBWUMsZUFBZSwwQkFBZkEsZUFBZTtFQUFmQSxlQUFlO0VBQWZBLGVBQWU7RUFBQSxPQUFmQSxlQUFlO0FBQUE7QUFlM0IsV0FBWUMsY0FBYywwQkFBZEEsY0FBYztFQUFkQSxjQUFjO0VBQWRBLGNBQWM7RUFBZEEsY0FBYztFQUFkQSxjQUFjO0VBQUEsT0FBZEEsY0FBYztBQUFBO0FBTzFCLFdBQVlDLGdCQUFnQiwwQkFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQWhCQSxnQkFBZ0I7RUFBQSxPQUFoQkEsZ0JBQWdCO0FBQUE7QUFLNUIsV0FBWUMsU0FBUywwQkFBVEEsU0FBUztFQUFUQSxTQUFTO0VBQVRBLFNBQVM7RUFBVEEsU0FBUztFQUFUQSxTQUFTO0VBQVRBLFNBQVM7RUFBQSxPQUFUQSxTQUFTO0FBQUE7QUFRckIsV0FBWUMsWUFBWSwwQkFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQUEsT0FBWkEsWUFBWTtBQUFBO0FBc0R4QixXQUFZQyxhQUFhLDBCQUFiQSxhQUFhO0VBQWJBLGFBQWE7RUFBYkEsYUFBYTtFQUFiQSxhQUFhO0VBQWJBLGFBQWE7RUFBQSxPQUFiQSxhQUFhO0FBQUE7QUFjekIsV0FBWUMsU0FBUywwQkFBVEEsU0FBUztFQUFUQSxTQUFTO0VBQVRBLFNBQVM7RUFBVEEsU0FBUztFQUFUQSxTQUFTO0VBQUEsT0FBVEEsU0FBUztBQUFBO0FBK0JyQixXQUFZQyxRQUFRLDBCQUFSQSxRQUFRO0VBQVJBLFFBQVE7RUFBUkEsUUFBUTtFQUFSQSxRQUFRO0VBQUEsT0FBUkEsUUFBUTtBQUFBO0FBcUJwQixXQUFZQyxHQUFHLDBCQUFIQSxHQUFHO0VBQUhBLEdBQUc7RUF