UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

724 lines (720 loc) 88.2 kB
// 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 Etat = /*#__PURE__*/function (Etat) { Etat["Annul\xE9"] = "Annul\xE9"; Etat["Confirm\xE9"] = "Confirm\xE9"; Etat["Eventuel"] = "Eventuel"; Etat["Supprim\xE9"] = "Supprim\xE9"; return Etat; }({}); 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 TypeReunion = /*#__PURE__*/function (TypeReunion) { TypeReunion["Dep"] = "DEP"; TypeReunion["Ga"] = "GA"; TypeReunion["Ge"] = "GE"; TypeReunion["Gevi"] = "GEVI"; TypeReunion["Gp"] = "GP"; TypeReunion["H\xE9Aur\xE9lien"] = "H\xC9 Aur\xE9lien"; return TypeReunion; }({}); export let Civ = /*#__PURE__*/function (Civ) { Civ["M"] = "M."; Civ["Mme"] = "Mme"; return Civ; }({}); export let UidXsiType = /*#__PURE__*/function (UidXsiType) { UidXsiType["IdActeurType"] = "IdActeur_type"; UidXsiType["IdPersonneExterneType"] = "IdPersonneExterne_type"; return UidXsiType; }({}); // Converts JSON strings to/from your types // and asserts the results of JSON.parse at runtime export class Convert { static toReunion(json) { return cast(JSON.parse(json), r("Reunion")); } static reunionToJson(value) { return JSON.stringify(uncast(value, r("Reunion")), null, 2); } static toAgendas(json) { return cast(JSON.parse(json), r("Agendas")); } static agendasToJson(value) { return JSON.stringify(uncast(value, r("Agendas")), 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 = { "Reunion": o([{ json: "reunion", js: "reunion", typ: r("ReunionReunion") }], false), "ReunionReunion": o([{ json: "@xmlns", js: "@xmlns", typ: "" }, { json: "@xmlns:xsi", js: "@xmlns:xsi", typ: "" }, { json: "@xsi:type", js: "@xsi:type", typ: r("ReunionXsiType") }, { json: "uid", js: "uid", typ: "" }, { json: "timeStampDebut", js: "timeStampDebut", typ: Date }, { json: "timeStampFin", js: "timeStampFin", typ: u(undefined, "") }, { json: "lieu", js: "lieu", typ: u(undefined, r("Lieu")) }, { json: "cycleDeVie", js: "cycleDeVie", typ: r("CycleDeVie") }, { json: "demandeurs", js: "demandeurs", typ: u(undefined, u(r("Demandeurs"), null)) }, { json: "organeReuniRef", js: "organeReuniRef", typ: u(null, "") }, { json: "typeReunion", js: "typeReunion", typ: u(undefined, r("TypeReunion")) }, { json: "demandeur", js: "demandeur", typ: u(undefined, u(r("Demandeur"), null)) }, { json: "participants", js: "participants", typ: u(undefined, u(r("PurpleParticipants"), null)) }, { json: "visioConference", js: "visioConference", typ: u(undefined, u(null, "")) }, { json: "ODJ", js: "ODJ", typ: u(undefined, u(r("Odj"), null)) }, { json: "sessionRef", js: "sessionRef", typ: u(undefined, u("", null)) }, { json: "ouverturePresse", js: "ouverturePresse", typ: u(undefined, "") }, { json: "captationVideo", js: "captationVideo", typ: u(undefined, "") }, { json: "compteRenduRef", js: "compteRenduRef", typ: u(undefined, u(null, "")) }, { json: "formatReunion", js: "formatReunion", typ: u(undefined, r("FormatReunion")) }, { json: "infosReunionsInternationale", js: "infosReunionsInternationale", typ: u(undefined, r("InfosReunionsInternationale")) }, { json: "identifiants", js: "identifiants", typ: u(undefined, r("Identifiants")) }], false), "Odj": o([{ json: "convocationODJ", js: "convocationODJ", typ: u(r("ConvocationOdjClass"), null) }, { json: "resumeODJ", js: "resumeODJ", typ: u(r("ConvocationOdjClass"), null) }, { json: "pointsODJ", js: "pointsODJ", typ: u(undefined, u(r("PointsOdj"), null)) }], false), "ConvocationOdjClass": o([{ json: "item", js: "item", typ: u(a(""), "") }], false), "PointsOdj": o([{ json: "pointODJ", js: "pointODJ", typ: u(a(r("PointOdjElement")), r("PointOdjElement")) }], false), "PointOdjElement": o([{ json: "@xsi:type", js: "@xsi:type", typ: r("PointOdjXsiType") }, { json: "uid", js: "uid", typ: "" }, { json: "cycleDeVie", js: "cycleDeVie", typ: r("CycleDeVie") }, { json: "objet", js: "objet", typ: "" }, { json: "demandeurPoint", js: "demandeurPoint", typ: null }, { json: "procedure", js: "procedure", typ: u(r("Procedure"), null) }, { json: "dossiersLegislatifsRefs", js: "dossiersLegislatifsRefs", typ: u(r("DossiersLegislatifsRefs"), null) }, { json: "typePointODJ", js: "typePointODJ", typ: r("TypePointOdj") }, { json: "comiteSecret", js: "comiteSecret", typ: "" }, { json: "textesAssocies", js: "textesAssocies", typ: null }, { json: "natureTravauxODJ", js: "natureTravauxODJ", typ: u(undefined, r("NatureTravauxOdj")) }, { json: "dateConfPres", js: "dateConfPres", typ: u(undefined, "") }, { json: "dateLettreMinistre", js: "dateLettreMinistre", typ: u(undefined, "") }], false), "CycleDeVie": o([{ json: "etat", js: "etat", typ: r("Etat") }, { json: "chrono", js: "chrono", typ: r("Chrono") }], false), "Chrono": o([{ json: "creation", js: "creation", typ: "" }, { json: "cloture", js: "cloture", typ: u(null, "") }], false), "DossiersLegislatifsRefs": o([{ json: "dossierRef", js: "dossierRef", typ: u(a(""), "") }], false), "Demandeur": o([{ json: "acteur", js: "acteur", typ: u(undefined, r("ActeurElement")) }, { json: "organe", js: "organe", typ: u(undefined, r("Organe")) }], false), "ActeurElement": o([{ json: "nom", js: "nom", typ: u(null, "") }, { json: "acteurRef", js: "acteurRef", typ: "" }], false), "Organe": o([{ json: "nom", js: "nom", typ: "" }, { json: "organeRef", js: "organeRef", typ: "" }], false), "Demandeurs": o([{ json: "acteur", js: "acteur", typ: u(undefined, u(a(r("ActeurElement")), r("ActeurElement"))) }, { json: "organe", js: "organe", typ: u(undefined, r("Organe")) }], false), "Identifiants": o([{ json: "numSeanceJO", js: "numSeanceJO", typ: u(null, "") }, { json: "idJO", js: "idJO", typ: u(null, "") }, { json: "quantieme", js: "quantieme", typ: r("Quantieme") }, { json: "DateSeance", js: "DateSeance", typ: "" }], false), "InfosReunionsInternationale": o([{ json: "estReunionInternationale", js: "estReunionInternationale", typ: "" }, { json: "listePays", js: "listePays", typ: u(r("ListePays"), null) }, { json: "informationsComplementaires", js: "informationsComplementaires", typ: u(undefined, u(null, "")) }], false), "ListePays": o([{ json: "paysRef", js: "paysRef", typ: u(a(""), "") }], false), "Lieu": o([{ json: "code", js: "code", typ: u(undefined, u("", null)) }, { json: "libelleCourt", js: "libelleCourt", typ: u(undefined, u("", null)) }, { json: "libelleLong", js: "libelleLong", typ: u(null, "") }, { json: "lieuRef", js: "lieuRef", typ: u(undefined, u("", null)) }], false), "PurpleParticipants": o([{ json: "participantsInternes", js: "participantsInternes", typ: u(r("PurpleParticipantsInternes"), null) }, { json: "personnesAuditionnees", js: "personnesAuditionnees", typ: u(r("PurplePersonnesAuditionnees"), null) }], false), "PurpleParticipantsInternes": o([{ json: "participantInterne", js: "participantInterne", typ: u(a(r("ParticipantInterneElement")), r("ParticipantInterneElement")) }], false), "ParticipantInterneElement": o([{ json: "acteurRef", js: "acteurRef", typ: "" }, { json: "presence", js: "presence", typ: r("Presence") }], false), "PurplePersonnesAuditionnees": o([{ json: "personneAuditionnee", js: "personneAuditionnee", typ: u(a(null), null) }], false), "Agendas": o([{ json: "reunions", js: "reunions", typ: r("Reunions") }], false), "Reunions": o([{ json: "reunion", js: "reunion", typ: a(r("ReunionElement")) }], false), "ReunionElement": o([{ json: "uid", js: "uid", typ: "" }, { json: "timeStampDebut", js: "timeStampDebut", typ: Date }, { json: "timeStampFin", js: "timeStampFin", typ: u(undefined, "") }, { json: "lieu", js: "lieu", typ: r("Lieu") }, { json: "cycleDeVie", js: "cycleDeVie", typ: r("CycleDeVie") }, { json: "demandeurs", js: "demandeurs", typ: u(undefined, u(r("Demandeurs"), null)) }, { json: "organeReuniRef", js: "organeReuniRef", typ: u(null, "") }, { json: "typeReunion", js: "typeReunion", typ: u(undefined, r("TypeReunion")) }, { json: "@xmlns:xsi", js: "@xmlns:xsi", typ: u(undefined, "") }, { json: "demandeur", js: "demandeur", typ: u(undefined, null) }, { json: "participants", js: "participants", typ: u(undefined, u(r("FluffyParticipants"), null)) }, { json: "sessionRef", js: "sessionRef", typ: u(undefined, u("", null)) }, { json: "ouverturePresse", js: "ouverturePresse", typ: u(undefined, "") }, { json: "ODJ", js: "ODJ", typ: u(undefined, r("Odj")) }, { json: "compteRenduRef", js: "compteRenduRef", typ: u(undefined, u(null, "")) }, { json: "identifiants", js: "identifiants", typ: u(undefined, r("Identifiants")) }], false), "FluffyParticipants": o([{ json: "participantsInternes", js: "participantsInternes", typ: u(r("FluffyParticipantsInternes"), null) }, { json: "personnesAuditionnees", js: "personnesAuditionnees", typ: u(r("FluffyPersonnesAuditionnees"), null) }], false), "FluffyParticipantsInternes": o([{ json: "participantInterne", js: "participantInterne", typ: a(r("ParticipantInterneElement")) }], false), "FluffyPersonnesAuditionnees": o([{ json: "personneAuditionnee", js: "personneAuditionnee", typ: u(a(r("PersonneAuditionneeElement")), r("PersonneAuditionneeElement")) }], false), "PersonneAuditionneeElement": o([{ json: "uid", js: "uid", typ: r("Uid") }, { json: "ident", js: "ident", typ: r("Ident") }, { json: "dateNais", js: "dateNais", typ: u(Date, null) }], 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, u(null, "")) }], false), "Uid": o([{ json: "@xsi:type", js: "@xsi:type", typ: r("UidXsiType") }, { json: "#text", js: "#text", typ: "" }], false), "ReunionXsiType": ["reunionCommission_type", "reunionInitParlementaire_type", "seance_type"], "PointOdjXsiType": ["podjReunion_type", "podjSeanceConfPres_type"], "Etat": ["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"], "TypeReunion": ["DEP", "GA", "GE", "GEVI", "GP", "HÉ Aurélien"], "Civ": ["M.", "Mme"], "UidXsiType": ["IdActeur_type", "IdPersonneExterne_type"] }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXVuaW9uWHNpVHlwZSIsIlBvaW50T2RqWHNpVHlwZSIsIkV0YXQiLCJOYXR1cmVUcmF2YXV4T2RqIiwiUHJvY2VkdXJlIiwiVHlwZVBvaW50T2RqIiwiRm9ybWF0UmV1bmlvbiIsIlF1YW50aWVtZSIsIlByZXNlbmNlIiwiVHlwZVJldW5pb24iLCJDaXYiLCJVaWRYc2lUeXBlIiwiQ29udmVydCIsInRvUmV1bmlvbiIsImpzb24iLCJjYXN0IiwiSlNPTiIsInBhcnNlIiwiciIsInJldW5pb25Ub0pzb24iLCJ2YWx1ZSIsInN0cmluZ2lmeSIsInVuY2FzdCIsInRvQWdlbmRhcyIsImFnZW5kYXNUb0pzb24iLCJpbnZhbGlkVmFsdWUiLCJ0eXAiLCJ2YWwiLCJrZXkiLCJFcnJvciIsImpzb25Ub0pTUHJvcHMiLCJqc29uVG9KUyIsInVuZGVmaW5lZCIsIm1hcCIsInByb3BzIiwiZm9yRWFjaCIsInAiLCJqcyIsImpzVG9KU09OUHJvcHMiLCJqc1RvSlNPTiIsInRyYW5zZm9ybSIsImdldFByb3BzIiwidHJhbnNmb3JtUHJpbWl0aXZlIiwidHJhbnNmb3JtVW5pb24iLCJ0eXBzIiwibCIsImxlbmd0aCIsImkiLCJfIiwidHJhbnNmb3JtRW51bSIsImNhc2VzIiwiaW5kZXhPZiIsInRyYW5zZm9ybUFycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiZWwiLCJ0cmFuc2Zvcm1EYXRlIiwiZCIsIkRhdGUiLCJpc05hTiIsInZhbHVlT2YiLCJ0cmFuc2Zvcm1PYmplY3QiLCJhZGRpdGlvbmFsIiwicmVzdWx0IiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3AiLCJ2IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVmIiwidHlwZU1hcCIsInVuaW9uTWVtYmVycyIsImFycmF5SXRlbXMiLCJhIiwidSIsIm8iLCJuYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jhd190eXBlcy9hZ2VuZGFzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRvIHBhcnNlIHRoaXMgZGF0YTpcbi8vXG4vLyAgIGltcG9ydCB7IENvbnZlcnQsIFJldW5pb24sIEFnZW5kYXMgfSBmcm9tIFwiLi9maWxlXCI7XG4vL1xuLy8gICBjb25zdCByZXVuaW9uID0gQ29udmVydC50b1JldW5pb24oanNvbik7XG4vLyAgIGNvbnN0IGFnZW5kYXMgPSBDb252ZXJ0LnRvQWdlbmRhcyhqc29uKTtcbi8vXG4vLyBUaGVzZSBmdW5jdGlvbnMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgSlNPTiBkb2Vzbid0XG4vLyBtYXRjaCB0aGUgZXhwZWN0ZWQgaW50ZXJmYWNlLCBldmVuIGlmIHRoZSBKU09OIGlzIHZhbGlkLlxuXG5leHBvcnQgaW50ZXJmYWNlIFJldW5pb24ge1xuICAgIHJldW5pb246IFJldW5pb25SZXVuaW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldW5pb25SZXVuaW9uIHtcbiAgICBcIkB4bWxuc1wiOiAgICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBcIkB4bWxuczp4c2lcIjogICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBcIkB4c2k6dHlwZVwiOiAgICAgICAgICAgICAgICAgIFJldW5pb25Yc2lUeXBlO1xuICAgIHVpZDogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICB0aW1lU3RhbXBEZWJ1dDogICAgICAgICAgICAgICBEYXRlO1xuICAgIHRpbWVTdGFtcEZpbj86ICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBsaWV1PzogICAgICAgICAgICAgICAgICAgICAgICBMaWV1O1xuICAgIGN5Y2xlRGVWaWU6ICAgICAgICAgICAgICAgICAgIEN5Y2xlRGVWaWU7XG4gICAgZGVtYW5kZXVycz86ICAgICAgICAgICAgICAgICAgRGVtYW5kZXVycyB8IG51bGw7XG4gICAgb3JnYW5lUmV1bmlSZWY6ICAgICAgICAgICAgICAgbnVsbCB8IHN0cmluZztcbiAgICB0eXBlUmV1bmlvbj86ICAgICAgICAgICAgICAgICBUeXBlUmV1bmlvbjtcbiAgICBkZW1hbmRldXI/OiAgICAgICAgICAgICAgICAgICBEZW1hbmRldXIgfCBudWxsO1xuICAgIHBhcnRpY2lwYW50cz86ICAgICAgICAgICAgICAgIFB1cnBsZVBhcnRpY2lwYW50cyB8IG51bGw7XG4gICAgdmlzaW9Db25mZXJlbmNlPzogICAgICAgICAgICAgbnVsbCB8IHN0cmluZztcbiAgICBPREo/OiAgICAgICAgICAgICAgICAgICAgICAgICBPZGogfCBudWxsO1xuICAgIHNlc3Npb25SZWY/OiAgICAgICAgICAgICAgICAgIG51bGwgfCBzdHJpbmc7XG4gICAgb3V2ZXJ0dXJlUHJlc3NlPzogICAgICAgICAgICAgc3RyaW5nO1xuICAgIGNhcHRhdGlvblZpZGVvPzogICAgICAgICAgICAgIHN0cmluZztcbiAgICBjb21wdGVSZW5kdVJlZj86ICAgICAgICAgICAgICBudWxsIHwgc3RyaW5nO1xuICAgIGZvcm1hdFJldW5pb24/OiAgICAgICAgICAgICAgIEZvcm1hdFJldW5pb247XG4gICAgaW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlPzogSW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlO1xuICAgIGlkZW50aWZpYW50cz86ICAgICAgICAgICAgICAgIElkZW50aWZpYW50cztcbn1cblxuZXhwb3J0IGVudW0gUmV1bmlvblhzaVR5cGUge1xuICAgIFJldW5pb25Db21taXNzaW9uVHlwZSA9IFwicmV1bmlvbkNvbW1pc3Npb25fdHlwZVwiLFxuICAgIFJldW5pb25Jbml0UGFybGVtZW50YWlyZVR5cGUgPSBcInJldW5pb25Jbml0UGFybGVtZW50YWlyZV90eXBlXCIsXG4gICAgU2VhbmNlVHlwZSA9IFwic2VhbmNlX3R5cGVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPZGoge1xuICAgIGNvbnZvY2F0aW9uT0RKOiBDb252b2NhdGlvbk9kakNsYXNzIHwgbnVsbDtcbiAgICByZXN1bWVPREo6ICAgICAgQ29udm9jYXRpb25PZGpDbGFzcyB8IG51bGw7XG4gICAgcG9pbnRzT0RKPzogICAgIFBvaW50c09kaiB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udm9jYXRpb25PZGpDbGFzcyB7XG4gICAgaXRlbTogc3RyaW5nW10gfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9pbnRzT2RqIHtcbiAgICBwb2ludE9ESjogUG9pbnRPZGpFbGVtZW50W10gfCBQb2ludE9kakVsZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9pbnRPZGpFbGVtZW50IHtcbiAgICBcIkB4c2k6dHlwZVwiOiAgICAgICAgICAgICBQb2ludE9kalhzaVR5cGU7XG4gICAgdWlkOiAgICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBjeWNsZURlVmllOiAgICAgICAgICAgICAgQ3ljbGVEZVZpZTtcbiAgICBvYmpldDogICAgICAgICAgICAgICAgICAgc3RyaW5nO1xuICAgIGRlbWFuZGV1clBvaW50OiAgICAgICAgICBudWxsO1xuICAgIHByb2NlZHVyZTogICAgICAgICAgICAgICBQcm9jZWR1cmUgfCBudWxsO1xuICAgIGRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzOiBEb3NzaWVyc0xlZ2lzbGF0aWZzUmVmcyB8IG51bGw7XG4gICAgdHlwZVBvaW50T0RKOiAgICAgICAgICAgIFR5cGVQb2ludE9kajtcbiAgICBjb21pdGVTZWNyZXQ6ICAgICAgICAgICAgc3RyaW5nO1xuICAgIHRleHRlc0Fzc29jaWVzOiAgICAgICAgICBudWxsO1xuICAgIG5hdHVyZVRyYXZhdXhPREo/OiAgICAgICBOYXR1cmVUcmF2YXV4T2RqO1xuICAgIGRhdGVDb25mUHJlcz86ICAgICAgICAgICBzdHJpbmc7XG4gICAgZGF0ZUxldHRyZU1pbmlzdHJlPzogICAgIHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gUG9pbnRPZGpYc2lUeXBlIHtcbiAgICBQb2RqUmV1bmlvblR5cGUgPSBcInBvZGpSZXVuaW9uX3R5cGVcIixcbiAgICBQb2RqU2VhbmNlQ29uZlByZXNUeXBlID0gXCJwb2RqU2VhbmNlQ29uZlByZXNfdHlwZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN5Y2xlRGVWaWUge1xuICAgIGV0YXQ6ICAgRXRhdDtcbiAgICBjaHJvbm86IENocm9ubztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaHJvbm8ge1xuICAgIGNyZWF0aW9uOiBzdHJpbmc7XG4gICAgY2xvdHVyZTogIG51bGwgfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIEV0YXQge1xuICAgIEFubnVsw6kgPSBcIkFubnVsw6lcIixcbiAgICBDb25maXJtw6kgPSBcIkNvbmZpcm3DqVwiLFxuICAgIEV2ZW50dWVsID0gXCJFdmVudHVlbFwiLFxuICAgIFN1cHByaW3DqSA9IFwiU3VwcHJpbcOpXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9zc2llcnNMZWdpc2xhdGlmc1JlZnMge1xuICAgIGRvc3NpZXJSZWY6IHN0cmluZ1tdIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBOYXR1cmVUcmF2YXV4T2RqIHtcbiAgICBPZGpwciA9IFwiT0RKUFJcIixcbiAgICBPZGpzbiA9IFwiT0RKU05cIixcbn1cblxuZXhwb3J0IGVudW0gUHJvY2VkdXJlIHtcbiAgICBEaXNjdXNzaW9uR8OpbsOpcmFsZUNvbW11bmUgPSBcImRpc2N1c3Npb24gZ8OpbsOpcmFsZSBjb21tdW5lXCIsXG4gICAgUHJvY8OpZHVyZURFeGFtZW5TaW1wbGlmacOpZUFydGljbGUxMDMgPSBcInByb2PDqWR1cmUgZCdleGFtZW4gc2ltcGxpZmnDqWUtQXJ0aWNsZSAxMDNcIixcbiAgICBQcm9jw6lkdXJlREV4YW1lblNpbXBsaWZpw6llQXJ0aWNsZTEwNiA9IFwicHJvY8OpZHVyZSBkJ2V4YW1lbiBzaW1wbGlmacOpZS1BcnRpY2xlIDEwNlwiLFxuICAgIFByb2PDqWR1cmVERXhhbWVuU2ltcGxpZmnDqWVBcnRpY2xlMTA3ID0gXCJwcm9jw6lkdXJlIGQnZXhhbWVuIHNpbXBsaWZpw6llLUFydGljbGUgMTA3XCIsXG4gICAgUHJvY8OpZHVyZURlTMOpZ2lzbGF0aW9uRW5Db21taXNzaW9uQXJ0aWNsZTEwNzEgPSBcInByb2PDqWR1cmUgZGUgbMOpZ2lzbGF0aW9uIGVuIGNvbW1pc3Npb24tQXJ0aWNsZSAxMDctMVwiLFxufVxuXG5leHBvcnQgZW51bSBUeXBlUG9pbnRPZGoge1xuICAgIEFtZW5kZW1lbnRzQXJ0ODggPSBcIkFtZW5kZW1lbnRzIChBcnQuIDg4KVwiLFxuICAgIEFtZW5kZW1lbnRzQXJ0OTEgPSBcIkFtZW5kZW1lbnRzIChBcnQuIDkxKVwiLFxuICAgIEF1ZGl0aW9uID0gXCJBdWRpdGlvblwiLFxuICAgIEF1ZGl0aW9uTWluaXN0cmUgPSBcIkF1ZGl0aW9uIG1pbmlzdHJlXCIsXG4gICAgQXVkaXRpb25NaW5pc3RyZU91dmVydGXDgExhUHJlc3NlID0gXCJBdWRpdGlvbiBtaW5pc3RyZSBvdXZlcnRlIMOgIGxhIHByZXNzZVwiLFxuICAgIEF1ZGl0aW9uT3V2ZXJ0ZcOATGFQcmVzc2UgPSBcIkF1ZGl0aW9uIG91dmVydGUgw6AgbGEgcHJlc3NlXCIsXG4gICAgQ29tbXVuaWNhdGlvbiA9IFwiQ29tbXVuaWNhdGlvblwiLFxuICAgIENvbnN0aXR1dGlvbkRlTWlzc2lvbkRJbmZvcm1hdGlvbiA9IFwiQ29uc3RpdHV0aW9uIGRlIG1pc3Npb24gZCdpbmZvcm1hdGlvblwiLFxuICAgIERpc2N1c3Npb24gPSBcIkRpc2N1c3Npb25cIixcbiAgICBEw6liYXRESW5pdGlhdGl2ZVBhcmxlbWVudGFpcmUgPSBcIkTDqWJhdCBkJ2luaXRpYXRpdmUgcGFybGVtZW50YWlyZVwiLFxuICAgIETDqWNsYXJhdGlvbkR1R291dmVybmVtZW50U3VpdmllRFVuRMOpYmF0ID0gXCJEw6ljbGFyYXRpb24gZHUgR291dmVybmVtZW50IHN1aXZpZSBkJ3VuIGTDqWJhdFwiLFxuICAgIEVjaGFuZ2VzRGVWdWVzID0gXCJFY2hhbmdlcyBkZSB2dWVzXCIsXG4gICAgRXhhbWVuID0gXCJFeGFtZW5cIixcbiAgICBFeHBsaWNhdGlvbnNEZVZvdGVEZXNHcm91cGVzRXRWb3RlUGFyU2NydXRpblB1YmxpYyA9IFwiRXhwbGljYXRpb25zIGRlIHZvdGUgZGVzIGdyb3VwZXMgZXQgdm90ZSBwYXIgc2NydXRpbiBwdWJsaWNcIixcbiAgICBFeHBsaWNhdGlvbnNEZVZvdGVFdFZvdGVQYXJTY3J1dGluUHVibGljID0gXCJFeHBsaWNhdGlvbnMgZGUgdm90ZSBldCB2b3RlIHBhciBzY3J1dGluIHB1YmxpY1wiLFxuICAgIEZpeGF0aW9uRGVMT3JkcmVEdUpvdXIgPSBcIkZpeGF0aW9uIGRlIGwnb3JkcmUgZHUgam91clwiLFxuICAgIE5vbWluYXRpb25CdXJlYXUgPSBcIk5vbWluYXRpb24gYnVyZWF1XCIsXG4gICAgTm9taW5hdGlvbkNhbmRpZGF0c09yZ2FuaXNtZUV4dHJhcGFybGVtZW50YWlyZSA9IFwiTm9taW5hdGlvbiBjYW5kaWRhdHMgb3JnYW5pc21lIGV4dHJhcGFybGVtZW50YWlyZVwiLFxuICAgIE5vbWluYXRpb25EVW5NZW1icmVEVW5lTWlzc2lvbkRJbmZvcm1hdGlvbiA9IFwiTm9taW5hdGlvbiBkJ3VuIG1lbWJyZSBkJ3VuZSBtaXNzaW9uIGQnaW5mb3JtYXRpb25cIixcbiAgICBOb21pbmF0aW9uUmFwcG9ydGV1ciA9IFwiTm9taW5hdGlvbiByYXBwb3J0ZXVyXCIsXG4gICAgTm9taW5hdGlvblJhcHBvcnRldXJEQXBwbGljYXRpb24gPSBcIk5vbWluYXRpb24gcmFwcG9ydGV1ciBkJ2FwcGxpY2F0aW9uXCIsXG4gICAgTm9taW5hdGlvblJhcHBvcnRldXJESW5mb3JtYXRpb24gPSBcIk5vbWluYXRpb24gcmFwcG9ydGV1ciBkJ2luZm9ybWF0aW9uXCIsXG4gICAgTm9taW5hdGlvblJhcHBvcnRldXJQb3VyQXZpcyA9IFwiTm9taW5hdGlvbiByYXBwb3J0ZXVyIHBvdXIgYXZpc1wiLFxuICAgIE91dmVydHVyZUV0Q2zDtHR1cmVEZVNlc3Npb24gPSBcIk91dmVydHVyZSBldCBjbMO0dHVyZSBkZSBzZXNzaW9uXCIsXG4gICAgUXVlc3Rpb25zQXVHb3V2ZXJuZW1lbnQgPSBcIlF1ZXN0aW9ucyBhdSBHb3V2ZXJuZW1lbnRcIixcbiAgICBRdWVzdGlvbnNPcmFsZXNTYW5zRMOpYmF0ID0gXCJRdWVzdGlvbnMgb3JhbGVzIHNhbnMgZMOpYmF0XCIsXG4gICAgUmFwcG9ydCA9IFwiUmFwcG9ydFwiLFxuICAgIFJhcHBvcnRESW5mb3JtYXRpb24gPSBcIlJhcHBvcnQgZCdpbmZvcm1hdGlvblwiLFxuICAgIFJhcHBvcnRQb3VyQXZpcyA9IFwiUmFwcG9ydCBwb3VyIGF2aXNcIixcbiAgICBTZWFuY2VzUmVzZXJ2ZWVzR3JvdXBlT3Bwb3NpdGlvbk91TWlub3JpdGFpcmU9XCJTw6lhbmNlcyByw6lzZXJ2w6llcyDDoCB1biBncm91cGUgZGUgbCdvcHBvc2l0aW9uIG91IG1pbm9yaXRhaXJlXCIsXG4gICAgU3VpdGVEZUxhRGlzY3Vzc2lvbiA9IFwiU3VpdGUgZGUgbGEgZGlzY3Vzc2lvblwiLFxuICAgIFRhYmxlUm9uZGUgPSBcIlRhYmxlIHJvbmRlXCIsXG4gICAgVm90ZVBhclNjcnV0aW5QdWJsaWMgPSBcIlZvdGUgcGFyIHNjcnV0aW4gcHVibGljXCIsXG4gICAgVm90ZVNvbGVubmVsID0gXCJWb3RlIHNvbGVubmVsXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVtYW5kZXVyIHtcbiAgICBhY3RldXI/OiBBY3RldXJFbGVtZW50O1xuICAgIG9yZ2FuZT86IE9yZ2FuZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3RldXJFbGVtZW50IHtcbiAgICBub206ICAgICAgIG51bGwgfCBzdHJpbmc7XG4gICAgYWN0ZXVyUmVmOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5lIHtcbiAgICBub206ICAgICAgIHN0cmluZztcbiAgICBvcmdhbmVSZWY6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZW1hbmRldXJzIHtcbiAgICBhY3RldXI/OiBBY3RldXJFbGVtZW50W10gfCBBY3RldXJFbGVtZW50O1xuICAgIG9yZ2FuZT86IE9yZ2FuZTtcbn1cblxuZXhwb3J0IGVudW0gRm9ybWF0UmV1bmlvbiB7XG4gICAgQXVkaXRpb25FeHRlcm5lID0gXCJBdWRpdGlvbkV4dGVybmVcIixcbiAgICBBdWRpdGlvblBhclByZXNpZGVudENvbW1pc3Npb24gPSBcIkF1ZGl0aW9uUGFyUHJlc2lkZW50Q29tbWlzc2lvblwiLFxuICAgIEF1ZGl0aW9uUGFyUmFwcG9ydGV1ciA9IFwiQXVkaXRpb25QYXJSYXBwb3J0ZXVyXCIsXG4gICAgT3JkaW5haXJlID0gXCJPcmRpbmFpcmVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJZGVudGlmaWFudHMge1xuICAgIG51bVNlYW5jZUpPOiBudWxsIHwgc3RyaW5nO1xuICAgIGlkSk86ICAgICAgICBudWxsIHwgc3RyaW5nO1xuICAgIHF1YW50aWVtZTogICBRdWFudGllbWU7XG4gICAgRGF0ZVNlYW5jZTogIHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gUXVhbnRpZW1lIHtcbiAgICBEZXV4acOobWUgPSBcIkRldXhpw6htZVwiLFxuICAgIFByZW1pw6hyZSA9IFwiUHJlbWnDqHJlXCIsXG4gICAgVHJvaXNpw6htZSA9IFwiVHJvaXNpw6htZVwiLFxuICAgIFVuaXF1ZSA9IFwiVW5pcXVlXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlIHtcbiAgICBlc3RSZXVuaW9uSW50ZXJuYXRpb25hbGU6ICAgICBzdHJpbmc7XG4gICAgbGlzdGVQYXlzOiAgICAgICAgICAgICAgICAgICAgTGlzdGVQYXlzIHwgbnVsbDtcbiAgICBpbmZvcm1hdGlvbnNDb21wbGVtZW50YWlyZXM/OiBudWxsIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlUGF5cyB7XG4gICAgcGF5c1JlZjogc3RyaW5nW10gfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlldSB7XG4gICAgY29kZT86ICAgICAgICAgc3RyaW5nIHwgbnVsbDtcbiAgICBsaWJlbGxlQ291cnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIGxpYmVsbGVMb25nOiAgIG51bGwgfCBzdHJpbmc7XG4gICAgbGlldVJlZj86ICAgICAgc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdXJwbGVQYXJ0aWNpcGFudHMge1xuICAgIHBhcnRpY2lwYW50c0ludGVybmVzOiAgUHVycGxlUGFydGljaXBhbnRzSW50ZXJuZXMgfCBudWxsO1xuICAgIHBlcnNvbm5lc0F1ZGl0aW9ubmVlczogUHVycGxlUGVyc29ubmVzQXVkaXRpb25uZWVzIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdXJwbGVQYXJ0aWNpcGFudHNJbnRlcm5lcyB7XG4gICAgcGFydGljaXBhbnRJbnRlcm5lOiBQYXJ0aWNpcGFudEludGVybmVFbGVtZW50W10gfCBQYXJ0aWNpcGFudEludGVybmVFbGVtZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpY2lwYW50SW50ZXJuZUVsZW1lbnQge1xuICAgIGFjdGV1clJlZjogc3RyaW5nO1xuICAgIHByZXNlbmNlOiAgUHJlc2VuY2U7XG59XG5cbmV4cG9ydCBlbnVtIFByZXNlbmNlIHtcbiAgICBBYnNlbnQgPSBcImFic2VudFwiLFxuICAgIEV4Y3Vzw6kgPSBcImV4Y3Vzw6lcIixcbiAgICBQcsOpc2VudCA9IFwicHLDqXNlbnRcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdXJwbGVQZXJzb25uZXNBdWRpdGlvbm5lZXMge1xuICAgIHBlcnNvbm5lQXVkaXRpb25uZWU6IG51bGxbXSB8IG51bGw7XG59XG5cbmV4cG9ydCBlbnVtIFR5cGVSZXVuaW9uIHtcbiAgICBEZXAgPSBcIkRFUFwiLFxuICAgIEdhID0gXCJHQVwiLFxuICAgIEdlID0gXCJHRVwiLFxuICAgIEdldmkgPSBcIkdFVklcIixcbiAgICBHcCA9IFwiR1BcIixcbiAgICBIw6lBdXLDqWxpZW4gPSBcIkjDiSBBdXLDqWxpZW5cIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VuZGFzIHtcbiAgICByZXVuaW9uczogUmV1bmlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV1bmlvbnMge1xuICAgIHJldW5pb246IFJldW5pb25FbGVtZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV1bmlvbkVsZW1lbnQge1xuICAgIHVpZDogICAgICAgICAgICAgIHN0cmluZztcbiAgICB0aW1lU3RhbXBEZWJ1dDogICBEYXRlO1xuICAgIHRpbWVTdGFtcEZpbj86ICAgIHN0cmluZztcbiAgICBsaWV1OiAgICAgICAgICAgICBMaWV1O1xuICAgIGN5Y2xlRGVWaWU6ICAgICAgIEN5Y2xlRGVWaWU7XG4gICAgZGVtYW5kZXVycz86ICAgICAgRGVtYW5kZXVycyB8IG51bGw7XG4gICAgb3JnYW5lUmV1bmlSZWY6ICAgbnVsbCB8IHN0cmluZztcbiAgICB0eXBlUmV1bmlvbj86ICAgICBUeXBlUmV1bmlvbjtcbiAgICBcIkB4bWxuczp4c2lcIj86ICAgIHN0cmluZztcbiAgICBkZW1hbmRldXI/OiAgICAgICBudWxsO1xuICAgIHBhcnRpY2lwYW50cz86ICAgIEZsdWZmeVBhcnRpY2lwYW50cyB8IG51bGw7XG4gICAgc2Vzc2lvblJlZj86ICAgICAgbnVsbCB8IHN0cmluZztcbiAgICBvdXZlcnR1cmVQcmVzc2U/OiBzdHJpbmc7XG4gICAgT0RKPzogICAgICAgICAgICAgT2RqO1xuICAgIGNvbXB0ZVJlbmR1UmVmPzogIG51bGwgfCBzdHJpbmc7XG4gICAgaWRlbnRpZmlhbnRzPzogICAgSWRlbnRpZmlhbnRzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdWZmeVBhcnRpY2lwYW50cyB7XG4gICAgcGFydGljaXBhbnRzSW50ZXJuZXM6ICBGbHVmZnlQYXJ0aWNpcGFudHNJbnRlcm5lcyB8IG51bGw7XG4gICAgcGVyc29ubmVzQXVkaXRpb25uZWVzOiBGbHVmZnlQZXJzb25uZXNBdWRpdGlvbm5lZXMgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdWZmeVBhcnRpY2lwYW50c0ludGVybmVzIHtcbiAgICBwYXJ0aWNpcGFudEludGVybmU6IFBhcnRpY2lwYW50SW50ZXJuZUVsZW1lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbHVmZnlQZXJzb25uZXNBdWRpdGlvbm5lZXMge1xuICAgIHBlcnNvbm5lQXVkaXRpb25uZWU6IFBlcnNvbm5lQXVkaXRpb25uZWVFbGVtZW50W10gfCBQZXJzb25uZUF1ZGl0aW9ubmVlRWxlbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZXJzb25uZUF1ZGl0aW9ubmVlRWxlbWVudCB7XG4gICAgdWlkOiAgICAgIFVpZDtcbiAgICBpZGVudDogICAgSWRlbnQ7XG4gICAgZGF0ZU5haXM6IERhdGUgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50IHtcbiAgICBjaXY6ICAgICAgICBDaXY7XG4gICAgcHJlbm9tOiAgICAgc3RyaW5nO1xuICAgIG5vbTogICAgICAgIHN0cmluZztcbiAgICBhbHBoYT86ICAgICBzdHJpbmc7XG4gICAgdHJpZ3JhbW1lPzogbnVsbCB8IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gQ2l2IHtcbiAgICBNID0gXCJNLlwiLFxuICAgIE1tZSA9IFwiTW1lXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVWlkIHtcbiAgICBcIkB4c2k6dHlwZVwiOiBVaWRYc2lUeXBlO1xuICAgIFwiI3RleHRcIjogICAgIHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gVWlkWHNpVHlwZSB7XG4gICAgSWRBY3RldXJUeXBlID0gXCJJZEFjdGV1cl90eXBlXCIsXG4gICAgSWRQZXJzb25uZUV4dGVybmVUeXBlID0gXCJJZFBlcnNvbm5lRXh0ZXJuZV90eXBlXCIsXG59XG5cbi8vIENvbnZlcnRzIEpTT04gc3RyaW5ncyB0by9mcm9tIHlvdXIgdHlwZXNcbi8vIGFuZCBhc3NlcnRzIHRoZSByZXN1bHRzIG9mIEpTT04ucGFyc2UgYXQgcnVudGltZVxuZXhwb3J0IGNsYXNzIENvbnZlcnQge1xuICAgIHB1YmxpYyBzdGF0aWMgdG9SZXVuaW9uKGpzb246IHN0cmluZyk6IFJldW5pb24ge1xuICAgICAgICByZXR1cm4gY2FzdChKU09OLnBhcnNlKGpzb24pLCByKFwiUmV1bmlvblwiKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZXVuaW9uVG9Kc29uKHZhbHVlOiBSZXVuaW9uKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHVuY2FzdCh2YWx1ZSwgcihcIlJldW5pb25cIikpLCBudWxsLCAyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvQWdlbmRhcyhqc29uOiBzdHJpbmcpOiBBZ2VuZGFzIHtcbiAgICAgICAgcmV0dXJuIGNhc3QoSlNPTi5wYXJzZShqc29uKSwgcihcIkFnZW5kYXNcIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYWdlbmRhc1RvSnNvbih2YWx1ZTogQWdlbmRhcyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh1bmNhc3QodmFsdWUsIHIoXCJBZ2VuZGFzXCIpKSwgbnVsbCwgMik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkVmFsdWUodHlwOiBhbnksIHZhbDogYW55LCBrZXk6IGFueSA9ICcnKTogbmV2ZXIge1xuICAgIGlmIChrZXkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiLiBFeHBlY3RlZCB0eXBlICR7SlNPTi5zdHJpbmdpZnkodHlwKX0gYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbCl9YCk7XG4gICAgfVxuICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkodmFsKX0gZm9yIHR5cGUgJHtKU09OLnN0cmluZ2lmeSh0eXApfWAsICk7XG59XG5cbmZ1bmN0aW9uIGpzb25Ub0pTUHJvcHModHlwOiBhbnkpOiBhbnkge1xuICAgIGlmICh0eXAuanNvblRvSlMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtYXA6IGFueSA9IHt9O1xuICAgICAgICB0eXAucHJvcHMuZm9yRWFjaCgocDogYW55KSA9PiBtYXBbcC5qc29uXSA9IHsga2V5OiBwLmpzLCB0eXA6IHAudHlwIH0pO1xuICAgICAgICB0eXAuanNvblRvSlMgPSBtYXA7XG4gICAgfVxuICAgIHJldHVybiB0eXAuanNvblRvSlM7XG59XG5cbmZ1bmN0aW9uIGpzVG9KU09OUHJvcHModHlwOiBhbnkpOiBhbnkge1xuICAgIGlmICh0eXAuanNUb0pTT04gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtYXA6IGFueSA9IHt9O1xuICAgICAgICB0eXAucHJvcHMuZm9yRWFjaCgocDogYW55KSA9PiBtYXBbcC5qc10gPSB7IGtleTogcC5qc29uLCB0eXA6IHAudHlwIH0pO1xuICAgICAgICB0eXAuanNUb0pTT04gPSBtYXA7XG4gICAgfVxuICAgIHJldHVybiB0eXAuanNUb0pTT047XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybSh2YWw6IGFueSwgdHlwOiBhbnksIGdldFByb3BzOiBhbnksIGtleTogYW55ID0gJycpOiBhbnkge1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVByaW1pdGl2ZSh0eXA6IHN0cmluZywgdmFsOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIHR5cCA9PT0gdHlwZW9mIHZhbCkgcmV0dXJuIHZhbDtcbiAgICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZSh0eXAsIHZhbCwga2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Vbmlvbih0eXBzOiBhbnlbXSwgdmFsOiBhbnkpOiBhbnkge1xuICAgICAgICAvLyB2YWwgbXVzdCB2YWxpZGF0ZSBhZ2FpbnN0IG9uZSB0eXAgaW4gdHlwc1xuICAgICAgICBjb25zdCBsID0gdHlwcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0eXAgPSB0eXBzW2ldO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtKHZhbCwgdHlwLCBnZXRQcm9wcyk7XG4gICAgICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUodHlwcywgdmFsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1FbnVtKGNhc2VzOiBzdHJpbmdbXSwgdmFsOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAoY2FzZXMuaW5kZXhPZih2YWwpICE9PSAtMSkgcmV0dXJuIHZhbDtcbiAgICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZShjYXNlcywgdmFsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1BcnJheSh0eXA6IGFueSwgdmFsOiBhbnkpOiBhbnkge1xuICAgICAgICAvLyB2YWwgbXVzdCBiZSBhbiBhcnJheSB3aXRoIG5vIGludmFsaWQgZWxlbWVudHNcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBpbnZhbGlkVmFsdWUoXCJhcnJheVwiLCB2YWwpO1xuICAgICAgICByZXR1cm4gdmFsLm1hcChlbCA9PiB0cmFuc2Zvcm0oZWwsIHR5cCwgZ2V0UHJvcHMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRlKHZhbDogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgIGlmIChpc05hTihkLnZhbHVlT2YoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUoXCJEYXRlXCIsIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtT2JqZWN0KHByb3BzOiB7IFtrOiBzdHJpbmddOiBhbnkgfSwgYWRkaXRpb25hbDogYW55LCB2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUoXCJvYmplY3RcIiwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2tleV07XG4gICAgICAgICAgICBjb25zdCB2ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwga2V5KSA/IHZhbFtrZXldIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmVzdWx0W3Byb3Aua2V5XSA9IHRyYW5zZm9ybSh2LCBwcm9wLnR5cCwgZ2V0UHJvcHMsIHByb3Aua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvcHMsIGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHRyYW5zZm9ybSh2YWxba2V5XSwgYWRkaXRpb25hbCwgZ2V0UHJvcHMsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0eXAgPT09IFwiYW55XCIpIHJldHVybiB2YWw7XG4gICAgaWYgKHR5cCA9PT0gbnVsbCkge1xuICAgICAgICBpZiAodmFsID09PSBudWxsKSByZXR1cm4gdmFsO1xuICAgICAgICByZXR1cm4gaW52YWxpZFZhbHVlKHR5cCwgdmFsKTtcbiAgICB9XG4gICAgaWYgKHR5cCA9PT0gZmFsc2UpIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwpO1xuICAgIHdoaWxlICh0eXBlb2YgdHlwID09PSBcIm9iamVjdFwiICYmIHR5cC5yZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0eXAgPSB0eXBlTWFwW3R5cC5yZWZdO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXApKSByZXR1cm4gdHJhbnNmb3JtRW51bSh0eXAsIHZhbCk7XG4gICAgaWYgKHR5cGVvZiB0eXAgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIHR5cC5oYXNPd25Qcm9wZXJ0eShcInVuaW9uTWVtYmVyc1wiKSA/IHRyYW5zZm9ybVVuaW9uKHR5cC51bmlvbk1lbWJlcnMsIHZhbClcbiAgICAgICAgICAgIDogdHlwLmhhc093blByb3BlcnR5KFwiYXJyYXlJdGVtc1wiKSAgICA/IHRyYW5zZm9ybUFycmF5KHR5cC5hcnJheUl0ZW1zLCB2YWwpXG4gICAgICAgICAgICA6IHR5cC5oYXNPd25Qcm9wZXJ0eShcInByb3BzXCIpICAgICAgICAgPyB0cmFuc2Zvcm1PYmplY3QoZ2V0UHJvcHModHlwKSwgdHlwLmFkZGl0aW9uYWwsIHZhbClcbiAgICAgICAgICAgIDogaW52YWxpZFZhbHVlKHR5cCwgdmFsKTtcbiAgICB9XG4gICAgLy8gTnVtYmVycyBjYW4gYmUgcGFyc2VkIGJ5IERhdGUgYnV0IHNob3VsZG4ndCBiZS5cbiAgICBpZiAodHlwID09PSBEYXRlICYmIHR5cGVvZiB2YWwgIT09IFwibnVtYmVyXCIpIHJldHVybiB0cmFuc2Zvcm1EYXRlKHZhbCk7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVByaW1pdGl2ZSh0eXAsIHZhbCk7XG59XG5cbmZ1bmN0aW9uIGNhc3Q8VD4odmFsOiBhbnksIHR5cDogYW55KTogVCB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybSh2YWwsIHR5cCwganNvblRvSlNQcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVuY2FzdDxUPih2YWw6IFQsIHR5cDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdHJhbnNmb3JtKHZhbCwgdHlwLCBqc1RvSlNPTlByb3BzKTtcbn1cblxuZnVuY3Rpb24gYSh0eXA6IGFueSkge1xuICAgIHJldHVybiB7IGFycmF5SXRlbXM6IHR5cCB9O1xufVxuXG5mdW5jdGlvbiB1KC4uLnR5cHM6IGFueVtdKSB7XG4gICAgcmV0dXJuIHsgdW5pb25NZW1iZXJzOiB0eXBzIH07XG59XG5cbmZ1bmN0aW9uIG8ocHJvcHM6IGFueVtdLCBhZGRpdGlvbmFsOiBhbnkpIHtcbiAgICByZXR1cm4geyBwcm9wcywgYWRkaXRpb25hbCB9O1xufVxuXG4vLyBmdW5jdGlvbiBtKGFkZGl0aW9uYWw6IGFueSkge1xuLy8gICAgIHJldHVybiB7IHByb3BzOiBbXSwgYWRkaXRpb25hbCB9O1xuLy8gfVxuXG5mdW5jdGlvbiByKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB7IHJlZjogbmFtZSB9O1xufVxuXG5jb25zdCB0eXBlTWFwOiBhbnkgPSB7XG4gICAgXCJSZXVuaW9uXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwicmV1bmlvblwiLCBqczogXCJyZXVuaW9uXCIsIHR5cDogcihcIlJldW5pb25SZXVuaW9uXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiUmV1bmlvblJldW5pb25cIjogbyhbXG4gICAgICAgIHsganNvbjogXCJAeG1sbnNcIiwganM6IFwiQHhtbG5zXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiQHhtbG5zOnhzaVwiLCBqczogXCJAeG1sbnM6eHNpXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiQHhzaTp0eXBlXCIsIGpzOiBcIkB4c2k6dHlwZVwiLCB0eXA6IHIoXCJSZXVuaW9uWHNpVHlwZVwiKSB9LFxuICAgICAgICB7IGpzb246IFwidWlkXCIsIGpzOiBcInVpZFwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcInRpbWVTdGFtcERlYnV0XCIsIGpzOiBcInRpbWVTdGFtcERlYnV0XCIsIHR5cDogRGF0ZSB9LFxuICAgICAgICB7IGpzb246IFwidGltZVN0YW1wRmluXCIsIGpzOiBcInRpbWVTdGFtcEZpblwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgICB7IGpzb246IFwibGlldVwiLCBqczogXCJsaWV1XCIsIHR5cDogdSh1bmRlZmluZWQsIHIoXCJMaWV1XCIpKSB9LFxuICAgICAgICB7IGpzb246IFwiY3ljbGVEZVZpZVwiLCBqczogXCJjeWNsZURlVmllXCIsIHR5cDogcihcIkN5Y2xlRGVWaWVcIikgfSxcbiAgICAgICAgeyBqc29uOiBcImRlbWFuZGV1cnNcIiwganM6IFwiZGVtYW5kZXVyc1wiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJEZW1hbmRldXJzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcIm9yZ2FuZVJldW5pUmVmXCIsIGpzOiBcIm9yZ2FuZVJldW5pUmVmXCIsIHR5cDogdShudWxsLCBcIlwiKSB9LFxuICAgICAgICB7IGpzb246IFwidHlwZVJldW5pb25cIiwganM6IFwidHlwZVJldW5pb25cIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIlR5cGVSZXVuaW9uXCIpKSB9LFxuICAgICAgICB7IGpzb246IFwiZGVtYW5kZXVyXCIsIGpzOiBcImRlbWFuZGV1clwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJEZW1hbmRldXJcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwicGFydGljaXBhbnRzXCIsIGpzOiBcInBhcnRpY2lwYW50c1wiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJQdXJwbGVQYXJ0aWNpcGFudHNcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwidmlzaW9Db25mZXJlbmNlXCIsIGpzOiBcInZpc2lvQ29uZmVyZW5jZVwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KG51bGwsIFwiXCIpKSB9LFxuICAgICAgICB7IGpzb246IFwiT0RKXCIsIGpzOiBcIk9ESlwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJPZGpcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwic2Vzc2lvblJlZlwiLCBqczogXCJzZXNzaW9uUmVmXCIsIHR5cDogdSh1bmRlZmluZWQsIHUoXCJcIiwgbnVsbCkpIH0sXG4gICAgICAgIHsganNvbjogXCJvdXZlcnR1cmVQcmVzc2VcIiwganM6IFwib3V2ZXJ0dXJlUHJlc3NlXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJjYXB0YXRpb25WaWRlb1wiLCBqczogXCJjYXB0YXRpb25WaWRlb1wiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgICB7IGpzb246IFwiY29tcHRlUmVuZHVSZWZcIiwganM6IFwiY29tcHRlUmVuZHVSZWZcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShudWxsLCBcIlwiKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImZvcm1hdFJldW5pb25cIiwganM6IFwiZm9ybWF0UmV1bmlvblwiLCB0eXA6IHUodW5kZWZpbmVkLCByKFwiRm9ybWF0UmV1bmlvblwiKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZVwiLCBqczogXCJpbmZvc1JldW5pb25zSW50ZXJuYXRpb25hbGVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIkluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZVwiKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImlkZW50aWZpYW50c1wiLCBqczogXCJpZGVudGlmaWFudHNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIklkZW50aWZpYW50c1wiKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJPZGpcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJjb252b2NhdGlvbk9ESlwiLCBqczogXCJjb252b2NhdGlvbk9ESlwiLCB0eXA6IHUocihcIkNvbnZvY2F0aW9uT2RqQ2xhc3NcIiksIG51bGwpIH0sXG4gICAgICAgIHsganNvbjogXCJyZXN1bWVPREpcIiwganM6IFwicmVzdW1lT0RKXCIsIHR5cDogdShyKFwiQ29udm9jYXRpb25PZGpDbGFzc1wiKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcInBvaW50c09ESlwiLCBqczogXCJwb2ludHNPREpcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiUG9pbnRzT2RqXCIpLCBudWxsKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJDb252b2NhdGlvbk9kakNsYXNzXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwiaXRlbVwiLCBqczogXCJpdGVtXCIsIHR5cDogdShhKFwiXCIpLCBcIlwiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIlBvaW50c09kalwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcInBvaW50T0RKXCIsIGpzOiBcInBvaW50T0RKXCIsIHR5cDogdShhKHIoXCJQb2ludE9kakVsZW1lbnRcIikpLCByKFwiUG9pbnRPZGpFbGVtZW50XCIpKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIlBvaW50T2RqRWxlbWVudFwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIkB4c2k6dHlwZVwiLCBqczogXCJAeHNpOnR5cGVcIiwgdHlwOiByKFwiUG9pbnRPZGpYc2lUeXBlXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJ1aWRcIiwganM6IFwidWlkXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiY3ljbGVEZVZpZVwiLCBqczogXCJjeWNsZURlVmllXCIsIHR5cDogcihcIkN5Y2xlRGVWaWVcIikgfSxcbiAgICAgICAgeyBqc29uOiBcIm9iamV0XCIsIGpzOiBcIm9iamV0XCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiZGVtYW5kZXVyUG9pbnRcIiwganM6IFwiZGVtYW5kZXVyUG9pbnRcIiwgdHlwOiBudWxsIH0sXG4gICAgICAgIHsganNvbjogXCJwcm9jZWR1cmVcIiwganM6IFwicHJvY2VkdXJlXCIsIHR5cDogdShyKFwiUHJvY2VkdXJlXCIpLCBudWxsKSB9LFxuICAgICAgICB7IGpzb246IFwiZG9zc2llcnNMZWdpc2xhdGlmc1JlZnNcIiwganM6IFwiZG9zc2llcnNMZWdpc2xhdGlmc1JlZnNcIiwgdHlwOiB1KHIoXCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmVmc1wiKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcInR5cGVQb2ludE9ESlwiLCBqczogXCJ0eXBlUG9pbnRPREpcIiwgdHlwOiByKFwiVHlwZVBvaW50T2RqXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJjb21pdGVTZWNyZXRcIiwganM6IFwiY29taXRlU2VjcmV0XCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwidGV4dGVzQXNzb2NpZXNcIiwganM6IFwidGV4dGVzQXNzb2NpZXNcIiwgdHlwOiBudWxsIH0sXG4gICAgICAgIHsganNvbjogXCJuYXR1cmVUcmF2YXV4T0RKXCIsIGpzOiBcIm5hdHVyZVRyYXZhdXhPREpcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIk5hdHVyZVRyYXZhdXhPZGpcIikpIH0sXG4gICAgICAgIHsganNvbjogXCJkYXRlQ29uZlByZXNcIiwganM6IFwiZGF0ZUNvbmZQcmVzXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJkYXRlTGV0dHJlTWluaXN0cmVcIiwganM6IFwiZGF0ZUxldHRyZU1pbmlzdHJlXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiQ3ljbGVEZVZpZVwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImV0YXRcIiwganM6IFwiZXRhdFwiLCB0eXA6IHIoXCJFdGF0XCIpIH0sXG4gICAgICAgIHsganNvbjogXCJjaHJvbm9cIiwganM6IFwiY2hyb25vXCIsIHR5cDogcihcIkNocm9ub1wiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkNocm9ub1wiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImNyZWF0aW9uXCIsIGpzOiBcImNyZWF0aW9uXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiY2xvdHVyZVwiLCBqczogXCJjbG90dXJlXCIsIHR5cDogdShudWxsLCBcIlwiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwiZG9zc2llclJlZlwiLCBqczogXCJkb3NzaWVyUmVmXCIsIHR5cDogdShhKFwiXCIpLCBcIlwiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkRlbWFuZGV1clwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImFjdGV1clwiLCBqczogXCJhY3RldXJcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIkFjdGV1ckVsZW1lbnRcIikpIH0sXG4gICAgICAgIHsganNvbjogXCJvcmdhbmVcIiwganM6IFwib3JnYW5lXCIsIHR5cDogdSh1bmRlZmluZWQsIHIoXCJPcmdhbmVcIikpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiQWN0ZXVyRWxlbWVudFwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIm5vbVwiLCBqczogXCJub21cIiwgdHlwOiB1KG51bGwsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJhY3RldXJSZWZcIiwganM6IFwiYWN0ZXVyUmVmXCIsIHR5cDogXCJcIiB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIk9yZ2FuZVwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIm5vbVwiLCBqczogXCJub21cIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJvcmdhbmVSZWZcIiwganM6IFwib3JnYW5lUmVmXCIsIHR5cDogXCJcIiB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkRlbWFuZGV1cnNcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJhY3RldXJcIiwganM6IFwiYWN0ZXVyXCIsIHR5cDogdSh1bmRlZmluZWQsIHUoYShyKFwiQWN0ZXVyRWxlbWVudFwiKSksIHIoXCJBY3RldXJFbGVtZW50XCIpKSkgfSxcbiAgICAgICAgeyBqc29uOiBcIm9yZ2FuZVwiLCBqczogXCJvcmdhbmVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIk9yZ2FuZVwiKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJJZGVudGlmaWFudHNcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJudW1TZWFuY2VKT1wiLCBqczogXCJudW1TZWFuY2VKT1wiLCB0eXA6IHUobnVsbCwgXCJcIikgfSxcbiAgICAgICAgeyBqc29uOiBcImlkSk9cIiwganM6IFwiaWRKT1wiLCB0eXA6IHUobnVsbCwgXCJcIikgfSxcbiAgICAgICAge