mmhglobal-dynamicform 1.2.3 → 1.3.2
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.
- package/README.md +14 -2
- package/esm2020/lib/directives/fieldelement.directive.mjs +16 -0
- package/esm2020/lib/directives/scrollbar.theme.directive.mjs +43 -0
- package/esm2020/lib/mmhglobal-dynamicform.module.mjs +464 -0
- package/esm2020/lib/services/main.service.mjs +752 -0
- package/esm2020/lib/services/zcomponent.debug.service.mjs +621 -0
- package/esm2020/lib/services/zcomponent.service.mjs +81 -0
- package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +265 -0
- package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +67 -0
- package/esm2020/lib/uicontent/uicontent.component.mjs +41 -0
- package/esm2020/lib/uiheader/uiheader.component.mjs +66 -0
- package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +35 -0
- package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +37 -0
- package/{esm2015/lib/uipage/uipage.component.js → esm2020/lib/uipage/uipage.component.mjs} +12 -13
- package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +41 -0
- package/esm2020/lib/zbullet/zbullet.component.mjs +74 -0
- package/esm2020/lib/zbuttons/zbuttons.component.mjs +171 -0
- package/esm2020/lib/zcard/zcard.component.mjs +72 -0
- package/esm2020/lib/zchart/zchart.component.mjs +201 -0
- package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +166 -0
- package/esm2020/lib/zchip/zchip.component.mjs +121 -0
- package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +169 -0
- package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +60 -0
- package/esm2020/lib/zdaterange/zdaterange.component.mjs +70 -0
- package/esm2020/lib/zdatetime/dateParser.pipe.mjs +30 -0
- package/esm2020/lib/zdatetime/zdatetime.component.mjs +285 -0
- package/esm2020/lib/zdiv/zdiv.component.mjs +50 -0
- package/esm2020/lib/zdiv/zdiv.pipe.mjs +31 -0
- package/esm2020/lib/zform/zform.component.mjs +147 -0
- package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +49 -0
- package/esm2020/lib/zgauge/zgauge.component.mjs +148 -0
- package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +135 -0
- package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +490 -0
- package/esm2020/lib/zgrid/zgrid.component.mjs +847 -0
- package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +17 -0
- package/esm2020/lib/zimg/zimg.component.mjs +121 -0
- package/esm2020/lib/zkcard/zkcard.component.mjs +367 -0
- package/esm2020/lib/zlabel/zlabel.component.mjs +62 -0
- package/esm2020/lib/zmfb/zmfb.component.mjs +215 -0
- package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +120 -0
- package/esm2020/lib/zmodal/zmodal.component.mjs +125 -0
- package/esm2020/lib/znumeric/znumeric.component.mjs +119 -0
- package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +352 -0
- package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +204 -0
- package/esm2020/lib/zreport/zreport.component.mjs +105 -0
- package/esm2020/lib/zreport/zreport.config.mjs +117 -0
- package/esm2020/lib/zscheduler/zscheduler.component.mjs +267 -0
- package/{esm2015/lib/zscheduler/zscheduler.toolbar.component.js → esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs} +55 -19
- package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +577 -0
- package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +35 -0
- package/esm2020/lib/ztab/ztab.component.mjs +187 -0
- package/esm2020/lib/ztab/ztab.pipe.mjs +26 -0
- package/esm2020/lib/ztext/ztext.component.mjs +297 -0
- package/esm2020/lib/ztextarea/ztextarea.component.mjs +109 -0
- package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +57 -0
- package/esm2020/lib/ztree/ztree.component.mjs +380 -0
- package/esm2020/lib/ztreelist/ztreelist.component.mjs +544 -0
- package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +92 -0
- package/esm2020/lib/zudf/zudf.component.mjs +205 -0
- package/esm2020/lib/zunknown/zunknown.component.mjs +20 -0
- package/esm2020/lib/zupload/zupload.component.mjs +359 -0
- package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +216 -0
- package/esm2020/mmhglobal-dynamicform.mjs +5 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/mmhglobal-dynamicform.mjs +10790 -0
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -0
- package/fesm2020/mmhglobal-dynamicform.mjs +10779 -0
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -0
- package/lib/directives/fieldelement.directive.d.ts +3 -0
- package/lib/directives/scrollbar.theme.directive.d.ts +3 -0
- package/lib/mmhglobal-dynamicform.module.d.ts +92 -0
- package/lib/services/main.service.d.ts +3 -0
- package/lib/services/zcomponent.debug.service.d.ts +8 -5
- package/lib/services/zcomponent.service.d.ts +7 -2
- package/lib/uiactionbutton/uiactionbutton.component.d.ts +3 -0
- package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +3 -0
- package/lib/uicontent/uicontent.component.d.ts +3 -0
- package/lib/uiheader/uiheader.component.d.ts +3 -0
- package/lib/uimenubutton/uimenubutton.component.d.ts +3 -0
- package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
- package/lib/uipage/uipage.component.d.ts +3 -0
- package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +3 -0
- package/lib/zbullet/zbullet.component.d.ts +3 -0
- package/lib/zbuttons/zbuttons.component.d.ts +3 -0
- package/lib/zcard/zcard.component.d.ts +3 -0
- package/lib/zchart/zchart.component.d.ts +3 -0
- package/lib/zcheckbox/zcheckbox.component.d.ts +3 -0
- package/lib/zchip/zchip.component.d.ts +3 -0
- package/lib/zcodeeditor/zcodeeditor.component.d.ts +3 -0
- package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +3 -0
- package/lib/zdaterange/zdaterange.component.d.ts +3 -0
- package/lib/zdatetime/dateParser.pipe.d.ts +3 -0
- package/lib/zdatetime/zdatetime.component.d.ts +3 -0
- package/lib/zdiv/zdiv.component.d.ts +3 -0
- package/lib/zdiv/zdiv.pipe.d.ts +3 -0
- package/lib/zform/zform.component.d.ts +3 -0
- package/lib/zformcontrol/zformcontrol.component.d.ts +3 -0
- package/lib/zgauge/zgauge.component.d.ts +3 -0
- package/lib/zgrid/date-range-cell-filter.component.d.ts +3 -0
- package/lib/zgrid/zgrid.binding.directive.d.ts +3 -0
- package/lib/zgrid/zgrid.component.d.ts +4 -1
- package/lib/zgrid/zgrid.popup.anchor-target.directive.d.ts +3 -0
- package/lib/zimg/zimg.component.d.ts +3 -0
- package/lib/zkcard/zkcard.component.d.ts +3 -0
- package/lib/zlabel/zlabel.component.d.ts +3 -0
- package/lib/zmfb/zmfb.component.d.ts +3 -0
- package/lib/zmodal/zmodal-mobile.component.d.ts +3 -0
- package/lib/zmodal/zmodal.component.d.ts +3 -0
- package/lib/znumeric/znumeric.component.d.ts +3 -0
- package/lib/zpostselectinput/zpostselectinput.component.d.ts +3 -0
- package/lib/zquerybuilder/zquerybuilder.component.d.ts +3 -0
- package/lib/zreport/zreport.component.d.ts +3 -0
- package/lib/zreport/zreport.config.d.ts +3 -0
- package/lib/zscheduler/zscheduler.component.d.ts +3 -0
- package/lib/zscheduler/zscheduler.toolbar.component.d.ts +3 -0
- package/lib/zselectmultiple/zselectmultiple.component.d.ts +3 -0
- package/lib/zselectmultiple/zselectmultiple.directive.d.ts +3 -0
- package/lib/ztab/ztab.component.d.ts +3 -0
- package/lib/ztab/ztab.pipe.d.ts +3 -0
- package/lib/ztext/ztext.component.d.ts +3 -0
- package/lib/ztextarea/ztextarea.component.d.ts +3 -0
- package/lib/ztexteditor/ztexteditor.component.d.ts +3 -0
- package/lib/ztree/ztree.component.d.ts +3 -0
- package/lib/ztreelist/ztreelist.component.d.ts +3 -0
- package/lib/ztrendcard/ztrendcard.component.d.ts +3 -0
- package/lib/zudf/zudf.component.d.ts +3 -0
- package/lib/zunknown/zunknown.component.d.ts +3 -0
- package/lib/zupload/zupload.component.d.ts +3 -0
- package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +3 -0
- package/mmhglobal-dynamicform.d.ts +1 -2
- package/package.json +20 -11
- package/bundles/mmhglobal-dynamicform.umd.js +0 -11360
- package/bundles/mmhglobal-dynamicform.umd.js.map +0 -1
- package/bundles/mmhglobal-dynamicform.umd.min.js +0 -16
- package/bundles/mmhglobal-dynamicform.umd.min.js.map +0 -1
- package/esm2015/lib/directives/fieldelement.directive.js +0 -15
- package/esm2015/lib/directives/scrollbar.theme.directive.js +0 -42
- package/esm2015/lib/mmhglobal-dynamicform.module.js +0 -314
- package/esm2015/lib/services/main.service.js +0 -766
- package/esm2015/lib/services/zcomponent.debug.service.js +0 -626
- package/esm2015/lib/services/zcomponent.service.js +0 -167
- package/esm2015/lib/uiactionbutton/uiactionbutton.component.js +0 -271
- package/esm2015/lib/uiappmenucontent/uiappmenucontent.component.js +0 -69
- package/esm2015/lib/uicontent/uicontent.component.js +0 -41
- package/esm2015/lib/uiheader/uiheader.component.js +0 -65
- package/esm2015/lib/uimenubutton/uimenubutton.component.js +0 -40
- package/esm2015/lib/uimenucontent/uimenucontent.component.js +0 -34
- package/esm2015/lib/uivalidationmessage/uivalidationmessage.component.js +0 -39
- package/esm2015/lib/zbullet/zbullet.component.js +0 -71
- package/esm2015/lib/zbuttons/zbuttons.component.js +0 -168
- package/esm2015/lib/zcard/zcard.component.js +0 -68
- package/esm2015/lib/zchart/zchart.component.js +0 -199
- package/esm2015/lib/zcheckbox/zcheckbox.component.js +0 -158
- package/esm2015/lib/zchip/zchip.component.js +0 -117
- package/esm2015/lib/zcodeeditor/zcodeeditor.component.js +0 -163
- package/esm2015/lib/zcodeeditor/zcodeeditor.pipe.js +0 -56
- package/esm2015/lib/zdaterange/zdaterange.component.js +0 -63
- package/esm2015/lib/zdatetime/dateParser.pipe.js +0 -26
- package/esm2015/lib/zdatetime/zdatetime.component.js +0 -279
- package/esm2015/lib/zdiv/zdiv.component.js +0 -48
- package/esm2015/lib/zdiv/zdiv.pipe.js +0 -27
- package/esm2015/lib/zform/zform.component.js +0 -148
- package/esm2015/lib/zformcontrol/zformcontrol.component.js +0 -49
- package/esm2015/lib/zgauge/zgauge.component.js +0 -146
- package/esm2015/lib/zgrid/date-range-cell-filter.component.js +0 -102
- package/esm2015/lib/zgrid/zgrid.binding.directive.js +0 -493
- package/esm2015/lib/zgrid/zgrid.component.js +0 -834
- package/esm2015/lib/zgrid/zgrid.popup.anchor-target.directive.js +0 -16
- package/esm2015/lib/zimg/zimg.component.js +0 -123
- package/esm2015/lib/zkcard/zkcard.component.js +0 -372
- package/esm2015/lib/zlabel/zlabel.component.js +0 -59
- package/esm2015/lib/zmfb/zmfb.component.js +0 -215
- package/esm2015/lib/zmodal/zmodal-mobile.component.js +0 -119
- package/esm2015/lib/zmodal/zmodal.component.js +0 -130
- package/esm2015/lib/znumeric/znumeric.component.js +0 -114
- package/esm2015/lib/zpostselectinput/zpostselectinput.component.js +0 -345
- package/esm2015/lib/zquerybuilder/zquerybuilder.component.js +0 -196
- package/esm2015/lib/zreport/zreport.component.js +0 -104
- package/esm2015/lib/zreport/zreport.config.js +0 -115
- package/esm2015/lib/zscheduler/zscheduler.component.js +0 -268
- package/esm2015/lib/zselectmultiple/zselectmultiple.component.js +0 -565
- package/esm2015/lib/zselectmultiple/zselectmultiple.directive.js +0 -28
- package/esm2015/lib/ztab/ztab.component.js +0 -180
- package/esm2015/lib/ztab/ztab.pipe.js +0 -22
- package/esm2015/lib/ztext/ztext.component.js +0 -286
- package/esm2015/lib/ztextarea/ztextarea.component.js +0 -104
- package/esm2015/lib/ztexteditor/ztexteditor.component.js +0 -52
- package/esm2015/lib/ztree/ztree.component.js +0 -374
- package/esm2015/lib/ztreelist/ztreelist.component.js +0 -539
- package/esm2015/lib/ztrendcard/ztrendcard.component.js +0 -89
- package/esm2015/lib/zudf/zudf.component.js +0 -206
- package/esm2015/lib/zunknown/zunknown.component.js +0 -20
- package/esm2015/lib/zupload/zupload.component.js +0 -358
- package/esm2015/lib/zworkflowbuttons/zworkflowbuttons.component.js +0 -215
- package/esm2015/mmhglobal-dynamicform.js +0 -7
- package/fesm2015/mmhglobal-dynamicform.js +0 -10729
- package/fesm2015/mmhglobal-dynamicform.js.map +0 -1
- package/mmhglobal-dynamicform.metadata.json +0 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/********** Angular **********/
|
|
2
|
+
import { Pipe } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/********** Ionic **********/
|
|
5
|
+
/********** Plugin **********/
|
|
6
|
+
/********** Component & Service **********/
|
|
7
|
+
export class EditorFilter {
|
|
8
|
+
transform(source) {
|
|
9
|
+
if (!source) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (typeof source === "string") {
|
|
13
|
+
try {
|
|
14
|
+
const jsonValue = JSON.parse(source);
|
|
15
|
+
return JSON.stringify(jsonValue, null, 2);
|
|
16
|
+
// return this.safeStringify(jsonValue);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return source;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (typeof source === "object" || Array.isArray(source)) {
|
|
23
|
+
try {
|
|
24
|
+
return JSON.stringify(source, null, 2);
|
|
25
|
+
// return this.safeStringify(source);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return "problem - [Circular structure to JSON]";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
safeStringify(jsonValue) {
|
|
33
|
+
// Note: cache should not be re-used by repeated calls to JSON.stringify.
|
|
34
|
+
const cache = [];
|
|
35
|
+
return JSON.stringify(jsonValue, (key, value) => {
|
|
36
|
+
if (typeof value === 'object' && value !== null) {
|
|
37
|
+
// Duplicate reference found, discard key
|
|
38
|
+
if (cache.includes(value)) {
|
|
39
|
+
// debugger;
|
|
40
|
+
// return "problem - [Circular structure to JSON]";
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Store value in our collection
|
|
44
|
+
cache.push(value);
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}, 2);
|
|
48
|
+
// cache = null; // Enable garbage collection
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
EditorFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: EditorFilter, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
52
|
+
EditorFilter.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: EditorFilter, name: "editorfilter", pure: false });
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: EditorFilter, decorators: [{
|
|
54
|
+
type: Pipe,
|
|
55
|
+
args: [{
|
|
56
|
+
name: 'editorfilter',
|
|
57
|
+
pure: false
|
|
58
|
+
}]
|
|
59
|
+
}] });
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemNvZGVlZGl0b3IucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pjb2RlZWRpdG9yL3pjb2RlZWRpdG9yLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUVwRCw2QkFBNkI7QUFFN0IsOEJBQThCO0FBRTlCLDJDQUEyQztBQU8zQyxNQUFNLE9BQU8sWUFBWTtJQUNyQixTQUFTLENBQUMsTUFBVztRQUNqQixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTztTQUNWO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDNUIsSUFBSTtnQkFDQSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUMsd0NBQXdDO2FBQzNDO1lBQUMsTUFBTTtnQkFDSixPQUFPLE1BQU0sQ0FBQzthQUNqQjtTQUNKO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyRCxJQUFJO2dCQUNBLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxxQ0FBcUM7YUFDeEM7WUFBQyxNQUFNO2dCQUNKLE9BQU8sd0NBQXdDLENBQUM7YUFDbkQ7U0FDSjtJQUVMLENBQUM7SUFFTyxhQUFhLENBQUMsU0FBYztRQUNoQyx5RUFBeUU7UUFDekUsTUFBTSxLQUFLLEdBQWUsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtnQkFDN0MseUNBQXlDO2dCQUN6QyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3ZCLFlBQVk7b0JBQ1osbURBQW1EO29CQUNuRCxPQUFPO2lCQUNWO2dCQUNELGdDQUFnQztnQkFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNOLDZDQUE2QztJQUNqRCxDQUFDOzt5R0ExQ1EsWUFBWTt1R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBSnhCLElBQUk7bUJBQUM7b0JBQ0YsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLElBQUksRUFBRSxLQUFLO2lCQUNkIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcblxyXG5cclxuQFBpcGUoe1xyXG4gICAgbmFtZTogJ2VkaXRvcmZpbHRlcicsXHJcbiAgICBwdXJlOiBmYWxzZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRWRpdG9yRmlsdGVyIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgICB0cmFuc2Zvcm0oc291cmNlOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGlmICghc291cmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25WYWx1ZSA9IEpTT04ucGFyc2Uoc291cmNlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShqc29uVmFsdWUsIG51bGwsIDIpO1xyXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoaXMuc2FmZVN0cmluZ2lmeShqc29uVmFsdWUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc291cmNlLCBudWxsLCAyKTtcclxuICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLnNhZmVTdHJpbmdpZnkoc291cmNlKTtcclxuICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwcm9ibGVtIC0gW0NpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OXVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhZmVTdHJpbmdpZnkoanNvblZhbHVlOiBhbnkpIHtcclxuICAgICAgICAvLyBOb3RlOiBjYWNoZSBzaG91bGQgbm90IGJlIHJlLXVzZWQgYnkgcmVwZWF0ZWQgY2FsbHMgdG8gSlNPTi5zdHJpbmdpZnkuXHJcbiAgICAgICAgY29uc3QgY2FjaGU6IEFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvblZhbHVlLCAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlIHJlZmVyZW5jZSBmb3VuZCwgZGlzY2FyZCBrZXlcclxuICAgICAgICAgICAgICAgIGlmIChjYWNoZS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gXCJwcm9ibGVtIC0gW0NpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OXVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIFN0b3JlIHZhbHVlIGluIG91ciBjb2xsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICBjYWNoZS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSwgMik7XHJcbiAgICAgICAgLy8gY2FjaGUgPSBudWxsOyAvLyBFbmFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uXHJcbiAgICB9XHJcbn0iXX0=
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/********** Angular **********/
|
|
2
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
3
|
+
import { Validators } from '@angular/forms';
|
|
4
|
+
/********** Component & Service **********/
|
|
5
|
+
import { ZComponentProperties, ZComponentHelper } from 'mmhglobal-zcore';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@ionic/angular";
|
|
8
|
+
import * as i2 from "@progress/kendo-angular-dateinputs";
|
|
9
|
+
import * as i3 from "../uivalidationmessage/uivalidationmessage.component";
|
|
10
|
+
import * as i4 from "@angular/common";
|
|
11
|
+
import * as i5 from "@angular/forms";
|
|
12
|
+
export class ZdaterangeComponent {
|
|
13
|
+
constructor() {
|
|
14
|
+
// @ViewChild('endDateInput', { static: true }) public endInput: ElementRef;
|
|
15
|
+
this.range = { start: null, end: null };
|
|
16
|
+
this.componentProperties = new ZComponentProperties();
|
|
17
|
+
this.setEnable = (status) => {
|
|
18
|
+
this.componentProperties.isReadOnly = !status;
|
|
19
|
+
};
|
|
20
|
+
this.setVisible = (status) => {
|
|
21
|
+
this.componentProperties.isVisible = status;
|
|
22
|
+
this.data.Visible = status;
|
|
23
|
+
};
|
|
24
|
+
this.setRequire = (status) => {
|
|
25
|
+
this.componentProperties.isRequired = status;
|
|
26
|
+
ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
ngOnInit() {
|
|
30
|
+
ZComponentHelper.setComponentProperties(this);
|
|
31
|
+
ZComponentHelper.registerComponent(this);
|
|
32
|
+
const rangeDateArray = this.data.Value.split(',');
|
|
33
|
+
const fromDateString = rangeDateArray[0].trim();
|
|
34
|
+
const toDateString = rangeDateArray[1].trim();
|
|
35
|
+
const fromDate = ZComponentHelper.getGroupEvalValue.call(this, fromDateString);
|
|
36
|
+
const toDate = ZComponentHelper.getGroupEvalValue.call(this, toDateString);
|
|
37
|
+
// this.range = {
|
|
38
|
+
// start: fromDate,
|
|
39
|
+
// end: toDate
|
|
40
|
+
// }
|
|
41
|
+
const options = ZComponentHelper.getGroupEvalValue.call(this, this.data.Options);
|
|
42
|
+
if (options) {
|
|
43
|
+
if (options.min && options.max) {
|
|
44
|
+
this.setNewRange(new Date(options.min), new Date(options.max));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
setNewRange(min, max) {
|
|
49
|
+
this.zdaterange.setRange({
|
|
50
|
+
start: min,
|
|
51
|
+
end: max
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
ZdaterangeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZdaterangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
56
|
+
ZdaterangeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.4", type: ZdaterangeComponent, selector: "app-zdaterange", inputs: { data: "data", group: "group", form: "form" }, viewQueries: [{ propertyName: "zdaterange", first: true, predicate: ["zdaterange"], descendants: true }], ngImport: i0, template: "<ion-item [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}} <ion-text *ngIf=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"ion-row\" style=\"justify-content: space-between; width: 100%\">\r\n <span style=\"flex: 1;\">\r\n <kendo-daterange #zdaterange class=\"ion-row\">\r\n <!-- <label style=\"flex: 1;\"> -->\r\n <!-- <span class=\"label\">Start</span> -->\r\n <kendo-dateinput style=\"flex: 1;\" kendoDateRangeStartInput [(value)]=\"range.start\" \r\n [attr.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"></kendo-dateinput>\r\n <!-- </label> -->\r\n <!-- <label style=\"flex: 1;\"> -->\r\n <!-- <span class=\"label\">End</span> -->\r\n <!-- <kendo-dateinput style=\"flex: 1;\" kendoDateRangeEndInput [(value)]=\"range.end\"></kendo-dateinput> -->\r\n <!-- </label> -->\r\n\r\n <kendo-daterange-popup [animate]=\"false\"></kendo-daterange-popup>\r\n </kendo-daterange>\r\n </span>\r\n <app-uivalidationmessage [group]=\"group\" [data]=\"data\" [form]=\"form\"></app-uivalidationmessage>\r\n </div>\r\n</ion-item>", styles: [".item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.k-dateinput{color:var(--z-text-color)}\n"], components: [{ type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { type: i2.DateRangeComponent, selector: "kendo-daterange" }, { type: i2.DateInputComponent, selector: "kendo-dateinput", inputs: ["focusableId", "disabled", "readonly", "title", "tabindex", "role", "ariaReadOnly", "format", "placeholder", "steps", "rangeValidation", "autoCorrect", "incompleteDateValidation", "twoDigitYearMax", "spinners", "isPopupOpen", "hasPopup", "tabIndex", "value", "size", "rounded", "fillMode", "formatPlaceholder", "max", "min"], outputs: ["valueChange", "valueUpdate", "focus", "blur"], exportAs: ["kendo-dateinput"] }, { type: i2.DateRangePopupComponent, selector: "kendo-daterange-popup", inputs: ["animate", "collision", "anchor", "anchorAlign", "appendTo", "popupAlign", "margin"], outputs: ["open", "close", "blur", "focus", "cancel"], exportAs: ["kendo-daterange-popup"] }, { type: i3.UivalidationmessageComponent, selector: "app-uivalidationmessage", inputs: ["group", "data", "form"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DateRangeStartInputDirective, selector: "[kendoDateRangeStartInput]", inputs: ["navigateCalendarOnFocus", "autoCorrectOn"] }] });
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZdaterangeComponent, decorators: [{
|
|
58
|
+
type: Component,
|
|
59
|
+
args: [{ selector: 'app-zdaterange', template: "<ion-item [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}} <ion-text *ngIf=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"ion-row\" style=\"justify-content: space-between; width: 100%\">\r\n <span style=\"flex: 1;\">\r\n <kendo-daterange #zdaterange class=\"ion-row\">\r\n <!-- <label style=\"flex: 1;\"> -->\r\n <!-- <span class=\"label\">Start</span> -->\r\n <kendo-dateinput style=\"flex: 1;\" kendoDateRangeStartInput [(value)]=\"range.start\" \r\n [attr.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"></kendo-dateinput>\r\n <!-- </label> -->\r\n <!-- <label style=\"flex: 1;\"> -->\r\n <!-- <span class=\"label\">End</span> -->\r\n <!-- <kendo-dateinput style=\"flex: 1;\" kendoDateRangeEndInput [(value)]=\"range.end\"></kendo-dateinput> -->\r\n <!-- </label> -->\r\n\r\n <kendo-daterange-popup [animate]=\"false\"></kendo-daterange-popup>\r\n </kendo-daterange>\r\n </span>\r\n <app-uivalidationmessage [group]=\"group\" [data]=\"data\" [form]=\"form\"></app-uivalidationmessage>\r\n </div>\r\n</ion-item>", styles: [".item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.k-dateinput{color:var(--z-text-color)}\n"] }]
|
|
60
|
+
}], ctorParameters: function () { return []; }, propDecorators: { data: [{
|
|
61
|
+
type: Input
|
|
62
|
+
}], group: [{
|
|
63
|
+
type: Input
|
|
64
|
+
}], form: [{
|
|
65
|
+
type: Input
|
|
66
|
+
}], zdaterange: [{
|
|
67
|
+
type: ViewChild,
|
|
68
|
+
args: ['zdaterange']
|
|
69
|
+
}] } });
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemRhdGVyYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96ZGF0ZXJhbmdlL3pkYXRlcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemRhdGVyYW5nZS96ZGF0ZXJhbmdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT3ZELDJDQUEyQztBQUMzQyxPQUFPLEVBQ1csb0JBQW9CLEVBQ3hCLGdCQUFnQixFQUM3QixNQUFNLGlCQUFpQixDQUFDOzs7Ozs7O0FBUXpCLE1BQU0sT0FBTyxtQkFBbUI7SUFTOUI7UUFKQSw0RUFBNEU7UUFDNUUsVUFBSyxHQUE4QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQyxDQUFDO1FBQzdELHdCQUFtQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQW9DMUMsY0FBUyxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxDQUFDLENBQUE7UUFFTSxlQUFVLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDN0IsQ0FBQyxDQUFBO1FBRU0sZUFBVSxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDN0MsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkgsQ0FBQyxDQUFBO0lBOUNlLENBQUM7SUFFakIsUUFBUTtRQUNOLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTlDLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDL0UsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzRSxpQkFBaUI7UUFDakIscUJBQXFCO1FBQ3JCLGdCQUFnQjtRQUNoQixJQUFJO1FBR0osTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pGLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hFO1NBQ0Y7SUFFSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVMsRUFBRSxHQUFTO1FBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3ZCLEtBQUssRUFBRSxHQUFHO1lBQ1YsR0FBRyxFQUFFLEdBQUc7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDOztnSEF6Q1UsbUJBQW1CO29HQUFuQixtQkFBbUIsd05DckJoQyxtaURBc0JXOzJGRERFLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7MEVBS2pCLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUMwQixVQUFVO3NCQUF6QyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGF0ZVJhbmdlU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRhdGVpbnB1dHMnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBcclxuICBaRmllbGQsIFpHcm91cCwgWkNvbXBvbmVudFByb3BlcnRpZXMsXHJcbiAgWkNvbXBvbmVudCwgWkNvbXBvbmVudEhlbHBlciBcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXpkYXRlcmFuZ2UnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi96ZGF0ZXJhbmdlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi96ZGF0ZXJhbmdlLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaZGF0ZXJhbmdlQ29tcG9uZW50IGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0IHtcclxuICBASW5wdXQoKSBkYXRhOiBaRmllbGQ7XHJcbiAgQElucHV0KCkgZ3JvdXA6IFpHcm91cDtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgQFZpZXdDaGlsZCgnemRhdGVyYW5nZScpIHB1YmxpYyB6ZGF0ZXJhbmdlOiBEYXRlUmFuZ2VTZXJ2aWNlO1xyXG4gIC8vIEBWaWV3Q2hpbGQoJ2VuZERhdGVJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBlbmRJbnB1dDogRWxlbWVudFJlZjtcclxuICByYW5nZTogeyBzdGFydDogRGF0ZSwgZW5kOiBEYXRlfSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbH07XHJcbiAgY29tcG9uZW50UHJvcGVydGllcyA9IG5ldyBaQ29tcG9uZW50UHJvcGVydGllcygpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0Q29tcG9uZW50UHJvcGVydGllcyh0aGlzKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVnaXN0ZXJDb21wb25lbnQodGhpcyk7XHJcblxyXG4gICAgY29uc3QgcmFuZ2VEYXRlQXJyYXkgPSB0aGlzLmRhdGEuVmFsdWUuc3BsaXQoJywnKTtcclxuICAgIGNvbnN0IGZyb21EYXRlU3RyaW5nID0gcmFuZ2VEYXRlQXJyYXlbMF0udHJpbSgpO1xyXG4gICAgY29uc3QgdG9EYXRlU3RyaW5nID0gcmFuZ2VEYXRlQXJyYXlbMV0udHJpbSgpO1xyXG4gIFxyXG4gICAgY29uc3QgZnJvbURhdGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgZnJvbURhdGVTdHJpbmcpO1xyXG4gICAgY29uc3QgdG9EYXRlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRvRGF0ZVN0cmluZyk7XHJcbiAgICAvLyB0aGlzLnJhbmdlID0ge1xyXG4gICAgLy8gICBzdGFydDogZnJvbURhdGUsXHJcbiAgICAvLyAgIGVuZDogdG9EYXRlXHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLk9wdGlvbnMpO1xyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgaWYgKG9wdGlvbnMubWluICYmIG9wdGlvbnMubWF4KSB7XHJcbiAgICAgICAgdGhpcy5zZXROZXdSYW5nZShuZXcgRGF0ZShvcHRpb25zLm1pbiksIG5ldyBEYXRlKG9wdGlvbnMubWF4KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzZXROZXdSYW5nZShtaW46IERhdGUsIG1heDogRGF0ZSkge1xyXG4gICAgdGhpcy56ZGF0ZXJhbmdlLnNldFJhbmdlKHtcclxuICAgICAgc3RhcnQ6IG1pbixcclxuICAgICAgZW5kOiBtYXhcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEVuYWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5ID0gIXN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaXNpYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSA9IHN0YXR1cztcclxuICAgIHRoaXMuZGF0YS5WaXNpYmxlID0gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlcXVpcmUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZCA9IHN0YXR1cztcclxuICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGlvbi1pdGVtIFtmb3JtR3JvdXBdPVwiZm9ybVwiICpuZ0lmPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCI+XHJcbiAgPGlvbi1sYWJlbCBbYXR0ci5mb3JdPVwiZGF0YS5WYWx1ZVwiICpuZ0lmPVwiZGF0YS5TaG93TGFiZWwgPT09IHVuZGVmaW5lZCB8fCBkYXRhLlNob3dMYWJlbFwiIHBvc2l0aW9uPVwic3RhY2tlZFwiPlxyXG4gICAge3tkYXRhLkxhYmVsfX0gPGlvbi10ZXh0ICpuZ0lmPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWRGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQpXCIgY29sb3I9XCJkYW5nZXJcIj4qPC9pb24tdGV4dD5cclxuICA8L2lvbi1sYWJlbD5cclxuICA8ZGl2IGNsYXNzPVwiaW9uLXJvd1wiIHN0eWxlPVwianVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyB3aWR0aDogMTAwJVwiPlxyXG4gICAgPHNwYW4gc3R5bGU9XCJmbGV4OiAxO1wiPlxyXG4gICAgICA8a2VuZG8tZGF0ZXJhbmdlICN6ZGF0ZXJhbmdlIGNsYXNzPVwiaW9uLXJvd1wiPlxyXG4gICAgICAgIDwhLS0gPGxhYmVsIHN0eWxlPVwiZmxleDogMTtcIj4gLS0+XHJcbiAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImxhYmVsXCI+U3RhcnQ8L3NwYW4+IC0tPlxyXG4gICAgICAgIDxrZW5kby1kYXRlaW5wdXQgc3R5bGU9XCJmbGV4OiAxO1wiIGtlbmRvRGF0ZVJhbmdlU3RhcnRJbnB1dCBbKHZhbHVlKV09XCJyYW5nZS5zdGFydFwiIFxyXG4gICAgICAgIFthdHRyLmRpc2FibGVkXT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiPjwva2VuZG8tZGF0ZWlucHV0PlxyXG4gICAgICAgIDwhLS0gPC9sYWJlbD4gLS0+XHJcbiAgICAgICAgPCEtLSA8bGFiZWwgc3R5bGU9XCJmbGV4OiAxO1wiPiAtLT5cclxuICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5FbmQ8L3NwYW4+IC0tPlxyXG4gICAgICAgIDwhLS0gPGtlbmRvLWRhdGVpbnB1dCBzdHlsZT1cImZsZXg6IDE7XCIga2VuZG9EYXRlUmFuZ2VFbmRJbnB1dCBbKHZhbHVlKV09XCJyYW5nZS5lbmRcIj48L2tlbmRvLWRhdGVpbnB1dD4gLS0+XHJcbiAgICAgICAgPCEtLSA8L2xhYmVsPiAtLT5cclxuXHJcbiAgICAgICAgPGtlbmRvLWRhdGVyYW5nZS1wb3B1cCBbYW5pbWF0ZV09XCJmYWxzZVwiPjwva2VuZG8tZGF0ZXJhbmdlLXBvcHVwPlxyXG4gICAgICA8L2tlbmRvLWRhdGVyYW5nZT5cclxuICAgIDwvc3Bhbj5cclxuICAgIDxhcHAtdWl2YWxpZGF0aW9ubWVzc2FnZSBbZ3JvdXBdPVwiZ3JvdXBcIiBbZGF0YV09XCJkYXRhXCIgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXVpdmFsaWRhdGlvbm1lc3NhZ2U+XHJcbiAgPC9kaXY+XHJcbjwvaW9uLWl0ZW0+Il19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Pipe } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class DateParserFilter {
|
|
4
|
+
transform(items) {
|
|
5
|
+
// debugger;
|
|
6
|
+
if (!items) {
|
|
7
|
+
return items;
|
|
8
|
+
}
|
|
9
|
+
// filter items array, items which match and return true will be
|
|
10
|
+
// kept, false will be filtered out
|
|
11
|
+
try {
|
|
12
|
+
const d = new Date(items);
|
|
13
|
+
return d;
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
console.log("DateParserFilter error: ", error);
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
DateParserFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: DateParserFilter, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
22
|
+
DateParserFilter.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: DateParserFilter, name: "dateParser" });
|
|
23
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: DateParserFilter, decorators: [{
|
|
24
|
+
type: Pipe,
|
|
25
|
+
args: [{
|
|
26
|
+
name: "dateParser",
|
|
27
|
+
pure: true,
|
|
28
|
+
}]
|
|
29
|
+
}] });
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZVBhcnNlci5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemRhdGV0aW1lL2RhdGVQYXJzZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFNcEQsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixTQUFTLENBQUMsS0FBVTtRQUNsQixZQUFZO1FBQ1osSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxnRUFBZ0U7UUFDaEUsbUNBQW1DO1FBQ25DLElBQUk7WUFDRixNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDOzs2R0FmVSxnQkFBZ0I7MkdBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUo1QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxZQUFZO29CQUNsQixJQUFJLEVBQUUsSUFBSTtpQkFDWCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQFBpcGUoe1xyXG4gIG5hbWU6IFwiZGF0ZVBhcnNlclwiLFxyXG4gIHB1cmU6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlUGFyc2VyRmlsdGVyIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgdHJhbnNmb3JtKGl0ZW1zOiBhbnkpOiBhbnkge1xyXG4gICAgLy8gZGVidWdnZXI7XHJcbiAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuICAgIC8vIGZpbHRlciBpdGVtcyBhcnJheSwgaXRlbXMgd2hpY2ggbWF0Y2ggYW5kIHJldHVybiB0cnVlIHdpbGwgYmVcclxuICAgIC8vIGtlcHQsIGZhbHNlIHdpbGwgYmUgZmlsdGVyZWQgb3V0XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoaXRlbXMpO1xyXG4gICAgICByZXR1cm4gZDtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRGF0ZVBhcnNlckZpbHRlciBlcnJvcjogXCIsIGVycm9yKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/********** Angular **********/
|
|
2
|
+
import { Component, Input } from "@angular/core";
|
|
3
|
+
import { Validators } from "@angular/forms";
|
|
4
|
+
/********** Component & Service **********/
|
|
5
|
+
import { ZComponentHelper, ZComponentProperties } from "mmhglobal-zcore";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@ionic/angular";
|
|
8
|
+
import * as i2 from "@progress/kendo-angular-dateinputs";
|
|
9
|
+
import * as i3 from "../uivalidationmessage/uivalidationmessage.component";
|
|
10
|
+
import * as i4 from "@angular/common";
|
|
11
|
+
import * as i5 from "@angular/forms";
|
|
12
|
+
import * as i6 from "./dateParser.pipe";
|
|
13
|
+
export class ZdatetimeComponent {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.dateFormat = "DD-MMM-YYYY";
|
|
16
|
+
// dateValue = null;
|
|
17
|
+
this.componentProperties = new ZComponentProperties();
|
|
18
|
+
this.setEnable = (status) => {
|
|
19
|
+
const fc = this.group.form.controls[this.data.Value];
|
|
20
|
+
status ? fc.enable() : fc.disable();
|
|
21
|
+
this.componentProperties.isReadOnly = !status;
|
|
22
|
+
};
|
|
23
|
+
this.setVisible = (status) => {
|
|
24
|
+
this.componentProperties.isVisible = status;
|
|
25
|
+
this.data.Visible = status;
|
|
26
|
+
};
|
|
27
|
+
this.setRequire = (status) => {
|
|
28
|
+
this.componentProperties.isRequired = status;
|
|
29
|
+
ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
|
|
30
|
+
};
|
|
31
|
+
this.SetDateRange = (MinDate, MaxDate) => {
|
|
32
|
+
var thisComponent = this;
|
|
33
|
+
if (!isNaN(Date.parse(MinDate))) {
|
|
34
|
+
this.data.MinDate = new Date(MinDate);
|
|
35
|
+
}
|
|
36
|
+
if (!isNaN(Date.parse(MaxDate))) {
|
|
37
|
+
this.data.MaxDate = new Date(MaxDate);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
ngOnInit() {
|
|
42
|
+
ZComponentHelper.setComponentProperties(this);
|
|
43
|
+
ZComponentHelper.registerComponent(this);
|
|
44
|
+
if (this.data.Type === "ztime") {
|
|
45
|
+
this.dateFormat = "HH:mm";
|
|
46
|
+
}
|
|
47
|
+
if (this.data.Type === "zuidatetime") {
|
|
48
|
+
this.dateFormat = "DD-MMM-YYYY h:mm A";
|
|
49
|
+
}
|
|
50
|
+
if (this.data.Type === "zuitime") {
|
|
51
|
+
this.dateFormat = "HH:mm:ss";
|
|
52
|
+
}
|
|
53
|
+
if (this.data.Type === "zshortdate") {
|
|
54
|
+
this.dateFormat = "MMM-YYYY";
|
|
55
|
+
}
|
|
56
|
+
// if (this.group.zModel[this.data.Value]) {
|
|
57
|
+
// this.dateValue = new Date(this.group.zModel[this.data.Value]);
|
|
58
|
+
// }
|
|
59
|
+
}
|
|
60
|
+
toKendoDateFormat() {
|
|
61
|
+
return this.dateFormat
|
|
62
|
+
.replace("DD", "dd")
|
|
63
|
+
.replace("YYYY", "yyyy")
|
|
64
|
+
.replace("h", "H")
|
|
65
|
+
.replace("A", "a");
|
|
66
|
+
}
|
|
67
|
+
getReadOnlyValue() {
|
|
68
|
+
const readOnlyValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.ReadOnly, this.group);
|
|
69
|
+
if (typeof readOnlyValue === "function") {
|
|
70
|
+
return readOnlyValue();
|
|
71
|
+
}
|
|
72
|
+
return readOnlyValue;
|
|
73
|
+
}
|
|
74
|
+
isMobileScreen() {
|
|
75
|
+
const v = ZComponentHelper.isMobileScreen();
|
|
76
|
+
return v;
|
|
77
|
+
}
|
|
78
|
+
getDateValue() {
|
|
79
|
+
const value = this.form.controls[this.data.Value].value;
|
|
80
|
+
if (value) {
|
|
81
|
+
return new Date(value);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
GetDate(date) {
|
|
88
|
+
// convert the date to ISOString
|
|
89
|
+
const myDate = new Date(date).toISOString();
|
|
90
|
+
// assign to the zModel
|
|
91
|
+
ZComponentHelper.setModelValue(this.data.Value, myDate, this.group);
|
|
92
|
+
}
|
|
93
|
+
onChange(value) {
|
|
94
|
+
// console.log(
|
|
95
|
+
// "date change ",
|
|
96
|
+
// value.toISOString(),
|
|
97
|
+
// " date value: ",
|
|
98
|
+
// new Date(value.toISOString())
|
|
99
|
+
// );
|
|
100
|
+
// // this.group.zModel[this.data.Value] = value.toISOString();
|
|
101
|
+
// const v = value.toISOString();
|
|
102
|
+
// this.dateValue = new Date(value.toISOString());
|
|
103
|
+
if (value === null) {
|
|
104
|
+
ZComponentHelper.setModelValue(this.data.Value, value, this.group);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
ZComponentHelper.setModelValue(this.data.Value, value.toISOString(), this.group);
|
|
108
|
+
const fc = this.form.controls[this.data.Value];
|
|
109
|
+
fc.setValue(value.toISOString());
|
|
110
|
+
}
|
|
111
|
+
this.group.subject.next({
|
|
112
|
+
type: "onChange",
|
|
113
|
+
target: this.data.OnChange,
|
|
114
|
+
data: value,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
handlePreventableEvent(event, eventName, preventDefault) {
|
|
118
|
+
// keep "this" to use in binding.
|
|
119
|
+
var thisComponent = this;
|
|
120
|
+
// need a timeout for ui to display the calender popup
|
|
121
|
+
setTimeout(function () {
|
|
122
|
+
// only available when popup is shown, get the element by class
|
|
123
|
+
// for date
|
|
124
|
+
thisComponent.dateAppendEvent(thisComponent);
|
|
125
|
+
// for time
|
|
126
|
+
thisComponent.timeAppendEvent(thisComponent);
|
|
127
|
+
}, 500);
|
|
128
|
+
}
|
|
129
|
+
dateAppendEvent(thisComponent) {
|
|
130
|
+
let dateCell = $("tbody.k-calendar-tbody").find("td.k-calendar-td");
|
|
131
|
+
for (var i = 0; i < dateCell.length; i++) {
|
|
132
|
+
const node = dateCell[i];
|
|
133
|
+
if (node.title != "") {
|
|
134
|
+
// when date clicked
|
|
135
|
+
node.addEventListener("click", function () {
|
|
136
|
+
if (!isNaN(Date.parse(node.title))) {
|
|
137
|
+
const nodeDate = new Date(node.title).toISOString();
|
|
138
|
+
// assign to the zModel
|
|
139
|
+
ZComponentHelper.setModelValue(thisComponent.data.Value, nodeDate, thisComponent.group);
|
|
140
|
+
}
|
|
141
|
+
// timeout append time click event
|
|
142
|
+
setTimeout(function () {
|
|
143
|
+
thisComponent.hoursOnClick(thisComponent);
|
|
144
|
+
thisComponent.minutesOnClick(thisComponent);
|
|
145
|
+
thisComponent.ampmOnClick(thisComponent);
|
|
146
|
+
thisComponent.nowOnClick(thisComponent);
|
|
147
|
+
}, 500);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Today clicked
|
|
152
|
+
const todayDate = $("span.k-today")[0];
|
|
153
|
+
todayDate.addEventListener("click", function () {
|
|
154
|
+
const dateNow = new Date().toJSON().slice(0, 10).replace(/-/g, '/');
|
|
155
|
+
// set to Model
|
|
156
|
+
thisComponent.setDateTimeToModel(thisComponent, dateNow);
|
|
157
|
+
thisComponent.hoursOnClick(thisComponent);
|
|
158
|
+
thisComponent.minutesOnClick(thisComponent);
|
|
159
|
+
thisComponent.ampmOnClick(thisComponent);
|
|
160
|
+
thisComponent.nowOnClick(thisComponent);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
timeAppendEvent(thisComponent) {
|
|
164
|
+
var timeTab = $("button.k-button.k-time-tab")[0];
|
|
165
|
+
timeTab.addEventListener("click", function () {
|
|
166
|
+
thisComponent.hoursOnClick(thisComponent);
|
|
167
|
+
thisComponent.minutesOnClick(thisComponent);
|
|
168
|
+
thisComponent.ampmOnClick(thisComponent);
|
|
169
|
+
thisComponent.nowOnClick(thisComponent);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
nowOnClick(thisComponent) {
|
|
173
|
+
const nowTime = $("button.k-button.k-bare.k-time-now")[0];
|
|
174
|
+
if (nowTime) {
|
|
175
|
+
nowTime.addEventListener("click", function (e) {
|
|
176
|
+
// get model current value
|
|
177
|
+
let valueDateTime = thisComponent.currentDateTimeValue(thisComponent);
|
|
178
|
+
const dateTimeNow = new Date();
|
|
179
|
+
// convert current value to datetime
|
|
180
|
+
valueDateTime.setHours(dateTimeNow.getHours());
|
|
181
|
+
valueDateTime.setMinutes(dateTimeNow.getMinutes());
|
|
182
|
+
valueDateTime.setSeconds(dateTimeNow.getSeconds());
|
|
183
|
+
// set to Model
|
|
184
|
+
thisComponent.setDateTimeToModel(thisComponent, valueDateTime);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
hoursOnClick(thisComponent) {
|
|
189
|
+
const timeWrapper = $("div.k-time-list-wrapper").find("ul");
|
|
190
|
+
if (timeWrapper.length > 0) {
|
|
191
|
+
const hour = timeWrapper[0].children;
|
|
192
|
+
for (var i = 0; i < hour.length; i++) {
|
|
193
|
+
hour[i].addEventListener("click", function (e) {
|
|
194
|
+
// get clicked node value
|
|
195
|
+
const nodeValue = e.currentTarget.textContent;
|
|
196
|
+
// get model current value
|
|
197
|
+
let valueDateTime = thisComponent.currentDateTimeValue(thisComponent);
|
|
198
|
+
// set new hour
|
|
199
|
+
valueDateTime.setHours(nodeValue);
|
|
200
|
+
// set to Model
|
|
201
|
+
thisComponent.setDateTimeToModel(thisComponent, valueDateTime);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
minutesOnClick(thisComponent) {
|
|
207
|
+
const timeWrapper = $("div.k-time-list-wrapper").find("ul");
|
|
208
|
+
if (timeWrapper.length > 0) {
|
|
209
|
+
const minutes = timeWrapper[1].children;
|
|
210
|
+
for (var i = 0; i < minutes.length; i++) {
|
|
211
|
+
minutes[i].addEventListener("click", function (e) {
|
|
212
|
+
// get clicked node value
|
|
213
|
+
const nodeValue = e.currentTarget.textContent;
|
|
214
|
+
// get model current value
|
|
215
|
+
const valueDateTime = thisComponent.currentDateTimeValue(thisComponent);
|
|
216
|
+
// set new minute
|
|
217
|
+
valueDateTime.setMinutes(nodeValue);
|
|
218
|
+
// set to Model
|
|
219
|
+
thisComponent.setDateTimeToModel(thisComponent, valueDateTime);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
ampmOnClick(thisComponent) {
|
|
225
|
+
const timeWrapper = $("div.k-time-list-wrapper").find("ul");
|
|
226
|
+
if (timeWrapper.length > 0) {
|
|
227
|
+
const ampm = timeWrapper[2].children;
|
|
228
|
+
for (var i = 0; i < ampm.length; i++) {
|
|
229
|
+
ampm[i].addEventListener("click", function (e) {
|
|
230
|
+
// get clicked node value
|
|
231
|
+
const nodeValue = e.currentTarget.textContent;
|
|
232
|
+
// get model current value
|
|
233
|
+
const valueDateTime = thisComponent.currentDateTimeValue(thisComponent);
|
|
234
|
+
// set new minutes
|
|
235
|
+
var _hour = valueDateTime.getHours();
|
|
236
|
+
if (nodeValue.toLowerCase() == "am") {
|
|
237
|
+
_hour -= 12;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
_hour += 12;
|
|
241
|
+
}
|
|
242
|
+
valueDateTime.setHours(_hour);
|
|
243
|
+
// set to Model
|
|
244
|
+
thisComponent.setDateTimeToModel(thisComponent, valueDateTime);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
currentDateTimeValue(thisComponent) {
|
|
250
|
+
// get current value
|
|
251
|
+
const zModelValue = ZComponentHelper.getZModelValue(thisComponent.data.Value, thisComponent.group, thisComponent.group.zModel);
|
|
252
|
+
let valueDateTime = new Date();
|
|
253
|
+
if (zModelValue != "" && zModelValue != undefined) {
|
|
254
|
+
// convert current value to datetime
|
|
255
|
+
valueDateTime = new Date(zModelValue);
|
|
256
|
+
}
|
|
257
|
+
return valueDateTime;
|
|
258
|
+
}
|
|
259
|
+
setDateTimeToModel(thisComponent, valueDateTime) {
|
|
260
|
+
// convert the date to ISOString
|
|
261
|
+
const newDateTime = new Date(valueDateTime).toISOString();
|
|
262
|
+
// assign to the zModel
|
|
263
|
+
ZComponentHelper.setModelValue(thisComponent.data.Value, newDateTime, thisComponent.group);
|
|
264
|
+
// set timeout do add event again after node clicked. if not it only work 1 time.
|
|
265
|
+
setTimeout(function () {
|
|
266
|
+
thisComponent.hoursOnClick(thisComponent);
|
|
267
|
+
thisComponent.minutesOnClick(thisComponent);
|
|
268
|
+
thisComponent.ampmOnClick(thisComponent);
|
|
269
|
+
thisComponent.nowOnClick(thisComponent);
|
|
270
|
+
}, 500);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
ZdatetimeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZdatetimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
274
|
+
ZdatetimeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.4", type: ZdatetimeComponent, selector: "app-zdatetime", inputs: { data: "data", group: "group", form: "form" }, ngImport: i0, template: "<ion-item [ngClass]=\"data.Class\" [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}} <ion-text *ngIf=\"componentProperties.isRequired\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"ion-row\" style=\"justify-content: space-between; width: 100%\">\r\n <span style=\"flex: 1;\">\r\n <ion-datetime *ngIf=\"isMobileScreen()\"\r\n style=\"padding: 8px 0px;\"\r\n [required]=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [id]=\"data.Value\"\r\n [displayFormat]=\"dateFormat\"\r\n [pickerFormat]=\"dateFormat\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [formControlName]=\"data.Value\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\">\r\n </ion-datetime>\r\n <kendo-datepicker *ngIf=\"!isMobileScreen() && dateFormat==='MMM-YYYY'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n [min]=\"data.MinDate\"\r\n [max]=\"data.MaxDate\"\r\n [activeView]=\"'year'\"\r\n [bottomView]=\"'year'\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\">\r\n </kendo-datepicker>\r\n <kendo-datepicker *ngIf=\"!isMobileScreen() && dateFormat==='DD-MMM-YYYY'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n [min]=\"data.MinDate\"\r\n [max]=\"data.MaxDate\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\"></kendo-datepicker>\r\n <kendo-datetimepicker *ngIf=\"!isMobileScreen() && dateFormat==='DD-MMM-YYYY h:mm A'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n (open)=\"handlePreventableEvent($event, 'open', false)\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\">\r\n <ng-template kendoCalendarMonthCellTemplate let-date>\r\n <span (click)=\"GetDate(date)\">{{date.getDate()}}</span>\r\n </ng-template>\r\n </kendo-datetimepicker>\r\n <kendo-timepicker *ngIf=\"!isMobileScreen() && (dateFormat==='HH:mm:ss' || dateFormat==='HH:mm')\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\"></kendo-timepicker>\r\n </span>\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"></app-uivalidationmessage>\r\n </div>\r\n</ion-item>\r\n", styles: [".gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.k-datepicker{color:var(--z-text-color)}\n"], components: [{ type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { type: i1.IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "name", "presentation", "readonly", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "value", "yearValues"] }, { type: i2.DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "navigation", "min", "max", "incompleteDateValidation", "focusedDate", "format", "twoDigitYearMax", "placeholder", "tabindex", "title", "rangeValidation", "disabledDatesValidation", "weekNumber", "cellTemplate", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "navigationItemTemplate", "popupSettings", "value", "tabIndex", "disabledDates", "size", "rounded", "fillMode", "formatPlaceholder"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-datepicker"] }, { type: i2.DateTimePickerComponent, selector: "kendo-datetimepicker", inputs: ["twoDigitYearMax", "focusableId", "title", "disabled", "readonly", "readOnlyInput", "cancelButton", "steps", "calendarType", "animateCalendarNavigation", "weekNumber", "rangeValidation", "disabledDatesValidation", "incompleteDateValidation", "value", "format", "tabindex", "disabledDates", "popupSettings", "min", "max", "defaultTab", "size", "rounded", "fillMode", "formatPlaceholder", "placeholder", "focusedDate"], outputs: ["valueChange", "open", "close", "focus", "blur"], exportAs: ["kendo-datetimepicker"] }, { type: i2.TimePickerComponent, selector: "kendo-timepicker", inputs: ["focusableId", "disabled", "readonly", "readOnlyInput", "format", "placeholder", "incompleteDateValidation", "cancelButton", "nowButton", "tabindex", "title", "rangeValidation", "min", "max", "steps", "popupSettings", "tabIndex", "value", "size", "rounded", "fillMode", "formatPlaceholder"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-timepicker"] }, { type: i3.UivalidationmessageComponent, selector: "app-uivalidationmessage", inputs: ["group", "data", "form"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.SelectValueAccessor, selector: "ion-range, ion-select, ion-radio-group, ion-segment, ion-datetime" }, { type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.MonthCellTemplateDirective, selector: "[kendoCalendarMonthCellTemplate]" }], pipes: { "dateParser": i6.DateParserFilter } });
|
|
275
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZdatetimeComponent, decorators: [{
|
|
276
|
+
type: Component,
|
|
277
|
+
args: [{ selector: "app-zdatetime", template: "<ion-item [ngClass]=\"data.Class\" [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}} <ion-text *ngIf=\"componentProperties.isRequired\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"ion-row\" style=\"justify-content: space-between; width: 100%\">\r\n <span style=\"flex: 1;\">\r\n <ion-datetime *ngIf=\"isMobileScreen()\"\r\n style=\"padding: 8px 0px;\"\r\n [required]=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [id]=\"data.Value\"\r\n [displayFormat]=\"dateFormat\"\r\n [pickerFormat]=\"dateFormat\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [formControlName]=\"data.Value\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\">\r\n </ion-datetime>\r\n <kendo-datepicker *ngIf=\"!isMobileScreen() && dateFormat==='MMM-YYYY'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n [min]=\"data.MinDate\"\r\n [max]=\"data.MaxDate\"\r\n [activeView]=\"'year'\"\r\n [bottomView]=\"'year'\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\">\r\n </kendo-datepicker>\r\n <kendo-datepicker *ngIf=\"!isMobileScreen() && dateFormat==='DD-MMM-YYYY'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n [min]=\"data.MinDate\"\r\n [max]=\"data.MaxDate\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\"></kendo-datepicker>\r\n <kendo-datetimepicker *ngIf=\"!isMobileScreen() && dateFormat==='DD-MMM-YYYY h:mm A'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n (open)=\"handlePreventableEvent($event, 'open', false)\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\">\r\n <ng-template kendoCalendarMonthCellTemplate let-date>\r\n <span (click)=\"GetDate(date)\">{{date.getDate()}}</span>\r\n </ng-template>\r\n </kendo-datetimepicker>\r\n <kendo-timepicker *ngIf=\"!isMobileScreen() && (dateFormat==='HH:mm:ss' || dateFormat==='HH:mm')\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\"></kendo-timepicker>\r\n </span>\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"></app-uivalidationmessage>\r\n </div>\r\n</ion-item>\r\n", styles: [".gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.k-datepicker{color:var(--z-text-color)}\n"] }]
|
|
278
|
+
}], ctorParameters: function () { return []; }, propDecorators: { data: [{
|
|
279
|
+
type: Input
|
|
280
|
+
}], group: [{
|
|
281
|
+
type: Input
|
|
282
|
+
}], form: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}] } });
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemRhdGV0aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pkYXRldGltZS96ZGF0ZXRpbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemRhdGV0aW1lL3pkYXRldGltZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT3ZELDJDQUEyQztBQUMzQyxPQUFPLEVBQ08sZ0JBQWdCLEVBQ1osb0JBQW9CLEVBQ3JDLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7O0FBV3pCLE1BQU0sT0FBTyxrQkFBa0I7SUFTN0I7UUFMQSxlQUFVLEdBQUcsYUFBYSxDQUFDO1FBQzNCLG9CQUFvQjtRQUVwQix3QkFBbUIsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFtRzFDLGNBQVMsR0FBRyxDQUFDLE1BQWUsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxDQUFDLENBQUE7UUFFTSxlQUFVLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUN0QyxJQUFJ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QWEsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDOzsrR0FuVVUsa0JBQWtCO21HQUFsQixrQkFBa0IsNkdDeEIvQix3M0tBdUVBOzJGRC9DYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZUFBZTswRUFLaEIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBQcmV2ZW50YWJsZUV2ZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZGF0ZWlucHV0cyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7XHJcbiAgWkNvbXBvbmVudCwgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LFxyXG4gIFpGaWVsZCwgWkdyb3VwLCBaQ29tcG9uZW50UHJvcGVydGllc1xyXG59IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuXHJcblxyXG4vLyBpbXBvcnQgKiBhcyAkIGZyb20gJ2pxdWVyeSc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC16ZGF0ZXRpbWVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3pkYXRldGltZS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96ZGF0ZXRpbWUuY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaZGF0ZXRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGRhdGE6IFpGaWVsZDtcclxuICBASW5wdXQoKSBncm91cDogWkdyb3VwO1xyXG4gIEBJbnB1dCgpIGZvcm06IEZvcm1Hcm91cDtcclxuICBkYXRlRm9ybWF0ID0gXCJERC1NTU0tWVlZWVwiO1xyXG4gIC8vIGRhdGVWYWx1ZSA9IG51bGw7XHJcblxyXG4gIGNvbXBvbmVudFByb3BlcnRpZXMgPSBuZXcgWkNvbXBvbmVudFByb3BlcnRpZXMoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldENvbXBvbmVudFByb3BlcnRpZXModGhpcyk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMpO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuVHlwZSA9PT0gXCJ6dGltZVwiKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IFwiSEg6bW1cIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRhdGEuVHlwZSA9PT0gXCJ6dWlkYXRldGltZVwiKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IFwiREQtTU1NLVlZWVkgaDptbSBBXCI7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kYXRhLlR5cGUgPT09IFwienVpdGltZVwiKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuICAgIH1cclxuXHRpZiAodGhpcy5kYXRhLlR5cGUgPT09IFwienNob3J0ZGF0ZVwiKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IFwiTU1NLVlZWVlcIjtcclxuICAgIH1cclxuICAgIC8vIGlmICh0aGlzLmdyb3VwLnpNb2RlbFt0aGlzLmRhdGEuVmFsdWVdKSB7XHJcbiAgICAvLyAgIHRoaXMuZGF0ZVZhbHVlID0gbmV3IERhdGUodGhpcy5ncm91cC56TW9kZWxbdGhpcy5kYXRhLlZhbHVlXSk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICB0b0tlbmRvRGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGVGb3JtYXRcclxuICAgICAgLnJlcGxhY2UoXCJERFwiLCBcImRkXCIpXHJcbiAgICAgIC5yZXBsYWNlKFwiWVlZWVwiLCBcInl5eXlcIilcclxuICAgICAgLnJlcGxhY2UoXCJoXCIsIFwiSFwiKVxyXG4gICAgICAucmVwbGFjZShcIkFcIiwgXCJhXCIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVhZE9ubHlWYWx1ZSgpIHtcclxuICAgIGNvbnN0IHJlYWRPbmx5VmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwoXHJcbiAgICAgIHRoaXMsXHJcbiAgICAgIHRoaXMuZGF0YS5SZWFkT25seSxcclxuICAgICAgdGhpcy5ncm91cFxyXG4gICAgKTtcclxuICAgIGlmICh0eXBlb2YgcmVhZE9ubHlWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIHJldHVybiByZWFkT25seVZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVhZE9ubHlWYWx1ZTtcclxuICB9XHJcblxyXG4gIGlzTW9iaWxlU2NyZWVuKCkge1xyXG4gICAgY29uc3QgdiA9IFpDb21wb25lbnRIZWxwZXIuaXNNb2JpbGVTY3JlZW4oKTtcclxuICAgIHJldHVybiB2O1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZVZhbHVlKCkge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXS52YWx1ZTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0RGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICAvLyBjb252ZXJ0IHRoZSBkYXRlIHRvIElTT1N0cmluZ1xyXG4gICAgY29uc3QgbXlEYXRlID0gbmV3IERhdGUoZGF0ZSkudG9JU09TdHJpbmcoKTtcclxuICAgIC8vIGFzc2lnbiB0byB0aGUgek1vZGVsXHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUodGhpcy5kYXRhLlZhbHVlLCBteURhdGUsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlKHZhbHVlOiBEYXRlKTogdm9pZCB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcclxuICAgIC8vICAgXCJkYXRlIGNoYW5nZSBcIixcclxuICAgIC8vICAgdmFsdWUudG9JU09TdHJpbmcoKSxcclxuICAgIC8vICAgXCIgZGF0ZSB2YWx1ZTogXCIsXHJcbiAgICAvLyAgIG5ldyBEYXRlKHZhbHVlLnRvSVNPU3RyaW5nKCkpXHJcbiAgICAvLyApO1xyXG4gICAgLy8gLy8gdGhpcy5ncm91cC56TW9kZWxbdGhpcy5kYXRhLlZhbHVlXSA9IHZhbHVlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAvLyBjb25zdCB2ID0gdmFsdWUudG9JU09TdHJpbmcoKTtcclxuICAgIC8vIHRoaXMuZGF0ZVZhbHVlID0gbmV3IERhdGUodmFsdWUudG9JU09TdHJpbmcoKSk7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKFxyXG4gICAgICAgIHRoaXMuZGF0YS5WYWx1ZSxcclxuICAgICAgICB2YWx1ZSxcclxuICAgICAgICB0aGlzLmdyb3VwXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUoXHJcbiAgICAgICAgdGhpcy5kYXRhLlZhbHVlLFxyXG4gICAgICAgIHZhbHVlLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgdGhpcy5ncm91cFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgZmMgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgICAgZmMuc2V0VmFsdWUodmFsdWUudG9JU09TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgIHR5cGU6IFwib25DaGFuZ2VcIixcclxuICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuT25DaGFuZ2UsXHJcbiAgICAgIGRhdGE6IHZhbHVlLFxyXG4gICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEVuYWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIGNvbnN0IGZjID0gdGhpcy5ncm91cC5mb3JtLmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICBzdGF0dXMgPyBmYy5lbmFibGUoKSA6IGZjLmRpc2FibGUoKTtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5ID0gIXN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaXNpYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSA9IHN0YXR1cztcclxuICAgIHRoaXMuZGF0YS5WaXNpYmxlID0gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlcXVpcmUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZCA9IHN0YXR1cztcclxuICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFNldERhdGVSYW5nZSA9IChNaW5EYXRlOiBzdHJpbmcsTWF4RGF0ZTogc3RyaW5nKTogYW55ID0+XHJcbiAge1xyXG4gICAgdmFyIHRoaXNDb21wb25lbnQgPSB0aGlzO1xyXG5cclxuICAgIGlmICghaXNOYU4oRGF0ZS5wYXJzZShNaW5EYXRlKSkpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuZGF0YS5NaW5EYXRlID0gbmV3IERhdGUoTWluRGF0ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzTmFOKERhdGUucGFyc2UoTWF4RGF0ZSkpKVxyXG4gICAge1xyXG4gICAgICB0aGlzLmRhdGEuTWF4RGF0ZSA9IG5ldyBEYXRlKE1heERhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVByZXZlbnRhYmxlRXZlbnQoZXZlbnQ6IFByZXZlbnRhYmxlRXZlbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBwcmV2ZW50RGVmYXVsdDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgLy8ga2VlcCBcInRoaXNcIiB0byB1c2UgaW4gYmluZGluZy5cclxuICAgIHZhciB0aGlzQ29tcG9uZW50ID0gdGhpcztcclxuXHJcbiAgICAvLyBuZWVkIGEgdGltZW91dCBmb3IgdWkgdG8gZGlzcGxheSB0aGUgY2FsZW5kZXIgcG9wdXBcclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAvLyBvbmx5IGF2YWlsYWJsZSB3aGVuIHBvcHVwIGlzIHNob3duLCBnZXQgdGhlIGVsZW1lbnQgYnkgY2xhc3NcclxuICAgICAgLy8gZm9yIGRhdGVcclxuICAgICAgdGhpc0NvbXBvbmVudC5kYXRlQXBwZW5kRXZlbnQodGhpc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAvLyBmb3IgdGltZVxyXG4gICAgICB0aGlzQ29tcG9uZW50LnRpbWVBcHBlbmRFdmVudCh0aGlzQ29tcG9uZW50KTtcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRhdGVBcHBlbmRFdmVudCh0aGlzQ29tcG9uZW50OiBhbnkpIHtcclxuICAgIGxldCBkYXRlQ2VsbCA9ICQoXCJ0Ym9keS5rLWNhbGVuZGFyLXRib2R5XCIpLmZpbmQoXCJ0ZC5rLWNhbGVuZGFyLXRkXCIpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRlQ2VsbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBub2RlID0gZGF0ZUNlbGxbaV07XHJcblxyXG4gICAgICBpZiAobm9kZS50aXRsZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgLy8gd2hlbiBkYXRlIGNsaWNrZWRcclxuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBpZiAoIWlzTmFOKERhdGUucGFyc2Uobm9kZS50aXRsZSkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRlID0gbmV3IERhdGUobm9kZS50aXRsZSkudG9JU09TdHJpbmcoKTtcclxuICAgICAgICAgICAgLy8gYXNzaWduIHRvIHRoZSB6TW9kZWxcclxuICAgICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKHRoaXNDb21wb25lbnQuZGF0YS5WYWx1ZSwgbm9kZURhdGUsIHRoaXNDb21wb25lbnQuZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRpbWVvdXQgYXBwZW5kIHRpbWUgY2xpY2sgZXZlbnRcclxuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzQ29tcG9uZW50LmhvdXJzT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgdGhpc0NvbXBvbmVudC5taW51dGVzT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgdGhpc0NvbXBvbmVudC5hbXBtT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgdGhpc0NvbXBvbmVudC5ub3dPbkNsaWNrKHRoaXNDb21wb25lbnQpO1xyXG4gICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRvZGF5IGNsaWNrZWRcclxuICAgIGNvbnN0IHRvZGF5RGF0ZSA9ICQoXCJzcGFuLmstdG9kYXlcIilbMF07XHJcbiAgICB0b2RheURhdGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgY29uc3QgZGF0ZU5vdyA9IG5ldyBEYXRlKCkudG9KU09OKCkuc2xpY2UoMCwgMTApLnJlcGxhY2UoLy0vZywgJy8nKTtcclxuICAgICAgLy8gc2V0IHRvIE1vZGVsXHJcbiAgICAgIHRoaXNDb21wb25lbnQuc2V0RGF0ZVRpbWVUb01vZGVsKHRoaXNDb21wb25lbnQsIGRhdGVOb3cpO1xyXG5cclxuICAgICAgdGhpc0NvbXBvbmVudC5ob3Vyc09uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQubWludXRlc09uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQuYW1wbU9uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQubm93T25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0aW1lQXBwZW5kRXZlbnQodGhpc0NvbXBvbmVudDogYW55KSB7XHJcbiAgICB2YXIgdGltZVRhYiA9ICQoXCJidXR0b24uay1idXR0b24uay10aW1lLXRhYlwiKVswXTtcclxuICAgIHRpbWVUYWIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhpc0NvbXBvbmVudC5ob3Vyc09uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQubWludXRlc09uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQuYW1wbU9uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQubm93T25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3dPbkNsaWNrKHRoaXNDb21wb25lbnQ6IGFueSkge1xyXG4gICAgY29uc3Qgbm93VGltZSA9ICQoXCJidXR0b24uay1idXR0b24uay1iYXJlLmstdGltZS1ub3dcIilbMF07XHJcbiAgICBpZiAobm93VGltZSkge1xyXG4gICAgICBub3dUaW1lLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vIGdldCBtb2RlbCBjdXJyZW50IHZhbHVlXHJcbiAgICAgICAgbGV0IHZhbHVlRGF0ZVRpbWUgPSB0aGlzQ29tcG9uZW50LmN1cnJlbnREYXRlVGltZVZhbHVlKHRoaXNDb21wb25lbnQpO1xyXG4gICAgICAgIGNvbnN0IGRhdGVUaW1lTm93ID0gbmV3IERhdGUoKTtcclxuXHJcbiAgICAgICAgLy8gY29udmVydCBjdXJyZW50IHZhbHVlIHRvIGRhdGV0aW1lXHJcbiAgICAgICAgdmFsdWVEYXRlVGltZS5zZXRIb3VycyhkYXRlVGltZU5vdy5nZXRIb3VycygpKTtcclxuICAgICAgICB2YWx1ZURhdGVUaW1lLnNldE1pbnV0ZXMoZGF0ZVRpbWVOb3cuZ2V0TWludXRlcygpKTtcclxuICAgICAgICB2YWx1ZURhdGVUaW1lLnNldFNlY29uZHMoZGF0ZVRpbWVOb3cuZ2V0U2Vjb25kcygpKTtcclxuXHJcbiAgICAgICAgLy8gc2V0IHRvIE1vZGVsXHJcbiAgICAgICAgdGhpc0NvbXBvbmVudC5zZXREYXRlVGltZVRvTW9kZWwodGhpc0NvbXBvbmVudCwgdmFsdWVEYXRlVGltZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBob3Vyc09uQ2xpY2sodGhpc0NvbXBvbmVudDogYW55KSB7XHJcbiAgICBjb25zdCB0aW1lV3JhcHBlciA9ICQoXCJkaXYuay10aW1lLWxpc3Qtd3JhcHBlclwiKS5maW5kKFwidWxcIik7XHJcbiAgICBpZiAodGltZVdyYXBwZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBob3VyID0gdGltZVdyYXBwZXJbMF0uY2hpbGRyZW47XHJcblxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvdXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBob3VyW2ldLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgLy8gZ2V0IGNsaWNrZWQgbm9kZSB2YWx1ZVxyXG4gICAgICAgICAgY29uc3Qgbm9kZVZhbHVlID0gZS5jdXJyZW50VGFyZ2V0LnRleHRDb250ZW50O1xyXG5cclxuICAgICAgICAgIC8vIGdldCBtb2RlbCBjdXJyZW50IHZhbHVlXHJcbiAgICAgICAgICBsZXQgdmFsdWVEYXRlVGltZSA9IHRoaXNDb21wb25lbnQuY3VycmVudERhdGVUaW1lVmFsdWUodGhpc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IG5ldyBob3VyXHJcbiAgICAgICAgICB2YWx1ZURhdGVUaW1lLnNldEhvdXJzKG5vZGVWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IHRvIE1vZGVsXHJcbiAgICAgICAgICB0aGlzQ29tcG9uZW50LnNldERhdGVUaW1lVG9Nb2RlbCh0aGlzQ29tcG9uZW50LCB2YWx1ZURhdGVUaW1lKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtaW51dGVzT25DbGljayh0aGlzQ29tcG9uZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHRpbWVXcmFwcGVyID0gJChcImRpdi5rLXRpbWUtbGlzdC13cmFwcGVyXCIpLmZpbmQoXCJ1bFwiKTtcclxuICAgIGlmICh0aW1lV3JhcHBlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IG1pbnV0ZXMgPSB0aW1lV3JhcHBlclsxXS5jaGlsZHJlbjtcclxuXHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWludXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG1pbnV0ZXNbaV0uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAvLyBnZXQgY2xpY2tlZCBub2RlIHZhbHVlXHJcbiAgICAgICAgICBjb25zdCBub2RlVmFsdWUgPSBlLmN1cnJlbnRUYXJnZXQudGV4dENvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgLy8gZ2V0IG1vZGVsIGN1cnJlbnQgdmFsdWVcclxuICAgICAgICAgIGNvbnN0IHZhbHVlRGF0ZVRpbWUgPSB0aGlzQ29tcG9uZW50LmN1cnJlbnREYXRlVGltZVZhbHVlKHRoaXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICAgIC8vIHNldCBuZXcgbWludXRlXHJcbiAgICAgICAgICB2YWx1ZURhdGVUaW1lLnNldE1pbnV0ZXMobm9kZVZhbHVlKTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgdG8gTW9kZWxcclxuICAgICAgICAgIHRoaXNDb21wb25lbnQuc2V0RGF0ZVRpbWVUb01vZGVsKHRoaXNDb21wb25lbnQsIHZhbHVlRGF0ZVRpbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFtcG1PbkNsaWNrKHRoaXNDb21wb25lbnQ6IGFueSkge1xyXG4gICAgY29uc3QgdGltZVdyYXBwZXIgPSAkKFwiZGl2LmstdGltZS1saXN0LXdyYXBwZXJcIikuZmluZChcInVsXCIpO1xyXG4gICAgaWYgKHRpbWVXcmFwcGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgYW1wbSA9IHRpbWVXcmFwcGVyWzJdLmNoaWxkcmVuO1xyXG5cclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbXBtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgYW1wbVtpXS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgIC8vIGdldCBjbGlja2VkIG5vZGUgdmFsdWVcclxuICAgICAgICAgIGNvbnN0IG5vZGVWYWx1ZSA9IGUuY3VycmVudFRhcmdldC50ZXh0Q29udGVudDtcclxuXHJcbiAgICAgICAgICAvLyBnZXQgbW9kZWwgY3VycmVudCB2YWx1ZVxyXG4gICAgICAgICAgY29uc3QgdmFsdWVEYXRlVGltZSA9IHRoaXNDb21wb25lbnQuY3VycmVudERhdGVUaW1lVmFsdWUodGhpc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IG5ldyBtaW51dGVzXHJcbiAgICAgICAgICB2YXIgX2hvdXIgPSB2YWx1ZURhdGVUaW1lLmdldEhvdXJzKCk7XHJcbiAgICAgICAgICBpZiAobm9kZVZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gXCJhbVwiKSB7XHJcbiAgICAgICAgICAgIF9ob3VyIC09IDEyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIF9ob3VyICs9IDEyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFsdWVEYXRlVGltZS5zZXRIb3VycyhfaG91cik7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IHRvIE1vZGVsXHJcbiAgICAgICAgICB0aGlzQ29tcG9uZW50LnNldERhdGVUaW1lVG9Nb2RlbCh0aGlzQ29tcG9uZW50LCB2YWx1ZURhdGVUaW1lKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RGF0ZVRpbWVWYWx1ZSh0aGlzQ29tcG9uZW50OiBhbnkpIHtcclxuICAgIC8vIGdldCBjdXJyZW50IHZhbHVlXHJcbiAgICBjb25zdCB6TW9kZWxWYWx1ZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Wk1vZGVsVmFsdWUodGhpc0NvbXBvbmVudC5kYXRhLlZhbHVlLCB0aGlzQ29tcG9uZW50Lmdyb3VwLCB0aGlzQ29tcG9uZW50Lmdyb3VwLnpNb2RlbCk7XHJcblxyXG4gICAgbGV0IHZhbHVlRGF0ZVRpbWUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGlmICh6TW9kZWxWYWx1ZSAhPSBcIlwiICYmIHpNb2RlbFZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBjb252ZXJ0IGN1cnJlbnQgdmFsdWUgdG8gZGF0ZXRpbWVcclxuICAgICAgdmFsdWVEYXRlVGltZSA9IG5ldyBEYXRlKHpNb2RlbFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsdWVEYXRlVGltZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXREYXRlVGltZVRvTW9kZWwodGhpc0NvbXBvbmVudDogYW55LCB2YWx1ZURhdGVUaW1lOiBhbnkpIHtcclxuICAgIC8vIGNvbnZlcnQgdGhlIGRhdGUgdG8gSVNPU3RyaW5nXHJcbiAgICBjb25zdCBuZXdEYXRlVGltZSA9IG5ldyBEYXRlKHZhbHVlRGF0ZVRpbWUpLnRvSVNPU3RyaW5nKCk7XHJcblxyXG4gICAgLy8gYXNzaWduIHRvIHRoZSB6TW9kZWxcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh0aGlzQ29tcG9uZW50LmRhdGEuVmFsdWUsIG5ld0RhdGVUaW1lLCB0aGlzQ29tcG9uZW50Lmdyb3VwKTtcclxuXHJcbiAgICAvLyBzZXQgdGltZW91dCBkbyBhZGQgZXZlbnQgYWdhaW4gYWZ0ZXIgbm9kZSBjbGlja2VkLiBpZiBub3QgaXQgb25seSB3b3JrIDEgdGltZS5cclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzQ29tcG9uZW50LmhvdXJzT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgdGhpc0NvbXBvbmVudC5taW51dGVzT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgdGhpc0NvbXBvbmVudC5hbXBtT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgdGhpc0NvbXBvbmVudC5ub3dPbkNsaWNrKHRoaXNDb21wb25lbnQpO1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcbn1cclxuIiwiPGlvbi1pdGVtIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIiBbZm9ybUdyb3VwXT1cImZvcm1cIiAqbmdJZj1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiPlxyXG4gIDxpb24tbGFiZWwgW2F0dHIuZm9yXT1cImRhdGEuVmFsdWVcIiAqbmdJZj1cImRhdGEuU2hvd0xhYmVsID09PSB1bmRlZmluZWQgfHwgZGF0YS5TaG93TGFiZWxcIiBwb3NpdGlvbj1cInN0YWNrZWRcIj5cclxuICAgIHt7ZGF0YS5MYWJlbH19IDxpb24tdGV4dCAqbmdJZj1cImNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZFwiIGNvbG9yPVwiZGFuZ2VyXCI+KjwvaW9uLXRleHQ+XHJcbiAgPC9pb24tbGFiZWw+XHJcbiAgPGRpdiBjbGFzcz1cImlvbi1yb3dcIiBzdHlsZT1cImp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjsgd2lkdGg6IDEwMCVcIj5cclxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj5cclxuICAgICAgPGlvbi1kYXRldGltZSAqbmdJZj1cImlzTW9iaWxlU2NyZWVuKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDBweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWRGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZEZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BpY2tlckZvcm1hdF09XCJkYXRlRm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIj5cclxuICAgICAgPC9pb24tZGF0ZXRpbWU+XHJcbiAgICAgIDxrZW5kby1kYXRlcGlja2VyICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgZGF0ZUZvcm1hdD09PSdNTU0tWVlZWSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChkYXRhLlZhbHVlKS52YWx1ZSB8IGRhdGVQYXJzZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwiZGF0YS5NaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJkYXRhLk1heERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aXZlVmlld109XCIneWVhcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYm90dG9tVmlld109XCIneWVhcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDdweDsgd2lkdGg6IDEwMCU7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybWF0XT1cInRvS2VuZG9EYXRlRm9ybWF0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiPlxyXG4gICAgICA8L2tlbmRvLWRhdGVwaWNrZXI+XHJcbiAgICAgIDxrZW5kby1kYXRlcGlja2VyICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgZGF0ZUZvcm1hdD09PSdERC1NTU0tWVlZWSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChkYXRhLlZhbHVlKS52YWx1ZSB8IGRhdGVQYXJzZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwiZGF0YS5NaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJkYXRhLk1heERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDdweDsgd2lkdGg6IDEwMCU7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybWF0XT1cInRvS2VuZG9EYXRlRm9ybWF0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiPjwva2VuZG8tZGF0ZXBpY2tlcj5cclxuICAgICAgPGtlbmRvLWRhdGV0aW1lcGlja2VyICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgZGF0ZUZvcm1hdD09PSdERC1NTU0tWVlZWSBoOm1tIEEnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChkYXRhLlZhbHVlKS52YWx1ZSB8IGRhdGVQYXJzZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW4pPVwiaGFuZGxlUHJldmVudGFibGVFdmVudCgkZXZlbnQsICdvcGVuJywgZmFsc2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogN3B4OyB3aWR0aDogMTAwJTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwidG9LZW5kb0RhdGVGb3JtYXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0NhbGVuZGFyTW9udGhDZWxsVGVtcGxhdGUgbGV0LWRhdGU+XHJcbiAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiR2V0RGF0ZShkYXRlKVwiPnt7ZGF0ZS5nZXREYXRlKCl9fTwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2tlbmRvLWRhdGV0aW1lcGlja2VyPlxyXG4gICAgICA8a2VuZG8tdGltZXBpY2tlciAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpICYmIChkYXRlRm9ybWF0PT09J0hIOm1tOnNzJyB8fCBkYXRlRm9ybWF0PT09J0hIOm1tJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChkYXRhLlZhbHVlKS52YWx1ZSB8IGRhdGVQYXJzZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogN3B4OyB3aWR0aDogMTAwJTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwidG9LZW5kb0RhdGVGb3JtYXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCI+PC9rZW5kby10aW1lcGlja2VyPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPGFwcC11aXZhbGlkYXRpb25tZXNzYWdlIFtncm91cF09XCJncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXVpdmFsaWRhdGlvbm1lc3NhZ2U+XHJcbiAgPC9kaXY+XHJcbjwvaW9uLWl0ZW0+XHJcbiJdfQ==
|