@dev-tcloud/tcloud-ui 0.0.79 → 0.0.80

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,183 @@
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.mode = 'select';
29
+ this.isValid = false;
30
+ //Placeholders for the callbacks which are later providesd
31
+ //by the Control Value Accessor
32
+ this.onTouchedCallback = noop;
33
+ this.onChangeCallback = noop;
34
+ }
35
+ ngOnInit() {
36
+ this.setOptionsDateTime();
37
+ }
38
+ setOptionsDateTime() {
39
+ this.options_date_time = [
40
+ { value: '7-days', description: '7 dias' },
41
+ { value: '15-days', description: '15 dias' },
42
+ { value: '30-days', description: '30 dias' },
43
+ { value: 'current-month', description: 'Mês atual' },
44
+ { value: 'current-year', description: 'Ano atual' }
45
+ ];
46
+ setTimeout(() => {
47
+ if (this.defaultValuePeriodStartStop !== '') {
48
+ this.onChangeOptionsDateTime(this.defaultValuePeriodStartStop);
49
+ }
50
+ });
51
+ }
52
+ onChangeOptionsDateTime(event) {
53
+ this.isValid = false;
54
+ // this.description_options_date_time = '';
55
+ // this.value_options_date_time = '';
56
+ event = (event.value) ? event.value : event;
57
+ let now = new Date();
58
+ let filter_date = undefined;
59
+ if (event === '7-days') {
60
+ filter_date = new Date((new Date(now)).setDate(now.getDate() - 7));
61
+ filter_date = new Date((filter_date).setSeconds(0));
62
+ }
63
+ if (event === '15-days') {
64
+ filter_date = new Date((new Date(now)).setDate(now.getDate() - 15));
65
+ filter_date = new Date((filter_date).setSeconds(0));
66
+ }
67
+ if (event === '30-days') {
68
+ filter_date = new Date((new Date(now)).setDate(now.getDate() - 30));
69
+ filter_date = new Date((filter_date).setSeconds(0));
70
+ }
71
+ if (event === 'current-month') {
72
+ filter_date = new Date(now.getFullYear(), now.getMonth(), 1);
73
+ }
74
+ if (event === 'current-year') {
75
+ filter_date = new Date(now.getFullYear(), 0, 1);
76
+ }
77
+ if (filter_date) {
78
+ this.result = {
79
+ start: filter_date,
80
+ stop: now
81
+ };
82
+ this.onChange.emit(this.result);
83
+ this.isValid = true;
84
+ }
85
+ else {
86
+ this.result = {};
87
+ this.onChange.emit(this.result);
88
+ this.isValid = false;
89
+ }
90
+ }
91
+ onChangeStartDateTime(event) {
92
+ this.isValid = false;
93
+ if (this.result && this.result.start && this.result.stop) {
94
+ this.onChange.emit(this.result);
95
+ this.isValid = true;
96
+ }
97
+ else {
98
+ this.result = {};
99
+ this.onChange.emit(this.result);
100
+ }
101
+ }
102
+ onChangeStopDateTime(event) {
103
+ this.isValid = false;
104
+ if (this.result && this.result.start && this.result.stop) {
105
+ this.onChange.emit(this.result);
106
+ this.isValid = true;
107
+ }
108
+ else {
109
+ this.result = {};
110
+ this.onChange.emit(this.result);
111
+ }
112
+ }
113
+ toggle() {
114
+ const mode = (this.mode === 'select') ? 'datepickers' : 'select';
115
+ if (mode === 'select') {
116
+ this.isValid = false;
117
+ this.result = {};
118
+ this.onChange.emit(this.result);
119
+ }
120
+ this.mode = mode;
121
+ }
122
+ //get accessor
123
+ get value() {
124
+ return this.innerValue;
125
+ }
126
+ ;
127
+ //set accessor including call the onchange callback
128
+ set value(v) {
129
+ if (v !== this.innerValue) {
130
+ this.innerValue = v;
131
+ this.onChangeCallback(v);
132
+ }
133
+ }
134
+ //Set touched on blur
135
+ onBlur() {
136
+ this.onTouchedCallback();
137
+ }
138
+ //From ControlValueAccessor interface
139
+ writeValue(value) {
140
+ if (value !== this.innerValue) {
141
+ this.innerValue = value;
142
+ //this.toSetDefault(value);
143
+ }
144
+ }
145
+ //From ControlValueAccessor interface
146
+ registerOnChange(fn) {
147
+ this.onChangeCallback = fn;
148
+ }
149
+ //From ControlValueAccessor interface
150
+ registerOnTouched(fn) {
151
+ this.onTouchedCallback = fn;
152
+ }
153
+ validate(c) {
154
+ if (c && (typeof this.required !== 'undefined')) {
155
+ this.use_validation_required = true;
156
+ return (this.check_is_valid()) ? null : 'required';
157
+ }
158
+ return null;
159
+ }
160
+ check_is_valid() {
161
+ if (this.result && this.result.start && this.result.stop) {
162
+ return true;
163
+ }
164
+ return false;
165
+ }
166
+ }
167
+ TCloudUiRangeDateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TCloudUiRangeDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
168
+ 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" }, 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 [(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 [(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"] }] });
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TCloudUiRangeDateComponent, decorators: [{
170
+ type: Component,
171
+ 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 [(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 [(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"] }]
172
+ }], ctorParameters: function () { return []; }, propDecorators: { onChange: [{
173
+ type: Output
174
+ }], defaultValuePeriodStartStop: [{
175
+ type: Input
176
+ }], required: [{
177
+ type: Input
178
+ }], descriptionStart: [{
179
+ type: Input
180
+ }], descriptionStop: [{
181
+ type: Input
182
+ }] } });
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtZGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90Y2xvdWQtdWkvc3JjL2xpYi9fbW9kdWxlcy90Y2xvdWQtdWktZmlsdGVycy9jb21wb25lbnRzL3JhbmdlLWRhdGUvcmFuZ2UtZGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90Y2xvdWQtdWkvc3JjL2xpYi9fbW9kdWxlcy90Y2xvdWQtdWktZmlsdGVycy9jb21wb25lbnRzL3JhbmdlLWRhdGUvcmFuZ2UtZGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQWUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRS9FLE1BQU8sdUJBQXVCLEdBQVE7SUFDcEMsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztJQUN6RCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUE7QUFFRCxNQUFNLG1DQUFtQyxHQUFRO0lBQy9DLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztJQUN6RCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7QUFDbEIsQ0FBQyxDQUFDO0FBY0YsTUFBTSxPQUFPLDBCQUEwQjtJQW1CckM7UUFqQkEsV0FBTSxHQUFHLEVBQXFCLENBQUM7UUFFL0Isc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBQzVCLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUUvQixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFFaEQsZ0NBQTJCLEdBQVcsRUFBRSxDQUFDO1FBR3pDLHFCQUFnQixHQUFXLEVBQUUsQ0FBQztRQUM5QixvQkFBZSxHQUFXLEVBQUUsQ0FBQztRQUV0QyxTQUFJLEdBQVcsUUFBUSxDQUFDO1FBRXhCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUEySWhCLDBEQUEwRDtRQUMxRCwrQkFBK0I7UUFDdkIsc0JBQWlCLEdBQWUsSUFBSSxDQUFDO1FBQ3JDLHFCQUFnQixHQUFxQixJQUFJLENBQUM7SUE1SWxDLENBQUM7SUFFakIsUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHO1lBQ3ZCLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFDO1lBQ3ZDLEVBQUMsS0FBSyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFDO1lBQ3pDLEVBQUMsS0FBSyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFDO1lBQ3pDLEVBQUMsS0FBSyxFQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFDO1lBQ2pELEVBQUMsS0FBSyxFQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFDO1NBQ2pELENBQUE7UUFDRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEtBQUssRUFBRSxFQUFFO2dCQUMzQyxJQUFJLENBQUMsdUJBQXVCLENBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFFLENBQUM7YUFDbEU7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxLQUFVO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLDJDQUEyQztRQUMzQyxxQ0FBcUM7UUFDckMsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFNUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLFdBQVcsR0FBUSxTQUFTLENBQUM7UUFDakMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQ3RCLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBRSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUUsQ0FBRSxDQUFDO1lBQ3ZFLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDO1NBQ3ZEO1FBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBRSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUUsQ0FBRSxDQUFDO1lBQ3hFLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDO1NBQ3ZEO1FBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBRSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUUsQ0FBRSxDQUFDO1lBQ3hFLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDO1NBQ3ZEO1FBRUQsSUFBSSxLQUFLLEtBQUssZUFBZSxF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UEFGMUIsQ0FBQyxtQ0FBbUMsRUFBRSx1QkFBdUIsQ0FBQywwQkM1QjNFLGsvRUFxRFE7NEZEdkJLLDBCQUEwQjtrQkFOdEMsU0FBUzsrQkFDRSxZQUFZLGFBR1gsQ0FBQyxtQ0FBbUMsRUFBRSx1QkFBdUIsQ0FBQzswRUFTL0QsUUFBUTtzQkFBakIsTUFBTTtnQkFFRSwyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuY29uc3QgIENVU1RPTV9JTlBVVF9WQUxJREFUT1JTOiBhbnkgPSB7IFxuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLCBcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVENsb3VkVWlSYW5nZURhdGVDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufVxuXG5jb25zdCBDVVNUT01fSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVENsb3VkVWlSYW5nZURhdGVDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHtcbn07XG5cblxuaW50ZXJmYWNlIElSZXN1bHREYXRlVGltZXtcbiAgc3RhcnQ6IGFueTtcbiAgc3RvcDogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyYW5nZS1kYXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhbmdlLWRhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yYW5nZS1kYXRlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0NVU1RPTV9JTlBVVF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SLCBDVVNUT01fSU5QVVRfVkFMSURBVE9SU11cbn0pXG5leHBvcnQgY2xhc3MgVENsb3VkVWlSYW5nZURhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHJlc3VsdCA9IHt9IGFzIElSZXN1bHREYXRlVGltZTtcblxuICBvcHRpb25zX2RhdGVfdGltZTogYW55ID0gW107XG4gIHVzZV92YWxpZGF0aW9uX3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJUmVzdWx0RGF0ZVRpbWU+KCk7XG5cbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlUGVyaW9kU3RhcnRTdG9wOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcmVxdWlyZWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKSBkZXNjcmlwdGlvblN0YXJ0OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb25TdG9wOiBzdHJpbmcgPSAnJztcblxuICBtb2RlOiBzdHJpbmcgPSAnc2VsZWN0JztcblxuICBpc1ZhbGlkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE9wdGlvbnNEYXRlVGltZSgpO1xuICB9XG5cbiAgc2V0T3B0aW9uc0RhdGVUaW1lKCl7XG4gICAgdGhpcy5vcHRpb25zX2RhdGVfdGltZSA9IFtcbiAgICAgIHt2YWx1ZTonNy1kYXlzJywgZGVzY3JpcHRpb246ICc3IGRpYXMnfSxcbiAgICAgIHt2YWx1ZTonMTUtZGF5cycsIGRlc2NyaXB0aW9uOiAnMTUgZGlhcyd9LFxuICAgICAge3ZhbHVlOiczMC1kYXlzJywgZGVzY3JpcHRpb246ICczMCBkaWFzJ30sXG4gICAgICB7dmFsdWU6J2N1cnJlbnQtbW9udGgnLCBkZXNjcmlwdGlvbjogJ03DqnMgYXR1YWwnfSxcbiAgICAgIHt2YWx1ZTonY3VycmVudC15ZWFyJywgZGVzY3JpcHRpb246ICdBbm8gYXR1YWwnfVxuICAgIF1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmKCB0aGlzLmRlZmF1bHRWYWx1ZVBlcmlvZFN0YXJ0U3RvcCAhPT0gJycgKXtcbiAgICAgICAgdGhpcy5vbkNoYW5nZU9wdGlvbnNEYXRlVGltZSggdGhpcy5kZWZhdWx0VmFsdWVQZXJpb2RTdGFydFN0b3AgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgfVxuXG4gIG9uQ2hhbmdlT3B0aW9uc0RhdGVUaW1lKGV2ZW50OiBhbnkpe1xuICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgIC8vIHRoaXMuZGVzY3JpcHRpb25fb3B0aW9uc19kYXRlX3RpbWUgPSAnJztcbiAgICAvLyB0aGlzLnZhbHVlX29wdGlvbnNfZGF0ZV90aW1lID0gJyc7XG4gICAgZXZlbnQgPSAoZXZlbnQudmFsdWUpID8gZXZlbnQudmFsdWUgOiBldmVudDtcblxuICAgIGxldCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBmaWx0ZXJfZGF0ZTogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmKCBldmVudCA9PT0gJzctZGF5cycgKXtcbiAgICAgIGZpbHRlcl9kYXRlID0gbmV3IERhdGUoIChuZXcgRGF0ZShub3cpKS5zZXREYXRlKCBub3cuZ2V0RGF0ZSgpIC0gNyApICk7ICBcbiAgICAgIGZpbHRlcl9kYXRlID0gbmV3IERhdGUoIChmaWx0ZXJfZGF0ZSkuc2V0U2Vjb25kcygwKSApOyAgICAgIFxuICAgIH1cblxuICAgIGlmKCBldmVudCA9PT0gJzE1LWRheXMnICl7XG4gICAgICBmaWx0ZXJfZGF0ZSA9IG5ldyBEYXRlKCAobmV3IERhdGUobm93KSkuc2V0RGF0ZSggbm93LmdldERhdGUoKSAtIDE1ICkgKTtcbiAgICAgIGZpbHRlcl9kYXRlID0gbmV3IERhdGUoIChmaWx0ZXJfZGF0ZSkuc2V0U2Vjb25kcygwKSApO1xuICAgIH1cblxuICAgIGlmKCBldmVudCA9PT0gJzMwLWRheXMnICl7XG4gICAgICBmaWx0ZXJfZGF0ZSA9IG5ldyBEYXRlKCAobmV3IERhdGUobm93KSkuc2V0RGF0ZSggbm93LmdldERhdGUoKSAtIDMwICkgKTtcbiAgICAgIGZpbHRlcl9kYXRlID0gbmV3IERhdGUoIChmaWx0ZXJfZGF0ZSkuc2V0U2Vjb25kcygwKSApO1xuICAgIH1cblxuICAgIGlmKCBldmVudCA9PT0gJ2N1cnJlbnQtbW9udGgnICl7XG4gICAgICBmaWx0ZXJfZGF0ZSA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSwgMSk7XG4gICAgfVxuXG4gICAgaWYoIGV2ZW50ID09PSAnY3VycmVudC15ZWFyJyApe1xuICAgICAgZmlsdGVyX2RhdGUgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG4gICAgfVxuXG4gICAgaWYoZmlsdGVyX2RhdGUpeyAgIFxuICAgICAgXG4gICAgICB0aGlzLnJlc3VsdCA9IHtcbiAgICAgICAgc3RhcnQ6IGZpbHRlcl9kYXRlLFxuICAgICAgICBzdG9wOiBub3dcbiAgICAgIH0gYXMgSVJlc3VsdERhdGVUaW1lO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMucmVzdWx0KTtcbiAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLnJlc3VsdCA9IHt9IGFzIElSZXN1bHREYXRlVGltZTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLnJlc3VsdCk7XG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgfVxuXG4gIG9uQ2hhbmdlU3RhcnREYXRlVGltZShldmVudDogYW55KXtcbiAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICBpZiggdGhpcy5yZXN1bHQgJiYgdGhpcy5yZXN1bHQuc3RhcnQgJiYgdGhpcy5yZXN1bHQuc3RvcCApe1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMucmVzdWx0KTtcbiAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLnJlc3VsdCA9IHt9IGFzIElSZXN1bHREYXRlVGltZTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLnJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2VTdG9wRGF0ZVRpbWUoZXZlbnQ6IGFueSl7XG4gICAgdGhpcy5pc1ZhbGlkID0gZmFsc2U7XG4gICAgaWYoIHRoaXMucmVzdWx0ICYmIHRoaXMucmVzdWx0LnN0YXJ0ICYmIHRoaXMucmVzdWx0LnN0b3AgKXtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLnJlc3VsdCk7XG4gICAgICB0aGlzLmlzVmFsaWQgPSB0cnVlO1xuICAgIH1lbHNle1xuICAgICAgdGhpcy5yZXN1bHQgPSB7fSBhcyBJUmVzdWx0RGF0ZVRpbWU7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5yZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZSgpe1xuICAgIGNvbnN0IG1vZGUgPSAodGhpcy5tb2RlID09PSAnc2VsZWN0JykgPyAnZGF0ZXBpY2tlcnMnIDogJ3NlbGVjdCc7XG4gICAgaWYoIG1vZGUgPT09ICdzZWxlY3QnICl7XG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzdWx0ID0ge30gYXMgSVJlc3VsdERhdGVUaW1lO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMucmVzdWx0KTtcbiAgICB9XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICBpbm5lclZhbHVlOiBhbnkgfCB1bmRlZmluZWQ7XG4gIC8vUGxhY2Vob2xkZXJzIGZvciB0aGUgY2FsbGJhY2tzIHdoaWNoIGFyZSBsYXRlciBwcm92aWRlc2RcbiAgLy9ieSB0aGUgQ29udHJvbCBWYWx1ZSBBY2Nlc3NvclxuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcblxuICAvL2dldCBhY2Nlc3NvclxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICAgIHJldHVybiB0aGlzLmlubmVyVmFsdWU7XG4gIH07XG5cbiAgLy9zZXQgYWNjZXNzb3IgaW5jbHVkaW5nIGNhbGwgdGhlIG9uY2hhbmdlIGNhbGxiYWNrXG4gIHNldCB2YWx1ZSh2OiBhbnkpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5pbm5lclZhbHVlKSB7XG4gICAgICB0aGlzLmlubmVyVmFsdWUgPSB2OyAgICAgIFxuICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICAgIH1cbiAgfVxuXG4gIC8vU2V0IHRvdWNoZWQgb24gYmx1clxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgLy9Gcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuaW5uZXJWYWx1ZSkge1xuICAgICAgdGhpcy5pbm5lclZhbHVlID0gdmFsdWU7XG4gICAgICAvL3RoaXMudG9TZXREZWZhdWx0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvL0Zyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgLy9Gcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKGM6IEZvcm1Db250cm9sKTogYW55IHtcbiAgICBpZiggYyAmJiAoIHR5cGVvZiB0aGlzLnJlcXVpcmVkICE9PSAndW5kZWZpbmVkJyApICl7XG4gICAgICB0aGlzLnVzZV92YWxpZGF0aW9uX3JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiAodGhpcy5jaGVja19pc192YWxpZCgpKSA/IG51bGwgOiAncmVxdWlyZWQnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNoZWNrX2lzX3ZhbGlkKCk6IGJvb2xlYW57XG4gICAgaWYoIHRoaXMucmVzdWx0ICYmIHRoaXMucmVzdWx0LnN0YXJ0ICYmIHRoaXMucmVzdWx0LnN0b3AgKXtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxufVxuIiwiPHRhYmxlIGNsYXNzPVwiYXJlYS1yYW5nZS1kYXRlXCI+XG4gICAgPHRyPlxuXG4gICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtb2RlID09PSAnc2VsZWN0J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvbi1wZXJpb2RcIj5QZXLDrW9kbzwvZGl2PlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInBlcmlvZG9cIiBjbGFzcz1cImZvcm0tY29udHJvbCB0Yy1mb3JtLWNvbnRyb2xcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlT3B0aW9uc0RhdGVUaW1lKCRldmVudC50YXJnZXQpXCIgWyhuZ01vZGVsKV09XCJkZWZhdWx0VmFsdWVQZXJpb2RTdGFydFN0b3BcIiAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+PC9vcHRpb24+IFxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNfZGF0ZV90aW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCI+e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm1vZGUgPT09ICdkYXRlcGlja2VycydcIj5cblxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImFyZWEtcmFuZ2UtZGF0ZXBpY2tlcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvbi1zdGFydFwiPnt7IGRlc2NyaXB0aW9uU3RhcnQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGNsb3VkLXVpLWRhdGVwaWNrZXItdGltZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI19pbnB1dF9zdGFydCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXN1bHQuc3RhcnRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImlucHV0X3N0YXJ0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudENoYW5nZSk9XCJvbkNoYW5nZVN0YXJ0RGF0ZVRpbWUoX2lucHV0X3N0YXJ0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGNsb3VkLXVpLWRhdGVwaWNrZXItdGltZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uLXN0b3BcIj57eyBkZXNjcmlwdGlvblN0b3AgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGNsb3VkLXVpLWRhdGVwaWNrZXItdGltZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI19pbnB1dF9zdG9wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVzdWx0LnN0b3BcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImlucHV0X3N0b3BcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50Q2hhbmdlKT1cIm9uQ2hhbmdlU3RvcERhdGVUaW1lKF9pbnB1dF9zdG9wKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGNsb3VkLXVpLWRhdGVwaWNrZXItdGltZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG5cbiAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1tb2RlLXJhbmdlLWRhdGVcIiBbY2xhc3MuYWN0aXZlXT1cIm1vZGUgPT09ICdzZWxlY3QnXCIgKGNsaWNrKT1cInRvZ2dsZSgpXCIgdHlwZT1cImJ1dHRvblwiPlxuXG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJtb2RlID09PSAnc2VsZWN0J1wiIGNsYXNzPVwiZmFyIGZhLWNhbGVuZGFyLWFsdFwiIHRpdGxlPVwiQWx0ZXJhciBwYXJhIGNhbGVuZMOhcmlvXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwibW9kZSAhPT0gJ3NlbGVjdCdcIiBjbGFzcz1cImZhcyBmYS1jYWxlbmRhci13ZWVrXCIgdGl0bGU9XCJTZWxlY2lvbmFyIHBlcsOtb2RvXCI+PC9pPlxuXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwibW9kZSA9PT0gJ3NlbGVjdCdcIj5FeGliaXI8YnI+Q2FsZW5kw6FyaW88L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwibW9kZSAhPT0gJ3NlbGVjdCdcIj5FeGliaXI8YnI+UGVyw61vZG88L2Rpdj4gLS0+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cblxuICAgIDwvdHI+XG48L3RhYmxlPiJdfQ==