@dev-tcloud/tcloud-ui 0.0.79 → 0.0.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,186 @@
1
+ import { Component, Input, Output, EventEmitter, forwardRef } from '@angular/core';
2
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/forms";
6
+ import * as i3 from "../../../tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.component";
7
+ const CUSTOM_INPUT_VALIDATORS = {
8
+ provide: NG_VALIDATORS,
9
+ useExisting: forwardRef(() => TCloudUiRangeDateComponent),
10
+ multi: true
11
+ };
12
+ const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR = {
13
+ provide: NG_VALUE_ACCESSOR,
14
+ useExisting: forwardRef(() => TCloudUiRangeDateComponent),
15
+ multi: true
16
+ };
17
+ const noop = () => {
18
+ };
19
+ export class TCloudUiRangeDateComponent {
20
+ constructor() {
21
+ this.result = {};
22
+ this.options_date_time = [];
23
+ this.use_validation_required = false;
24
+ this.onChange = new EventEmitter();
25
+ this.defaultValuePeriodStartStop = '';
26
+ this.descriptionStart = '';
27
+ this.descriptionStop = '';
28
+ this.UTC = false;
29
+ this.mode = 'select';
30
+ this.isValid = false;
31
+ //Placeholders for the callbacks which are later providesd
32
+ //by the Control Value Accessor
33
+ this.onTouchedCallback = noop;
34
+ this.onChangeCallback = noop;
35
+ }
36
+ ngOnInit() {
37
+ this.setOptionsDateTime();
38
+ }
39
+ setOptionsDateTime() {
40
+ this.options_date_time = [
41
+ { value: '7-days', description: '7 dias' },
42
+ { value: '15-days', description: '15 dias' },
43
+ { value: '30-days', description: '30 dias' },
44
+ { value: 'current-month', description: 'Mês atual' },
45
+ { value: 'current-year', description: 'Ano atual' }
46
+ ];
47
+ setTimeout(() => {
48
+ if (this.defaultValuePeriodStartStop !== '') {
49
+ this.onChangeOptionsDateTime(this.defaultValuePeriodStartStop);
50
+ }
51
+ });
52
+ }
53
+ onChangeOptionsDateTime(event) {
54
+ this.isValid = false;
55
+ // this.description_options_date_time = '';
56
+ // this.value_options_date_time = '';
57
+ event = (event.value) ? event.value : event;
58
+ let now = new Date();
59
+ let filter_date = undefined;
60
+ if (event === '7-days') {
61
+ filter_date = new Date((new Date(now)).setDate(now.getDate() - 7));
62
+ filter_date = new Date((filter_date).setSeconds(0));
63
+ }
64
+ if (event === '15-days') {
65
+ filter_date = new Date((new Date(now)).setDate(now.getDate() - 15));
66
+ filter_date = new Date((filter_date).setSeconds(0));
67
+ }
68
+ if (event === '30-days') {
69
+ filter_date = new Date((new Date(now)).setDate(now.getDate() - 30));
70
+ filter_date = new Date((filter_date).setSeconds(0));
71
+ }
72
+ if (event === 'current-month') {
73
+ filter_date = new Date(now.getFullYear(), now.getMonth(), 1);
74
+ }
75
+ if (event === 'current-year') {
76
+ filter_date = new Date(now.getFullYear(), 0, 1);
77
+ }
78
+ if (filter_date) {
79
+ this.result = {
80
+ start: filter_date,
81
+ stop: now
82
+ };
83
+ this.onChange.emit(this.result);
84
+ this.isValid = true;
85
+ }
86
+ else {
87
+ this.result = {};
88
+ this.onChange.emit(this.result);
89
+ this.isValid = false;
90
+ }
91
+ }
92
+ onChangeStartDateTime(event) {
93
+ this.isValid = false;
94
+ if (this.result && this.result.start && this.result.stop) {
95
+ this.onChange.emit(this.result);
96
+ this.isValid = true;
97
+ }
98
+ else {
99
+ this.result = {};
100
+ this.onChange.emit(this.result);
101
+ }
102
+ }
103
+ onChangeStopDateTime(event) {
104
+ this.isValid = false;
105
+ if (this.result && this.result.start && this.result.stop) {
106
+ this.onChange.emit(this.result);
107
+ this.isValid = true;
108
+ }
109
+ else {
110
+ this.result = {};
111
+ this.onChange.emit(this.result);
112
+ }
113
+ }
114
+ toggle() {
115
+ const mode = (this.mode === 'select') ? 'datepickers' : 'select';
116
+ if (mode === 'select') {
117
+ this.isValid = false;
118
+ this.result = {};
119
+ this.onChange.emit(this.result);
120
+ }
121
+ this.mode = mode;
122
+ }
123
+ //get accessor
124
+ get value() {
125
+ return this.innerValue;
126
+ }
127
+ ;
128
+ //set accessor including call the onchange callback
129
+ set value(v) {
130
+ if (v !== this.innerValue) {
131
+ this.innerValue = v;
132
+ this.onChangeCallback(v);
133
+ }
134
+ }
135
+ //Set touched on blur
136
+ onBlur() {
137
+ this.onTouchedCallback();
138
+ }
139
+ //From ControlValueAccessor interface
140
+ writeValue(value) {
141
+ if (value !== this.innerValue) {
142
+ this.innerValue = value;
143
+ //this.toSetDefault(value);
144
+ }
145
+ }
146
+ //From ControlValueAccessor interface
147
+ registerOnChange(fn) {
148
+ this.onChangeCallback = fn;
149
+ }
150
+ //From ControlValueAccessor interface
151
+ registerOnTouched(fn) {
152
+ this.onTouchedCallback = fn;
153
+ }
154
+ validate(c) {
155
+ if (c && (typeof this.required !== 'undefined')) {
156
+ this.use_validation_required = true;
157
+ return (this.check_is_valid()) ? null : 'required';
158
+ }
159
+ return null;
160
+ }
161
+ check_is_valid() {
162
+ if (this.result && this.result.start && this.result.stop) {
163
+ return true;
164
+ }
165
+ return false;
166
+ }
167
+ }
168
+ TCloudUiRangeDateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TCloudUiRangeDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
169
+ TCloudUiRangeDateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TCloudUiRangeDateComponent, selector: "range-date", inputs: { defaultValuePeriodStartStop: "defaultValuePeriodStartStop", required: "required", descriptionStart: "descriptionStart", descriptionStop: "descriptionStop", UTC: "UTC" }, outputs: { onChange: "onChange" }, providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR, CUSTOM_INPUT_VALIDATORS], ngImport: i0, template: "<table class=\"area-range-date\">\n <tr>\n\n <td>\n <div *ngIf=\"mode === 'select'\">\n <div class=\"description-period\">Per\u00EDodo</div>\n <select name=\"periodo\" class=\"form-control tc-form-control\" (change)=\"onChangeOptionsDateTime($event.target)\" [(ngModel)]=\"defaultValuePeriodStartStop\" >\n <option value=\"\"></option> \n <ng-container *ngFor=\"let item of options_date_time\">\n <option [value]=\"item.value\">{{ item.description }}</option>\n </ng-container>\n </select>\n </div>\n <div *ngIf=\"mode === 'datepickers'\">\n\n <table class=\"area-range-datepickers\">\n <tr>\n <td>\n <div class=\"description-start\">{{ descriptionStart }}</div>\n <tcloud-ui-datepicker-time \n #_input_start \n [UTC]=\"UTC\"\n [(ngModel)]=\"result.start\" \n name=\"input_start\" \n (eventChange)=\"onChangeStartDateTime(_input_start)\">\n </tcloud-ui-datepicker-time>\n </td>\n <td>\n <div class=\"description-stop\">{{ descriptionStop }}</div>\n <tcloud-ui-datepicker-time \n #_input_stop\n [UTC]=\"UTC\"\n [(ngModel)]=\"result.stop\" \n name=\"input_stop\" \n (eventChange)=\"onChangeStopDateTime(_input_stop)\">\n </tcloud-ui-datepicker-time>\n </td>\n </tr>\n </table>\n\n </div>\n </td>\n\n <td>\n <button class=\"btn-mode-range-date\" [class.active]=\"mode === 'select'\" (click)=\"toggle()\" type=\"button\">\n\n <i *ngIf=\"mode === 'select'\" class=\"far fa-calendar-alt\" title=\"Alterar para calend\u00E1rio\"></i>\n <i *ngIf=\"mode !== 'select'\" class=\"fas fa-calendar-week\" title=\"Selecionar per\u00EDodo\"></i>\n\n <!-- <div *ngIf=\"mode === 'select'\">Exibir<br>Calend\u00E1rio</div> -->\n <!-- <div *ngIf=\"mode !== 'select'\">Exibir<br>Per\u00EDodo</div> -->\n </button>\n </td>\n\n </tr>\n</table>", styles: [".area-range-date{width:100%}.area-range-date tr td:first-child{width:calc(100% - 35px)}.area-range-date tr td:first-child select{color:#535353;border-radius:3px 0 0 3px!important}.area-range-date tr td:first-child .area-range-datepickers{width:100%}.area-range-date tr td:first-child .area-range-datepickers td{width:50%!important}.area-range-date tr td:last-child{width:35px}.area-range-date tr td:last-child .btn-mode-range-date{width:100%;text-align:center;border:1px solid #ccc;background-color:#fff;font-size:17px;line-height:1;cursor:pointer;color:#6c6c6c;height:40px;border-radius:0 3px 3px 0}.area-range-date tr td:last-child .btn-mode-range-date:focus{color:#403d3d}.active{background-color:#eee!important}.description-period,.description-start{position:relative;left:17px;top:-15px;line-height:0}.description-stop{position:relative;top:-15px;line-height:0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.TCloudUiDatepickerTimeComponent, selector: "tcloud-ui-datepicker-time", inputs: ["UTC", "ngModel", "useOptionsDateTime"], outputs: ["ngModelChange", "onChange", "eventChange"] }] });
170
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TCloudUiRangeDateComponent, decorators: [{
171
+ type: Component,
172
+ args: [{ selector: 'range-date', providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR, CUSTOM_INPUT_VALIDATORS], template: "<table class=\"area-range-date\">\n <tr>\n\n <td>\n <div *ngIf=\"mode === 'select'\">\n <div class=\"description-period\">Per\u00EDodo</div>\n <select name=\"periodo\" class=\"form-control tc-form-control\" (change)=\"onChangeOptionsDateTime($event.target)\" [(ngModel)]=\"defaultValuePeriodStartStop\" >\n <option value=\"\"></option> \n <ng-container *ngFor=\"let item of options_date_time\">\n <option [value]=\"item.value\">{{ item.description }}</option>\n </ng-container>\n </select>\n </div>\n <div *ngIf=\"mode === 'datepickers'\">\n\n <table class=\"area-range-datepickers\">\n <tr>\n <td>\n <div class=\"description-start\">{{ descriptionStart }}</div>\n <tcloud-ui-datepicker-time \n #_input_start \n [UTC]=\"UTC\"\n [(ngModel)]=\"result.start\" \n name=\"input_start\" \n (eventChange)=\"onChangeStartDateTime(_input_start)\">\n </tcloud-ui-datepicker-time>\n </td>\n <td>\n <div class=\"description-stop\">{{ descriptionStop }}</div>\n <tcloud-ui-datepicker-time \n #_input_stop\n [UTC]=\"UTC\"\n [(ngModel)]=\"result.stop\" \n name=\"input_stop\" \n (eventChange)=\"onChangeStopDateTime(_input_stop)\">\n </tcloud-ui-datepicker-time>\n </td>\n </tr>\n </table>\n\n </div>\n </td>\n\n <td>\n <button class=\"btn-mode-range-date\" [class.active]=\"mode === 'select'\" (click)=\"toggle()\" type=\"button\">\n\n <i *ngIf=\"mode === 'select'\" class=\"far fa-calendar-alt\" title=\"Alterar para calend\u00E1rio\"></i>\n <i *ngIf=\"mode !== 'select'\" class=\"fas fa-calendar-week\" title=\"Selecionar per\u00EDodo\"></i>\n\n <!-- <div *ngIf=\"mode === 'select'\">Exibir<br>Calend\u00E1rio</div> -->\n <!-- <div *ngIf=\"mode !== 'select'\">Exibir<br>Per\u00EDodo</div> -->\n </button>\n </td>\n\n </tr>\n</table>", styles: [".area-range-date{width:100%}.area-range-date tr td:first-child{width:calc(100% - 35px)}.area-range-date tr td:first-child select{color:#535353;border-radius:3px 0 0 3px!important}.area-range-date tr td:first-child .area-range-datepickers{width:100%}.area-range-date tr td:first-child .area-range-datepickers td{width:50%!important}.area-range-date tr td:last-child{width:35px}.area-range-date tr td:last-child .btn-mode-range-date{width:100%;text-align:center;border:1px solid #ccc;background-color:#fff;font-size:17px;line-height:1;cursor:pointer;color:#6c6c6c;height:40px;border-radius:0 3px 3px 0}.area-range-date tr td:last-child .btn-mode-range-date:focus{color:#403d3d}.active{background-color:#eee!important}.description-period,.description-start{position:relative;left:17px;top:-15px;line-height:0}.description-stop{position:relative;top:-15px;line-height:0}\n"] }]
173
+ }], ctorParameters: function () { return []; }, propDecorators: { onChange: [{
174
+ type: Output
175
+ }], defaultValuePeriodStartStop: [{
176
+ type: Input
177
+ }], required: [{
178
+ type: Input
179
+ }], descriptionStart: [{
180
+ type: Input
181
+ }], descriptionStop: [{
182
+ type: Input
183
+ }], UTC: [{
184
+ type: Input
185
+ }] } });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtZGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90Y2xvdWQtdWkvc3JjL2xpYi9fbW9kdWxlcy90Y2xvdWQtdWktZmlsdGVycy9jb21wb25lbnRzL3JhbmdlLWRhdGUvcmFuZ2UtZGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90Y2xvdWQtdWkvc3JjL2xpYi9fbW9kdWxlcy90Y2xvdWQtdWktZmlsdGVycy9jb21wb25lbnRzL3JhbmdlLWRhdGUvcmFuZ2UtZGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQWUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRS9FLE1BQU8sdUJBQXVCLEdBQVE7SUFDcEMsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztJQUN6RCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUE7QUFFRCxNQUFNLG1DQUFtQyxHQUFRO0lBQy9DLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztJQUN6RCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7QUFDbEIsQ0FBQyxDQUFDO0FBY0YsTUFBTSxPQUFPLDBCQUEwQjtJQXFCckM7UUFuQkEsV0FBTSxHQUFHLEVBQXFCLENBQUM7UUFFL0Isc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBQzVCLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUUvQixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFFaEQsZ0NBQTJCLEdBQVcsRUFBRSxDQUFDO1FBR3pDLHFCQUFnQixHQUFXLEVBQUUsQ0FBQztRQUM5QixvQkFBZSxHQUFXLEVBQUUsQ0FBQztRQUU3QixRQUFHLEdBQVksS0FBSyxDQUFDO1FBRTlCLFNBQUksR0FBVyxRQUFRLENBQUM7UUFFeEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQTJJaEIsMERBQTBEO1FBQzFELCtCQUErQjtRQUN2QixzQkFBaUIsR0FBZSxJQUFJLENBQUM7UUFDckMscUJBQWdCLEdBQXFCLElBQUksQ0FBQztJQTVJbEMsQ0FBQztJQUVqQixRQUFRO1FBQ04sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsaUJBQWlCLEdBQUc7WUFDdkIsRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUM7WUFDdkMsRUFBQyxLQUFLLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUM7WUFDekMsRUFBQyxLQUFLLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUM7WUFDekMsRUFBQyxLQUFLLEVBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUM7WUFDakQsRUFBQyxLQUFLLEVBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUM7U0FDakQsQ0FBQTtRQUNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQywyQkFBMkIsS0FBSyxFQUFFLEVBQUU7Z0JBQzNDLElBQUksQ0FBQyx1QkFBdUIsQ0FBRSxJQUFJLENBQUMsMkJBQTJCLENBQUUsQ0FBQzthQUNsRTtRQUNILENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQUVELHVCQUF1QixDQUFDLEtBQVU7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsMkNBQTJDO1FBQzNDLHFDQUFxQztRQUNyQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUU1QyxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksV0FBVyxHQUFRLFNBQVMsQ0FBQztRQUNqQyxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDdEIsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBRSxDQUFFLENBQUM7WUFDdkUsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7U0FDdkQ7UUFFRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBRSxDQUFFLENBQUM7WUFDeEUsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7U0FDdkQ7UUFFRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBRSxDQUFFLENBQUM7WUFDeEUsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7U0FDdkQ7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cE5VLDBCQUEwQjs0R0FBMUIsMEJBQTBCLDRQQUYxQixDQUFDLG1DQUFtQyxFQUFFLHVCQUF1QixDQUFDLDBCQzVCM0UsZ2xGQXVEUTs0RkR6QkssMEJBQTBCO2tCQU50QyxTQUFTOytCQUNFLFlBQVksYUFHWCxDQUFDLG1DQUFtQyxFQUFFLHVCQUF1QixDQUFDOzBFQVMvRCxRQUFRO3NCQUFqQixNQUFNO2dCQUVFLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLEdBQUc7c0JBQVgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuY29uc3QgIENVU1RPTV9JTlBVVF9WQUxJREFUT1JTOiBhbnkgPSB7IFxuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLCBcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVENsb3VkVWlSYW5nZURhdGVDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufVxuXG5jb25zdCBDVVNUT01fSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVENsb3VkVWlSYW5nZURhdGVDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHtcbn07XG5cblxuaW50ZXJmYWNlIElSZXN1bHREYXRlVGltZXtcbiAgc3RhcnQ6IGFueTtcbiAgc3RvcDogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyYW5nZS1kYXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhbmdlLWRhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yYW5nZS1kYXRlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0NVU1RPTV9JTlBVVF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SLCBDVVNUT01fSU5QVVRfVkFMSURBVE9SU11cbn0pXG5leHBvcnQgY2xhc3MgVENsb3VkVWlSYW5nZURhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHJlc3VsdCA9IHt9IGFzIElSZXN1bHREYXRlVGltZTtcblxuICBvcHRpb25zX2RhdGVfdGltZTogYW55ID0gW107XG4gIHVzZV92YWxpZGF0aW9uX3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJUmVzdWx0RGF0ZVRpbWU+KCk7XG5cbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlUGVyaW9kU3RhcnRTdG9wOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcmVxdWlyZWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKSBkZXNjcmlwdGlvblN0YXJ0OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb25TdG9wOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKSBVVEM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtb2RlOiBzdHJpbmcgPSAnc2VsZWN0JztcblxuICBpc1ZhbGlkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE9wdGlvbnNEYXRlVGltZSgpO1xuICB9XG5cbiAgc2V0T3B0aW9uc0RhdGVUaW1lKCl7XG4gICAgdGhpcy5vcHRpb25zX2RhdGVfdGltZSA9IFtcbiAgICAgIHt2YWx1ZTonNy1kYXlzJywgZGVzY3JpcHRpb246ICc3IGRpYXMnfSxcbiAgICAgIHt2YWx1ZTonMTUtZGF5cycsIGRlc2NyaXB0aW9uOiAnMTUgZGlhcyd9LFxuICAgICAge3ZhbHVlOiczMC1kYXlzJywgZGVzY3JpcHRpb246ICczMCBkaWFzJ30sXG4gICAgICB7dmFsdWU6J2N1cnJlbnQtbW9udGgnLCBkZXNjcmlwdGlvbjogJ03DqnMgYXR1YWwnfSxcbiAgICAgIHt2YWx1ZTonY3VycmVudC15ZWFyJywgZGVzY3JpcHRpb246ICdBbm8gYXR1YWwnfVxuICAgIF1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmKCB0aGlzLmRlZmF1bHRWYWx1ZVBlcmlvZFN0YXJ0U3RvcCAhPT0gJycgKXtcbiAgICAgICAgdGhpcy5vbkNoYW5nZU9wdGlvbnNEYXRlVGltZSggdGhpcy5kZWZhdWx0VmFsdWVQZXJpb2RTdGFydFN0b3AgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgfVxuXG4gIG9uQ2hhbmdlT3B0aW9uc0RhdGVUaW1lKGV2ZW50OiBhbnkpe1xuICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgIC8vIHRoaXMuZGVzY3JpcHRpb25fb3B0aW9uc19kYXRlX3RpbWUgPSAnJztcbiAgICAvLyB0aGlzLnZhbHVlX29wdGlvbnNfZGF0ZV90aW1lID0gJyc7XG4gICAgZXZlbnQgPSAoZXZlbnQudmFsdWUpID8gZXZlbnQudmFsdWUgOiBldmVudDtcblxuICAgIGxldCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBmaWx0ZXJfZGF0ZTogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmKCBldmVudCA9PT0gJzctZGF5cycgKXtcbiAgICAgIGZpbHRlcl9kYXRlID0gbmV3IERhdGUoIChuZXcgRGF0ZShub3cpKS5zZXREYXRlKCBub3cuZ2V0RGF0ZSgpIC0gNyApICk7ICBcbiAgICAgIGZpbHRlcl9kYXRlID0gbmV3IERhdGUoIChmaWx0ZXJfZGF0ZSkuc2V0U2Vjb25kcygwKSApOyAgICAgIFxuICAgIH1cblxuICAgIGlmKCBldmVudCA9PT0gJzE1LWRheXMnICl7XG4gICAgICBmaWx0ZXJfZGF0ZSA9IG5ldyBEYXRlKCAobmV3IERhdGUobm93KSkuc2V0RGF0ZSggbm93LmdldERhdGUoKSAtIDE1ICkgKTtcbiAgICAgIGZpbHRlcl9kYXRlID0gbmV3IERhdGUoIChmaWx0ZXJfZGF0ZSkuc2V0U2Vjb25kcygwKSApO1xuICAgIH1cblxuICAgIGlmKCBldmVudCA9PT0gJzMwLWRheXMnICl7XG4gICAgICBmaWx0ZXJfZGF0ZSA9IG5ldyBEYXRlKCAobmV3IERhdGUobm93KSkuc2V0RGF0ZSggbm93LmdldERhdGUoKSAtIDMwICkgKTtcbiAgICAgIGZpbHRlcl9kYXRlID0gbmV3IERhdGUoIChmaWx0ZXJfZGF0ZSkuc2V0U2Vjb25kcygwKSApO1xuICAgIH1cblxuICAgIGlmKCBldmVudCA9PT0gJ2N1cnJlbnQtbW9udGgnICl7XG4gICAgICBmaWx0ZXJfZGF0ZSA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSwgMSk7XG4gICAgfVxuXG4gICAgaWYoIGV2ZW50ID09PSAnY3VycmVudC15ZWFyJyApe1xuICAgICAgZmlsdGVyX2RhdGUgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG4gICAgfVxuXG4gICAgaWYoZmlsdGVyX2RhdGUpeyAgIFxuICAgICAgXG4gICAgICB0aGlzLnJlc3VsdCA9IHtcbiAgICAgICAgc3RhcnQ6IGZpbHRlcl9kYXRlLFxuICAgICAgICBzdG9wOiBub3dcbiAgICAgIH0gYXMgSVJlc3VsdERhdGVUaW1lO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMucmVzdWx0KTtcbiAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLnJlc3VsdCA9IHt9IGFzIElSZXN1bHREYXRlVGltZTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLnJlc3VsdCk7XG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgfVxuXG4gIG9uQ2hhbmdlU3RhcnREYXRlVGltZShldmVudDogYW55KXtcbiAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICBpZiggdGhpcy5yZXN1bHQgJiYgdGhpcy5yZXN1bHQuc3RhcnQgJiYgdGhpcy5yZXN1bHQuc3RvcCApe1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMucmVzdWx0KTtcbiAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLnJlc3VsdCA9IHt9IGFzIElSZXN1bHREYXRlVGltZTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLnJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2VTdG9wRGF0ZVRpbWUoZXZlbnQ6IGFueSl7XG4gICAgdGhpcy5pc1ZhbGlkID0gZmFsc2U7XG4gICAgaWYoIHRoaXMucmVzdWx0ICYmIHRoaXMucmVzdWx0LnN0YXJ0ICYmIHRoaXMucmVzdWx0LnN0b3AgKXtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLnJlc3VsdCk7XG4gICAgICB0aGlzLmlzVmFsaWQgPSB0cnVlO1xuICAgIH1lbHNle1xuICAgICAgdGhpcy5yZXN1bHQgPSB7fSBhcyBJUmVzdWx0RGF0ZVRpbWU7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5yZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZSgpe1xuICAgIGNvbnN0IG1vZGUgPSAodGhpcy5tb2RlID09PSAnc2VsZWN0JykgPyAnZGF0ZXBpY2tlcnMnIDogJ3NlbGVjdCc7XG4gICAgaWYoIG1vZGUgPT09ICdzZWxlY3QnICl7XG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzdWx0ID0ge30gYXMgSVJlc3VsdERhdGVUaW1lO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMucmVzdWx0KTtcbiAgICB9XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICBpbm5lclZhbHVlOiBhbnkgfCB1bmRlZmluZWQ7XG4gIC8vUGxhY2Vob2xkZXJzIGZvciB0aGUgY2FsbGJhY2tzIHdoaWNoIGFyZSBsYXRlciBwcm92aWRlc2RcbiAgLy9ieSB0aGUgQ29udHJvbCBWYWx1ZSBBY2Nlc3NvclxuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcblxuICAvL2dldCBhY2Nlc3NvclxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICAgIHJldHVybiB0aGlzLmlubmVyVmFsdWU7XG4gIH07XG5cbiAgLy9zZXQgYWNjZXNzb3IgaW5jbHVkaW5nIGNhbGwgdGhlIG9uY2hhbmdlIGNhbGxiYWNrXG4gIHNldCB2YWx1ZSh2OiBhbnkpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5pbm5lclZhbHVlKSB7XG4gICAgICB0aGlzLmlubmVyVmFsdWUgPSB2OyAgICAgIFxuICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICAgIH1cbiAgfVxuXG4gIC8vU2V0IHRvdWNoZWQgb24gYmx1clxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgLy9Gcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuaW5uZXJWYWx1ZSkge1xuICAgICAgdGhpcy5pbm5lclZhbHVlID0gdmFsdWU7XG4gICAgICAvL3RoaXMudG9TZXREZWZhdWx0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvL0Zyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgLy9Gcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKGM6IEZvcm1Db250cm9sKTogYW55IHtcbiAgICBpZiggYyAmJiAoIHR5cGVvZiB0aGlzLnJlcXVpcmVkICE9PSAndW5kZWZpbmVkJyApICl7XG4gICAgICB0aGlzLnVzZV92YWxpZGF0aW9uX3JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiAodGhpcy5jaGVja19pc192YWxpZCgpKSA/IG51bGwgOiAncmVxdWlyZWQnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNoZWNrX2lzX3ZhbGlkKCk6IGJvb2xlYW57XG4gICAgaWYoIHRoaXMucmVzdWx0ICYmIHRoaXMucmVzdWx0LnN0YXJ0ICYmIHRoaXMucmVzdWx0LnN0b3AgKXtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxufVxuIiwiPHRhYmxlIGNsYXNzPVwiYXJlYS1yYW5nZS1kYXRlXCI+XG4gICAgPHRyPlxuXG4gICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtb2RlID09PSAnc2VsZWN0J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvbi1wZXJpb2RcIj5QZXLDrW9kbzwvZGl2PlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInBlcmlvZG9cIiBjbGFzcz1cImZvcm0tY29udHJvbCB0Yy1mb3JtLWNvbnRyb2xcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlT3B0aW9uc0RhdGVUaW1lKCRldmVudC50YXJnZXQpXCIgWyhuZ01vZGVsKV09XCJkZWZhdWx0VmFsdWVQZXJpb2RTdGFydFN0b3BcIiAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+PC9vcHRpb24+IFxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNfZGF0ZV90aW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCI+e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm1vZGUgPT09ICdkYXRlcGlja2VycydcIj5cblxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImFyZWEtcmFuZ2UtZGF0ZXBpY2tlcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvbi1zdGFydFwiPnt7IGRlc2NyaXB0aW9uU3RhcnQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGNsb3VkLXVpLWRhdGVwaWNrZXItdGltZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI19pbnB1dF9zdGFydCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1VUQ109XCJVVENcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlc3VsdC5zdGFydFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiaW5wdXRfc3RhcnRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50Q2hhbmdlKT1cIm9uQ2hhbmdlU3RhcnREYXRlVGltZShfaW5wdXRfc3RhcnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Y2xvdWQtdWktZGF0ZXBpY2tlci10aW1lPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb24tc3RvcFwiPnt7IGRlc2NyaXB0aW9uU3RvcCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Y2xvdWQtdWktZGF0ZXBpY2tlci10aW1lIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX2lucHV0X3N0b3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1VUQ109XCJVVENcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlc3VsdC5zdG9wXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnB1dF9zdG9wXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudENoYW5nZSk9XCJvbkNoYW5nZVN0b3BEYXRlVGltZShfaW5wdXRfc3RvcClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RjbG91ZC11aS1kYXRlcGlja2VyLXRpbWU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuXG4gICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tbW9kZS1yYW5nZS1kYXRlXCIgW2NsYXNzLmFjdGl2ZV09XCJtb2RlID09PSAnc2VsZWN0J1wiIChjbGljayk9XCJ0b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj5cblxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwibW9kZSA9PT0gJ3NlbGVjdCdcIiBjbGFzcz1cImZhciBmYS1jYWxlbmRhci1hbHRcIiB0aXRsZT1cIkFsdGVyYXIgcGFyYSBjYWxlbmTDoXJpb1wiPjwvaT5cbiAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIm1vZGUgIT09ICdzZWxlY3QnXCIgY2xhc3M9XCJmYXMgZmEtY2FsZW5kYXItd2Vla1wiIHRpdGxlPVwiU2VsZWNpb25hciBwZXLDrW9kb1wiPjwvaT5cblxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIm1vZGUgPT09ICdzZWxlY3QnXCI+RXhpYmlyPGJyPkNhbGVuZMOhcmlvPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIm1vZGUgIT09ICdzZWxlY3QnXCI+RXhpYmlyPGJyPlBlcsOtb2RvPC9kaXY+IC0tPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG5cbiAgICA8L3RyPlxuPC90YWJsZT4iXX0=