UNPKG

ng-jhipster

Version:

A Jhipster util library for Angular

147 lines (143 loc) 18.4 kB
/* Copyright 2013-2020 the original author or authors from the JHipster project. This file is part of the JHipster project, see https://www.jhipster.tech/ for more information. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ import { Component } from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; export class JhiThreadModalComponent { constructor(activeModal) { this.activeModal = activeModal; this.threadDumpAll = 0; this.threadDumpBlocked = 0; this.threadDumpRunnable = 0; this.threadDumpTimedWaiting = 0; this.threadDumpWaiting = 0; } ngOnInit() { this.threadDump.forEach(value => { if (value.threadState === 'RUNNABLE') { this.threadDumpRunnable += 1; } else if (value.threadState === 'WAITING') { this.threadDumpWaiting += 1; } else if (value.threadState === 'TIMED_WAITING') { this.threadDumpTimedWaiting += 1; } else if (value.threadState === 'BLOCKED') { this.threadDumpBlocked += 1; } }); this.threadDumpAll = this.threadDumpRunnable + this.threadDumpWaiting + this.threadDumpTimedWaiting + this.threadDumpBlocked; } getBadgeClass(threadState) { if (threadState === 'RUNNABLE') { return 'badge-success'; } else if (threadState === 'WAITING') { return 'badge-info'; } else if (threadState === 'TIMED_WAITING') { return 'badge-warning'; } else if (threadState === 'BLOCKED') { return 'badge-danger'; } } } JhiThreadModalComponent.decorators = [ { type: Component, args: [{ selector: 'jhi-thread-modal', template: ` <div class="modal-header"> <h4 class="modal-title" jhiTranslate="metrics.jvm.threads.dump.title">Threads dump</h4> <button type="button" class="close" (click)="activeModal.dismiss('closed')">&times;</button> </div> <div class="modal-body"> <span class="badge badge-primary" (click)="threadDumpFilter = {}"> All&nbsp;<span class="badge badge-pill badge-default">{{ threadDumpAll }}</span> </span >&nbsp; <span class="badge badge-success" (click)="threadDumpFilter = { threadState: 'RUNNABLE' }"> Runnable&nbsp;<span class="badge badge-pill badge-default">{{ threadDumpRunnable }}</span> </span >&nbsp; <span class="badge badge-info" (click)="threadDumpFilter = { threadState: 'WAITING' }" >Waiting&nbsp;<span class="badge badge-pill badge-default">{{ threadDumpWaiting }}</span></span >&nbsp; <span class="badge badge-warning" (click)="threadDumpFilter = { threadState: 'TIMED_WAITING' }"> Timed Waiting&nbsp;<span class="badge badge-pill badge-default">{{ threadDumpTimedWaiting }}</span> </span >&nbsp; <span class="badge badge-danger" (click)="threadDumpFilter = { threadState: 'BLOCKED' }" >Blocked&nbsp;<span class="badge badge-pill badge-default">{{ threadDumpBlocked }}</span></span >&nbsp; <div class="mt-2">&nbsp;</div> Filter <input type="text" [(ngModel)]="threadDumpFilter" class="form-control" /> <div class="pad" *ngFor="let entry of (threadDump | pureFilter: threadDumpFilter:'lockName' | keys)"> <h6> <span class="badge" [ngClass]="getBadgeClass(entry.value.threadState)">{{ entry.value.threadState }}</span >&nbsp;{{ entry.value.threadName }} (ID {{ entry.value.threadId }}) <a (click)="entry.show = !entry.show" href="javascript:void(0);"> <span [hidden]="entry.show" jhiTranslate="metrics.jvm.threads.dump.show">Show StackTrace</span> <span [hidden]="!entry.show" jhiTranslate="metrics.jvm.threads.dump.hide">Hide StackTrace</span> </a> </h6> <div class="card" [hidden]="!entry.show"> <div class="card-body"> <div *ngFor="let st of (entry.value.stackTrace | keys)" class="break"> <samp >{{ st.value.className }}.{{ st.value.methodName }}(<code >{{ st.value.fileName }}:{{ st.value.lineNumber }}</code >)</samp > <span class="mt-1"></span> </div> </div> </div> <table class="table table-sm table-responsive"> <thead> <tr> <th jhiTranslate="metrics.jvm.threads.dump.blockedtime">Blocked Time</th> <th jhiTranslate="metrics.jvm.threads.dump.blockedcount">Blocked Count</th> <th jhiTranslate="metrics.jvm.threads.dump.waitedtime">Waited Time</th> <th jhiTranslate="metrics.jvm.threads.dump.waitedcount">Waited Count</th> <th jhiTranslate="metrics.jvm.threads.dump.lockname">Lock Name</th> </tr> </thead> <tbody> <tr> <td>{{ entry.value.blockedTime }}</td> <td>{{ entry.value.blockedCount }}</td> <td>{{ entry.value.waitedTime }}</td> <td>{{ entry.value.waitedCount }}</td> <td class="thread-dump-modal-lock" title="{{ entry.value.lockName }}"> <code>{{ entry.value.lockName }}</code> </td> </tr> </tbody> </table> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary float-left" data-dismiss="modal" (click)="activeModal.dismiss('closed')"> Done </button> </div> ` },] } ]; JhiThreadModalComponent.ctorParameters = () => [ { type: NgbActiveModal } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamhpLW1ldHJpY3MtbW9kYWwtdGhyZWFkcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50L21ldHJpY3MvamhpLW1ldHJpY3MtbW9kYWwtdGhyZWFkcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFrRjVELE1BQU0sT0FBTyx1QkFBdUI7SUFTaEMsWUFBbUIsV0FBMkI7UUFBM0IsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBTjlDLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUN0Qix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDdkIsMkJBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztJQUUyQixDQUFDO0lBRWxELFFBQVE7UUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QixJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxDQUFDO2FBQ2hDO2lCQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7YUFDL0I7aUJBQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLGVBQWUsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsQ0FBQzthQUNwQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO2FBQy9CO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNqSSxDQUFDO0lBRUQsYUFBYSxDQUFDLFdBQVc7UUFDckIsSUFBSSxXQUFXLEtBQUssVUFBVSxFQUFFO1lBQzVCLE9BQU8sZUFBZSxDQUFDO1NBQzFCO2FBQU0sSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU8sWUFBWSxDQUFDO1NBQ3ZCO2FBQU0sSUFBSSxXQUFXLEtBQUssZUFBZSxFQUFFO1lBQ3hDLE9BQU8sZUFBZSxDQUFDO1NBQzFCO2FBQU0sSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU8sY0FBYyxDQUFDO1NBQ3pCO0lBQ0wsQ0FBQzs7O1lBckhKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0E0RVQ7YUFDSjs7O1lBakZRLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIENvcHlyaWdodCAyMDEzLTIwMjAgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzIGZyb20gdGhlIEpIaXBzdGVyIHByb2plY3QuXG5cbiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSkhpcHN0ZXIgcHJvamVjdCwgc2VlIGh0dHBzOi8vd3d3LmpoaXBzdGVyLnRlY2gvXG4gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdqaGktdGhyZWFkLW1vZGFsJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGpoaVRyYW5zbGF0ZT1cIm1ldHJpY3MuanZtLnRocmVhZHMuZHVtcC50aXRsZVwiPlRocmVhZHMgZHVtcDwvaDQ+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgKGNsaWNrKT1cImFjdGl2ZU1vZGFsLmRpc21pc3MoJ2Nsb3NlZCcpXCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtcHJpbWFyeVwiIChjbGljayk9XCJ0aHJlYWREdW1wRmlsdGVyID0ge31cIj5cbiAgICAgICAgICAgICAgICBBbGwmbmJzcDs8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXBpbGwgYmFkZ2UtZGVmYXVsdFwiPnt7IHRocmVhZER1bXBBbGwgfX08L3NwYW4+IDwvc3BhblxuICAgICAgICAgICAgPiZuYnNwO1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1zdWNjZXNzXCIgKGNsaWNrKT1cInRocmVhZER1bXBGaWx0ZXIgPSB7IHRocmVhZFN0YXRlOiAnUlVOTkFCTEUnIH1cIj5cbiAgICAgICAgICAgICAgICBSdW5uYWJsZSZuYnNwOzxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtcGlsbCBiYWRnZS1kZWZhdWx0XCI+e3sgdGhyZWFkRHVtcFJ1bm5hYmxlIH19PC9zcGFuPiA8L3NwYW5cbiAgICAgICAgICAgID4mbmJzcDtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtaW5mb1wiIChjbGljayk9XCJ0aHJlYWREdW1wRmlsdGVyID0geyB0aHJlYWRTdGF0ZTogJ1dBSVRJTkcnIH1cIlxuICAgICAgICAgICAgICAgID5XYWl0aW5nJm5ic3A7PHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1waWxsIGJhZGdlLWRlZmF1bHRcIj57eyB0aHJlYWREdW1wV2FpdGluZyB9fTwvc3Bhbj48L3NwYW5cbiAgICAgICAgICAgID4mbmJzcDtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2Utd2FybmluZ1wiIChjbGljayk9XCJ0aHJlYWREdW1wRmlsdGVyID0geyB0aHJlYWRTdGF0ZTogJ1RJTUVEX1dBSVRJTkcnIH1cIj5cbiAgICAgICAgICAgICAgICBUaW1lZCBXYWl0aW5nJm5ic3A7PHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1waWxsIGJhZGdlLWRlZmF1bHRcIj57eyB0aHJlYWREdW1wVGltZWRXYWl0aW5nIH19PC9zcGFuPiA8L3NwYW5cbiAgICAgICAgICAgID4mbmJzcDtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtZGFuZ2VyXCIgKGNsaWNrKT1cInRocmVhZER1bXBGaWx0ZXIgPSB7IHRocmVhZFN0YXRlOiAnQkxPQ0tFRCcgfVwiXG4gICAgICAgICAgICAgICAgPkJsb2NrZWQmbmJzcDs8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXBpbGwgYmFkZ2UtZGVmYXVsdFwiPnt7IHRocmVhZER1bXBCbG9ja2VkIH19PC9zcGFuPjwvc3BhblxuICAgICAgICAgICAgPiZuYnNwO1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj4mbmJzcDs8L2Rpdj5cbiAgICAgICAgICAgIEZpbHRlclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ0aHJlYWREdW1wRmlsdGVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZFwiICpuZ0Zvcj1cImxldCBlbnRyeSBvZiAodGhyZWFkRHVtcCB8IHB1cmVGaWx0ZXI6IHRocmVhZER1bXBGaWx0ZXI6J2xvY2tOYW1lJyB8IGtleXMpXCI+XG4gICAgICAgICAgICAgICAgPGg2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlXCIgW25nQ2xhc3NdPVwiZ2V0QmFkZ2VDbGFzcyhlbnRyeS52YWx1ZS50aHJlYWRTdGF0ZSlcIj57eyBlbnRyeS52YWx1ZS50aHJlYWRTdGF0ZSB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+Jm5ic3A7e3sgZW50cnkudmFsdWUudGhyZWFkTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAoSURcbiAgICAgICAgICAgICAgICAgICAge3sgZW50cnkudmFsdWUudGhyZWFkSWQgfX0pXG4gICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJlbnRyeS5zaG93ID0gIWVudHJ5LnNob3dcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJlbnRyeS5zaG93XCIgamhpVHJhbnNsYXRlPVwibWV0cmljcy5qdm0udGhyZWFkcy5kdW1wLnNob3dcIj5TaG93IFN0YWNrVHJhY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cIiFlbnRyeS5zaG93XCIgamhpVHJhbnNsYXRlPVwibWV0cmljcy5qdm0udGhyZWFkcy5kdW1wLmhpZGVcIj5IaWRlIFN0YWNrVHJhY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCIgW2hpZGRlbl09XCIhZW50cnkuc2hvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdCBvZiAoZW50cnkudmFsdWUuc3RhY2tUcmFjZSB8IGtleXMpXCIgY2xhc3M9XCJicmVha1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzYW1wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBzdC52YWx1ZS5jbGFzc05hbWUgfX0ue3sgc3QudmFsdWUubWV0aG9kTmFtZSB9fSg8Y29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IHN0LnZhbHVlLmZpbGVOYW1lIH19Ont7IHN0LnZhbHVlLmxpbmVOdW1iZXIgfX08L2NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPik8L3NhbXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdC0xXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXNtIHRhYmxlLXJlc3BvbnNpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBqaGlUcmFuc2xhdGU9XCJtZXRyaWNzLmp2bS50aHJlYWRzLmR1bXAuYmxvY2tlZHRpbWVcIj5CbG9ja2VkIFRpbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBqaGlUcmFuc2xhdGU9XCJtZXRyaWNzLmp2bS50aHJlYWRzLmR1bXAuYmxvY2tlZGNvdW50XCI+QmxvY2tlZCBDb3VudDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGpoaVRyYW5zbGF0ZT1cIm1ldHJpY3MuanZtLnRocmVhZHMuZHVtcC53YWl0ZWR0aW1lXCI+V2FpdGVkIFRpbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBqaGlUcmFuc2xhdGU9XCJtZXRyaWNzLmp2bS50aHJlYWRzLmR1bXAud2FpdGVkY291bnRcIj5XYWl0ZWQgQ291bnQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBqaGlUcmFuc2xhdGU9XCJtZXRyaWNzLmp2bS50aHJlYWRzLmR1bXAubG9ja25hbWVcIj5Mb2NrIE5hbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBlbnRyeS52YWx1ZS5ibG9ja2VkVGltZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGVudHJ5LnZhbHVlLmJsb2NrZWRDb3VudCB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGVudHJ5LnZhbHVlLndhaXRlZFRpbWUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBlbnRyeS52YWx1ZS53YWl0ZWRDb3VudCB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGhyZWFkLWR1bXAtbW9kYWwtbG9ja1wiIHRpdGxlPVwie3sgZW50cnkudmFsdWUubG9ja05hbWUgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+e3sgZW50cnkudmFsdWUubG9ja05hbWUgfX08L2NvZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBmbG9hdC1sZWZ0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAoY2xpY2spPVwiYWN0aXZlTW9kYWwuZGlzbWlzcygnY2xvc2VkJylcIj5cbiAgICAgICAgICAgICAgICBEb25lXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgYFxufSlcbmV4cG9ydCBjbGFzcyBKaGlUaHJlYWRNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgdGhyZWFkRHVtcEZpbHRlcjogYW55O1xuICAgIHRocmVhZER1bXA6IGFueTtcbiAgICB0aHJlYWREdW1wQWxsID0gMDtcbiAgICB0aHJlYWREdW1wQmxvY2tlZCA9IDA7XG4gICAgdGhyZWFkRHVtcFJ1bm5hYmxlID0gMDtcbiAgICB0aHJlYWREdW1wVGltZWRXYWl0aW5nID0gMDtcbiAgICB0aHJlYWREdW1wV2FpdGluZyA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudGhyZWFkRHVtcC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS50aHJlYWRTdGF0ZSA9PT0gJ1JVTk5BQkxFJykge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkRHVtcFJ1bm5hYmxlICs9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnRocmVhZFN0YXRlID09PSAnV0FJVElORycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZER1bXBXYWl0aW5nICs9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnRocmVhZFN0YXRlID09PSAnVElNRURfV0FJVElORycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZER1bXBUaW1lZFdhaXRpbmcgKz0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUudGhyZWFkU3RhdGUgPT09ICdCTE9DS0VEJykge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkRHVtcEJsb2NrZWQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50aHJlYWREdW1wQWxsID0gdGhpcy50aHJlYWREdW1wUnVubmFibGUgKyB0aGlzLnRocmVhZER1bXBXYWl0aW5nICsgdGhpcy50aHJlYWREdW1wVGltZWRXYWl0aW5nICsgdGhpcy50aHJlYWREdW1wQmxvY2tlZDtcbiAgICB9XG5cbiAgICBnZXRCYWRnZUNsYXNzKHRocmVhZFN0YXRlKSB7XG4gICAgICAgIGlmICh0aHJlYWRTdGF0ZSA9PT0gJ1JVTk5BQkxFJykge1xuICAgICAgICAgICAgcmV0dXJuICdiYWRnZS1zdWNjZXNzJztcbiAgICAgICAgfSBlbHNlIGlmICh0aHJlYWRTdGF0ZSA9PT0gJ1dBSVRJTkcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2JhZGdlLWluZm8nO1xuICAgICAgICB9IGVsc2UgaWYgKHRocmVhZFN0YXRlID09PSAnVElNRURfV0FJVElORycpIHtcbiAgICAgICAgICAgIHJldHVybiAnYmFkZ2Utd2FybmluZyc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhyZWFkU3RhdGUgPT09ICdCTE9DS0VEJykge1xuICAgICAgICAgICAgcmV0dXJuICdiYWRnZS1kYW5nZXInO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19