simclimat-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.
283 lines • 67.6 kB
JavaScript
import { CLogger } from './simclimat-lib.logger';
/**
* This class define physics constants and calculated physics constants.
*
* Instanciation example :
*
* ```typescript
* const instance = new CPhysicsConstants();
* ```
*
* @remarks
* This method is part of the {@link core-library#Statistics | Statistics subsystem}.
*
* @author Alain Deseine
*
* @copyright CEI Alain Deseine 1992-2019
*
* @beta
*/
export class CPhysicsConstants {
// si 1: calcul Euler explicite
// si 2: calcul par decroissance vers équilibre
/**
* Constructor.
*
* The constructor of this class calculate calculated physics constants.
*
* @remarks
* This method is part of the {@link core-library#Statistics | Statistics subsystem}.
*
* @beta
*/
constructor() {
// Set calculated physics constants
CLogger.log('physics-constants: appel constructor');
this.t_res_coo_actuel = 280 / 0.083 / (CPhysicsConstants.concentration_coo_2007 / CPhysicsConstants.coo_Gt_2007); // Modification mars 2022
this.t_res_coo_90 = this.t_res_coo_actuel * 0.9;
this.t_res_coo_critique = this.t_res_coo_90 + (90 - CPhysicsConstants.niveau_calotte_critique_coo) * -(this.t_res_coo_90 - this.t_res_coo_actuel) / (90 - CPhysicsConstants.niveau_calottes_1750);
this.deltaT_last_century = CPhysicsConstants.temperature_actuelle - CPhysicsConstants.temperature_1750;
//this.temperature_1900 = CPhysicsConstants.temperature_actuelle - CPhysicsConstants.deltaT_last_century; // en °C ; necessaire dans modele_reset
this.G0 = CPhysicsConstants.puissance_recue_zero * (1 - CPhysicsConstants.albedo_1750) / CPhysicsConstants.sigma / Math.exp(4 * Math.log(CPhysicsConstants.Tkelvin + CPhysicsConstants.temperature_1750)); //0.584;
// commenté le 19 avril 2024 par Camille car inutile
/*
this.T_ressentie_actuelle = ( 1. / ( CPhysicsConstants.p0 + CPhysicsConstants.p1 + CPhysicsConstants.p2 + CPhysicsConstants.p3 ) ) * ( CPhysicsConstants.p0 * CPhysicsConstants.temperature_actuelle
+ CPhysicsConstants.p1 * CPhysicsConstants.temperature_actuelle - CPhysicsConstants.deltaT_last_century / 100 * CPhysicsConstants.deltat1
+ CPhysicsConstants.p2 * CPhysicsConstants.temperature_actuelle - CPhysicsConstants.deltaT_last_century / 100 * CPhysicsConstants.deltat2
+ CPhysicsConstants.p3 * CPhysicsConstants.temperature_actuelle - CPhysicsConstants.deltaT_last_century / 100 * CPhysicsConstants.deltat3 );
*/
this.a_calottes = (CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_LGM_noinsol) / (CPhysicsConstants.temperature_1750 - CPhysicsConstants.temperature_LGM) * 0.8; // on suppose qu'une partie de la variation du niveau de calotte est lié à l'effet de la température (ici 40%), et l'autre est liée à l'effet de la variation d'insolation.
this.b_calottes = CPhysicsConstants.niveau_calottes_1750 - this.a_calottes * CPhysicsConstants.temperature_1750;
this.niveau_calottes_actuel = CPhysicsConstants.niveau_calottes_1750 + (this.a_calottes * CPhysicsConstants.temperature_actuelle + this.b_calottes - CPhysicsConstants.niveau_calottes_1750) * (1. - Math.exp(-100. / CPhysicsConstants.tau_niveau_calottes_deglacement));
CLogger.log('physics-constants: niveau_calottes_actuel= ' + this.niveau_calottes_actuel);
//CLogger.log( 'niveau_calottes_1750,temperature_actuelle,niveau_calottes_1750=' + CPhysicsConstants.niveau_calottes_1750 + CPhysicsConstants.temperature_actuelle + CPhysicsConstants.niveau_calottes_1750);
//CLogger.log ('a_calottes,b_calottes,tau_niveau_calottes_deglacement=' + this.a_calottes + this.b_calottes + CPhysicsConstants.tau_niveau_calottes_deglacement);
// modif CR: 31 oct 2019: Tressentie_act doit correspondre au calcul dans calcul_niveau_mer
// this.Tressentie_act = CPhysicsConstants.temperature_actuelle - 0.7; // orig -0.75
this.pond_memoire_mer = Math.exp(-CPhysicsConstants.tmemoire_niveau_mer / CPhysicsConstants.tau_niveau_mer);
CLogger.log('physics-constants: pond_memoire_mer= ' + this.pond_memoire_mer);
CLogger.log('pond_memoire_mer=' + this.pond_memoire_mer);
CLogger.log('temperature_actuelle=' + CPhysicsConstants.temperature_actuelle);
CLogger.log('deltaT_last_century=' + this.deltaT_last_century);
this.Tressentie_act = CPhysicsConstants.temperature_actuelle - this.pond_memoire_mer * this.deltaT_last_century; // -0.64
this.dilatation_1750 = CPhysicsConstants.dilat * CPhysicsConstants.coef_dilat * (CPhysicsConstants.temperature_1750 - this.Tressentie_act);
CLogger.log('dilatation_1750=' + this.dilatation_1750);
CLogger.log('dilat=' + CPhysicsConstants.dilat);
CLogger.log('coef_dilat=' + CPhysicsConstants.coef_dilat);
CLogger.log('temperature_1750=' + CPhysicsConstants.temperature_1750);
CLogger.log('Tressentie_act=' + this.Tressentie_act);
// Commenté par Camille le 19 avril 2024 car c'est devenu inutile
/*
this.optim1 = ( 1 + this.dilatation_1750 ) * ( 1
- CPhysicsConstants.fphig2 * Math.pow( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max, 2 )
- CPhysicsConstants.fphig3 * Math.pow( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max, 3 ) )
- ( 1 - CPhysicsConstants.fphig2 * Math.pow( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max, 2 )
- CPhysicsConstants.fphig3 * Math.pow( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max, 3 ) );
this.optim2 = ( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max ) - ( 1 + this.dilatation_1750 ) * ( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max );
this.fphig1 = (CPhysicsConstants.niveau_mer_1750_target / CPhysicsConstants.Hmer_tot - this.optim1 ) / this.optim2;
*/
// CR avril 2024: Hmer_tot est maintenant ajusté avec le LGM
CPhysicsConstants.Hmer_tot = (CPhysicsConstants.niveau_mer_LGM + 10.0) / ((1. - Math.cos((CPhysicsConstants.niveau_calottes_max - this.niveau_calottes_actuel) * CPhysicsConstants.pi / 180)) * Math.pow((1. - this.niveau_calottes_actuel / CPhysicsConstants.niveau_calottes_max), CPhysicsConstants.expmer) - (1. - Math.cos((CPhysicsConstants.niveau_calottes_max - CPhysicsConstants.niveau_calottes_LGM) * CPhysicsConstants.pi / 180)) * Math.pow((1. - CPhysicsConstants.niveau_calottes_LGM / CPhysicsConstants.niveau_calottes_max), CPhysicsConstants.expmer));
CLogger.log('physics-constants: Hmer_tot = ' + CPhysicsConstants.Hmer_tot);
CLogger.log('physics-constants: niveau_calottes_actuel=' + this.niveau_calottes_actuel);
// CR avril 2024: Hmeract calculé avec la nouvelle formule du niveau mer
this.Hmeract = CPhysicsConstants.Hmer_tot * (1. - (1. - Math.cos((CPhysicsConstants.niveau_calottes_max - this.niveau_calottes_actuel) * CPhysicsConstants.pi / 180)) * Math.pow((1. - this.niveau_calottes_actuel / CPhysicsConstants.niveau_calottes_max), CPhysicsConstants.expmer));
CLogger.log('physics-constants: Hmeract = ' + this.Hmeract);
/*
this.Hmeract = CPhysicsConstants.Hmer_tot * ( 1
- this.fphig1 * ( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max)
- CPhysicsConstants.fphig2 * Math.pow( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max, 2 )
- CPhysicsConstants.fphig3 * Math.pow( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max, 3 ) );
*/
// modif CR 4 nov 2019: calcul exact de niveau_mer_1750
// this.niveau_mer_1750 = CPhysicsConstants.Hmer_tot * ( 1 + CPhysicsConstants.dilat * 0.5 * ( CPhysicsConstants.temperature_1750 - this.Tressentie_act ) ) * ( 1
// - this.fphig1 * ( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max)
// - CPhysicsConstants.fphig2 * Math.pow( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max, 2 )
// - CPhysicsConstants.fphig3 * Math.pow( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max, 3 ) ) - this.Hmeract;
// modif CR avril 2024 car on modifie le calcul de niveau mer.
this.Hmer_1750 = CPhysicsConstants.Hmer_tot * (1 + this.dilatation_1750) * (1. - (1. - Math.cos((CPhysicsConstants.niveau_calottes_max - CPhysicsConstants.niveau_calottes_1750) * CPhysicsConstants.pi / 180)) * Math.pow((1. - CPhysicsConstants.niveau_calottes_1750 / CPhysicsConstants.niveau_calottes_max), CPhysicsConstants.expmer));
CLogger.log('physics-constants: Hmer_1750 = ' + this.Hmer_1750);
CLogger.log('physics-constants: dilatation_1750= ' + this.dilatation_1750);
CLogger.log('physics-constants: Hmer_tot= ' + CPhysicsConstants.Hmer_tot);
CLogger.log('physics-constants: CPhysicsConstants.niveau_calottes_1750 = ' + CPhysicsConstants.niveau_calottes_1750);
this.niveau_mer_1750 = this.Hmer_1750 - this.Hmeract;
CLogger.log('physics-constants: niveau_mer_1750 = ' + this.niveau_mer_1750);
this.C_alteration_naturel = -CPhysicsConstants.volcanisme_actuel / CPhysicsConstants.concentration_coo_1750;
this.deltaT_poce = 0.5 / CPhysicsConstants.A_oce;
this.a_H2O = -CPhysicsConstants.q_H2O * (1 - this.G0);
this.Tlim_bio_froid = CPhysicsConstants.temperature_froid;
this.delta_angle_actuel = (CPhysicsConstants.lat_Mil - CPhysicsConstants.obliquite_actuel) / 360 * 2 * CPhysicsConstants.pi;
this.insol_actuel = CPhysicsConstants.puissance_recue_zero * Math.cos(this.delta_angle_actuel);
this.albedo_crit = (CPhysicsConstants.albedo_1750 - CPhysicsConstants.albedo_ter * (CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.phig_crit) /
(CPhysicsConstants.niveau_calottes_max - CPhysicsConstants.phig_crit)) /
(1 - (CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.phig_crit) /
(CPhysicsConstants.niveau_calottes_max - CPhysicsConstants.phig_crit)); // 0.41
this.albedo_actuel = this.albedo_crit + (this.niveau_calottes_actuel - CPhysicsConstants.phig_crit) / (CPhysicsConstants.niveau_calottes_max - CPhysicsConstants.phig_crit) * (CPhysicsConstants.albedo_ter - this.albedo_crit);
this.stockage_max = CPhysicsConstants.flux_co2_stockage_max / CPhysicsConstants.concentration_coo_1750;
this.concentration_coo_carbonifere = CPhysicsConstants.concentration_coo_1750 * 2; // modif 7 avril 2009
this.stockage_carbonifere = CPhysicsConstants.flux_co2_stockage_carbonifere / this.concentration_coo_carbonifere;
}
/**
* logModelConstants method.
*
* this method simply log to the console class properties and methods.
*
* @remarks
* This method is part of the {@link core-library#Statistics | Statistics subsystem}.
*
* @beta
*/
logModelConstants() {
console.log(this);
}
/**
* toJSON method.
*
* this method return the public and protected object properties.
*
* @remarks
* This method is part of the {@link core-library#Statistics | Statistics subsystem}.
*
* @beta
*/
toJSON() {
let properties = Object.getOwnPropertyNames(this);
return properties;
}
}
// Constantes mathématiques
/** Pi math constant */
CPhysicsConstants.pi = Math.PI;
// constantes radiatives
CPhysicsConstants.puissance_recue_zero = 1370 / 4.;
CPhysicsConstants.distance_ts_actuelle = 1.5e11;
CPhysicsConstants.sigma = 5.67e-8;
// constantes du calcul de l'albédo
CPhysicsConstants.albedo_froid = 0.65;
CPhysicsConstants.albedo_chaud = 0.325;
CPhysicsConstants.temperature_froid = 262;
CPhysicsConstants.temperature_chaud = 286;
// constantes des GES (Gaz à effet de serre)
// conversions de Gt à ppm:
/** 5.13e6 en Gt */
CPhysicsConstants.masse_atmosphere_Gt = 1.4e6;
/** Exprimée eng/mol */
CPhysicsConstants.masse_molaire_coo = 44;
CPhysicsConstants.masse_molaire_chhhh = 16;
CPhysicsConstants.masse_molaire_air = 29;
// concentrations actuelles et naturelles
CPhysicsConstants.concentration_coo_actuel = 405; // ppm
CPhysicsConstants.concentration_coo_2007 = 370; // ppm: ajout mars 2022
CPhysicsConstants.concentration_coo_1750 = 280;
CPhysicsConstants.concentration_coo_naturel = 280;
CPhysicsConstants.concentration_coo_min = 1e-1; // pour ne pas avoir de nan en prenant le log
CPhysicsConstants.coo_Gt_act = 750; // masse de CO2 en Gt
CPhysicsConstants.coo_Gt_2007 = 750; // masse de CO2 en Gt: ajout mars 2022
CPhysicsConstants.coo_Gt_1750 = 280 * 750 / 370; // masse de CO2 en Gt
CPhysicsConstants.concentration_coo_glaciaire = 180; // ppm
// constantes radiatives
CPhysicsConstants.a_coo = 22e-3; // 5.35; On peut changer cette valeur sans changer l'equilibre pre-industriel.
CPhysicsConstants.concentration_coo_limite = 10000; // en ppm, la limite entre relation linéaire et log pour forcage serre
// pour extrapolations lin pour hautes concentrations
CPhysicsConstants.concentration_coo_limite_bas = 100; // en ppm,idem pour extrapolation pour basses concnetrations
CPhysicsConstants.G_min = 1e-4; // forcage_serre min, pour eviter des nan
CPhysicsConstants.t_res_coo_0 = 1.5e6;
CPhysicsConstants.niveau_calotte_critique_coo = 20;
CPhysicsConstants.niveau_calottes_1750 = 60;
// const double facteur_alteration_0=1e-3;
// const double facteur_alteration_90=1;
// températures
CPhysicsConstants.tau_temperature = 30; // en années
CPhysicsConstants.temperature_actuelle = 15.5; // en °C ; necessaire dans modele_reset
// calculée à la main pour C02=370 et albédo=albédo_actuel
// public readonly temperature_1900: number;
CPhysicsConstants.temperature_1750 = 14.4;
CPhysicsConstants.temperature_LGM = 10;
CPhysicsConstants.C_terre = 5e9; // capacité calorifique de la Terre en J/K/m2
CPhysicsConstants.Tkelvin = 273.0;
// données radiatives sur l'actuel
CPhysicsConstants.albedo_1750 = 0.33;
// données et constantes de bidouille sur le niveau de la mer
/** Facteur de pondération de la température il y a [[deltat0]] ans */
// constantes commentées par Camille le 19 avril 2024 car sont inutiles
// public static readonly p0: number = 1.;
// public static readonly p1: number = 5.;
// public static readonly p2: number = 3.;
// public static readonly p3: number = 1.;
/** Retard en temps en année */
CPhysicsConstants.deltat0 = 0.;
CPhysicsConstants.deltat1 = 5.;
CPhysicsConstants.deltat2 = 20.;
CPhysicsConstants.deltat3 = 50.;
CPhysicsConstants.C_niveau = 100.; // orig=96
CPhysicsConstants.a_mer = 140;
CPhysicsConstants.tmemoire_niveau_mer = 100.; // le 30 janvier 2011: en fait, tau_niveau_mer ne peut dépasser 100 ans car c'est la mémoire maximale d'une simul pour la simul précédente. # c est le pas de temps utilise pour calculer l effet memoire.
CPhysicsConstants.tau_niveau_mer = 1000.; // c est l echelle de temps caracteristique de l evolution de la temperature de l ocean
// public readonly T_ressentie_actuelle: number; // commenté le 19 avril 2024 par Camille car c'est inutile
// niveau mer exprimé en m /t actuel
CPhysicsConstants.niveau_mer_LGM = -130;
// niveau des calottes
CPhysicsConstants.niveau_calottes_LGM = 45;
CPhysicsConstants.niveau_calottes_LGM_noinsol = 52;
CPhysicsConstants.tau_niveau_calottes_englacement = 5000.;
CPhysicsConstants.tau_niveau_calottes_deglacement = 5000.;
CPhysicsConstants.niveau_calottes_min = 0;
CPhysicsConstants.niveau_calottes_max = 90;
CPhysicsConstants.dilat = 2.4e-4; // en °C
CPhysicsConstants.coef_dilat = 2.0; // c'est un param ajustable pour ajuster la dilatation. Avant on n'en avait pas besoin parce que Hmer_tot réaliste, mais là, on l'ajuste su le changement de niveau mer du LGM
// public readonly optim1: number;
// public readonly optim2: number;
CPhysicsConstants.expmer = 1.5; // constante ajoutée le 19 avril 2024 par Camille. C'est un exposant qui sert de maramètre ajustable pour que niveau_mer_1750 soit à peu près égale à -0.2 m.
// public static readonly niveau_mer_1750_target: number = -0.2; // commenté le 19 avril 2024 par Camille
// flux de carbone
// const double CO2_biologique_eq=concentration_coo_naturel;
// calcul CO2_ocean_eq en fonction temp�rature
CPhysicsConstants.a_CO2_eq = 20; // ppm/°C
CPhysicsConstants.emit_anthro_coo_act = 12; // Gt: mise à jour mars 2022
CPhysicsConstants.volcanisme_actuel = 0.083; // en Gt/an
CPhysicsConstants.puit_ocean_act = 20.0; // en pourcent des emissions anthro absorbées
CPhysicsConstants.Tlim_oce = 10; // en °K
// const double rel_CO2_temperature=emit_anthro_coo_act/Tlim_oce;
CPhysicsConstants.b_ocean = 1 / 5000.0;
CPhysicsConstants.Tlim_oce_froid = 275;
CPhysicsConstants.A_oce = 3e-2;
CPhysicsConstants.Tcrit_oce = 35;
CPhysicsConstants.puit_oce_max = 40; // en pourcent
CPhysicsConstants.dFdegaz = 0.05;
CPhysicsConstants.q_CO2 = 0.26; // CO2=26% de l'effet de serre
// retroactions vapeur d'eau
CPhysicsConstants.q_H2O = 0.6; // eau=60% de l'effet de serre
// public static readonly tau_T: number = 200; // en °K
CPhysicsConstants.rapport_H2O_actconst = 1.05719; // rapport pour la température actuelle
CPhysicsConstants.a_rankine = 13.7;
CPhysicsConstants.b_rankine = 5120.;
CPhysicsConstants.pow_H2O = 0.23; // normallement: 0.18
// paramétrisation de A_biologique en fonction de la température
CPhysicsConstants.puit_bio_act = 30; // en pourcent
CPhysicsConstants.Tlim_bio_chaud = 340; // en K
//const double A_biologique_act=-puit_bio_act*emit_anthro_coo_act/(concentration_coo_actuel-concentration_coo_1750); // en an-1
// parametres orbitaux
CPhysicsConstants.lat_Mil = 65;
CPhysicsConstants.c_calottes = 0.2;
//const double precession_actuel=-90;
CPhysicsConstants.precession_actuel = 102.7; // modif 31 janv 2009: on prend la même precession que LMDZ
// la formule de insol65N n'a pas été modifiée car 2 bugs se compensaient
CPhysicsConstants.obliquite_actuel = 23.5;
CPhysicsConstants.excentricite_actuel = 0.0167;
// albédo
CPhysicsConstants.albedo_phi_min = 0.60;
CPhysicsConstants.albedo_phi_max = 0.2;
CPhysicsConstants.albedo_glace_const = 0.90;
CPhysicsConstants.phig_crit = 30.0; // 30
CPhysicsConstants.albedo_ter = 0.25;
// calcule de la température
CPhysicsConstants.capacite_calorifique = 0.1;
// stockage biologique
CPhysicsConstants.flux_co2_stockage_max = -10; // GT/an-1
CPhysicsConstants.flux_co2_stockage_carbonifere = -0.396; // en Gt par an d'apres R.A. Berner et D.E. Canfield (1989)
// logicals
CPhysicsConstants.echantillonage = 1;
// if 1: échantillonage direct au pas de temps
// if 2: échantillonage en moyennant sur les pas de temps autour du point d'échantillonage
CPhysicsConstants.calcul_carbone = 1;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltY2xpbWF0LWxpYi5waHlzaWNzLWNvbnN0YW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbWNsaW1hdC1saWIvc3JjL2xpYi9zaW1jbGltYXQtbGliLnBoeXNpY3MtY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FpQks7QUFFTCxNQUFNLE9BQU8saUJBQWlCO0lBbU43QiwrQkFBK0I7SUFDL0IsK0NBQStDO0lBRzVDOzs7Ozs7Ozs7T0FTRztJQUVIO1FBQ0ksbUNBQW1DO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUUsc0NBQXNDLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEdBQWlCLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBRSxpQkFBaUIsQ0FBQyxzQkFBc0IsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUUsQ0FBQyxDQUFDLHlCQUF5QjtRQUMzSixJQUFJLENBQUMsWUFBWSxHQUFxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxrQkFBa0IsR0FBZSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUUsRUFBRSxHQUFHLGlCQUFpQixDQUFDLDJCQUEyQixDQUFFLEdBQUcsQ0FBRSxDQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFFLEdBQUcsQ0FBRSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsb0JBQW9CLENBQUUsQ0FBQztRQUM1TixJQUFJLENBQUMsbUJBQW1CLEdBQUcsaUJBQWlCLENBQUMsb0JBQW9CLEdBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUM7UUFDOUYsbUtBQW1LO1FBQ25LLElBQUksQ0FBQyxFQUFFLEdBQStCLGlCQUFpQixDQUFDLG9CQUFvQixHQUFHLENBQUUs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N0QsZ0NBQWMsR0FBNkIsR0FBRyxDQUFDLENBQUMsT0FBTztBQUM5RSwrSEFBK0g7QUFFL0gsc0JBQXNCO0FBQ0MseUJBQU8sR0FBb0MsRUFBRSxDQUFDO0FBQzlDLDRCQUFVLEdBQWlDLEdBQUcsQ0FBQztBQUN0RSxxQ0FBcUM7QUFDZCxtQ0FBaUIsR0FBMEIsS0FBSyxDQUFDLENBQUMsMkRBQTJEO0FBQ3BJLHlFQUF5RTtBQUNsRCxrQ0FBZ0IsR0FBMkIsSUFBSSxDQUFDO0FBQ2hELHFDQUFtQixHQUF3QixNQUFNLENBQUM7QUFJekUsU0FBUztBQUNjLGdDQUFjLEdBQTZCLElBQUksQ0FBQztBQUNoRCxnQ0FBYyxHQUE2QixHQUFHLENBQUM7QUFDL0Msb0NBQWtCLEdBQXlCLElBQUksQ0FBQztBQUNoRCwyQkFBUyxHQUFrQyxJQUFJLENBQUMsQ0FBQyxLQUFLO0FBQ3RELDRCQUFVLEdBQWlDLElBQUksQ0FBQztBQUl2RSw0QkFBNEI7QUFDTCxzQ0FBb0IsR0FBdUIsR0FBRyxDQUFDO0FBRXRFLHNCQUFzQjtBQUNDLHVDQUFxQixHQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVU7QUFFMUQsK0NBQTZCLEdBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQywyREFBMkQ7QUFJckksV0FBVztBQUNZLGdDQUFjLEdBQTZCLENBQUMsQ0FBQztBQUN2RSw4Q0FBOEM7QUFDOUMsMEZBQTBGO0FBQ2hFLGdDQUFjLEdBQTZCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q0xvZ2dlcn0gZnJvbSAnLi9zaW1jbGltYXQtbGliLmxvZ2dlcic7XG5cbi8qKlxuICAgKiBUaGlzIGNsYXNzIGRlZmluZSBwaHlzaWNzIGNvbnN0YW50cyBhbmQgY2FsY3VsYXRlZCBwaHlzaWNzIGNvbnN0YW50cy5cbiAgICpcbiAgICogSW5zdGFuY2lhdGlvbiBleGFtcGxlIDogXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGluc3RhbmNlID0gbmV3IENQaHlzaWNzQ29uc3RhbnRzKCk7XG4gICAqIGBgYFxuICAgKiBcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgKiAgXG4gICAqIEBhdXRob3IgQWxhaW4gRGVzZWluZVxuICAgKiBcbiAgICogQGNvcHlyaWdodCBDRUkgQWxhaW4gRGVzZWluZSAxOTkyLTIwMTlcbiAgICogXG4gICAqIEBiZXRhIFxuICAgKi9cblxuZXhwb3J0IGNsYXNzIENQaHlzaWNzQ29uc3RhbnRzIHtcblxuICAgIC8vIENvbnN0YW50ZXMgbWF0aMOpbWF0aXF1ZXNcbiAgICBcbiAgICAvKiogUGkgbWF0aCBjb25zdGFudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGk6IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE1hdGguUEk7ICBcblxuICAgIC8vIGNvbnN0YW50ZXMgcmFkaWF0aXZlc1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcHVpc3NhbmNlX3JlY3VlX3plcm86IG51bWJlciAgICAgICAgICAgICA9IDEzNzAgLyA0LjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRpc3RhbmNlX3RzX2FjdHVlbGxlOiBudW1iZXIgICAgICAgICAgICAgPSAxLjVlMTE7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzaWdtYTogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNS42N2UtODtcblxuICAgIC8vIGNvbnN0YW50ZXMgZHUgY2FsY3VsIGRlIGwnYWxiw6lkbyBcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGFsYmVkb19mcm9pZDogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgPSAwLjY1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYWxiZWRvX2NoYXVkOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICA9IDAuMzI1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGVtcGVyYXR1cmVfZnJvaWQ6IG51bWJlciAgICAgICAgICAgICAgICA9IDI2MjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRlbXBlcmF0dXJlX2NoYXVkOiBudW1iZXIgICAgICAgICAgICAgICAgPSAyODY7XG5cblxuICAgIC8vIGNvbnN0YW50ZXMgZGVzIEdFUyAoR2F6IMOgIGVmZmV0IGRlIHNlcnJlKSAgICBcbiAgICAvLyBjb252ZXJzaW9ucyBkZSBHdCDDoCBwcG06IFxuXG4gICAgLyoqIDUuMTNlNiBlbiBHdCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbWFzc2VfYXRtb3NwaGVyZV9HdDogbnVtYmVyICAgICAgICAgICAgICA9IDEuNGU2OyAgICBcblxuICAgIC8qKiBFeHByaW3DqWUgZW5nL21vbCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbWFzc2VfbW9sYWlyZV9jb286IG51bWJlciAgICAgICAgICAgICAgICA9IDQ0OyAgICAgICBcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG1hc3NlX21vbGFpcmVfY2hoaGg6IG51bWJlciAgICAgICAgICAgICAgPSAxNjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG1hc3NlX21vbGFpcmVfYWlyOiBudW1iZXIgICAgICAgICAgICAgICAgPSAyOTtcblxuICAgIC8vIGNvbmNlbnRyYXRpb25zIGFjdHVlbGxlcyBldCBuYXR1cmVsbGVzICAgXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb25jZW50cmF0aW9uX2Nvb19hY3R1ZWw6IG51bWJlciAgICAgICAgID0gNDA1OyAgICAgICAgICAgICAgLy8gcHBtXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb25jZW50cmF0aW9uX2Nvb18yMDA3OiBudW1iZXIgICAgICAgICAgID0gMzcwOyAgICAgICAgICAgICAgLy8gcHBtOiBham91dCBtYXJzIDIwMjJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNvbmNlbnRyYXRpb25fY29vXzE3NTA6IG51bWJlciAgICAgICAgICAgPSAyODA7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb25jZW50cmF0aW9uX2Nvb19uYXR1cmVsOiBudW1iZXIgICAgICAgID0gMjgwO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29uY2VudHJhdGlvbl9jb29fbWluOiBudW1iZXIgICAgICAgICAgICA9IDFlLTE7ICAgICAgICAgICAgIC8vIHBvdXIgbmUgcGFzIGF2b2lyIGRlIG5hbiBlbiBwcmVuYW50IGxlIGxvZ1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29vX0d0X2FjdDogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICA9IDc1MDsgICAgICAgICAgICAgIC8vIG1hc3NlIGRlIENPMiBlbiBHdFxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29vX0d0XzIwMDc6IG51bWJlciAgICAgICAgICAgICAgICAgICAgICA9IDc1MDsgICAgICAgICAgICAgIC8vIG1hc3NlIGRlIENPMiBlbiBHdDogYWpvdXQgbWFycyAyMDIyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb29fR3RfMTc1MDogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgID0gMjgwICogNzUwIC8gMzcwOyAgLy8gbWFzc2UgZGUgQ08yIGVuIEd0XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb25jZW50cmF0aW9uX2Nvb19nbGFjaWFpcmU6IG51bWJlciAgICAgID0gMTgwOyAgICAgICAgICAgICAgLy8gcHBtXG5cbiAgICAvLyBjb25zdGFudGVzIHJhZGlhdGl2ZXNcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGFfY29vOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMmUtMzsgICAgICAgICAgICAvLyA1LjM1OyBPbiBwZXV0IGNoYW5nZXIgY2V0dGUgdmFsZXVyIHNhbnMgY2hhbmdlciBsJ2VxdWlsaWJyZSBwcmUtaW5kdXN0cmllbC5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNvbmNlbnRyYXRpb25fY29vX2xpbWl0ZTogbnVtYmVyICAgICAgICAgPSAxMDAwMDsgICAgICAgICAgICAvLyBlbiBwcG0sIGxhIGxpbWl0ZSBlbnRyZSByZWxhdGlvbiBsaW7DqWFpcmUgZXQgbG9nIHBvdXIgZm9yY2FnZSBzZXJyZVxuXG4gICAgLy8gcG91ciBleHRyYXBvbGF0aW9ucyBsaW4gcG91ciBoYXV0ZXMgY29uY2VudHJhdGlvbnNcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGNvbmNlbnRyYXRpb25fY29vX2xpbWl0ZV9iYXM6IG51bWJlciAgICAgPSAxMDA7ICAgICAgICAgICAgICAvLyBlbiBwcG0saWRlbSBwb3VyIGV4dHJhcG9sYXRpb24gcG91ciBiYXNzZXMgY29uY25ldHJhdGlvbnNcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdfbWluOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxZS00OyAgICAgICAgICAgICAvLyBmb3JjYWdlX3NlcnJlIG1pbiwgcG91ciBldml0ZXIgZGVzIG5hblxuXG4gICAgLy8gdGVtcHMgZGUgcsOpc2lkZW5jZVxuICAgIHB1YmxpYyByZWFkb25seSB0X3Jlc19jb29fYWN0dWVsOiBudW1iZXI7XG5cbiAgICAvLyBvbiBjYWxjdWxlIHRlbCBxdSdhIGwnw6lxdWlsaWJyZSwgc2FucyBlbWlzc2lvbnMgaHVtYWluZXMsIGNvbmNlbnRyYXRpb24gZW4gQzAyPWVtaXNzaW9uKnRlbXBzIGRlIHLDqXNpZGVuY2U9MjgwcHBtXG4gICAgcHVibGljIHJlYWRvbmx5IHRfcmVzX2Nvb185MDogbnVtYmVyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdF9yZXNfY29vXzA6IG51bWJlciAgICAgICAgICAgICAgICAgICAgICA9IDEuNWU2O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbml2ZWF1X2NhbG90dGVfY3JpdGlxdWVfY29vOiBudW1iZXIgICAgICA9IDIwO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbml2ZWF1X2NhbG90dGVzXzE3NTA6IG51bWJlciAgICAgICAgICAgICA9IDYwO1xuICAgIHB1YmxpYyByZWFkb25seSB0X3Jlc19jb29fY3JpdGlxdWU6IG51bWJlcjtcbiAgICAvLyBjb25zdCBkb3VibGUgZmFjdGV1cl9hbHRlcmF0aW9uXzA9MWUtMztcdFxuICAgIC8vIGNvbnN0IGRvdWJsZSBmYWN0ZXVyX2FsdGVyYXRpb25fOTA9MTtcdFxuXG4gICAgLy8gdGVtcMOpcmF0dXJlc1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGF1X3RlbXBlcmF0dXJlOiBudW1iZXIgICAgICAgICAgICAgICAgICA9IDMwOyAvLyBlbiBhbm7DqWVzXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZW1wZXJhdHVyZV9hY3R1ZWxsZTogbnVtYmVyICAgICAgICAgICAgID0gMTUuNTsgLy8gZW4gwrBDIDsgbmVjZXNzYWlyZSBkYW5zIG1vZGVsZV9yZXNldFxuXG4gICAgLy8gY2FsY3Vsw6llIMOgIGxhIG1haW4gcG91ciBDMDI9MzcwIGV0IGFsYsOpZG89YWxiw6lkb19hY3R1ZWxcbiAgICAvLyBwdWJsaWMgcmVhZG9ubHkgdGVtcGVyYXR1cmVfMTkwMDogbnVtYmVyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGVtcGVyYXR1cmVfMTc1MDogbnVtYmVyICAgICAgICAgICAgICAgICA9IDE0LjQ7XG4gICAgcHVibGljIHJlYWRvbmx5IGRlbHRhVF9sYXN0X2NlbnR1cnk6IG51bWJlciAgIFxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGVtcGVyYXR1cmVfTEdNOiBudW1iZXIgICAgICAgICAgICAgICAgICA9IDEwO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ190ZXJyZTogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDVlOTsgLy8gY2FwYWNpdMOpIGNhbG9yaWZpcXVlIGRlIGxhIFRlcnJlIGVuIEovSy9tMlxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVGtlbHZpbjogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3My4wO1xuXG4gICAgLy8gZG9ubsOpZXMgcmFkaWF0aXZlcyBzdXIgbCdhY3R1ZWxcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGFsYmVkb18xNzUwOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgPSAwLjMzO1xuICAgIHB1YmxpYyByZWFkb25seSBHMDogbnVtYmVyO1xuXG4gICAgLy8gZG9ubsOpZXMgZXQgY29uc3RhbnRlcyBkZSBiaWRvdWlsbGUgc3VyIGxlIG5pdmVhdSBkZSBsYSBtZXJcbiAgICAvKiogRmFjdGV1ciBkZSBwb25kw6lyYXRpb24gZGUgbGEgdGVtcMOpcmF0dXJlIGlsIHkgYSBbW2RlbHRhdDBdXSBhbnMgKi9cbiAgICAvLyBjb25zdGFudGVzIGNvbW1lbnTDqWVzIHBhciBDYW1pbGxlIGxlIDE5IGF2cmlsIDIwMjQgY2FyIHNvbnQgaW51dGlsZXNcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHAwOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLjsgICBcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHAxOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LjtcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHAyOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLjtcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHAzOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLjtcblxuICAgIC8qKiBSZXRhcmQgZW4gdGVtcHMgZW4gYW5uw6llICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVsdGF0MDogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAuOyAgIFxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVsdGF0MTogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUuO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVsdGF0MjogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlbHRhdDM6IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MC47XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDX25pdmVhdTogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAwLjsgLy8gb3JpZz05NlxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYV9tZXI6IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRtZW1vaXJlX25pdmVhdV9tZXIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMC47IC8vIGxlIDMwIGphbnZpZXIgMjAxMTogZW4gZmFpdCwgdGF1X25pdmVhdV9tZXIgbmUgcGV1dCBkw6lwYXNzZXIgMTAwIGFucyBjYXIgYydlc3QgbGEgbcOpbW9pcmUgbWF4aW1hbGUgZCd1bmUgc2ltdWwgcG91ciBsYSBzaW11bCBwcsOpY8OpZGVudGUuICMgYyBlc3QgbGUgcGFzIGRlIHRlbXBzIHV0aWxpc2UgcG91ciBjYWxjdWxlciBsIGVmZmV0IG1lbW9pcmUuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB0YXVfbml2ZWF1X21lciAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAwMC47IC8vIGMgZXN0IGwgZWNoZWxsZSBkZSB0ZW1wcyBjYXJhY3RlcmlzdGlxdWUgZGUgbCBldm9sdXRpb24gZGUgbGEgdGVtcGVyYXR1cmUgZGUgbCBvY2VhblxuICAgIHB1YmxpYyByZWFkb25seSBwb25kX21lbW9pcmVfbWVyXG4gICAgLy8gcHVibGljIHJlYWRvbmx5IFRfcmVzc2VudGllX2FjdHVlbGxlOiBudW1iZXI7IC8vIGNvbW1lbnTDqSBsZSAxOSBhdnJpbCAyMDI0IHBhciBDYW1pbGxlIGNhciBjJ2VzdCBpbnV0aWxlXG5cbiAgICAvLyBuaXZlYXUgbWVyIGV4cHJpbcOpIGVuIG0gL3QgYWN0dWVsXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBuaXZlYXVfbWVyX0xHTTogbnVtYmVyICAgICAgICAgICAgICAgICAgID0gLTEzMDtcbiAgICBcbiAgICAvLyBtb2RpZiBDUiA0IG5vdiAyMDE5OiBvbiBsZSBjYWxjdWxlIGRlIG1hbmllcmUgcGx1cyBleGFjdGUgcGx1cyBiYXNcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG5pdmVhdV9tZXJfMTc1MDogbnVtYmVyICAgICAgICAgICAgICAgICAgPSAtMC4yOyAvLyBlbiBtXG4gICAgcHVibGljIHJlYWRvbmx5IEhtZXJfMTc1MDogbnVtYmVyO1xuICAgIHB1YmxpYyByZWFkb25seSBuaXZlYXVfbWVyXzE3NTA6IG51bWJlcjtcblxuICAgIC8vIG5pdmVhdSBkZXMgY2Fsb3R0ZXNcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG5pdmVhdV9jYWxvdHRlc19MR006IG51bWJlciAgICAgICAgICAgICAgPSA0NTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG5pdmVhdV9jYWxvdHRlc19MR01fbm9pbnNvbDogbnVtYmVyICAgICAgPSA1MjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRhdV9uaXZlYXVfY2Fsb3R0ZXNfZW5nbGFjZW1lbnQ6IG51bWJlciAgPSA1MDAwLjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRhdV9uaXZlYXVfY2Fsb3R0ZXNfZGVnbGFjZW1lbnQ6IG51bWJlciAgPSA1MDAwLjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYV9jYWxvdHRlczogbnVtYmVyO1xuXG4gICAgLy8gVW5lIHZhcmlhdGlvbiBnbG9iYWxlIGdsYXZpYWlyZS1pbnRlcmdsYWNpYWlyZSBjb3JyZXNwb25kIMOgIGVudmlyb24gNSDDoCAxMMKwQy5cbiAgICBwdWJsaWMgcmVhZG9ubHkgYl9jYWxvdHRlczogbnVtYmVyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbml2ZWF1X2NhbG90dGVzX21pbjogbnVtYmVyICAgICAgICAgICAgICA9IDA7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBuaXZlYXVfY2Fsb3R0ZXNfbWF4OiBudW1iZXIgICAgICAgICAgICAgID0gOTA7XG4gICAgcHVibGljIHJlYWRvbmx5IG5pdmVhdV9jYWxvdHRlc19hY3R1ZWw6IG51bWJlcjtcblxuICAgIC8vIG5vdXZlYXUgdHJhaXRlbWVudCBuaXZlYXUgZGUgbGEgbWVyXG4gICAgLy8gcHVibGljIHN0YXRpYyByZWFkb25seSBIbWVyX3RvdDogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgID0gMy44ZTM7ICAgIC8vIGVuIG0gLy8gcmVtcGxhY8OpIHBhciBDYW1pbGxlIGxlIDE5IGF2cmlsIDIwMjQgcGFyIHVuIHBhcmFtw6h0cmUgYWp1c3RhYmxlIHBvdXIgcXVlIG5pdmVhdSBtZXIgTEdNIC0xMDBtIHNhbnMgZGlsYXRhdGlvblxuICAgIHB1YmxpYyBzdGF0aWMgSG1lcl90b3Q6IG51bWJlcjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRpbGF0OiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLjRlLTQ7ICAgLy8gZW4gwrBDIFxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29lZl9kaWxhdDogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICA9IDIuMDsgLy8gYydlc3QgdW4gcGFyYW0gYWp1c3RhYmxlIHBvdXIgYWp1c3RlciBsYSBkaWxhdGF0aW9uLiBBdmFudCBvbiBuJ2VuIGF2YWl0IHBhcyBiZXNvaW4gcGFyY2UgcXVlIEhtZXJfdG90IHLDqWFsaXN0ZSwgbWFpcyBsw6AsIG9uIGwnYWp1c3RlIHN1IGxlIGNoYW5nZW1lbnQgZGUgbml2ZWF1IG1lciBkdSBMR01cbiAgICBwdWJsaWMgcmVhZG9ubHkgVHJlc3NlbnRpZV9hY3Q6IG51bWJlcjtcbiAgICAvLyBwdWJsaWMgcmVhZG9ubHkgZnBoaWcxOiBudW1iZXI7XG4gICAgLy8gcHVibGljIHN0YXRpYyByZWFkb25seSBmcGhpZzI6IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMC4xMGUtNDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGlsYXRhdGlvbl8xNzUwOiBudW1iZXI7XG4gICAgLy8gcHVibGljIHJlYWRvbmx5IG9wdGltMTogbnVtYmVyO1xuICAgIC8vIHB1YmxpYyByZWFkb25seSBvcHRpbTI6IG51bWJlcjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV4cG1lcjogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgID0gMS41OyAvLyBjb25zdGFudGUgYWpvdXTDqWUgbGUgMTkgYXZyaWwgMjAyNCBwYXIgQ2FtaWxsZS4gQydlc3QgdW4gZXhwb3NhbnQgcXVpIHNlcnQgZGUgbWFyYW3DqHRyZSBhanVzdGFibGUgcG91ciBxdWUgIG5pdmVhdV9tZXJfMTc1MCBzb2l0IMOgIHBldSBwcsOocyDDqWdhbGUgw6AgLTAuMiBtLlxuXG4gICAgLy8gbW9kaWYgQ1IgNCBub3YgMjAxOSwgcG91ciBhdm9pciBuaXZlYXVfbWVyXzE3NTA9LTAuMiBkZSBtYW5pZXJlIHBsdXMgZXhhY3RlXG4gICAgLy8gcHVibGljIHN0YXRpYyByZWFkb25seSBmcGhpZzM6IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTEuOTk0NDdlLTc7IC8vIHBsZWluIGRlIGNvbnN0YW50ZXMgc3VwcHJpbcOpZSBsZSAxOSBhdnJpbCAyMDI0IHBhciBDYW1pbGxlIGNhciBvbiBjaGFuZ2UgbGUgY2FsY3VsIGR1IG5pdmVhdSBkZXMgbWVyc1xuXG4gICAgLy8gdGVsIHF1ZSBsJ29uIHNvaXQgw6AgbCfDqXF1aWxpYnJlIMOgIG5pdmVhdV9tZXJfMTc1MCBlbiAxNzUwXG4gICAgLy8gZXQgdGVsIHF1ZSAtMTIwbSBhdSBMR01cbiAgICBwdWJsaWMgcmVhZG9ubHkgSG1lcmFjdDogbnVtYmVyO1xuICAgIC8vIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbml2ZWF1X21lcl8xNzUwX3RhcmdldDogbnVtYmVyXHQgICAgPSAtMC4yOyAvLyBjb21tZW50w6kgbGUgMTkgYXZyaWwgMjAyNCBwYXIgQ2FtaWxsZVxuXG4gICAgLy8gZmx1eCBkZSBjYXJib25lXG4gICAgLy8gY29uc3QgZG91YmxlIENPMl9iaW9sb2dpcXVlX2VxPWNvbmNlbnRyYXRpb25fY29vX25hdHVyZWw7XG4gICAgLy8gY2FsY3VsIENPMl9vY2Vhbl9lcSBlbiBmb25jdGlvbiB0ZW1w77+9cmF0dXJlXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBhX0NPMl9lcTogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA7ICAgICAgIC8vIHBwbS/CsENcdFx0XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBlbWl0X2FudGhyb19jb29fYWN0OiBudW1iZXIgICAgICAgICAgICAgID0gMTI7ICAgICAgIC8vIEd0OiBtaXNlIMOgIGpvdXIgbWFycyAyMDIyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB2b2xjYW5pc21lX2FjdHVlbDogbnVtYmVyICAgICAgICAgICAgICAgID0gMC4wODM7ICAgIC8vIGVuIEd0L2FuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBwdWl0X29jZWFuX2FjdDogbnVtYmVyICAgICAgICAgICAgICAgICAgID0gMjAuMDsgICAgIC8vIGVuIHBvdXJjZW50IGRlcyBlbWlzc2lvbnMgYW50aHJvIGFic29yYsOpZXNcbiAgICBcbiAgICAvLyBjb25zdCBkb3VibGUgQl9vY2Vhbj0tcHVpdF9vY2Vhbl9hY3QqZW1pdF9hbnRocm9fY29vX2FjdC8gKGNvbmNlbnRyYXRpb25fY29vX2FjdHVlbC1jb25jZW50cmF0aW9uX2Nvb18xNzUwIC1hX0NPMl9lcSoodGVtcGVyYXR1cmVfYWN0dWVsbGUtdGVtcGVyYXR1cmVfMTc1MCkpO1xuICAgIHB1YmxpYyByZWFkb25seSBDX2FsdGVyYXRpb25fbmF0dXJlbDogbnVtYmVyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVGxpbV9vY2U6IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwOyAgICAgICAvLyBlbiDCsEtcbiAgICBcbiAgICAvLyBjb25zdCBkb3VibGUgcmVsX0NPMl90ZW1wZXJhdHVyZT1lbWl0X2FudGhyb19jb29fYWN0L1RsaW1fb2NlO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYl9vY2VhbjogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEvNTAwMC4wO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVGxpbV9vY2VfZnJvaWQ6IG51bWJlciAgICAgICAgICAgICAgICAgICA9IDI3NTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFfb2NlOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzZS0yO1xuICAgIHB1YmxpYyByZWFkb25seSBkZWx0YVRfcG9jZTogbnVtYmVyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVGNyaXRfb2NlOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICA9IDM1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcHVpdF9vY2VfbWF4OiBudW1iZXIgICAgICAgICAgICAgICAgICAgICA9IDQwOyAgICAgICAvLyBlbiBwb3VyY2VudFxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZEZkZWdhejogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAuMDU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBxX0NPMjogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMC4yNjsgICAgIC8vIENPMj0yNiUgZGUgbCdlZmZldCBkZSBzZXJyZVxuXG4gICAgLy8gcmV0cm9hY3Rpb25zIHZhcGV1ciBkJ2VhdVxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcV9IMk86IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAuNjsgICAgICAvLyBlYXU9NjAlIGRlIGwnZWZmZXQgZGUgc2VycmVcbiAgICBwdWJsaWMgcmVhZG9ubHkgYV9IMk86IG51bWJlcjtcbiAgICAvLyBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRhdV9UOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDA7ICAgICAgLy8gZW4gwrBLXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSByYXBwb3J0X0gyT19hY3Rjb25zdDogbnVtYmVyICAgICAgICAgICAgID0gMS4wNTcxOTsgIC8vIHJhcHBvcnQgcG91ciBsYSB0ZW1ww6lyYXR1cmUgYWN0dWVsbGVcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGFfcmFua2luZTogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgPSAxMy43O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYl9yYW5raW5lOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMjAuO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcG93X0gyTzogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAuMjM7IC8vIG5vcm1hbGxlbWVudDogMC4xOFxuXG4gICAgLy8gcGFyYW3DqXRyaXNhdGlvbiBkZSBBX2Jpb2xvZ2lxdWUgZW4gZm9uY3Rpb24gXHRkZSBsYSB0ZW1ww6lyYXR1cmVcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHB1aXRfYmlvX2FjdDogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgPSAzMDsgLy8gZW4gcG91cmNlbnRcbiAgICBwdWJsaWMgcmVhZG9ubHkgVGxpbV9iaW9fZnJvaWQ6IG51bWJlcjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRsaW1fYmlvX2NoYXVkOiBudW1iZXIgICAgICAgICAgICAgICAgICAgPSAzNDA7IC8vIGVuIEtcbiAgICAvL2NvbnN0IGRvdWJsZSBBX2Jpb2xvZ2lxdWVfYWN0PS1wdWl0X2Jpb19hY3QqZW1pdF9hbnRocm9fY29vX2FjdC8oY29uY2VudHJhdGlvbl9jb29fYWN0dWVsLWNvbmNlbnRyYXRpb25fY29vXzE3NTApOyAvLyBlbiBhbi0xXG5cbiAgICAvLyBwYXJhbWV0cmVzIG9yYml0YXV4XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBsYXRfTWlsOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjX2NhbG90dGVzOiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgID0gMC4yO1xuICAgIC8vY29uc3QgZG91YmxlIHByZWNlc3Npb25fYWN0dWVsPS05MDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHByZWNlc3Npb25fYWN0dWVsOiBudW1iZXIgICAgICAgICAgICAgICAgPSAxMDIuNzsgLy8gbW9kaWYgMzEgamFudiAyMDA5OiBvbiBwcmVuZCBsYSBtw6ptZSBwcmVjZXNzaW9uIHF1ZSBMTURaXG4gICAgLy8gbGEgZm9ybXVsZSBkZSBpbnNvbDY1TiBuJ2EgcGFzIMOpdMOpIG1vZGlmacOpZSBjYXIgMiBidWdzIHNlIGNvbXBlbnNhaWVudFxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb2JsaXF1aXRlX2FjdHVlbDogbnVtYmVyICAgICAgICAgICAgICAgICA9IDIzLjU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBleGNlbnRyaWNpdGVfYWN0dWVsOiBudW1iZXIgICAgICAgICAgICAgID0gMC4wMTY3O1xuICAgIHB1YmxpYyByZWFkb25seSBkZWx0YV9hbmdsZV9hY3R1ZWw6IG51bWJlcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW5zb2xfYWN0dWVsOiBudW1iZXI7XG5cbiAgICAvLyBhbGLDqWRvXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBhbGJlZG9fcGhpX21pbjogbnVtYmVyICAgICAgICAgICAgICAgICAgID0gMC42MDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGFsYmVkb19waGlfbWF4OiBudW1iZXIgICAgICAgICAgICAgICAgICAgPSAwLjI7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBhbGJlZG9fZ2xhY2VfY29uc3Q6IG51bWJlciAgICAgICAgICAgICAgID0gMC45MDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBoaWdfY3JpdDogbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgPSAzMC4wOyAvLyAzMFxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYWxiZWRvX3RlcjogbnV