diff --git a/src/app/pages/load_test/load-test-chooser/load-test-chooser.page.html b/src/app/pages/load_test/load-test-chooser/load-test-chooser.page.html
index ca50b10..5a09b5f 100644
--- a/src/app/pages/load_test/load-test-chooser/load-test-chooser.page.html
+++ b/src/app/pages/load_test/load-test-chooser/load-test-chooser.page.html
@@ -30,9 +30,5 @@
-
-
-
-
diff --git a/src/app/pages/load_test/load-test/load-test.module.ts b/src/app/pages/load_test/load-test/load-test.module.ts
index 5990b9a..cb35a5c 100644
--- a/src/app/pages/load_test/load-test/load-test.module.ts
+++ b/src/app/pages/load_test/load-test/load-test.module.ts
@@ -8,15 +8,17 @@ import { LoadTestPageRoutingModule } from './load-test-routing.module';
import { LoadTestPage } from './load-test.page';
import {ComponentsModule} from "../../../components/components.module";
+import {NgxEchartsDirective} from "ngx-echarts";
@NgModule({
- imports: [
- CommonModule,
- FormsModule,
- IonicModule,
- LoadTestPageRoutingModule,
- ComponentsModule
- ],
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ LoadTestPageRoutingModule,
+ ComponentsModule,
+ NgxEchartsDirective
+ ],
declarations: [LoadTestPage]
})
export class LoadTestPageModule {}
diff --git a/src/app/pages/load_test/load-test/load-test.page.html b/src/app/pages/load_test/load-test/load-test.page.html
index 1ae7287..98e54e6 100644
--- a/src/app/pages/load_test/load-test/load-test.page.html
+++ b/src/app/pages/load_test/load-test/load-test.page.html
@@ -1,4 +1,4 @@
-
+
@@ -12,5 +12,32 @@
Load Target
+
+
+
+
+
+
+ Total Number of Requests
+
+
+ {{ totalNumberOfRequests | number:'1.0-0' }}
+
+
+
+
+
+
+
+
+ HTTP Status Codes
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/load_test/load-test/load-test.page.ts b/src/app/pages/load_test/load-test/load-test.page.ts
index 065daea..da1e2ae 100644
--- a/src/app/pages/load_test/load-test/load-test.page.ts
+++ b/src/app/pages/load_test/load-test/load-test.page.ts
@@ -3,6 +3,7 @@ import {ActivatedRoute, Router} from "@angular/router";
import {LoadTestService} from "../../../services/load-test.service";
import {AlertController, LoadingController} from "@ionic/angular";
import {ArtilleryData} from "../../../classes/artillery-data";
+import {EChartsOption} from "echarts";
@Component({
selector: 'app-load-test',
@@ -21,6 +22,22 @@ export class LoadTestPage implements OnInit {
description: string = '';
loadTestResults: ArtilleryData = {}
+ statusCodesOptions: EChartsOption = {
+ tooltip: {
+ trigger: 'axis'
+ },
+ xAxis: {
+ type: 'category',
+ boundaryGap: false,
+ data: [] // This will be populated with test titles
+ },
+ yAxis: {
+ type: 'value'
+ },
+ series: [
+ ]
+ }
+ totalNumberOfRequests: number = 0;
constructor(
private router: Router,
@@ -37,6 +54,7 @@ export class LoadTestPage implements OnInit {
this.getParams();
await this.getHistoryResults().then(() => {
this.byCodes();
+ this.totalRequests();
});
}
@@ -54,14 +72,7 @@ export class LoadTestPage implements OnInit {
}
- async getHistoryResults() {
- await this.showLoading();
- await this.loadTestService.getLoadTestHistory(this.orgName, this.productObjective, this.productStep).then((data) => {
- this.loadTestResults = data as ArtilleryData;
- console.log(this.loadTestResults);
- });
- await this.hideLoading();
- }
+
async sendRequest() {
@@ -85,34 +96,156 @@ export class LoadTestPage implements OnInit {
}
- byCodes(){
+
+ async getHistoryResults() {
+ await this.showLoading();
+ await this.loadTestService.getLoadTestHistory(this.orgName, this.productObjective, this.productStep).then((data) => {
+ this.loadTestResults = data as ArtilleryData;
+ console.log(this.loadTestResults);
+ });
+ await this.hideLoading();
+ }
+ totalRequests() {
let keys = Object.keys(this.loadTestResults);
+ let requests: Record> = {};
+ console.log(keys);
+ let totalRequests = 0;
+ // Itera sobre las claves de los resultados del test
+ for (let key of keys) {
+ // @ts-ignore: Extrae los contadores de los resultados agregados
+ let data = this.loadTestResults[key].aggregate.counters;
+ // @ts-ignore: Extrae la fecha del resultado
+ let date = this.loadTestResults[key].date;
+ // Filtra las claves que empiezan con "http.requests."
+ let httpCodesKeys = Object.keys(data).filter(keyCode => keyCode.startsWith('http.requests'));
+
+ for (let keyCode of httpCodesKeys) {
+ if (!requests[date]) {
+ requests[date] = {};
+ }
+ // Suma los valores si ya existen en la misma fecha
+ requests[date][keyCode] = (requests[date][keyCode] || 0) + data[keyCode];
+ }
+ }
- let codes = {};
+ for (let date of Object.keys(requests)) {
+ totalRequests += requests[date]['http.requests'];
+ }
+ this.totalNumberOfRequests = totalRequests;
+ console.log(this.totalNumberOfRequests);
+ }
+ byCodes() {
+ let keys = Object.keys(this.loadTestResults);
+ let codes: Record> = {};
+
+ // Itera sobre las claves de los resultados del test
for (let key of keys) {
- // @ts-ignore
+ // @ts-ignore: Extrae los contadores de los resultados agregados
let data = this.loadTestResults[key].aggregate.counters;
- // @ts-ignore
+ // @ts-ignore: Extrae la fecha del resultado
let date = this.loadTestResults[key].date;
- //get all keys that start with http.codes.
- let keys = Object.keys(data);
-
+ // Filtra las claves que empiezan con "http.codes."
+ let httpCodesKeys = Object.keys(data).filter(keyCode => keyCode.startsWith('http.codes.'));
- for (let keyCode of keys) {
- if (keyCode.startsWith('http.codes.')) {
- // @ts-ignore
- if (!codes[date]) {
- // @ts-ignore
- codes[date] = {};
+ for (let keyCode of httpCodesKeys) {
+ if (!codes[date]) {
+ codes[date] = {};
}
- // @ts-ignore
- codes[date][keyCode] = data[keyCode];
+ // Suma los valores si ya existen en la misma fecha
+ codes[date][keyCode] = (codes[date][keyCode] || 0) + data[keyCode];
}
+ }
+
+ // Diccionario modificado para agrupar por fecha
+ const modifiedDict: Record> = {};
+
+ // Agrupa y suma los códigos HTTP por fecha
+ Object.entries(codes).forEach(([timestamp, codes]) => {
+ // Extrae solo la fecha (año-mes-día)
+ const date = timestamp.split('-').slice(0, 3).join('-');
+
+ if (!modifiedDict[date]) {
+ modifiedDict[date] = {};
+ }
+
+ // Suma los códigos HTTP en el nuevo diccionario
+ Object.entries(codes).forEach(([code, value]) => {
+ if (modifiedDict[date][code]) {
+ modifiedDict[date][code] += value;
+ } else {
+ if (typeof value === "number") {
+ modifiedDict[date][code] = value;
+ }
}
+ });
+ });
+
+
+ // Ordena las fechas en modifiedDict
+ const sortedDates = Object.keys(modifiedDict).sort((a, b) => new Date(a).getTime() - new Date(b).getTime());
+
+ // Prepara las series para el gráfico
+ let statusCodes = new Set();
+ for (let status in modifiedDict) {
+ for (let code in modifiedDict[status]) {
+ statusCodes.add(code);
+ }
+ }
+
+ // Inicializa las series para el gráfico
+ this.statusCodesOptions.series = [];
+ for (let status of statusCodes) {
+ let seriesData: number[] = [];
+
+ // Llena los datos por cada fecha
+ sortedDates.forEach(date => {
+ seriesData.push(modifiedDict[date][status] || 0);
+ });
+
+ // Asigna el color en función del rango del código HTTP
+ let statusCodeNumber = parseInt(status.split('.')[2], 10); // Extraer el número de código HTTP
+
+ let color: string;
+ if (statusCodeNumber < 300) {
+ color = '#00c600'; // Verde para códigos 2xx
+ } else if (statusCodeNumber < 400) {
+ color = '#0080ff'; // Azul para códigos 3xx
+ } else if (statusCodeNumber < 500) {
+ color = '#e41313'; // Rojo para códigos 4xx
+ } else {
+ color = '#ff7300'; // Naranja para códigos 5xx
}
- console.log(codes);
+ // Añade la serie al gráfico con el color correspondiente
+ this.statusCodesOptions.series.push({
+ name: status,
+ type: 'line',
+ data: seriesData,
+ lineStyle: {
+ color: color
+ },
+ itemStyle: {
+ color: color
+ }
+ });
+ }
+
+ // Actualiza las etiquetas del eje X (fechas) con las fechas ordenadas
+ // @ts-ignore
+ this.statusCodesOptions.xAxis.data = sortedDates;
+
+
+ // Fuerza la actualización del gráfico
+ this.statusCodesOptions = { ...this.statusCodesOptions };
+
+
+ //get the eleement by id unitChart
+ let httpCodesChart = document.getElementById('httpCodesChart');
+ //change width and height
+ httpCodesChart!.style.width = '100%';
+ httpCodesChart!.style.height = '25em';
+
}
@@ -126,6 +259,7 @@ export class LoadTestPage implements OnInit {
+
/**
* Show a loading spinner.
*/
diff --git a/src/app/pages/software_testing/software-testing-chooser/software-testing-chooser.page.ts b/src/app/pages/software_testing/software-testing-chooser/software-testing-chooser.page.ts
index ca48ae4..876a3fe 100644
--- a/src/app/pages/software_testing/software-testing-chooser/software-testing-chooser.page.ts
+++ b/src/app/pages/software_testing/software-testing-chooser/software-testing-chooser.page.ts
@@ -549,11 +549,6 @@ export class SoftwareTestingChooserPage implements OnInit {
integrationChart!.style.width = '100%';
integrationChart!.style.height = '25em';
-
-
-
-
-
}
async graphSystemTests() {
const filteredData = await this.calculateGraphDataSystemTests();
diff --git a/www/2836.80322584e555bc89.js b/www/2836.80322584e555bc89.js
new file mode 100644
index 0000000..766d84e
--- /dev/null
+++ b/www/2836.80322584e555bc89.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[2836],{5553:(w,E,u)=>{u.d(E,{h:()=>b});var g=u(177),P=u(7863),d=u(4438);let b=(()=>{var f;class s{}return(f=s).\u0275fac=function(A){return new(A||f)},f.\u0275mod=d.$C({type:f}),f.\u0275inj=d.G2t({imports:[g.MD,P.bv]}),s})()},3241:(w,E,u)=>{u.d(E,{p:()=>b});var g=u(4438),P=u(177),d=u(7863);let b=(()=>{var f;class s{constructor(A){this.location=A,this.title="Header Title"}ngOnInit(){}goBack(){this.location.back()}}return(f=s).\u0275fac=function(A){return new(A||f)(g.rXU(P.aZ))},f.\u0275cmp=g.VBU({type:f,selectors:[["app-header-return"]],inputs:{title:"title"},decls:6,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"],["name","arrow-back","slot","start",1,"p-4","bigger-icon",3,"click"]],template:function(A,O){1&A&&(g.j41(0,"ion-header",0)(1,"ion-toolbar"),g.nrm(2,"ion-menu-button",1),g.j41(3,"ion-icon",2),g.bIt("click",function(){return O.goBack()}),g.k0s(),g.j41(4,"ion-title"),g.EFF(5),g.k0s()()()),2&A&&(g.Y8G("translucent",!0),g.R7$(5),g.JRh(O.title))},dependencies:[d.eU,d.iq,d.MC,d.BC,d.ai],styles:[".bigger-icon[_ngcontent-%COMP%]{font-size:1.5em}"]}),s})()},2836:(w,E,u)=>{u.r(E),u.d(E,{LoadTestPageModule:()=>q});var g=u(177),P=u(4341),d=u(7863),b=u(7650),f=u(467),s=u(4438),M=u(4262);class A{static toArtilleryData(o){return function F(t,o){return v(t,o,U)}(JSON.parse(o),R("ArtilleryData"))}static artilleryDataToJson(o){return JSON.stringify(function x(t,o){return v(t,o,$)}(o,R("ArtilleryData")),null,2)}}function O(t,o,l,e=""){const r=_(t);throw Error(`Invalid value${l?` for key "${l}"`:""}${e?` on ${e}`:""}. Expected ${r} but got ${JSON.stringify(o)}`)}function _(t){return Array.isArray(t)?2===t.length&&void 0===t[0]?`an optional ${_(t[1])}`:`one of [${t.map(o=>_(o)).join(", ")}]`:"object"==typeof t&&void 0!==t.literal?t.literal:typeof t}function U(t){if(void 0===t.jsonToJS){const o={};t.props.forEach(l=>o[l.json]={key:l.js,typ:l.typ}),t.jsonToJS=o}return t.jsonToJS}function $(t){if(void 0===t.jsToJSON){const o={};t.props.forEach(l=>o[l.js]={key:l.json,typ:l.typ}),t.jsToJSON=o}return t.jsToJSON}function v(t,o,l,e="",r=""){if("any"===o)return t;if(null===o)return null===t?t:O(o,t,e,r);if(!1===o)return O(o,t,e,r);let p;for(;"object"==typeof o&&void 0!==o.ref;)p=o.ref,o=G[o.ref];return Array.isArray(o)?function j(n,i){return-1!==n.indexOf(i)?i:O(n.map(T=>N(T)),i,e,r)}(o,t):"object"==typeof o?o.hasOwnProperty("unionMembers")?function c(n,i){const T=n.length;for(let L=0;Lv(T,n,l)):O(N("array"),i,e,r)}(o.arrayItems,t):o.hasOwnProperty("props")?function m(n,i,T){if(null===T||"object"!=typeof T||Array.isArray(T))return O(N(p||"object"),T,e,r);const L={};return Object.getOwnPropertyNames(n).forEach(C=>{const H=n[C],I=Object.prototype.hasOwnProperty.call(T,C)?T[C]:void 0;L[H.key]=void 0!==I?v(I,H.typ,l,C,p):void 0}),Object.getOwnPropertyNames(T).forEach(C=>{Object.prototype.hasOwnProperty.call(n,C)||(L[C]=v(T[C],i,l,C,p))}),L}(l(o),o.additional,t):O(o,t,e,r):o===Date&&"number"!=typeof t?function h(n){if(null===n)return null;const i=new Date(n);return isNaN(i.valueOf())?O(N("Date"),n,e,r):i}(t):function a(n,i){return typeof n==typeof i?i:O(n,i,e,r)}(o,t)}function N(t){return{literal:t}}function S(t,o){return{props:t,additional:o}}function D(t){return{props:[],additional:t}}function R(t){return{ref:t}}const G={ArtilleryData:S([{json:"aggregate",js:"aggregate",typ:R("Aggregate")},{json:"intermediate",js:"intermediate",typ:function J(t){return{arrayItems:t}}(R("Intermediate"))},{json:"date",js:"date",typ:""}],!1),Aggregate:S([{json:"counters",js:"counters",typ:D(0)},{json:"rates",js:"rates",typ:R("Rates")},{json:"firstCounterAt",js:"firstCounterAt",typ:0},{json:"firstHistogramAt",js:"firstHistogramAt",typ:0},{json:"lastCounterAt",js:"lastCounterAt",typ:0},{json:"lastHistogramAt",js:"lastHistogramAt",typ:0},{json:"firstMetricAt",js:"firstMetricAt",typ:0},{json:"lastMetricAt",js:"lastMetricAt",typ:0},{json:"period",js:"period",typ:0},{json:"summaries",js:"summaries",typ:R("Histograms")},{json:"histograms",js:"histograms",typ:R("Histograms")}],!1),Histograms:S([{json:"http.response_time",js:"http.response_time",typ:D(3.14)},{json:"plugins.metrics-by-endpoint.response_time./",js:"plugins.metrics-by-endpoint.response_time./",typ:D(3.14)},{json:"vusers.session_length",js:"vusers.session_length",typ:function k(...t){return{unionMembers:t}}(void 0,D(3.14))}],!1),Rates:S([{json:"http.request_rate",js:"http.request_rate",typ:0}],!1),Intermediate:S([{json:"counters",js:"counters",typ:D(0)},{json:"rates",js:"rates",typ:R("Rates")},{json:"http.request_rate",js:"http.request_rate",typ:null},{json:"firstCounterAt",js:"firstCounterAt",typ:0},{json:"firstHistogramAt",js:"firstHistogramAt",typ:0},{json:"lastCounterAt",js:"lastCounterAt",typ:0},{json:"lastHistogramAt",js:"lastHistogramAt",typ:0},{json:"firstMetricAt",js:"firstMetricAt",typ:0},{json:"lastMetricAt",js:"lastMetricAt",typ:0},{json:"period",js:"period",typ:""},{json:"summaries",js:"summaries",typ:R("Histograms")},{json:"histograms",js:"histograms",typ:R("Histograms")}],!1)};var W=u(1626);let B=(()=>{var t;class o{constructor(e,r){this.firestore=e,this.http=r,this.url="https://devprobeapi.onrender.com/create_load_test"}getLoadTestHistory(e,r,a){var c=this;return(0,f.A)(function*(){const j=(0,M.H9)(c.firestore,"teams",e,"products",r,"load_test",a),y=yield(0,M.x7)(j);if(y.exists()){let h=y.data();console.log(h);let m=Object.keys(h);console.log(m);for(let p of m){let i=A.toArtilleryData(h[p]);h[p]=i}return h}return{}})()}sendLoadTest(e,r,a,c){var j=this;return(0,f.A)(function*(){try{const y={team:e,product:r,service:a,target:`https://${c}`};return yield j.http.post(j.url,y).toPromise()}catch{return{}}})()}}return(t=o).\u0275fac=function(e){return new(e||t)(s.KVO(M._7),s.KVO(W.Qq))},t.\u0275prov=s.jDH({token:t,factory:t.\u0275fac,providedIn:"root"}),o})();var K=u(8453),X=u(3241),z=u(2820);const Y=[{path:"",component:(()=>{var t;class o{constructor(e,r,a,c,j){this.router=e,this.activatedRoute=r,this.loadTestService=a,this.loadingCtrl=c,this.alertCtrl=j,this.productStep="",this.productObjective="",this.orgName="",this.target="",this.description="",this.loadTestResults={},this.statusCodesOptions={tooltip:{trigger:"axis"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[]},this.totalNumberOfRequests=0}ngOnInit(){}ionViewWillEnter(){var e=this;return(0,f.A)(function*(){e.getParams(),yield e.getHistoryResults().then(()=>{e.byCodes(),e.totalRequests()})})()}getParams(){this.activatedRoute.params.subscribe(r=>{this.productObjective=r.productObjective,this.productStep=r.step});const e=JSON.parse(localStorage.getItem("user"));this.orgName=e.orgName,console.log(this.orgName),console.log(this.productObjective),console.log(this.productStep)}sendRequest(){var e=this;return(0,f.A)(function*(){if(yield e.showLoading(),e.target.startsWith("http://")||e.target.startsWith("https://")||e.target.endsWith("/"))return yield e.hideLoading(),void(yield e.showAlert("No http or https is needed, check for slashes at the end of the domain","Please enter a valid host"));yield e.loadTestService.sendLoadTest(e.orgName,e.productObjective,e.productStep,e.target).then(function(){var r=(0,f.A)(function*(a){yield e.hideLoading(),console.log("data",a),a&&(yield e.showAlert("Test sent, please wait a few seconds to GET RESULTS","Success"))});return function(a){return r.apply(this,arguments)}}()),yield e.hideLoading()})()}getHistoryResults(){var e=this;return(0,f.A)(function*(){yield e.showLoading(),yield e.loadTestService.getLoadTestHistory(e.orgName,e.productObjective,e.productStep).then(r=>{e.loadTestResults=r,console.log(e.loadTestResults)}),yield e.hideLoading()})()}totalRequests(){let e=Object.keys(this.loadTestResults),r={};console.log(e);let a=0;for(let c of e){let j=this.loadTestResults[c].aggregate.counters,y=this.loadTestResults[c].date,h=Object.keys(j).filter(m=>m.startsWith("http.requests"));for(let m of h)r[y]||(r[y]={}),r[y][m]=(r[y][m]||0)+j[m]}for(let c of Object.keys(r))a+=r[c]["http.requests"];this.totalNumberOfRequests=a,console.log(this.totalNumberOfRequests)}byCodes(){let e=Object.keys(this.loadTestResults),r={};for(let h of e){let m=this.loadTestResults[h].aggregate.counters,p=this.loadTestResults[h].date,n=Object.keys(m).filter(i=>i.startsWith("http.codes."));for(let i of n)r[p]||(r[p]={}),r[p][i]=(r[p][i]||0)+m[i]}const a={};Object.entries(r).forEach(([h,m])=>{const p=h.split("-").slice(0,3).join("-");a[p]||(a[p]={}),Object.entries(m).forEach(([n,i])=>{a[p][n]?a[p][n]+=i:"number"==typeof i&&(a[p][n]=i)})});const c=Object.keys(a).sort((h,m)=>new Date(h).getTime()-new Date(m).getTime());let j=new Set;for(let h in a)for(let m in a[h])j.add(m);this.statusCodesOptions.series=[];for(let h of j){let m=[];c.forEach(i=>{m.push(a[i][h]||0)});let n,p=parseInt(h.split(".")[2],10);n=p<300?"#00c600":p<400?"#0080ff":p<500?"#e41313":"#ff7300",this.statusCodesOptions.series.push({name:h,type:"line",data:m,lineStyle:{color:n},itemStyle:{color:n}})}this.statusCodesOptions.xAxis.data=c,this.statusCodesOptions={...this.statusCodesOptions};let y=document.getElementById("httpCodesChart");y.style.width="100%",y.style.height="25em"}showLoading(){var e=this;return(0,f.A)(function*(){yield(yield e.loadingCtrl.create({})).present()})()}hideLoading(){var e=this;return(0,f.A)(function*(){yield e.loadingCtrl.dismiss()})()}showAlert(e,r){var a=this;return(0,f.A)(function*(){const c=yield a.alertCtrl.create({header:r,message:e,buttons:["OK"]});return yield c.present(),yield c.onDidDismiss(),!0})()}}return(t=o).\u0275fac=function(e){return new(e||t)(s.rXU(b.Ix),s.rXU(b.nX),s.rXU(B),s.rXU(d.Xi),s.rXU(d.hG))},t.\u0275cmp=s.VBU({type:t,selectors:[["app-load-test"]],decls:29,vars:10,consts:[[3,"title"],[3,"fullscreen"],[1,"lg:m-10","md:m-10"],["size","12","size-md","8","size-lg","8",1,""],["label","Target","placeholder","Enter a target","type","text","labelPlacement","stacked",1,"",3,"ngModelChange","ngModel"],["size","12","size-md","12","size-lg","12",1,"flex","flex-row","justify-end"],["color","primary","size","small",1,"",3,"click"],["name","add"],[1,"w-full","p-6","flex","flex-col","justify-center","items-center"],[1,"text-3xl"],[1,"text-2xl","text-white"],[1,"h-[25em]","w-full"],["id","httpCodesChart","echarts","",1,"demo-chart","h-full","w-full",3,"options"]],template:function(e,r){1&e&&(s.nrm(0,"app-header-return",0),s.j41(1,"ion-content",1)(2,"ion-grid"),s.nrm(3,"app-title",0),s.j41(4,"ion-row",2)(5,"ion-col",3)(6,"ion-input",4),s.mxI("ngModelChange",function(c){return s.DH7(r.target,c)||(r.target=c),c}),s.k0s()()(),s.j41(7,"ion-row",2)(8,"ion-col",5)(9,"ion-button",6),s.bIt("click",function(){return r.sendRequest()}),s.EFF(10,"Load Target "),s.nrm(11,"ion-icon",7),s.k0s()()(),s.nrm(12,"app-title",0),s.j41(13,"ion-row",2)(14,"ion-card",8)(15,"ion-card-header")(16,"ion-card-title",9),s.EFF(17,"Total Number of Requests"),s.k0s()(),s.j41(18,"ion-card-content")(19,"h1",10),s.EFF(20),s.nI1(21,"number"),s.k0s()()()(),s.j41(22,"ion-row",2)(23,"ion-card",8)(24,"ion-card-header")(25,"ion-card-title",9),s.EFF(26,"HTTP Status Codes"),s.k0s()(),s.j41(27,"ion-card-content",11),s.nrm(28,"div",12),s.k0s()()()()()),2&e&&(s.Y8G("title","Load Test For "+r.productStep),s.R7$(),s.Y8G("fullscreen",!0),s.R7$(2),s.Y8G("title","New Load Test"),s.R7$(3),s.R50("ngModel",r.target),s.R7$(6),s.Y8G("title","Analytics For "+r.productStep),s.R7$(8),s.JRh(s.i5U(21,7,r.totalNumberOfRequests,"1.0-0")),s.R7$(8),s.Y8G("options",r.statusCodesOptions))},dependencies:[P.BC,P.vS,d.Jm,d.b_,d.I9,d.ME,d.tN,d.hU,d.W9,d.lO,d.iq,d.$w,d.ln,d.Gw,K.W,X.p,z.$P,g.QX]}),o})()}];let V=(()=>{var t;class o{}return(t=o).\u0275fac=function(e){return new(e||t)},t.\u0275mod=s.$C({type:t}),t.\u0275inj=s.G2t({imports:[b.iI.forChild(Y),b.iI]}),o})();var Q=u(5553);let q=(()=>{var t;class o{}return(t=o).\u0275fac=function(e){return new(e||t)},t.\u0275mod=s.$C({type:t}),t.\u0275inj=s.G2t({imports:[g.MD,P.YN,d.bv,V,Q.h]}),o})()}}]);
\ No newline at end of file
diff --git a/www/2836.c568b79792d5b1b2.js b/www/2836.c568b79792d5b1b2.js
deleted file mode 100644
index a05421e..0000000
--- a/www/2836.c568b79792d5b1b2.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[2836],{5553:(N,_,i)=>{i.d(_,{h:()=>C});var m=i(177),L=i(7863),c=i(4438);let C=(()=>{var a;class n{}return(a=n).\u0275fac=function(T){return new(T||a)},a.\u0275mod=c.$C({type:a}),a.\u0275inj=c.G2t({imports:[m.MD,L.bv]}),n})()},3241:(N,_,i)=>{i.d(_,{p:()=>C});var m=i(4438),L=i(177),c=i(7863);let C=(()=>{var a;class n{constructor(T){this.location=T,this.title="Header Title"}ngOnInit(){}goBack(){this.location.back()}}return(a=n).\u0275fac=function(T){return new(T||a)(m.rXU(L.aZ))},a.\u0275cmp=m.VBU({type:a,selectors:[["app-header-return"]],inputs:{title:"title"},decls:6,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"],["name","arrow-back","slot","start",1,"p-4","bigger-icon",3,"click"]],template:function(T,p){1&T&&(m.j41(0,"ion-header",0)(1,"ion-toolbar"),m.nrm(2,"ion-menu-button",1),m.j41(3,"ion-icon",2),m.bIt("click",function(){return p.goBack()}),m.k0s(),m.j41(4,"ion-title"),m.EFF(5),m.k0s()()()),2&T&&(m.Y8G("translucent",!0),m.R7$(5),m.JRh(p.title))},dependencies:[c.eU,c.iq,c.MC,c.BC,c.ai],styles:[".bigger-icon[_ngcontent-%COMP%]{font-size:1.5em}"]}),n})()},2836:(N,_,i)=>{i.r(_),i.d(_,{LoadTestPageModule:()=>Q});var m=i(177),L=i(4341),c=i(7863),C=i(7650),a=i(467),n=i(4438),M=i(4262);class T{static toArtilleryData(r){return function $(t,r){return v(t,r,U)}(JSON.parse(r),A("ArtilleryData"))}static artilleryDataToJson(r){return JSON.stringify(function W(t,r){return v(t,r,J)}(r,A("ArtilleryData")),null,2)}}function p(t,r,s,e=""){const o=S(t);throw Error(`Invalid value${s?` for key "${s}"`:""}${e?` on ${e}`:""}. Expected ${o} but got ${JSON.stringify(r)}`)}function S(t){return Array.isArray(t)?2===t.length&&void 0===t[0]?`an optional ${S(t[1])}`:`one of [${t.map(r=>S(r)).join(", ")}]`:"object"==typeof t&&void 0!==t.literal?t.literal:typeof t}function U(t){if(void 0===t.jsonToJS){const r={};t.props.forEach(s=>r[s.json]={key:s.js,typ:s.typ}),t.jsonToJS=r}return t.jsonToJS}function J(t){if(void 0===t.jsToJSON){const r={};t.props.forEach(s=>r[s.js]={key:s.json,typ:s.typ}),t.jsToJSON=r}return t.jsToJSON}function v(t,r,s,e="",o=""){if("any"===r)return t;if(null===r)return null===t?t:p(r,t,e,o);if(!1===r)return p(r,t,e,o);let P;for(;"object"==typeof r&&void 0!==r.ref;)P=r.ref,r=F[r.ref];return Array.isArray(r)?function g(l,u){return-1!==l.indexOf(u)?u:p(l.map(h=>D(h)),u,e,o)}(r,t):"object"==typeof r?r.hasOwnProperty("unionMembers")?function f(l,u){const h=l.length;for(let R=0;Rv(h,l,s)):p(D("array"),u,e,o)}(r.arrayItems,t):r.hasOwnProperty("props")?function H(l,u,h){if(null===h||"object"!=typeof h||Array.isArray(h))return p(D(P||"object"),h,e,o);const R={};return Object.getOwnPropertyNames(l).forEach(y=>{const I=l[y],w=Object.prototype.hasOwnProperty.call(h,y)?h[y]:void 0;R[I.key]=void 0!==w?v(w,I.typ,s,y,P):void 0}),Object.getOwnPropertyNames(h).forEach(y=>{Object.prototype.hasOwnProperty.call(l,y)||(R[y]=v(h[y],u,s,y,P))}),R}(s(r),r.additional,t):p(r,t,e,o):r===Date&&"number"!=typeof t?function j(l){if(null===l)return null;const u=new Date(l);return isNaN(u.valueOf())?p(D("Date"),l,e,o):u}(t):function d(l,u){return typeof l==typeof u?u:p(l,u,e,o)}(r,t)}function D(t){return{literal:t}}function b(t,r){return{props:t,additional:r}}function E(t){return{props:[],additional:t}}function A(t){return{ref:t}}const F={ArtilleryData:b([{json:"aggregate",js:"aggregate",typ:A("Aggregate")},{json:"intermediate",js:"intermediate",typ:function B(t){return{arrayItems:t}}(A("Intermediate"))},{json:"date",js:"date",typ:""}],!1),Aggregate:b([{json:"counters",js:"counters",typ:E(0)},{json:"rates",js:"rates",typ:A("Rates")},{json:"firstCounterAt",js:"firstCounterAt",typ:0},{json:"firstHistogramAt",js:"firstHistogramAt",typ:0},{json:"lastCounterAt",js:"lastCounterAt",typ:0},{json:"lastHistogramAt",js:"lastHistogramAt",typ:0},{json:"firstMetricAt",js:"firstMetricAt",typ:0},{json:"lastMetricAt",js:"lastMetricAt",typ:0},{json:"period",js:"period",typ:0},{json:"summaries",js:"summaries",typ:A("Histograms")},{json:"histograms",js:"histograms",typ:A("Histograms")}],!1),Histograms:b([{json:"http.response_time",js:"http.response_time",typ:E(3.14)},{json:"plugins.metrics-by-endpoint.response_time./",js:"plugins.metrics-by-endpoint.response_time./",typ:E(3.14)},{json:"vusers.session_length",js:"vusers.session_length",typ:function G(...t){return{unionMembers:t}}(void 0,E(3.14))}],!1),Rates:b([{json:"http.request_rate",js:"http.request_rate",typ:0}],!1),Intermediate:b([{json:"counters",js:"counters",typ:E(0)},{json:"rates",js:"rates",typ:A("Rates")},{json:"http.request_rate",js:"http.request_rate",typ:null},{json:"firstCounterAt",js:"firstCounterAt",typ:0},{json:"firstHistogramAt",js:"firstHistogramAt",typ:0},{json:"lastCounterAt",js:"lastCounterAt",typ:0},{json:"lastHistogramAt",js:"lastHistogramAt",typ:0},{json:"firstMetricAt",js:"firstMetricAt",typ:0},{json:"lastMetricAt",js:"lastMetricAt",typ:0},{json:"period",js:"period",typ:""},{json:"summaries",js:"summaries",typ:A("Histograms")},{json:"histograms",js:"histograms",typ:A("Histograms")}],!1)};var K=i(1626);let z=(()=>{var t;class r{constructor(e,o){this.firestore=e,this.http=o,this.url="https://devprobeapi.onrender.com/create_load_test"}getLoadTestHistory(e,o,d){var f=this;return(0,a.A)(function*(){const g=(0,M.H9)(f.firestore,"teams",e,"products",o,"load_test",d),O=yield(0,M.x7)(g);if(O.exists()){let j=O.data();console.log(j);let H=Object.keys(j);console.log(H);for(let P of H){let u=T.toArtilleryData(j[P]);j[P]=u}return j}return{}})()}sendLoadTest(e,o,d,f){var g=this;return(0,a.A)(function*(){try{const O={team:e,product:o,service:d,target:`https://${f}`};return yield g.http.post(g.url,O).toPromise()}catch{return{}}})()}}return(t=r).\u0275fac=function(e){return new(e||t)(n.KVO(M._7),n.KVO(K.Qq))},t.\u0275prov=n.jDH({token:t,factory:t.\u0275fac,providedIn:"root"}),r})();var X=i(8453),x=i(3241);const V=[{path:"",component:(()=>{var t;class r{constructor(e,o,d,f,g){this.router=e,this.activatedRoute=o,this.loadTestService=d,this.loadingCtrl=f,this.alertCtrl=g,this.productStep="",this.productObjective="",this.orgName="",this.target="",this.description="",this.loadTestResults={}}ngOnInit(){}ionViewWillEnter(){var e=this;return(0,a.A)(function*(){e.getParams(),yield e.getHistoryResults().then(()=>{e.byCodes()})})()}getParams(){this.activatedRoute.params.subscribe(o=>{this.productObjective=o.productObjective,this.productStep=o.step});const e=JSON.parse(localStorage.getItem("user"));this.orgName=e.orgName,console.log(this.orgName),console.log(this.productObjective),console.log(this.productStep)}getHistoryResults(){var e=this;return(0,a.A)(function*(){yield e.showLoading(),yield e.loadTestService.getLoadTestHistory(e.orgName,e.productObjective,e.productStep).then(o=>{e.loadTestResults=o,console.log(e.loadTestResults)}),yield e.hideLoading()})()}sendRequest(){var e=this;return(0,a.A)(function*(){if(yield e.showLoading(),e.target.startsWith("http://")||e.target.startsWith("https://")||e.target.endsWith("/"))return yield e.hideLoading(),void(yield e.showAlert("No http or https is needed, check for slashes at the end of the domain","Please enter a valid host"));yield e.loadTestService.sendLoadTest(e.orgName,e.productObjective,e.productStep,e.target).then(function(){var o=(0,a.A)(function*(d){yield e.hideLoading(),console.log("data",d),d&&(yield e.showAlert("Test sent, please wait a few seconds to GET RESULTS","Success"))});return function(d){return o.apply(this,arguments)}}()),yield e.hideLoading()})()}byCodes(){let e=Object.keys(this.loadTestResults),o={};for(let d of e){let f=this.loadTestResults[d].aggregate.counters,g=this.loadTestResults[d].date,O=Object.keys(f);for(let j of O)j.startsWith("http.codes.")&&(o[g]||(o[g]={}),o[g][j]=f[j])}console.log(o)}showLoading(){var e=this;return(0,a.A)(function*(){yield(yield e.loadingCtrl.create({})).present()})()}hideLoading(){var e=this;return(0,a.A)(function*(){yield e.loadingCtrl.dismiss()})()}showAlert(e,o){var d=this;return(0,a.A)(function*(){const f=yield d.alertCtrl.create({header:o,message:e,buttons:["OK"]});return yield f.present(),yield f.onDidDismiss(),!0})()}}return(t=r).\u0275fac=function(e){return new(e||t)(n.rXU(C.Ix),n.rXU(C.nX),n.rXU(z),n.rXU(c.Xi),n.rXU(c.hG))},t.\u0275cmp=n.VBU({type:t,selectors:[["app-load-test"]],decls:12,vars:4,consts:[[3,"title"],[3,"fullscreen"],[1,"lg:m-10","md:m-10"],["size","12","size-md","8","size-lg","8",1,""],["label","Target","placeholder","Enter a target","type","text","labelPlacement","stacked",1,"",3,"ngModelChange","ngModel"],["size","12","size-md","12","size-lg","12",1,"flex","flex-row","justify-end"],["color","primary","size","small",1,"",3,"click"],["name","add"]],template:function(e,o){1&e&&(n.nrm(0,"app-header-return",0),n.j41(1,"ion-content",1)(2,"ion-grid"),n.nrm(3,"app-title",0),n.j41(4,"ion-row",2)(5,"ion-col",3)(6,"ion-input",4),n.mxI("ngModelChange",function(f){return n.DH7(o.target,f)||(o.target=f),f}),n.k0s()()(),n.j41(7,"ion-row",2)(8,"ion-col",5)(9,"ion-button",6),n.bIt("click",function(){return o.sendRequest()}),n.EFF(10,"Load Target "),n.nrm(11,"ion-icon",7),n.k0s()()()()()),2&e&&(n.Y8G("title","Load Test"),n.R7$(),n.Y8G("fullscreen",!0),n.R7$(2),n.Y8G("title","New Load Test"),n.R7$(3),n.R50("ngModel",o.target))},dependencies:[L.BC,L.vS,c.Jm,c.hU,c.W9,c.lO,c.iq,c.$w,c.ln,c.Gw,X.W,x.p]}),r})()}];let k=(()=>{var t;class r{}return(t=r).\u0275fac=function(e){return new(e||t)},t.\u0275mod=n.$C({type:t}),t.\u0275inj=n.G2t({imports:[C.iI.forChild(V),C.iI]}),r})();var Y=i(5553);let Q=(()=>{var t;class r{}return(t=r).\u0275fac=function(e){return new(e||t)},t.\u0275mod=n.$C({type:t}),t.\u0275inj=n.G2t({imports:[m.MD,L.YN,c.bv,k,Y.h]}),r})()}}]);
\ No newline at end of file
diff --git a/www/4163.d03c993d9910ed21.js b/www/4163.dd6bee594e4d801a.js
similarity index 68%
rename from www/4163.d03c993d9910ed21.js
rename to www/4163.dd6bee594e4d801a.js
index 760d8b5..09afcd7 100644
--- a/www/4163.d03c993d9910ed21.js
+++ b/www/4163.dd6bee594e4d801a.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[4163],{5553:(C,h,r)=>{r.d(h,{h:()=>c});var g=r(177),p=r(7863),n=r(4438);let c=(()=>{var i;class o{}return(i=o).\u0275fac=function(f){return new(f||i)},i.\u0275mod=n.$C({type:i}),i.\u0275inj=n.G2t({imports:[g.MD,p.bv]}),o})()},4163:(C,h,r)=>{r.r(h),r.d(h,{LoadTestChooserPageModule:()=>y});var g=r(177),p=r(4341),n=r(7863),c=r(7650),i=r(467),o=r(4438),m=r(6241),f=r(385),v=r(8453);function T(t,d){if(1&t){const a=o.RV6();o.j41(0,"ion-item",7),o.bIt("click",function(){const s=o.eBV(a).$implicit,l=o.XpG().$implicit,u=o.XpG();return o.Njj(u.navigateToLoadTest(l,s))}),o.j41(1,"ion-label"),o.EFF(2),o.k0s(),o.nrm(3,"ion-icon",8),o.k0s()}if(2&t){const a=d.$implicit;o.R7$(2),o.JRh(a)}}function L(t,d){if(1&t&&(o.j41(0,"ion-col",4)(1,"ion-card")(2,"ion-card-header")(3,"ion-card-title"),o.EFF(4),o.k0s()(),o.j41(5,"ion-card-content")(6,"ion-list"),o.DNE(7,T,4,1,"ion-item",6),o.k0s()()()()),2&t){const a=d.$implicit;o.R7$(4),o.JRh(a.productObjective),o.R7$(3),o.Y8G("ngForOf",a.productSteps)}}const P=[{path:"",component:(()=>{var t;class d{constructor(e,s,l){this.productService=e,this.router=s,this.loadingCtrl=l,this.products=[]}ngOnInit(){}ionViewWillEnter(){var e=this;return(0,i.A)(function*(){yield e.showLoading(),e.getAllProducts(),yield e.hideLoading()})()}getAllProducts(){var e=this;return(0,i.A)(function*(){const s=localStorage.getItem("user");if(!s)return;const u=JSON.parse(s).orgName;e.products=yield e.productService.getProducts(u)})()}doRefresh(e){var s=this;return(0,i.A)(function*(){s.getAllProducts().then(()=>{e.target.complete()})})()}navigateToLoadTest(e,s){var l=this;return(0,i.A)(function*(){yield l.router.navigate(["/load-test",{productObjective:e.productObjective,step:s}])})()}showLoading(){var e=this;return(0,i.A)(function*(){yield(yield e.loadingCtrl.create({})).present()})()}hideLoading(){var e=this;return(0,i.A)(function*(){yield e.loadingCtrl.dismiss()})()}}return(t=d).\u0275fac=function(e){return new(e||t)(o.rXU(m.b),o.rXU(c.Ix),o.rXU(n.Xi))},t.\u0275cmp=o.VBU({type:t,selectors:[["app-load-test-chooser"]],decls:14,vars:5,consts:[[3,"title"],[3,"fullscreen"],["slot","fixed",3,"ionRefresh"],[1,"lg:m-10","md:m-10"],["size","12","size-md","4","size-lg","4",1,""],["size","12","size-md","4","size-lg","4","class","",4,"ngFor","ngForOf"],[3,"click",4,"ngFor","ngForOf"],[3,"click"],["name","arrow-forward","color","primary"]],template:function(e,s){1&e&&(o.nrm(0,"app-header",0),o.j41(1,"ion-content",1)(2,"ion-refresher",2),o.bIt("ionRefresh",function(u){return s.doRefresh(u)}),o.nrm(3,"ion-refresher-content"),o.k0s(),o.j41(4,"ion-grid"),o.nrm(5,"app-title",0),o.j41(6,"ion-row",3)(7,"ion-col",4)(8,"p"),o.EFF(9,"Choose a product and a product step to load test the product step."),o.k0s()()(),o.j41(10,"ion-row",3),o.DNE(11,L,8,2,"ion-col",5),o.k0s(),o.nrm(12,"app-title",0)(13,"ion-row",3),o.k0s()()),2&e&&(o.Y8G("title","Load Test Chooser"),o.R7$(),o.Y8G("fullscreen",!0),o.R7$(4),o.Y8G("title","Load Test Chooser"),o.R7$(6),o.Y8G("ngForOf",s.products),o.R7$(),o.Y8G("title","Status Codes"))},dependencies:[g.Sq,n.b_,n.I9,n.ME,n.tN,n.hU,n.W9,n.lO,n.iq,n.uz,n.he,n.nf,n.To,n.Ki,n.ln,f.l,v.W]}),d})()}];let M=(()=>{var t;class d{}return(t=d).\u0275fac=function(e){return new(e||t)},t.\u0275mod=o.$C({type:t}),t.\u0275inj=o.G2t({imports:[c.iI.forChild(P),c.iI]}),d})();var R=r(5553);let y=(()=>{var t;class d{}return(t=d).\u0275fac=function(e){return new(e||t)},t.\u0275mod=o.$C({type:t}),t.\u0275inj=o.G2t({imports:[g.MD,p.YN,n.bv,M,R.h]}),d})()}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[4163],{5553:(C,h,r)=>{r.d(h,{h:()=>c});var g=r(177),m=r(7863),n=r(4438);let c=(()=>{var i;class o{}return(i=o).\u0275fac=function(f){return new(f||i)},i.\u0275mod=n.$C({type:i}),i.\u0275inj=n.G2t({imports:[g.MD,m.bv]}),o})()},4163:(C,h,r)=>{r.r(h),r.d(h,{LoadTestChooserPageModule:()=>y});var g=r(177),m=r(4341),n=r(7863),c=r(7650),i=r(467),o=r(4438),p=r(6241),f=r(385),v=r(8453);function T(t,d){if(1&t){const a=o.RV6();o.j41(0,"ion-item",7),o.bIt("click",function(){const s=o.eBV(a).$implicit,l=o.XpG().$implicit,u=o.XpG();return o.Njj(u.navigateToLoadTest(l,s))}),o.j41(1,"ion-label"),o.EFF(2),o.k0s(),o.nrm(3,"ion-icon",8),o.k0s()}if(2&t){const a=d.$implicit;o.R7$(2),o.JRh(a)}}function L(t,d){if(1&t&&(o.j41(0,"ion-col",4)(1,"ion-card")(2,"ion-card-header")(3,"ion-card-title"),o.EFF(4),o.k0s()(),o.j41(5,"ion-card-content")(6,"ion-list"),o.DNE(7,T,4,1,"ion-item",6),o.k0s()()()()),2&t){const a=d.$implicit;o.R7$(4),o.JRh(a.productObjective),o.R7$(3),o.Y8G("ngForOf",a.productSteps)}}const P=[{path:"",component:(()=>{var t;class d{constructor(e,s,l){this.productService=e,this.router=s,this.loadingCtrl=l,this.products=[]}ngOnInit(){}ionViewWillEnter(){var e=this;return(0,i.A)(function*(){yield e.showLoading(),e.getAllProducts(),yield e.hideLoading()})()}getAllProducts(){var e=this;return(0,i.A)(function*(){const s=localStorage.getItem("user");if(!s)return;const u=JSON.parse(s).orgName;e.products=yield e.productService.getProducts(u)})()}doRefresh(e){var s=this;return(0,i.A)(function*(){s.getAllProducts().then(()=>{e.target.complete()})})()}navigateToLoadTest(e,s){var l=this;return(0,i.A)(function*(){yield l.router.navigate(["/load-test",{productObjective:e.productObjective,step:s}])})()}showLoading(){var e=this;return(0,i.A)(function*(){yield(yield e.loadingCtrl.create({})).present()})()}hideLoading(){var e=this;return(0,i.A)(function*(){yield e.loadingCtrl.dismiss()})()}}return(t=d).\u0275fac=function(e){return new(e||t)(o.rXU(p.b),o.rXU(c.Ix),o.rXU(n.Xi))},t.\u0275cmp=o.VBU({type:t,selectors:[["app-load-test-chooser"]],decls:12,vars:4,consts:[[3,"title"],[3,"fullscreen"],["slot","fixed",3,"ionRefresh"],[1,"lg:m-10","md:m-10"],["size","12","size-md","4","size-lg","4",1,""],["size","12","size-md","4","size-lg","4","class","",4,"ngFor","ngForOf"],[3,"click",4,"ngFor","ngForOf"],[3,"click"],["name","arrow-forward","color","primary"]],template:function(e,s){1&e&&(o.nrm(0,"app-header",0),o.j41(1,"ion-content",1)(2,"ion-refresher",2),o.bIt("ionRefresh",function(u){return s.doRefresh(u)}),o.nrm(3,"ion-refresher-content"),o.k0s(),o.j41(4,"ion-grid"),o.nrm(5,"app-title",0),o.j41(6,"ion-row",3)(7,"ion-col",4)(8,"p"),o.EFF(9,"Choose a product and a product step to load test the product step."),o.k0s()()(),o.j41(10,"ion-row",3),o.DNE(11,L,8,2,"ion-col",5),o.k0s()()()),2&e&&(o.Y8G("title","Load Test Chooser"),o.R7$(),o.Y8G("fullscreen",!0),o.R7$(4),o.Y8G("title","Load Test Chooser"),o.R7$(6),o.Y8G("ngForOf",s.products))},dependencies:[g.Sq,n.b_,n.I9,n.ME,n.tN,n.hU,n.W9,n.lO,n.iq,n.uz,n.he,n.nf,n.To,n.Ki,n.ln,f.l,v.W]}),d})()}];let M=(()=>{var t;class d{}return(t=d).\u0275fac=function(e){return new(e||t)},t.\u0275mod=o.$C({type:t}),t.\u0275inj=o.G2t({imports:[c.iI.forChild(P),c.iI]}),d})();var R=r(5553);let y=(()=>{var t;class d{}return(t=d).\u0275fac=function(e){return new(e||t)},t.\u0275mod=o.$C({type:t}),t.\u0275inj=o.G2t({imports:[g.MD,m.YN,n.bv,M,R.h]}),d})()}}]);
\ No newline at end of file
diff --git a/www/index.html b/www/index.html
index 133fd1d..9e597c3 100644
--- a/www/index.html
+++ b/www/index.html
@@ -21,6 +21,6 @@
-
+