kwikid-agent-dashboard 0.0.37 → 0.0.39

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.
Files changed (109) hide show
  1. package/bundles/kwikid-agent-dashboard.umd.js +3655 -1317
  2. package/bundles/kwikid-agent-dashboard.umd.js.map +1 -1
  3. package/esm2015/lib/kwikid-agent-dashboard.component.js +39 -120
  4. package/esm2015/lib/kwikid-agent-dashboard.module.js +26 -35
  5. package/esm2015/lib/v1/components/action-button/action-button.component.js +91 -0
  6. package/esm2015/lib/v1/components/customer-details/customer-details.component.js +139 -0
  7. package/esm2015/lib/v1/components/customer-list/customer-list.component.js +201 -0
  8. package/esm2015/lib/v1/components/customer-tile/customer-tile.component.js +137 -0
  9. package/esm2015/lib/v1/components/customer-tile/status-pill/status-pill.component.js +54 -0
  10. package/esm2015/lib/v1/components/customer-tile/status-pill/status-pill.definitions.js +36 -0
  11. package/esm2015/lib/v1/helpers/maps.helpers.js +46 -0
  12. package/esm2015/lib/v1/kwikid-agent-dashboard.component.js +177 -0
  13. package/esm2015/lib/v1/kwikid-agent-dashboard.module.js +120 -0
  14. package/esm2015/lib/v1/pipes/search-filter.pipe.js +62 -0
  15. package/esm2015/lib/v1/services/agent.service.js +149 -0
  16. package/esm2015/lib/v1/services/google-maps.service.js +201 -0
  17. package/esm2015/lib/v1/services/open-street-maps.service.js +252 -0
  18. package/esm2015/lib/v2/components/agent-info/agent-info.component.js +20 -0
  19. package/esm2015/lib/v2/components/agent-info/agent-info.module.js +37 -0
  20. package/esm2015/lib/v2/components/bottom-sheet/bottom-sheet.component.js +111 -0
  21. package/esm2015/lib/v2/components/bottom-sheet/bottom-sheet.module.js +41 -0
  22. package/esm2015/lib/v2/components/components.module.js +79 -0
  23. package/esm2015/lib/v2/components/map-view/map-view.component.js +39 -0
  24. package/esm2015/lib/v2/components/map-view/map-view.module.js +37 -0
  25. package/esm2015/lib/v2/components/primary-actions/primary-actions.component.js +65 -0
  26. package/esm2015/lib/v2/components/primary-actions/primary-actions.module.js +54 -0
  27. package/esm2015/lib/v2/components/task-detail/task-detail.component.js +82 -0
  28. package/esm2015/lib/v2/components/task-detail/task-detail.module.js +41 -0
  29. package/esm2015/lib/v2/components/task-item/task-item.component.js +107 -0
  30. package/esm2015/lib/v2/components/task-item/task-item.constant.js +12 -0
  31. package/esm2015/lib/v2/components/task-item/task-item.module.js +45 -0
  32. package/esm2015/lib/v2/components/task-item-status/task-item-status.component.js +51 -0
  33. package/esm2015/lib/v2/components/task-item-status/task-item-status.module.js +19 -0
  34. package/esm2015/lib/v2/components/task-list/task-list.component.js +186 -0
  35. package/esm2015/lib/v2/components/task-list/task-list.module.js +57 -0
  36. package/esm2015/lib/v2/components/task-list-search/task-list-search.component.js +118 -0
  37. package/esm2015/lib/v2/components/task-list-search/task-list-search.module.js +41 -0
  38. package/esm2015/lib/v2/components/task-preview/task-preview.component.js +30 -0
  39. package/esm2015/lib/v2/components/task-preview/task-preview.module.js +37 -0
  40. package/esm2015/lib/v2/helpers/array.helper.js +10 -0
  41. package/esm2015/lib/v2/helpers/date.helplers.js +17 -0
  42. package/esm2015/lib/v2/kwikid-agent-dashboard.component.js +61 -0
  43. package/esm2015/lib/v2/kwikid-agent-dashboard.module.js +45 -0
  44. package/esm2015/lib/v2/layout/layout-body/layout-body.component.js +274 -0
  45. package/esm2015/lib/v2/layout/layout-body/layout-body.module.js +55 -0
  46. package/esm2015/lib/v2/layout/layout-header/layout-header.component.js +60 -0
  47. package/esm2015/lib/v2/layout/layout-header/layout-header.module.js +48 -0
  48. package/esm2015/lib/v2/layout/layout.module.js +18 -0
  49. package/esm2015/lib/v2/pipes/search-filter.pipe.js +62 -0
  50. package/fesm2015/kwikid-agent-dashboard.js +3255 -1100
  51. package/fesm2015/kwikid-agent-dashboard.js.map +1 -1
  52. package/lib/kwikid-agent-dashboard.component.d.ts +11 -36
  53. package/lib/kwikid-agent-dashboard.module.d.ts +13 -16
  54. package/lib/v1/components/action-button/action-button.component.d.ts +18 -0
  55. package/lib/{components → v1/components}/customer-details/customer-details.component.d.ts +13 -6
  56. package/lib/{components → v1/components}/customer-list/customer-list.component.d.ts +25 -15
  57. package/lib/{components → v1/components}/customer-tile/customer-tile.component.d.ts +12 -5
  58. package/lib/{components → v1/components}/customer-tile/status-pill/status-pill.component.d.ts +6 -2
  59. package/lib/{components → v1/components}/customer-tile/status-pill/status-pill.definitions.d.ts +1 -1
  60. package/lib/v1/kwikid-agent-dashboard.component.d.ts +54 -0
  61. package/lib/v1/kwikid-agent-dashboard.module.d.ts +23 -0
  62. package/lib/{pipes → v1/pipes}/search-filter.pipe.d.ts +1 -1
  63. package/lib/{services → v1/services}/agent.service.d.ts +1 -1
  64. package/lib/{services → v1/services}/google-maps.service.d.ts +4 -4
  65. package/lib/{services → v1/services}/open-street-maps.service.d.ts +5 -5
  66. package/lib/v2/components/agent-info/agent-info.component.d.ts +8 -0
  67. package/lib/v2/components/agent-info/agent-info.module.d.ts +11 -0
  68. package/lib/v2/components/bottom-sheet/bottom-sheet.component.d.ts +24 -0
  69. package/lib/v2/components/bottom-sheet/bottom-sheet.module.d.ts +12 -0
  70. package/lib/v2/components/components.module.d.ts +15 -0
  71. package/lib/v2/components/map-view/map-view.component.d.ts +10 -0
  72. package/lib/v2/components/map-view/map-view.module.d.ts +11 -0
  73. package/lib/v2/components/primary-actions/primary-actions.component.d.ts +14 -0
  74. package/lib/v2/components/primary-actions/primary-actions.module.d.ts +13 -0
  75. package/lib/v2/components/task-detail/task-detail.component.d.ts +23 -0
  76. package/lib/v2/components/task-detail/task-detail.module.d.ts +12 -0
  77. package/lib/v2/components/task-item/task-item.component.d.ts +23 -0
  78. package/lib/v2/components/task-item/task-item.constant.d.ts +11 -0
  79. package/lib/v2/components/task-item/task-item.module.d.ts +13 -0
  80. package/lib/v2/components/task-item-status/task-item-status.component.d.ts +14 -0
  81. package/lib/v2/components/task-item-status/task-item-status.module.d.ts +9 -0
  82. package/lib/v2/components/task-list/task-list.component.d.ts +45 -0
  83. package/lib/v2/components/task-list/task-list.module.d.ts +16 -0
  84. package/lib/v2/components/task-list-search/task-list-search.component.d.ts +34 -0
  85. package/lib/v2/components/task-list-search/task-list-search.module.d.ts +12 -0
  86. package/lib/v2/components/task-preview/task-preview.component.d.ts +11 -0
  87. package/lib/v2/components/task-preview/task-preview.module.d.ts +11 -0
  88. package/lib/v2/helpers/array.helper.d.ts +1 -0
  89. package/lib/v2/helpers/date.helplers.d.ts +3 -0
  90. package/lib/v2/kwikid-agent-dashboard.component.d.ts +17 -0
  91. package/lib/v2/kwikid-agent-dashboard.module.d.ts +13 -0
  92. package/lib/v2/layout/layout-body/layout-body.component.d.ts +42 -0
  93. package/lib/v2/layout/layout-body/layout-body.module.d.ts +14 -0
  94. package/lib/v2/layout/layout-header/layout-header.component.d.ts +20 -0
  95. package/lib/v2/layout/layout-header/layout-header.module.d.ts +13 -0
  96. package/lib/v2/layout/layout.module.d.ts +8 -0
  97. package/lib/v2/pipes/search-filter.pipe.d.ts +25 -0
  98. package/package.json +2 -2
  99. package/esm2015/lib/components/customer-details/customer-details.component.js +0 -90
  100. package/esm2015/lib/components/customer-list/customer-list.component.js +0 -165
  101. package/esm2015/lib/components/customer-tile/customer-tile.component.js +0 -87
  102. package/esm2015/lib/components/customer-tile/status-pill/status-pill.component.js +0 -32
  103. package/esm2015/lib/components/customer-tile/status-pill/status-pill.definitions.js +0 -36
  104. package/esm2015/lib/helpers/maps.helpers.js +0 -46
  105. package/esm2015/lib/pipes/search-filter.pipe.js +0 -62
  106. package/esm2015/lib/services/agent.service.js +0 -153
  107. package/esm2015/lib/services/google-maps.service.js +0 -201
  108. package/esm2015/lib/services/open-street-maps.service.js +0 -252
  109. /package/lib/{helpers → v1/helpers}/maps.helpers.d.ts +0 -0
@@ -1,153 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { EStatus } from '../components/customer-tile/status-pill/status-pill.definitions';
3
- import * as i0 from "@angular/core";
4
- export class AgentService {
5
- constructor() {
6
- this.isListOpen = true;
7
- this.showMapview = false;
8
- this.addTaskForm = {
9
- key: 'ADD_TASK',
10
- title: 'Add Task',
11
- fields: [
12
- {
13
- key: 'name',
14
- label: 'Customer Name',
15
- validators: {
16
- required: true
17
- },
18
- properties: {
19
- placeholder: 'Please enter the Customer Name',
20
- readOnly: false,
21
- case: 'default'
22
- },
23
- type: 'text'
24
- },
25
- {
26
- key: 'phone',
27
- label: 'Phone Number',
28
- validators: {
29
- required: true
30
- },
31
- properties: {
32
- countryCode: '+91',
33
- removeCountryCodeFromValue: true,
34
- phoneMaskAfterCountryCode: '##########',
35
- placeholder: 'Please enter your Mobile Number',
36
- readOnly: false
37
- },
38
- type: 'phone'
39
- },
40
- {
41
- key: 'address',
42
- label: 'Address',
43
- validators: {
44
- required: true
45
- },
46
- properties: {
47
- placeholder: 'Please enter the Address',
48
- readOnly: false,
49
- case: 'default'
50
- },
51
- type: 'text'
52
- },
53
- {
54
- key: 'city',
55
- label: 'City',
56
- validators: {
57
- required: true
58
- },
59
- properties: {
60
- placeholder: 'Please enter the City',
61
- readOnly: false,
62
- case: 'default'
63
- },
64
- type: 'text'
65
- },
66
- {
67
- key: 'location',
68
- label: 'Location URL',
69
- validators: {
70
- required: true
71
- },
72
- properties: {
73
- placeholder: 'Please enter the Location URL',
74
- readOnly: false,
75
- case: 'default'
76
- },
77
- type: 'text'
78
- }
79
- ],
80
- properties: {
81
- header: {
82
- title: {
83
- hidden: true,
84
- label: 'Add Task'
85
- },
86
- steps: {
87
- hidden: true
88
- },
89
- logo: {
90
- hidden: true
91
- }
92
- },
93
- footer: {
94
- viewFormsButton: {
95
- hidden: true,
96
- label: 'View Forms'
97
- },
98
- saveButton: {
99
- hidden: false,
100
- label: 'Submit'
101
- }
102
- }
103
- }
104
- };
105
- this.notRequiredStatus = [
106
- EStatus.REJECTED,
107
- EStatus.AFTER_AUDIT,
108
- EStatus.COMPLETE,
109
- EStatus.SESSION_EXPIRED,
110
- EStatus.KYC_REJECTED,
111
- EStatus.KYC_RESULT_APPROVED,
112
- EStatus.KYC_RESULT_REJECTED,
113
- EStatus.KYC_RESULT_UNDER_REVIEW,
114
- EStatus.KYC_REQUEST_REJECTED
115
- ];
116
- }
117
- ngOnInit() { }
118
- setAgentConfig(config) {
119
- this.config = config;
120
- }
121
- toggleMapview() {
122
- this.showMapview = !this.showMapview;
123
- }
124
- canStartJourney(status) {
125
- var _a, _b;
126
- const noneEditableStatus = (_b = (_a = this.config.dashboard) === null || _a === void 0 ? void 0 : _a.cannotStartJourney) !== null && _b !== void 0 ? _b : this.notRequiredStatus;
127
- if (noneEditableStatus.includes(status)) {
128
- return false;
129
- }
130
- else {
131
- return true;
132
- }
133
- }
134
- canPlotMarkers(status) {
135
- var _a, _b;
136
- const nonePlottingSessions = (_b = (_a = this.config.dashboard) === null || _a === void 0 ? void 0 : _a.dontPlotMarkers) !== null && _b !== void 0 ? _b : [];
137
- if (nonePlottingSessions.includes(status)) {
138
- return false;
139
- }
140
- else {
141
- return true;
142
- }
143
- }
144
- }
145
- /** @nocollapse */ AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AgentService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
146
- /** @nocollapse */ AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AgentService, providedIn: 'root' });
147
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AgentService, decorators: [{
148
- type: Injectable,
149
- args: [{
150
- providedIn: 'root'
151
- }]
152
- }], ctorParameters: function () { return []; } });
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1hZ2VudC1kYXNoYm9hcmQvc3JjL2xpYi9zZXJ2aWNlcy9hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlFQUFpRSxDQUFDOztBQUsxRixNQUFNLE9BQU8sWUFBWTtJQXlIdkI7UUF0SEEsZUFBVSxHQUFHLElBQUksQ0FBQztRQUlsQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUlwQixnQkFBVyxHQUFHO1lBQ1osR0FBRyxFQUFFLFVBQVU7WUFDZixLQUFLLEVBQUUsVUFBVTtZQUNqQixNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsR0FBRyxFQUFFLE1BQU07b0JBQ1gsS0FBSyxFQUFFLGVBQWU7b0JBQ3RCLFVBQVUsRUFBRTt3QkFDVixRQUFRLEVBQUUsSUFBSTtxQkFDZjtvQkFDRCxVQUFVLEVBQUU7d0JBQ1YsV0FBVyxFQUFFLGdDQUFnQzt3QkFDN0MsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsSUFBSSxFQUFFLFNBQVM7cUJBQ2hCO29CQUNELElBQUksRUFBRSxNQUFNO2lCQUNiO2dCQUNEO29CQUNFLEdBQUcsRUFBRSxPQUFPO29CQUNaLEtBQUssRUFBRSxjQUFjO29CQUNyQixVQUFVLEVBQUU7d0JBQ1YsUUFBUSxFQUFFLElBQUk7cUJBQ2Y7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLFdBQVcsRUFBRSxLQUFLO3dCQUNsQiwwQkFBMEIsRUFBRSxJQUFJO3dCQUNoQyx5QkFBeUIsRUFBRSxZQUFZO3dCQUN2QyxXQUFXLEVBQUUsaUNBQWlDO3dCQUM5QyxRQUFRLEVBQUUsS0FBSztxQkFDaEI7b0JBQ0QsSUFBSSxFQUFFLE9BQU87aUJBQ2Q7Z0JBQ0Q7b0JBQ0UsR0FBRyxFQUFFLFNB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Q0gsQ0FBQzs7NkhBeEpVLFlBQVk7aUlBQVosWUFBWSxjQUZYLE1BQU07NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFU3RhdHVzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jdXN0b21lci10aWxlL3N0YXR1cy1waWxsL3N0YXR1cy1waWxsLmRlZmluaXRpb25zJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQWdlbnRTZXJ2aWNlIHtcbiAgY29uZmlnO1xuXG4gIGlzTGlzdE9wZW4gPSB0cnVlO1xuXG4gIGlzTW9iaWxlVmlldztcblxuICBzaG93TWFwdmlldyA9IGZhbHNlO1xuXG4gIGN1cnJlbnRUYXNrRGV0YWlscztcblxuICBhZGRUYXNrRm9ybSA9IHtcbiAgICBrZXk6ICdBRERfVEFTSycsXG4gICAgdGl0bGU6ICdBZGQgVGFzaycsXG4gICAgZmllbGRzOiBbXG4gICAgICB7XG4gICAgICAgIGtleTogJ25hbWUnLFxuICAgICAgICBsYWJlbDogJ0N1c3RvbWVyIE5hbWUnLFxuICAgICAgICB2YWxpZGF0b3JzOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnUGxlYXNlIGVudGVyIHRoZSBDdXN0b21lciBOYW1lJyxcbiAgICAgICAgICByZWFkT25seTogZmFsc2UsXG4gICAgICAgICAgY2FzZTogJ2RlZmF1bHQnXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICd0ZXh0J1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGhvbmUnLFxuICAgICAgICBsYWJlbDogJ1Bob25lIE51bWJlcicsXG4gICAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgY291bnRyeUNvZGU6ICcrOTEnLFxuICAgICAgICAgIHJlbW92ZUNvdW50cnlDb2RlRnJvbVZhbHVlOiB0cnVlLFxuICAgICAgICAgIHBob25lTWFza0FmdGVyQ291bnRyeUNvZGU6ICcjIyMjIyMjIyMjJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ1BsZWFzZSBlbnRlciB5b3VyIE1vYmlsZSBOdW1iZXInLFxuICAgICAgICAgIHJlYWRPbmx5OiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiAncGhvbmUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdhZGRyZXNzJyxcbiAgICAgICAgbGFiZWw6ICdBZGRyZXNzJyxcbiAgICAgICAgdmFsaWRhdG9yczoge1xuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ1BsZWFzZSBlbnRlciB0aGUgQWRkcmVzcycsXG4gICAgICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgICAgIGNhc2U6ICdkZWZhdWx0J1xuICAgICAgICB9LFxuICAgICAgICB0eXBlOiAndGV4dCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NpdHknLFxuICAgICAgICBsYWJlbDogJ0NpdHknLFxuICAgICAgICB2YWxpZGF0b3JzOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnUGxlYXNlIGVudGVyIHRoZSBDaXR5JyxcbiAgICAgICAgICByZWFkT25seTogZmFsc2UsXG4gICAgICAgICAgY2FzZTogJ2RlZmF1bHQnXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICd0ZXh0J1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnbG9jYXRpb24nLFxuICAgICAgICBsYWJlbDogJ0xvY2F0aW9uIFVSTCcsXG4gICAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdQbGVhc2UgZW50ZXIgdGhlIExvY2F0aW9uIFVSTCcsXG4gICAgICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgICAgIGNhc2U6ICdkZWZhdWx0J1xuICAgICAgICB9LFxuICAgICAgICB0eXBlOiAndGV4dCdcbiAgICAgIH1cbiAgICBdLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIGhlYWRlcjoge1xuICAgICAgICB0aXRsZToge1xuICAgICAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgICAgICBsYWJlbDogJ0FkZCBUYXNrJ1xuICAgICAgICB9LFxuICAgICAgICBzdGVwczoge1xuICAgICAgICAgIGhpZGRlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBsb2dvOiB7XG4gICAgICAgICAgaGlkZGVuOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmb290ZXI6IHtcbiAgICAgICAgdmlld0Zvcm1zQnV0dG9uOiB7XG4gICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgIGxhYmVsOiAnVmlldyBGb3JtcydcbiAgICAgICAgfSxcbiAgICAgICAgc2F2ZUJ1dHRvbjoge1xuICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgbGFiZWw6ICdTdWJtaXQnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgbm90UmVxdWlyZWRTdGF0dXMgPSBbXG4gICAgRVN0YXR1cy5SRUpFQ1RFRCxcbiAgICBFU3RhdHVzLkFGVEVSX0FVRElULFxuICAgIEVTdGF0dXMuQ09NUExFVEUsXG4gICAgRVN0YXR1cy5TRVNTSU9OX0VYUElSRUQsXG4gICAgRVN0YXR1cy5LWUNfUkVKRUNURUQsXG4gICAgRVN0YXR1cy5LWUNfUkVTVUxUX0FQUFJPVkVELFxuICAgIEVTdGF0dXMuS1lDX1JFU1VMVF9SRUpFQ1RFRCxcbiAgICBFU3RhdHVzLktZQ19SRVNVTFRfVU5ERVJfUkVWSUVXLFxuICAgIEVTdGF0dXMuS1lDX1JFUVVFU1RfUkVKRUNURURcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKSB7fVxuXG4gIHNldEFnZW50Q29uZmlnKGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgdG9nZ2xlTWFwdmlldygpIHtcbiAgICB0aGlzLnNob3dNYXB2aWV3ID0gIXRoaXMuc2hvd01hcHZpZXc7XG4gIH1cblxuICBjYW5TdGFydEpvdXJuZXkoc3RhdHVzKSB7XG4gICAgY29uc3Qgbm9uZUVkaXRhYmxlU3RhdHVzID1cbiAgICAgIHRoaXMuY29uZmlnLmRhc2hib2FyZD8uY2Fubm90U3RhcnRKb3VybmV5ID8/IHRoaXMubm90UmVxdWlyZWRTdGF0dXM7XG5cbiAgICBpZiAobm9uZUVkaXRhYmxlU3RhdHVzLmluY2x1ZGVzKHN0YXR1cykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgY2FuUGxvdE1hcmtlcnMoc3RhdHVzKSB7XG4gICAgY29uc3Qgbm9uZVBsb3R0aW5nU2Vzc2lvbnMgPSB0aGlzLmNvbmZpZy5kYXNoYm9hcmQ/LmRvbnRQbG90TWFya2VycyA/PyBbXTtcblxuICAgIGlmIChub25lUGxvdHRpbmdTZXNzaW9ucy5pbmNsdWRlcyhzdGF0dXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,201 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Injectable, ViewChildren } from '@angular/core';
3
- import { checkObjectPathExists, getObjectValueFromPath, isNotEmptyArray } from 'kwikid-toolkit';
4
- import { map } from 'rxjs/operators';
5
- import { addressConcator, nearestNeighborAlgorithm } from '../helpers/maps.helpers';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "./agent.service";
8
- import * as i2 from "@angular/google-maps";
9
- import * as i3 from "@angular/common/http";
10
- export class GoogleMapsService {
11
- constructor(agentService, mapDirectionsService, httpClient) {
12
- this.agentService = agentService;
13
- this.mapDirectionsService = mapDirectionsService;
14
- this.httpClient = httpClient;
15
- this.allMarkers = [];
16
- }
17
- // To get Current Position
18
- getPosition() {
19
- return new Promise((resolve, reject) => {
20
- navigator.geolocation.watchPosition((resp) => {
21
- resolve({
22
- lng: resp.coords.longitude,
23
- lat: resp.coords.latitude
24
- });
25
- }, (err) => {
26
- reject(err);
27
- });
28
- });
29
- }
30
- // To Initialize Google Maps
31
- initializeMap() {
32
- return __awaiter(this, void 0, void 0, function* () {
33
- this.myPosition = yield this.getPosition();
34
- this.map = {
35
- zoom: 10,
36
- center: this.myPosition,
37
- streetViewControl: false,
38
- mapTypeControl: false,
39
- fullscreenControl: false,
40
- zoomControl: false
41
- };
42
- });
43
- }
44
- // To extract Location from the Task Details
45
- getLocation(task) {
46
- return __awaiter(this, void 0, void 0, function* () {
47
- return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
48
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
49
- let encodedAddres;
50
- // If Fetch Address from Multiple Paths
51
- if (checkObjectPathExists(this.agentService.config, 'dashboard.taskLocationPaths')) {
52
- // Get address string from multiple paths
53
- const config = this.agentService.config.dashboard.taskLocationPaths;
54
- const address = addressConcator(task, config);
55
- // Encode the Address in URI
56
- encodedAddres = encodeURI(address);
57
- }
58
- // If Fetch Address from Single Path
59
- else if (checkObjectPathExists(this.agentService.config, 'dashboard.taskLocationPath')) {
60
- // Get Address from Single Path
61
- const config = this.agentService.config.dashboard.taskLocationPath;
62
- const address = getObjectValueFromPath(task, config);
63
- // Encode the Address in URI
64
- encodedAddres = encodeURI(address);
65
- }
66
- // Default Address Paths Avaiable
67
- else {
68
- const address = (_k = (_j = (_g = (_d = (_c = (_b = (_a = task === null || task === void 0 ? void 0 : task.extras) === null || _a === void 0 ? void 0 : _a.task_details) === null || _b === void 0 ? void 0 : _b.customer_details) === null || _c === void 0 ? void 0 : _c.address) !== null && _d !== void 0 ? _d : (_f = (_e = task === null || task === void 0 ? void 0 : task.task_details) === null || _e === void 0 ? void 0 : _e.customer_details) === null || _f === void 0 ? void 0 : _f.address) !== null && _g !== void 0 ? _g : (_h = task === null || task === void 0 ? void 0 : task.extras) === null || _h === void 0 ? void 0 : _h.address) !== null && _j !== void 0 ? _j : task === null || task === void 0 ? void 0 : task.address) !== null && _k !== void 0 ? _k : '';
69
- // Encode the Address in URI
70
- encodedAddres = encodeURI(address);
71
- }
72
- // URL to geocode Address String to Latitude & Longitude
73
- const url = `https://maps.googleapis.com/maps/api/geocode/json?key=${this.apiKey}&address=${encodedAddres}`;
74
- const response = yield fetch(url);
75
- const data = yield response.json();
76
- // Set Location {lat: LAT, lng: LNG} from address geocoded
77
- const isValidLocation = isNotEmptyArray(data === null || data === void 0 ? void 0 : data.results);
78
- const location = isValidLocation
79
- ? (_m = (_l = data === null || data === void 0 ? void 0 : data.results[0]) === null || _l === void 0 ? void 0 : _l.geometry) === null || _m === void 0 ? void 0 : _m.location
80
- : { lat: null, lng: null };
81
- // Set Location validation & Google Maps URL
82
- location['isValidLocation'] = isValidLocation;
83
- location['googleMapsUrl'] = `https://www.google.com/maps/place/${location === null || location === void 0 ? void 0 : location.lat},${location === null || location === void 0 ? void 0 : location.lng}`;
84
- resolve(location);
85
- }));
86
- });
87
- }
88
- // Get Tasks | Markers Location Co Ordinates
89
- getMarkersLocation(myMarker, tasks) {
90
- return __awaiter(this, void 0, void 0, function* () {
91
- return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
92
- let markers = [];
93
- markers.push(myMarker);
94
- const promises = tasks.map((task) => __awaiter(this, void 0, void 0, function* () {
95
- const marker = yield this.getLocation(task);
96
- task = Object.assign(Object.assign({}, task), marker);
97
- markers.push(task);
98
- }));
99
- yield Promise.all(promises);
100
- resolve(markers);
101
- }));
102
- });
103
- }
104
- // Plot All Markers
105
- plotAllMarkers(tasks) {
106
- return __awaiter(this, void 0, void 0, function* () {
107
- return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
108
- let path = [];
109
- const promises = tasks.map((task) => {
110
- if (task === null || task === void 0 ? void 0 : task.isValidLocation) {
111
- path.push({
112
- location: task,
113
- stopover: true
114
- });
115
- this.allMarkers.push(task);
116
- }
117
- });
118
- yield Promise.all(promises);
119
- resolve(path);
120
- }));
121
- });
122
- }
123
- // To Plot Directions for All Tasks
124
- plotDirectionsForAllTasks(tasks) {
125
- return __awaiter(this, void 0, void 0, function* () {
126
- this.allMarkers = [];
127
- // Create Agent Marker & Plot It.
128
- const myMarker = {
129
- lat: this.myPosition.lat,
130
- lng: this.myPosition.lng,
131
- title: 0,
132
- color: 'red'
133
- };
134
- // Get All Markers Location Co Ordinates
135
- const markers = yield this.getMarkersLocation(myMarker, tasks);
136
- // Run Algorithm to get optimized Routes
137
- const startingPoint = markers[0];
138
- const unvisitedWaypoints = markers.slice(1);
139
- const optimizedRoute = nearestNeighborAlgorithm(startingPoint, unvisitedWaypoints);
140
- // Sort All Tasks as per optimized routes
141
- tasks = optimizedRoute.slice(1);
142
- this.allMarkers = [myMarker];
143
- // Plot all markers & get path for directions
144
- const path = yield this.plotAllMarkers(tasks);
145
- // Set Directions in Google Maps
146
- const request = {
147
- origin: this.myPosition,
148
- destination: this.myPosition,
149
- waypoints: path,
150
- travelMode: google.maps.TravelMode.DRIVING
151
- };
152
- this.directionsRenderOption = {
153
- suppressMarkers: true
154
- };
155
- this.directionsResults$ = this.mapDirectionsService
156
- .route(request)
157
- .pipe(map((response) => response.result));
158
- this.directionsResults$.subscribe((val) => { });
159
- this.allDirectionsResults$ = this.directionsResults$;
160
- return tasks;
161
- });
162
- }
163
- // To Plot Directions for Selected Tasks
164
- plotDirectionsForSelectedTask(task) {
165
- if (task != null) {
166
- const taskMarker = task;
167
- // If Location is Available in Task Details
168
- if (taskMarker === null || taskMarker === void 0 ? void 0 : taskMarker.isValidLocation) {
169
- const request = {
170
- origin: this.myPosition,
171
- destination: taskMarker,
172
- optimizeWaypoints: true,
173
- travelMode: google.maps.TravelMode.DRIVING
174
- };
175
- this.directionsResults$ = this.mapDirectionsService
176
- .route(request)
177
- .pipe(map((response) => response.result));
178
- this.directionsResults$.subscribe();
179
- }
180
- else {
181
- alert('No Location Available');
182
- this.directionsResults$ = this.allDirectionsResults$;
183
- }
184
- }
185
- else {
186
- this.directionsResults$ = this.allDirectionsResults$;
187
- }
188
- }
189
- }
190
- /** @nocollapse */ GoogleMapsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: GoogleMapsService, deps: [{ token: i1.AgentService }, { token: i2.MapDirectionsService }, { token: i3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
191
- /** @nocollapse */ GoogleMapsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: GoogleMapsService, providedIn: 'root' });
192
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: GoogleMapsService, decorators: [{
193
- type: Injectable,
194
- args: [{
195
- providedIn: 'root'
196
- }]
197
- }], ctorParameters: function () { return [{ type: i1.AgentService }, { type: i2.MapDirectionsService }, { type: i3.HttpClient }]; }, propDecorators: { directionsRenders: [{
198
- type: ViewChildren,
199
- args: ['directionsRender']
200
- }] } });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1hZ2VudC1kYXNoYm9hcmQvc3JjL2xpYi9zZXJ2aWNlcy9nb29nbGUtbWFwcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFhLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEIsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE9BQU8sRUFDTCxlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3pCLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBSWpDLE1BQU0sT0FBTyxpQkFBaUI7SUFlNUIsWUFDVSxZQUEwQixFQUMzQixvQkFBMEMsRUFDMUMsVUFBc0I7UUFGckIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDM0IseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBYi9CLGVBQVUsR0FBUSxFQUFFLENBQUM7SUFjbEIsQ0FBQztJQUVKLDBCQUEwQjtJQUMxQixXQUFXO1FBQ1QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxTQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FDakMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDUCxPQUFPLENBQUM7b0JBQ04sR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztvQkFDMUIsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtpQkFDMUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxFQUNELENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ04sTUFBTSxDQUFDLEdB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RUFBRTtZQUNoQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFFeEIsMkNBQTJDO1lBQzNDLElBQUksVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLGVBQWUsRUFBRTtnQkFDL0IsTUFBTSxPQUFPLEdBQWtDO29CQUM3QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQ3ZCLFdBQVcsRUFBRSxVQUFVO29CQUN2QixpQkFBaUIsRUFBRSxJQUFJO29CQUN2QixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTztpQkFDM0MsQ0FBQztnQkFFRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQjtxQkFDaEQsS0FBSyxDQUFDLE9BQU8sQ0FBQztxQkFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFFNUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3JDO2lCQUFNO2dCQUNMLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO2FBQ3REO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7U0FDdEQ7SUFDSCxDQUFDOztrSUE3T1UsaUJBQWlCO3NJQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COytKQVltQyxpQkFBaUI7c0JBQWxELFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFnZW50U2VydmljZSB9IGZyb20gJy4vYWdlbnQuc2VydmljZSc7XG5pbXBvcnQge1xuICBjaGVja09iamVjdFBhdGhFeGlzdHMsXG4gIGdldE9iamVjdFZhbHVlRnJvbVBhdGgsXG4gIGlzTm90RW1wdHlBcnJheVxufSBmcm9tICdrd2lraWQtdG9vbGtpdCc7XG5cbmltcG9ydCB7IE1hcERpcmVjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGFuZ3VsYXIvZ29vZ2xlLW1hcHMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBhZGRyZXNzQ29uY2F0b3IsXG4gIG5lYXJlc3ROZWlnaGJvckFsZ29yaXRobVxufSBmcm9tICcuLi9oZWxwZXJzL21hcHMuaGVscGVycyc7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBHb29nbGVNYXBzU2VydmljZSB7XG4gIG15UG9zaXRpb247XG4gIG1hcDogYW55O1xuXG4gIGFwaUtleTogYW55O1xuICBhbGxNYXJrZXJzOiBhbnkgPSBbXTtcblxuICBkaXJlY3Rpb25zUmVuZGVyT3B0aW9uOiBhbnk7XG4gIGRpcmVjdGlvbnNSZXN1bHRzJDogYW55O1xuICBhbGxEaXJlY3Rpb25zUmVzdWx0cyQ6IGFueTtcblxuICBAVmlld0NoaWxkcmVuKCdkaXJlY3Rpb25zUmVuZGVyJykgZGlyZWN0aW9uc1JlbmRlcnM6IFF1ZXJ5TGlzdDxcbiAgICBFbGVtZW50UmVmPGdvb2dsZS5tYXBzLkRpcmVjdGlvbnNSZW5kZXJlcj5cbiAgPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFnZW50U2VydmljZTogQWdlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBtYXBEaXJlY3Rpb25zU2VydmljZTogTWFwRGlyZWN0aW9uc1NlcnZpY2UsXG4gICAgcHVibGljIGh0dHBDbGllbnQ6IEh0dHBDbGllbnRcbiAgKSB7fVxuXG4gIC8vIFRvIGdldCBDdXJyZW50IFBvc2l0aW9uXG4gIGdldFBvc2l0aW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKFxuICAgICAgICAocmVzcCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgbG5nOiByZXNwLmNvb3Jkcy5sb25naXR1ZGUsXG4gICAgICAgICAgICBsYXQ6IHJlc3AuY29vcmRzLmxhdGl0dWRlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRvIEluaXRpYWxpemUgR29vZ2xlIE1hcHNcbiAgYXN5bmMgaW5pdGlhbGl6ZU1hcCgpIHtcbiAgICB0aGlzLm15UG9zaXRpb24gPSBhd2FpdCB0aGlzLmdldFBvc2l0aW9uKCk7XG4gICAgdGhpcy5tYXAgPSB7XG4gICAgICB6b29tOiAxMCxcbiAgICAgIGNlbnRlcjogdGhpcy5teVBvc2l0aW9uLFxuICAgICAgc3RyZWV0Vmlld0NvbnRyb2w6IGZhbHNlLFxuICAgICAgbWFwVHlwZUNvbnRyb2w6IGZhbHNlLFxuICAgICAgZnVsbHNjcmVlbkNvbnRyb2w6IGZhbHNlLFxuICAgICAgem9vbUNvbnRyb2w6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRvIGV4dHJhY3QgTG9jYXRpb24gZnJvbSB0aGUgVGFzayBEZXRhaWxzXG4gIGFzeW5jIGdldExvY2F0aW9uKHRhc2spIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBlbmNvZGVkQWRkcmVzO1xuXG4gICAgICAvLyBJZiBGZXRjaCBBZGRyZXNzIGZyb20gTXVsdGlwbGUgUGF0aHNcbiAgICAgIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKFxuICAgICAgICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZyxcbiAgICAgICAgICAnZGFzaGJvYXJkLnRhc2tMb2NhdGlvblBhdGhzJ1xuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgLy8gR2V0IGFkZHJlc3Mgc3RyaW5nIGZyb20gbXVsdGlwbGUgcGF0aHNcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5hZ2VudFNlcnZpY2UuY29uZmlnLmRhc2hib2FyZC50YXNrTG9jYXRpb25QYXRocztcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGFkZHJlc3NDb25jYXRvcih0YXNrLCBjb25maWcpO1xuXG4gICAgICAgIC8vIEVuY29kZSB0aGUgQWRkcmVzcyBpbiBVUklcbiAgICAgICAgZW5jb2RlZEFkZHJlcyA9IGVuY29kZVVSSShhZGRyZXNzKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgRmV0Y2ggQWRkcmVzcyBmcm9tIFNpbmdsZSBQYXRoXG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKFxuICAgICAgICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZyxcbiAgICAgICAgICAnZGFzaGJvYXJkLnRhc2tMb2NhdGlvblBhdGgnXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICAvLyBHZXQgQWRkcmVzcyBmcm9tIFNpbmdsZSBQYXRoXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZy5kYXNoYm9hcmQudGFza0xvY2F0aW9uUGF0aDtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGdldE9iamVjdFZhbHVlRnJvbVBhdGgodGFzaywgY29uZmlnKTtcblxuICAgICAgICAvLyBFbmNvZGUgdGhlIEFkZHJlc3MgaW4gVVJJXG4gICAgICAgIGVuY29kZWRBZGRyZXMgPSBlbmNvZGVVUkkoYWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlZmF1bHQgQWRkcmVzcyBQYXRocyBBdmFpYWJsZVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAgIHRhc2s/LmV4dHJhcz8udGFza19kZXRhaWxzPy5jdXN0b21lcl9kZXRhaWxzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8udGFza19kZXRhaWxzPy5jdXN0b21lcl9kZXRhaWxzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8uZXh0cmFzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8uYWRkcmVzcyA/P1xuICAgICAgICAgICcnO1xuXG4gICAgICAgIC8vIEVuY29kZSB0aGUgQWRkcmVzcyBpbiBVUklcbiAgICAgICAgZW5jb2RlZEFkZHJlcyA9IGVuY29kZVVSSShhZGRyZXNzKTtcbiAgICAgIH1cblxuICAgICAgLy8gVVJMIHRvIGdlb2NvZGUgQWRkcmVzcyBTdHJpbmcgdG8gTGF0aXR1ZGUgJiBMb25naXR1ZGVcbiAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvZ2VvY29kZS9qc29uP2tleT0ke3RoaXMuYXBpS2V5fSZhZGRyZXNzPSR7ZW5jb2RlZEFkZHJlc31gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIFNldCBMb2NhdGlvbiB7bGF0OiBMQVQsIGxuZzogTE5HfSBmcm9tIGFkZHJlc3MgZ2VvY29kZWRcbiAgICAgIGNvbnN0IGlzVmFsaWRMb2NhdGlvbiA9IGlzTm90RW1wdHlBcnJheShkYXRhPy5yZXN1bHRzKTtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gaXNWYWxpZExvY2F0aW9uXG4gICAgICAgID8gZGF0YT8ucmVzdWx0c1swXT8uZ2VvbWV0cnk/LmxvY2F0aW9uXG4gICAgICAgIDoge2xhdDogbnVsbCwgbG5nOiBudWxsfTtcblxuICAgICAgLy8gU2V0IExvY2F0aW9uIHZhbGlkYXRpb24gJiBHb29nbGUgTWFwcyBVUkxcbiAgICAgIGxvY2F0aW9uWydpc1ZhbGlkTG9jYXRpb24nXSA9IGlzVmFsaWRMb2NhdGlvbjtcbiAgICAgIGxvY2F0aW9uW1xuICAgICAgICAnZ29vZ2xlTWFwc1VybCdcbiAgICAgIF0gPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3BsYWNlLyR7bG9jYXRpb24/LmxhdH0sJHtsb2NhdGlvbj8ubG5nfWA7XG5cbiAgICAgIHJlc29sdmUobG9jYXRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gR2V0IFRhc2tzIHwgTWFya2VycyBMb2NhdGlvbiBDbyBPcmRpbmF0ZXNcbiAgYXN5bmMgZ2V0TWFya2Vyc0xvY2F0aW9uKG15TWFya2VyLCB0YXNrcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IG1hcmtlcnMgPSBbXTtcbiAgICAgIG1hcmtlcnMucHVzaChteU1hcmtlcik7XG4gICAgICBjb25zdCBwcm9taXNlcyA9IHRhc2tzLm1hcChhc3luYyAodGFzaykgPT4ge1xuICAgICAgICBjb25zdCBtYXJrZXI6IGFueSA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb24odGFzayk7XG4gICAgICAgIHRhc2sgPSB7IC4uLnRhc2ssIC4uLm1hcmtlciB9O1xuICAgICAgICBtYXJrZXJzLnB1c2godGFzayk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXG4gICAgICByZXNvbHZlKG1hcmtlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUGxvdCBBbGwgTWFya2Vyc1xuICBhc3luYyBwbG90QWxsTWFya2Vycyh0YXNrcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHBhdGggPSBbXTtcbiAgICAgIGNvbnN0IHByb21pc2VzID0gdGFza3MubWFwKCh0YXNrKSA9PiB7XG4gICAgICAgIGlmICh0YXNrPy5pc1ZhbGlkTG9jYXRpb24pIHtcbiAgICAgICAgICBwYXRoLnB1c2goe1xuICAgICAgICAgICAgbG9jYXRpb246IHRhc2ssXG4gICAgICAgICAgICBzdG9wb3ZlcjogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWxsTWFya2Vycy5wdXNoKHRhc2spO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXG4gICAgICByZXNvbHZlKHBhdGgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVG8gUGxvdCBEaXJlY3Rpb25zIGZvciBBbGwgVGFza3NcbiAgYXN5bmMgcGxvdERpcmVjdGlvbnNGb3JBbGxUYXNrcyh0YXNrcykge1xuICAgIHRoaXMuYWxsTWFya2VycyA9IFtdO1xuXG4gICAgLy8gQ3JlYXRlIEFnZW50IE1hcmtlciAmIFBsb3QgSXQuXG4gICAgY29uc3QgbXlNYXJrZXIgPSB7XG4gICAgICBsYXQ6IHRoaXMubXlQb3NpdGlvbi5sYXQsXG4gICAgICBsbmc6IHRoaXMubXlQb3NpdGlvbi5sbmcsXG4gICAgICB0aXRsZTogMCxcbiAgICAgIGNvbG9yOiAncmVkJ1xuICAgIH07XG5cbiAgICAvLyBHZXQgQWxsIE1hcmtlcnMgTG9jYXRpb24gQ28gT3JkaW5hdGVzXG4gICAgY29uc3QgbWFya2VyczogYW55ID0gYXdhaXQgdGhpcy5nZXRNYXJrZXJzTG9jYXRpb24obXlNYXJrZXIsIHRhc2tzKTtcblxuICAgIC8vIFJ1biBBbGdvcml0aG0gdG8gZ2V0IG9wdGltaXplZCBSb3V0ZXNcbiAgICBjb25zdCBzdGFydGluZ1BvaW50ID0gbWFya2Vyc1swXTtcbiAgICBjb25zdCB1bnZpc2l0ZWRXYXlwb2ludHMgPSBtYXJrZXJzLnNsaWNlKDEpO1xuICAgIGNvbnN0IG9wdGltaXplZFJvdXRlID0gbmVhcmVzdE5laWdoYm9yQWxnb3JpdGhtKFxuICAgICAgc3RhcnRpbmdQb2ludCxcbiAgICAgIHVudmlzaXRlZFdheXBvaW50c1xuICAgICk7XG5cbiAgICAvLyBTb3J0IEFsbCBUYXNrcyBhcyBwZXIgb3B0aW1pemVkIHJvdXRlc1xuICAgIHRhc2tzID0gb3B0aW1pemVkUm91dGUuc2xpY2UoMSk7XG4gICAgdGhpcy5hbGxNYXJrZXJzID0gW215TWFya2VyXTtcblxuICAgIC8vIFBsb3QgYWxsIG1hcmtlcnMgJiBnZXQgcGF0aCBmb3IgZGlyZWN0aW9uc1xuICAgIGNvbnN0IHBhdGg6IGFueSA9IGF3YWl0IHRoaXMucGxvdEFsbE1hcmtlcnModGFza3MpO1xuXG4gICAgLy8gU2V0IERpcmVjdGlvbnMgaW4gR29vZ2xlIE1hcHNcbiAgICBjb25zdCByZXF1ZXN0OiBnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVxdWVzdCA9IHtcbiAgICAgIG9yaWdpbjogdGhpcy5teVBvc2l0aW9uLFxuICAgICAgZGVzdGluYXRpb246IHRoaXMubXlQb3NpdGlvbixcbiAgICAgIHdheXBvaW50czogcGF0aCxcbiAgICAgIHRyYXZlbE1vZGU6IGdvb2dsZS5tYXBzLlRyYXZlbE1vZGUuRFJJVklOR1xuICAgIH07XG5cbiAgICB0aGlzLmRpcmVjdGlvbnNSZW5kZXJPcHRpb24gPSB7XG4gICAgICBzdXBwcmVzc01hcmtlcnM6IHRydWVcbiAgICB9O1xuXG4gICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQgPSB0aGlzLm1hcERpcmVjdGlvbnNTZXJ2aWNlXG4gICAgICAucm91dGUocmVxdWVzdClcbiAgICAgIC5waXBlKG1hcCgocmVzcG9uc2UpID0+IHJlc3BvbnNlLnJlc3VsdCkpO1xuXG4gICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQuc3Vic2NyaWJlKCh2YWwpID0+IHt9KTtcblxuICAgIHRoaXMuYWxsRGlyZWN0aW9uc1Jlc3VsdHMkID0gdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQ7XG5cbiAgICByZXR1cm4gdGFza3M7XG4gIH1cblxuICAvLyBUbyBQbG90IERpcmVjdGlvbnMgZm9yIFNlbGVjdGVkIFRhc2tzXG4gIHBsb3REaXJlY3Rpb25zRm9yU2VsZWN0ZWRUYXNrKHRhc2spIHtcbiAgICBpZiAodGFzayAhPSBudWxsKSB7XG4gICAgICBjb25zdCB0YXNrTWFya2VyID0gdGFzaztcblxuICAgICAgLy8gSWYgTG9jYXRpb24gaXMgQXZhaWxhYmxlIGluIFRhc2sgRGV0YWlsc1xuICAgICAgaWYgKHRhc2tNYXJrZXI/LmlzVmFsaWRMb2NhdGlvbikge1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVxdWVzdCA9IHtcbiAgICAgICAgICBvcmlnaW46IHRoaXMubXlQb3NpdGlvbixcbiAgICAgICAgICBkZXN0aW5hdGlvbjogdGFza01hcmtlcixcbiAgICAgICAgICBvcHRpbWl6ZVdheXBvaW50czogdHJ1ZSxcbiAgICAgICAgICB0cmF2ZWxNb2RlOiBnb29nbGUubWFwcy5UcmF2ZWxNb2RlLkRSSVZJTkdcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRpcmVjdGlvbnNSZXN1bHRzJCA9IHRoaXMubWFwRGlyZWN0aW9uc1NlcnZpY2VcbiAgICAgICAgICAucm91dGUocmVxdWVzdClcbiAgICAgICAgICAucGlwZShtYXAoKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQpKTtcblxuICAgICAgICB0aGlzLmRpcmVjdGlvbnNSZXN1bHRzJC5zdWJzY3JpYmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFsZXJ0KCdObyBMb2NhdGlvbiBBdmFpbGFibGUnKTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQgPSB0aGlzLmFsbERpcmVjdGlvbnNSZXN1bHRzJDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQgPSB0aGlzLmFsbERpcmVjdGlvbnNSZXN1bHRzJDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==