PageSourceSearch

https://gestionposmobile.web.app/src_app_crm-contacts_crm-contacts_module_ts.js

js gestionposmobile.web.app collected 2026-10-03 12:26:39 UTC 44,375 bytes, 320 lines download raw bytes

1"use strict";
2(self["webpackChunkapp"] = self["webpackChunkapp"] || []).push([["src_app_crm-contacts_crm-contacts_module_ts"],{
3
4/***/ 76789:
5/*!*************************************************************!*\
6  !*** ./src/app/crm-contacts/crm-contacts-routing.module.ts ***!
7  \*************************************************************/
8/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9
10__webpack_require__.r(__webpack_exports__);
11/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12/* harmony export */   "CrmContactsPageRoutingModule": () => (/* binding */ CrmContactsPageRoutingModule)
13/* harmony export */ });
14/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tslib */ 39859);
15/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/core */ 14001);
16/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/router */ 13252);
17/* harmony import */ var _crm_contacts_page__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./crm-contacts.page */ 9357);
18
19
20
21
22const routes = [
23    {
24        path: '',
25        component: _crm_contacts_page__WEBPACK_IMPORTED_MODULE_0__.CrmContactsPage
26    }
27];
28let CrmContactsPageRoutingModule = class CrmContactsPageRoutingModule {
29};
30CrmContactsPageRoutingModule = (0,tslib__WEBPACK_IMPORTED_MODULE_1__.__decorate)([
31    (0,_angular_core__WEBPACK_IMPORTED_MODULE_2__.NgModule)({
32        imports: [_angular_router__WEBPACK_IMPORTED_MODULE_3__.RouterModule.forChild(routes)],
33        exports: [_angular_router__WEBPACK_IMPORTED_MODULE_3__.RouterModule],
34    })
35], CrmContactsPageRoutingModule);
36
37
38
39/***/ }),
40
41/***/ 75285:
42/*!*****************************************************!*\
43  !*** ./src/app/crm-contacts/crm-contacts.module.ts ***!
44  \*****************************************************/
45/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
46
47__webpack_require__.r(__webpack_exports__);
48/* harmony export */ __webpack_require__.d(__webpack_exports__, {
49/* harmony export */   "CrmContactsPageModule": () => (/* binding */ CrmContactsPageModule)
50/* harmony export */ });
51/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ 39859);
52/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/core */ 14001);
53/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/common */ 28267);
54/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/forms */ 18346);
55/* harmony import */ var _ionic_angular__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ionic/angular */ 78099);
56/* harmony import */ var _crm_contacts_routing_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./crm-contacts-routing.module */ 76789);
57/* harmony import */ var _crm_contacts_page__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./crm-contacts.page */ 9357);
58/* harmony import */ var _crm_shared_crm_shared_module__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../crm-shared/crm-shared.module */ 27194);
59
60
61
62
63
64
65
66
67let CrmContactsPageModule = class CrmContactsPageModule {
68};
69CrmContactsPageModule = (0,tslib__WEBPACK_IMPORTED_MODULE_3__.__decorate)([
70    (0,_angular_core__WEBPACK_IMPORTED_MODULE_4__.NgModule)({
71        imports: [
72            _angular_common__WEBPACK_IMPORTED_MODULE_5__.CommonModule,
73            _angular_forms__WEBPACK_IMPORTED_MODULE_6__.FormsModule,
74            _ionic_angular__WEBPACK_IMPORTED_MODULE_7__.IonicModule,
75            _crm_contacts_routing_module__WEBPACK_IMPORTED_MODULE_0__.CrmContactsPageRoutingModule,
76            _crm_shared_crm_shared_module__WEBPACK_IMPORTED_MODULE_2__.CrmSharedModule,
77        ],
78        declarations: [_crm_contacts_page__WEBPACK_IMPORTED_MODULE_1__.CrmContactsPage]
79    })
80], CrmContactsPageModule);
81
82
83
84/***/ }),
85
86/***/ 9357:
87/*!***************************************************!*\
88  !*** ./src/app/crm-contacts/crm-contacts.page.ts ***!
89  \***************************************************/
90/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
91
92__webpack_require__.r(__webpack_exports__);
93/* harmony export */ __webpack_require__.d(__webpack_exports__, {
94/* harmony export */   "CrmContactsPage": () => (/* binding */ CrmContactsPage)
95/* harmony export */ });
96/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! tslib */ 39859);
97/* harmony import */ var _Users_achirinos_projects_gestionpos_app_PAQUETEBASE_app_code_node_modules_ngtools_webpack_src_loaders_direct_resource_js_crm_contacts_page_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !./node_modules/@ngtools/webpack/src/loaders/direct-resource.js!./crm-contacts.page.html */ 33836);
98/* harmony import */ var _crm_contacts_page_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./crm-contacts.page.scss */ 63866);
99/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/core */ 14001);
100/* harmony import */ var _ionic_angular__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ionic/angular */ 78099);
101/* harmony import */ var _service_server_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../service/server.service */ 67824);
102/* harmony import */ var _service_permission_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../service/permission.service */ 11540);
103/* harmony import */ var _crm_shared_crm_contact_form_crm_contact_form_component__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../crm-shared/crm-contact-form/crm-contact-form.component */ 31140);
104/* harmony import */ var _crm_shared_crm_select_seller_crm_select_seller_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../crm-shared/crm-select-seller/crm-select-seller.component */ 88039);
105/* harmony import */ var _crm_shared_crm_date_filter_crm_date_filter_component__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../crm-shared/crm-date-filter/crm-date-filter.component */ 66741);
106
107
108
109
110
111
112
113
114
115
116let CrmContactsPage = class CrmContactsPage {
117    constructor(nav, server, modalController, alertController, toastController, permissionService) {
118        this.nav = nav;
119        this.server = server;
120        this.modalController = modalController;
121        this.alertController = alertController;
122        this.toastController = toastController;
123        this.permissionService = permissionService;
124        this.data = [];
125        this.loading = false;
126        this.page = 1;
127        this.lastPage = 1;
128        this.total = 0;
129        this.q = '';
130        this.lifecycle = null;
131        this.ownerId = null;
132        this.ownerName = null;
133        this.sort = 'name';
134        this.dateFilter = null;
135        this.lifecycleLabels = { lead: 'Lead', prospect: 'Prospecto', customer: 'Cliente', churned: 'Inactivo' };
136        if (!localStorage.getItem('user_id') || localStorage.getItem('user_id') == 'null') {
137            this.nav.navigateRoot('/home');
138        }
139        this.user = JSON.parse(localStorage.getItem('user_data'));
140    }
141    ngOnInit() { }
142    ionViewDidEnter() {
143        this.reload();
144    }
145    can(permission) {
146        if (this.user && this.user.type == 1)
147            return true;
148        return this.permissionService.hasPermission(permission);
149    }
150    onSearch() {
151        clearTimeout(this.timer);
152        this.timer = setTimeout(() => this.reload(), 350);
153    }
154    /** Filtro por fecha de creación (útil para ver qué registró cada vendedor en el mes). */
155    onDateFilter(v) {
156        this.dateFilter = v;
157        // al filtrar por período, lo natural es ver primero los más nuevos
158        if (v && (v.from || v.to) && this.sort === 'name')
159            this.sort = 'recent';
160        this.reload();
161    }
162    reload() {
163        this.page = 1;
164        this.data = [];
165        this.load();
166    }
167    load(event = null) {
168        if (!event)
169            this.loading = true;
170        this.server.crmContacts(Object.assign({ q: this.q, lifecycle_stage: this.lifecycle, owner_user_id: this.ownerId, sort: this.sort, page: this.page, per_page: 30 }, _crm_shared_crm_date_filter_crm_date_filter_component__WEBPACK_IMPORTED_MODULE_6__.CrmDateFilterComponent.toParams(this.dateFilter))).subscribe((r) => {
171            const p = r.data;
172            this.data = this.page === 1 ? (p.data || []) : this.data.concat(p.data || []);
173            this.lastPage = p.last_page;
174            this.total = p.total;
175            this.loading = false;
176            if (event)
177                event.target.complete();
178        }, (err) => {
179            var _a;
180            this.loading = false;
181            if (event)
182                event.target.complete();
183            this.presentToast(((_a = err === null || err === void 0 ? void 0 : err.error) === null || _a === void 0 ? void 0 : _a.message) || 'Error al cargar contactos');
184        });
185    }
186    loadMore(event) {
187        if (this.page >= this.lastPage) {
188            event.target.complete();
189            return;
190        }
191        this.page++;
192        this.load(event);
193    }
194    pickOwner() {
195        return (0,tslib__WEBPACK_IMPORTED_MODULE_7__.__awaiter)(this, void 0, void 0, function* () {
196            const modal = yield this.modalController.create({
197                component: _crm_shared_crm_select_seller_crm_select_seller_component__WEBPACK_IMPORTED_MODULE_5__.CrmSelectSellerComponent, mode: 'ios', cssClass: 'my-custom-modal-css',
198                componentProps: { selectedId: this.ownerId, allowAll: true },
199            });
200            modal.onDidDismiss().then((res) => {
201                if (!res.data || !('seller' in res.data))
202                    return;
203                this.ownerId = res.data.seller ? res.data.seller.id : null;
204                this.ownerName = res.data.seller ? res.data.seller.display_name : null;
205                this.reload();
206            });
207            yield modal.present();
208        });
209    }
210    add() {
211        return (0,tslib__WEBPACK_IMPORTED_MODULE_7__.__awaiter)(this, void 0, void 0, function* () {
212            const modal = yield this.modalController.create({
213                component: _crm_shared_crm_contact_form_crm_contact_form_component__WEBPACK_IMPORTED_MODULE_4__.CrmContactFormComponent, mode: 'ios', cssClass: 'my-custom-modal-css', backdropDismiss: false,
214            });
215            modal.onDidDismiss().then((res) => {
216                if (res.data && res.data.contact)
217                    this.reload();
218            });
219            yield modal.present();
220        });
221    }
222    open(c) {
223        this.nav.navigateForward('/crm-contact-detail/' + c.id);
224    }
225    edit(c, ev) {
226        return (0,tslib__WEBPACK_IMPORTED_MODULE_7__.__awaiter)(this, void 0, void 0, function* () {
227            ev.stopPropagation();
228            const modal = yield this.modalController.create({
229                component: _crm_shared_crm_contact_form_crm_contact_form_component__WEBPACK_IMPORTED_MODULE_4__.Crm
229ContactFormComponent, mode: 'ios', cssClass: 'my-custom-modal-css', backdropDismiss: false,
230                componentProps: { contact: c },
231            });
232            modal.onDidDismiss().then((res) => {
233                if (res.data && res.data.contact)
234                    this.reload();
235            });
236            yield modal.present();
237        });
238    }
239    remove(c, ev) {
240        return (0,tslib__WEBPACK_IMPORTED_MODULE_7__.__awaiter)(this, void 0, void 0, function* () {
241            ev.stopPropagation();
242            const alert = yield this.alertController.create({
243                header: 'Eliminar contacto',
244                message: `¿Eliminar a ${c.full_name}?`,
245                mode: 'ios',
246                buttons: [
247                    { text: 'Cancelar', role: 'cancel' },
248                    { text: 'Eliminar', role: 'destructive', handler: () => {
249                            this.server.crmDeleteContact(c.id).subscribe((r) => {
250                                this.presentToast(r.status === 'success' ? 'Contacto eliminado' : (r.message || 'Error'));
251                                this.reload();
252                            }, (err) => { var _a; return this.presentToast(((_a = err === null || err === void 0 ? void 0 : err.error) === null || _a === void 0 ? void 0 : _a.message) || 'Error al eliminar'); });
253                        } },
254                ],
255            });
256            yield alert.present();
257        });
258    }
259    initials(c) {
260        return ((c.first_name || '')[0] || '').toUpperCase() + ((c.last_name || '')[0] || '').toUpperCase();
261    }
262    whatsapp(c, ev) {
263        ev.stopPropagation();
264        const num = (c.whatsapp || c.phone || '').replace(/\D/g, '');
265        if (num)
266            window.open('https://wa.me/' + num, '_blank');
267    }
268    presentToast(txt) {
269        return (0,tslib__WEBPACK_IMPORTED_MODULE_7__.__awaiter)(this, void 0, void 0, function* () {
270            const toast = yield this.toastController.create({ message: txt, duration: 3000, position: 'top', mode: 'ios', color: 'dark' });
271            toast.present();
272        });
273    }
274};
275CrmContactsPage.ctorParameters = () => [
276    { type: _ionic_angular__WEBPACK_IMPORTED_MODULE_8__.NavController },
277    { type: _service_server_service__WEBPACK_IMPORTED_MODULE_2__.ServerService },
278    { type: _ionic_angular__WEBPACK_IMPORTED_MODULE_8__.ModalController },
279    { type: _ionic_angular__WEBPACK_IMPORTED_MODULE_8__.AlertController },
280    { type: _ionic_angular__WEBPACK_IMPORTED_MODULE_8__.ToastController },
281    { type: _service_permission_service__WEBPACK_IMPORTED_MODULE_3__.PermissionService }
282];
283CrmContactsPage = (0,tslib__WEBPACK_IMPORTED_MODULE_7__.__decorate)([
284    (0,_angular_core__WEBPACK_IMPORTED_MODULE_9__.Component)({
285        selector: 'app-crm-contacts',
286        template: _Users_achirinos_projects_gestionpos_app_PAQUETEBASE_app_code_node_modules_ngtools_webpack_src_loaders_direct_resource_js_crm_contacts_page_html__WEBPACK_IMPORTED_MODULE_0__["default"],
287        styles: [_crm_contacts_page_scss__WEBPACK_IMPORTED_MODULE_1__]
288    })
289], CrmContactsPage);
290
291
292
293/***/ }),
294
295/***/ 33836:
296/*!********************************************************************************************************************!*\
297  !*** ./node_modules/@ngtools/webpack/src/loaders/direct-resource.js!./src/app/crm-contacts/crm-contacts.page.html ***!
298  \********************************************************************************************************************/
299/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
300
301__webpack_require__.r(__webpack_exports__);
302/* harmony export */ __webpack_require__.d(__webpack_exports__, {
303/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
304/* harmony export */ });
305/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("<ion-header class=\"ion-no-border\">\n  <ion-toolbar color=\"light\">\n    <ion-buttons slot=\"start\">\n      <ion-menu-button></ion-menu-button>\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n    <ion-buttons slot=\"primary\">\n      <ion-button fill=\"outline\" mode=\"ios\" color=\"primary\" (click)=\"add()\" *ngIf=\"can('crm.contacts.create')\">\n        Nuevo contacto\n        <ion-icon name=\"add-circle-outline\" slot=\"end\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n    <ion-title>Contactos</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <div class=\"breadcrumb-bar\">\n    <div class=\"breadcrumb\">
305\n      <span class=\"breadcrumb-item\" (click)=\"nav.navigateRoot('/main')\"><ion-icon name=\"home-outline\"></ion-icon> Inicio</span>\n      <ion-icon name=\"chevron-forward-outline\" class=\"breadcrumb-separator\"></ion-icon>\n      <span class=\"breadcrumb-item\" (click)=\"nav.navigateRoot('/crm-dashboard')\">CRM</span>\n      <ion-icon name=\"chevron-forward-outline\" class=\"breadcrumb-separator\"></ion-icon>\n      <span class=\"breadcrumb-item active\">Contactos</span>\n    </div>\n    <span class=\"count\" *ngIf=\"!loading\">{{ total }} contacto{{ total == 1 ? '' : 's' }}</span>\n  </div>\n\n  <div class=\"filters-bar\">\n    <ion-searchbar [(ngModel)]=\"q\" (ionInput)=\"onSearch()\" [debounce]=\"0\" mode=\"ios\" placeholder=\"Buscar por nombre, correo, teléfono o empresa\"></ion-searchbar>\n    <ion-select [(ngModel)]=\"lifecycle\" (ionChange)=\"reload()\" interface=\"alert\" placeholder=\"Etapa\" okText=\"Aceptar\" cancelText=\"Cancelar\">\n      <ion-select-option [value]=\"null\">Todas las etapas</ion-select-option>\n      <ion-select-option value=\"lead\">Lead</ion-select-option>\n      <ion-select-option value=\"prospect\">Prospecto</ion-select-option>\n      <ion-select-option value=\"customer\">Cliente</ion-select-option>\n      <ion-select-option value=\"churned\">Inactivo</ion-select-option>\n    </ion-select>\n    <ion-button fill=\"outline\" size=\"small\" color=\"medium\" (click)=\"pickOwner()\" *ngIf=\"can('crm.viewall')\">\n      <ion-icon name=\"person-outline\" slot=\"start\"></ion-icon>{{ ownerName || 'Todos los vendedores' }}\n    </ion-button>\n    <app-crm-date-filter (changed)=\"onDateFilter($event)\"></app-crm-date-filter>\n    <ion-select [(ngModel)]=\"sort\" (ionChange)=\"reload()\" interface=\"alert\" okText=\"Aceptar\" cancelText=\"Cancelar\">\n      <ion-select-option value=\"name\">Por nombre</ion-select-option>\n      <ion-select-option value=\"recent\">Más recientes</ion-select-option>\n      <ion-select-option value=\"activity\">Última actividad</ion-select-option>\n    </ion-select>\n  </div>\n\n  <div class=\"container-loading\" *ngIf=\"loading\">\n    <ion-list>\n      <ion-item *ngFor=\"let i of [1,2,3,4]\">\n        <ion-thumbnail slot=\"start\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-thumbnail>\n        <ion-label>\n          <h3><ion-skeleton-text [animated]=\"true\" style=\"width: 60%;\"></ion-skeleton-text></h3>\n          <p><ion-skeleton-text [animated]=\"true\" style=\"width: 40%;\"></ion-skeleton-text></p>\n        </ion-label>\n      </ion-item>\n    </ion-list>\n  </div>\n\n  <ng-container *ngIf=\"!loading\">\n    <div class=\"crm-list-item\" *ngFor=\"let c of data\" (click)=\"open(c)\">\n      <div class=\"avatar\">{{ initials(c) }}</div>\n      <div class=\"item-body\">\n        <span class=\"item-title\">{{ c.full_name }}<span class=\"primary-star\" *ngIf=\"c.is_primary\" title=\"Contacto principal\">★</span></span>\n        <span class=\"item-sub\">\n          <span *ngIf=\"c.job_title\">{{ c.job_title }} · </span>\n          <span *ngIf=\"c.client_name\">{{ c.client_name }}</span>\n          <span *ngIf=\"!c.client_name\">Sin empresa</span>\n          <span *ngIf=\"c.email\"> · {{ c.email }}</span>\n          <span *ngIf=\"c.phone\"> · {{ c.phone }}</span>\n          <span *ngIf=\"sort === 'recent'\"> · creado {{ c.created_at | date:'dd/MM/yyyy' }}</span>\n        </span>\n      </div>\n      <div class=\"item-end\">\n        <span class=\"status-badge medium\" *ngIf=\"c.lifecycle_stage\">{{ lifecycleLabels[c.lifecycle_stage] }}</span>\n        <span class=\"owner-name\" *ngIf=\"c.owner_name\">{{ c.owner_name }}</span>\n        <ion-button fill=\"clear\" size=\"small\" color=\"success\" (click)=\"whatsapp(c, $event)\" *ngIf=\"c.whatsapp || c.phone\" title=\"WhatsApp\">\n          <ion-icon name=\"logo-whatsapp\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n        <ion-button fill=\"clear\" size=\"small\" color=\"dark\" (click)=\"edit(c, $event)\" *ngIf=\"can('crm.contacts.edit')\">\n          <ion-icon name=\"create-outline\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n        <ion-button fill=\"clear\" size=\"small\" color=\"danger\" (click)=\"remove(c, $event)\" *ngIf=\"can('crm.contacts.delete')\">\n          <ion-icon name=\"trash-outline\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n      </div>\n    </div>\n\n    <ion-infinite-scroll (ionInfinite)=\"loadMore($event)\" [disabled]=\"page >= lastPage\">\n      <ion-infinite-scroll-content loadingSpinner=\"bubbles\" loadingText=\"Cargando contactos...\"></ion-infinite-scroll-content>\n    </ion-infinite-scroll>\n\n    <div class=\"no-records\" *ngIf=\"data.length === 0\">\n      <ion-icon name=\"people-outline\" class=\"empty-icon\"></ion-icon>\n      <p>Sin contactos{{ q ? ' para \"' + q + '\"' : '' }}.</p>\n      <ion-button mode=\"ios\" (click)=\"add()\" *ngIf=\"can('crm.contacts.create')\">Crear el primer contacto</ion-button>\n    </div>\n  </ng-container>\n</ion-content>\n");
306
307/***/ }),
308
309/***/ 63866:
310/*!*****************************************************!*\
311  !*** ./src/app/crm-contacts/crm-contacts.page.scss ***!
312  \*****************************************************/
313/***/ ((module) => {
314
315module.exports = "ion-content {\n  --background: #f4f5f8;\n}\n\n.breadcrumb-bar {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  grid-gap: 8px;\n  gap: 8px;\n  margin-bottom: 12px;\n}\n\n.breadcrumb {\n  display: flex;\n  align-items: center;\n  padding: 12px 0;\n  font-size: 14px;\n  color: var(--ion-color-medium);\n  margin-inline-start: 10px;\n  flex-wrap: wrap;\n}\n\n.breadcrumb-item {\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  grid-gap: 4px;\n  gap: 4px;\n  transition: color 0.2s;\n}
315\n\n.breadcrumb-item:not(.active):hover {\n  color: var(--ion-color-primary);\n  text-decoration: underline;\n}\n\n.breadcrumb-item.active {\n  color: var(--ion-color-dark);\n  font-weight: 500;\n  cursor: default;\n}\n\n.breadcrumb-separator {\n  margin: 0 8px;\n  font-size: 12px;\n  color: var(--ion-color-medium);\n}\n\n.quick-actions {\n  display: flex;\n  flex-wrap: wrap;\n  grid-gap: 6px;\n  gap: 6px;\n  align-items: center;\n}\n\n.shadow-card {\n  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);\n  margin: 0 0 16px;\n}\n\n.shadow-card ion-card-title {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  font-size: 18px;\n  grid-gap: 8px;\n  gap: 8px;\n}\n\n.shadow-card .title-action {\n  --padding-start: 4px;\n  --padding-end: 4px;\n  margin: 0;\n}\n\n.shadow-card .hint {\n  margin: 6px 0 0;\n  font-size: 13px;\n  color: var(--ion-color-medium);\n}\n\n.info-container {\n  display: grid;\n  grid-gap: 1rem;\n  gap: 1rem;\n  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n  margin-bottom: 0;\n}\n\n.info-container .shadow-card {\n  margin: 0;\n}\n\n.client-info-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  grid-gap: 4px 16px;\n  gap: 4px 16px;\n}\n\n.client-info-grid .client-info-item {\n  display: flex;\n  align-items: center;\n  grid-gap: 6px;\n  gap: 6px;\n  font-size: 14px;\n  padding: 2px 0;\n  min-width: 0;\n  word-break: break-word;\n}\n\n.client-info-grid .client-info-item ion-icon {\n  color: var(--ion-color-medium);\n  font-size: 16px;\n  flex-shrink: 0;\n}\n\n.crm-list-item {\n  display: flex;\n  align-items: center;\n  grid-gap: 12px;\n  gap: 12px;\n  padding: 10px 14px;\n  border: 1px solid #d7d7d7;\n  border-radius: 10px;\n  background: #fff;\n  margin-top: 10px;\n  cursor: pointer;\n}\n\n.crm-list-item:hover {\n  background: #fafbfc;\n}\n\n.crm-list-item .avatar {\n  width: 36px;\n  height: 36px;\n  border-radius: 50%;\n  background: var(--ion-color-primary);\n  color: #fff;\n  font-size: 13px;\n  font-weight: 600;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n}\n\n.crm-list-item .avatar.company {\n  background: #5260ff;\n}\n\n.crm-list-item .item-body {\n  flex: 1;\n  min-width: 0;\n  display: flex;\n  flex-direction: column;\n  grid-gap: 2px;\n  gap: 2px;\n}\n\n.crm-list-item .item-body .item-title {\n  font-size: 16px;\n  color: #000;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.crm-list-item .item-body .item-sub {\n  font-size: 13px;\n  color: #737373;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.crm-list-item .item-end {\n  display: flex;\n  align-items: center;\n  grid-gap: 6px;\n  gap: 6px;\n  flex-shrink: 0;\n}\n\n.status-badge,\n.chip {\n  display: inline-block;\n  padding: 4px 8px;\n  border-radius: 4px;\n  font-size: 12px;\n  white-space: nowrap;\n  font-weight: 500;\n}\n\n.status-badge.primary,\n.chip.primary {\n  background: rgba(0, 168, 221, 0.1);\n  color: var(--ion-color-primary);\n}\n\n.status-badge.success,\n.chip.success {\n  background: rgba(45, 211, 111, 0.1);\n  color: #2dd36f;\n}\n\n.status-badge.warning,\n.chip.warning {\n  background: rgba(255, 196, 9, 0.12);\n  color: #d9a400;\n}\n\n.status-badge.danger,\n.chip.danger {\n  background: rgba(255, 87, 34, 0.1);\n  color: var(--ion-color-danger);\n}\n\n.status-badge.medium,\n.chip.medium {\n  background: #e6e8ec;\n  color: #7A7B7C;\n}\n\n.status-badge.tertiary,\n.chip.tertiary {\n  background: rgba(82, 96, 255, 0.1);\n  color: #5260ff;\n}\n\n.chip {\n  border-radius: 15px;\n  font-weight: 600;\n}\n\n.tag-row {\n  display: flex;\n  flex-wrap: wrap;\n  grid-gap: 6px;\n  gap: 6px;\n  align-items: center;\n}\n\n.summary-cards {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n  grid-gap: 12px;\n  gap: 12px;\n  margin: 8px 0 16px;\n}\n\n.summary-cards .summary-stat-card {\n  background: #fff;\n  border-radius: 4px;\n  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);\n  display: flex;\n  align-items: center;\n  grid-gap: 14px;\n  gap: 14px;\n  padding: 14px;\n  margin: 0;\n}\n\n.summary-cards .summary-stat-card .stat-icon-wrap {\n  width: 44px;\n  height: 44px;\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  background: var(--ion-color-primary);\n}\n\n.summary-cards .summary-stat-card .stat-icon-wrap ion-icon {\n  font-size: 22px;\n  color: #fff;\n}\n\n.summary-cards .summary-stat-card .stat-icon-wrap.success {\n  background: var(--ion-color-success);\n}\n\n.summary-cards .summary-stat-card .stat-icon-wrap.warning {\n  background: var(--ion-color-warning);\n}\n\n.summary-cards .summary-stat-card .stat-icon-wrap.danger {\n  background: var(--ion-color-danger);\n}\n\n.summary-cards .summary-stat-card .stat-icon-wrap.tertiary {\
315n  background: #5260ff;\n}\n\n.summary-cards .summary-stat-card .stat-info {\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n}\n\n.summary-cards .summary-stat-card .stat-info .stat-label {\n  font-size: 11px;\n  color: var(--ion-color-medium);\n  text-transform: uppercase;\n  letter-spacing: 0.5px;\n}\n\n.summary-cards .summary-stat-card .stat-info .stat-value {\n  font-size: 18px;\n  font-weight: 700;\n  color: var(--ion-color-dark);\n}\n\n.summary-cards .summary-stat-card .stat-info .stat-sub {\n  font-size: 11px;\n  color: var(--ion-color-medium);\n  font-weight: 500;\n}\n\n.filters-bar {\n  display: flex;\n  flex-wrap: wrap;\n  grid-gap: 8px;\n  gap: 8px;\n  align-items: center;\n  margin-bottom: 4px;\n}\n\n.filters-bar ion-searchbar {\n  flex: 1 1 240px;\n  padding: 0;\n  --border-radius: 10px;\n}\n\n.filters-bar ion-select, .filters-bar .filter-select {\n  background: #fff;\n  border: 1px solid #d7d7d7;\n  border-radius: 8px;\n  font-size: 14px;\n  min-height: 36px;\n  --padding-start: 12px;\n  --padding-end: 12px;\n  max-width: 220px;\n}\n\n.no-records {\n  padding: 2rem 1rem;\n  text-align: center;\n  color: var(--ion-color-medium);\n}\n\n.no-records .empty-icon {\n  font-size: 3rem;\n  display: block;\n  margin: 0 auto 8px;\n}\n\n.no-records p {\n  margin: 0 0 8px;\n}\n\n.kv-grid {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  grid-gap: 12px 16px;\n  gap: 12px 16px;\n}\n\n.kv-grid .kv {\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n}\n\n.kv-grid .kv .k {\n  font-size: 11px;\n  color: var(--ion-color-medium);\n  text-transform: uppercase;\n  letter-spacing: 0.5px;\n}\n\n.kv-grid .kv .v {\n  font-size: 16px;\n  font-weight: 600;\n  color: var(--ion-color-dark);\n  word-break: break-word;\n}\n\n.kv-grid .kv .v.primary {\n  color: var(--ion-color-primary);\n}\n\n@media (max-width: 768px) {\n  .client-info-grid,\n.kv-grid {\n    grid-template-columns: 1fr;\n  }\n}\n\n.rfm-badge {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: 22px;\n  height: 22px;\n  padding: 0 4px;\n  border-radius: 6px;\n  font-weight: 800;\n  font-size: 12.5px;\n  font-family: inherit;\n}\n\n.rfm-badge.rfm-N {\n  background: rgba(82, 96, 255, 0.14);\n  color: #5260ff;\n}\n\n.rfm-badge.rfm-A {\n  background: rgba(45, 211, 111, 0.15);\n  color: #1e9e5a;\n}\n\n.rfm-badge.rfm-B {\n  background: rgba(0, 168, 221, 0.14);\n  color: var(--ion-color-primary);\n}\n\n.rfm-badge.rfm-C {\n  background: rgba(255, 196, 9, 0.18);\n  color: #9a6b00;\n}\n\n.rfm-badge.rfm-D {\n  background: #e6e8ec;\n  color: #7A7B7C;\n}\n\n.count {\n  font-size: 13px;\n  color: var(--ion-color-medium);\n}\n\n.primary-star {\n  color: #ffc409;\n  margin-left: 4px;\n  font-size: 13px;\n}\n\n.owner-name {\n  font-size: 12px;\n  color: var(--ion-color-medium);\n  white-space: nowrap;\n}\n\n.item-end ion-button {\n  --padding-start: 4px;\n  --padding-end: 4px;\n  margin: 0;\n}\n\n@media (max-width: 768px) {\n  .owner-name {\n    display: none;\n  }\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2NybS1zaGFyZWQvY3JtLXRoZW1lLnNjc3MiLCJjcm0tY29udGFjdHMucGFnZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBO0VBQ0UscUJBQUE7QUNBRjs7QURHQTtFQUNFLGFBQUE7RUFDQSxtQkFBQTtFQUNBLDhCQUFBO0VBQ0EsZUFBQTtFQUNBLGFBQUE7RUFBQSxRQUFBO0VBQ0EsbUJBQUE7QUNBRjs7QURFQTtFQUNFLGFBQUE7RUFDQSxtQkFBQTtFQUNBLGVBQUE7RUFDQSxlQUFBO0VBQ0EsOEJBQUE7RUFDQSx5QkFBQTtFQUNBLGVBQUE7QUNDRjs7QURDQTtFQUNFLGVBQUE7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSxhQUFBO0VBQUEsUUFBQTtFQUNBLHNCQUFBO0FDRUY7O0FEQUE7RUFDRSwrQkFBQTtFQUNBLDBCQUFBO0FDR0Y7O0FEREE7RUFDRSw0QkFBQTtFQUNBLGdCQUFBO0VBQ0EsZUFBQTtBQ0lGOztBREZBO0VBQ0UsYUFBQTtFQUNBLGVBQUE7RUFDQSw4QkFBQTtBQ0tGOztBREZBO0VBQ0UsYUFBQTtFQUNBLGVBQUE7RUFDQSxhQUFBO0VBQUEsUUFBQTtFQUNBLG1CQUFBO0FDS0Y7O0FERkE7RUFDRSx5Q0FBQTtFQUNBLGdCQUFBO0FDS0Y7O0FESEU7RUFDRSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSw4QkFBQTtFQUNBLGVBQUE7RUFDQSxhQUFBO0VBQUEsUUFBQTtBQ0tKOztBREhFO0VBQ0Usb0JBQUE7RUFDQSxrQkFBQTtFQUNBLFNBQUE7QUNLSjs7QURIRTtFQUNFLGVBQUE7RUFDQSxlQUFBO0VBQ0EsOEJBQUE7QUNLSjs7QUREQTtFQUNFLGFBQUE7RUFDQSxjQUFBO0VBQUEsU0FBQTtFQUNBLDJEQUFBO0VBQ0EsZ0JBQUE7QUNJRjs7QURGRTtFQUNFLFNBQUE7QUNJSjs7QURBQTtFQUNFLGFBQUE7RUFDQSw4QkFBQTtFQUNBLGtCQUFBO0VBQUEsYUFBQTtBQ0dGOztBRERFO0VBQ0UsYUFBQTtFQUNBLG1CQUFB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URqRDs7QUR4REU7RUFBVSxvQ0FBQTtFQUFzQyxjQUFBO0FDNERsRDs7QUQzREU7RUFBVSxtQ0FBQTtFQUFxQywrQkFBQTtBQytEakQ7O0FEOURFO0VBQVUsbUNBQUE7RUFBcUMsY0FBQTtBQ2tFakQ7O0FEakVFO0VBQVUsbUJBQUE7RUFBcUIsY0FBQTtBQ3FFakM7O0FBM1hBO0VBQVMsZUFBQTtFQUFpQiw4QkFBQTtBQWdZMUI7O0FBL1hBO0VBQWdCLGNBQUE7RUFBZ0IsZ0JBQUE7RUFBa0IsZUFBQTtBQXFZbEQ7O0FBcFlBO0VBQWMsZUFBQTtFQUFpQiw4QkFBQTtFQUFnQyxtQkFBQTtBQTBZL0Q7O0FBellBO0VBQXVCLG9CQUFBO0VBQXNCLGtCQUFBO0VBQW9CLFNBQUE7QUErWWpFOztBQTdZQTtFQUNFO0lBQWMsYUFBQTtFQWlaZDtBQUNGIiwiZmlsZSI6ImNybS1jb250YWN0cy5wYWdlLnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBFc3RpbG9zIGNvbXBhcnRpZG9zIGRlbCBtw7NkdWxvIENSTSAoY2FsY2Fkb3MgZGVsIGRpc2XDsW8gYXByb2JhZG8geSBkZSBjbGllbnQtbW92ZW1lbnRzKVxuaW9uLWNvbnRlbnQge1xuICAtLWJhY2tncm91bmQ6ICNmNGY1Zjg7XG59XG5cbi5icmVhZGNydW1iLWJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBnYXA6IDhweDtcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcbn1cbi5icmVhZGNydW1iIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogMTJweCAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtKTtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogMTBweDtcbiAgZmxleC13cmFwOiB3cmFwO1xufVxuLmJyZWFkY3J1bWItaXRlbSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA0cHg7XG4gIHRyYW5zaXRpb246IGNvbG9yIDAuMnM7XG59XG4uYnJlYWRjcnVtYi1pdGVtOm5vdCguYWN0aXZlKTpob3ZlciB7XG4gIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuLmJyZWFkY3J1bWItaXRlbS5hY3RpdmUge1xuICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmspO1xuICBmb250LXdlaWdodDogNTAwO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG4uYnJlYWRjcnVtYi1zZXBhcmF0b3Ige1xuICBtYXJnaW46IDAgOHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtKTtcbn1cblxuLnF1aWNrLWFjdGlvbnMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGdhcDogNnB4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uc2hhZG93LWNhcmQge1xuICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgbWFyZ2luOiAwIDAgMTZweDtcblxuICBpb24tY2FyZC10aXRsZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBmb250LXNpemU6IDE4cHg7XG4gICAgZ2FwOiA4cHg7XG4gIH1cbiAgLnRpdGxlLWFjdGlvbiB7XG4gICAgLS1wYWRkaW5nLXN0YXJ0OiA0cHg7XG4gICAgLS1wYWRkaW5nLWVuZDogNHB4O1xuICAgIG1hcmdpbjogMDtcbiAgfVxuICAuaGludCB7XG4gICAgbWFyZ2luOiA2cHggMCAwO1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gIH1cbn1cblxuLmluZm8tY29udGFpbmVyIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ2FwOiAxcmVtO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDMwMHB4LCAxZnIpKTtcbiAgbWFyZ2luLWJvdHRvbTogMDtcblxuICAuc2hhZG93LWNhcmQge1xuICAgIG1hcmdpbjogMDtcbiAgfVxufVxuXG4uY2xpZW50LWluZm8tZ3JpZCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjtcbiAgZ2FwOiA0cHggMTZweDtcblxuICAuY2xpZW50LWluZm8taXRlbSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogNnB4O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBwYWRkaW5nOiAycHggMDtcbiAgICBtaW4td2lkdGg6IDA7XG4gICAgd29yZC1icmVhazogYnJlYWstd29yZDtcblxuICAgIGlvbi1pY29uIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtKTtcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgfVxufVxuXG4uY3JtLWxpc3QtaXRlbSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW
3151zOiBjZW50ZXI7XG4gIGdhcDogMTJweDtcbiAgcGFkZGluZzogMTBweCAxNHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZDdkN2Q3O1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG5cbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogI2ZhZmJmYztcbiAgfVxuXG4gIC5hdmF0YXIge1xuICAgIHdpZHRoOiAzNnB4O1xuICAgIGhlaWdodDogMzZweDtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXByaW1hcnkpO1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBmbGV4LXNocmluazogMDtcbiAgfVxuICAuYXZhdGFyLmNvbXBhbnkge1xuICAgIGJhY2tncm91bmQ6ICM1MjYwZmY7XG4gIH1cblxuICAuaXRlbS1ib2R5IHtcbiAgICBmbGV4OiAxO1xuICAgIG1pbi13aWR0aDogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAycHg7XG5cbiAgICAuaXRlbS10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICBjb2xvcjogIzAwMDtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgfVxuICAgIC5pdGVtLXN1YiB7XG4gICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICBjb2xvcjogIzczNzM3MztcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgfVxuICB9XG5cbiAgLml0ZW0tZW5kIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiA2cHg7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gIH1cbn1cblxuLnN0YXR1cy1iYWRnZSxcbi5jaGlwIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nOiA0cHggOHB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcblxuICAmLnByaW1hcnkgeyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDE2OCwgMjIxLCAwLjEpOyBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnkpOyB9XG4gICYuc3VjY2VzcyB7IGJhY2tncm91bmQ6IHJnYmEoNDUsIDIxMSwgMTExLCAwLjEpOyBjb2xvcjogIzJkZDM2ZjsgfVxuICAmLndhcm5pbmcgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTk2LCA5LCAwLjEyKTsgY29sb3I6ICNkOWE0MDA7IH1cbiAgJi5kYW5nZXIgIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsIDg3LCAzNCwgMC4xKTsgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXIpOyB9XG4gICYubWVkaXVtICB7IGJhY2tncm91bmQ6ICNlNmU4ZWM7IGNvbG9yOiAjN0E3QjdDOyB9XG4gICYudGVydGlhcnl7IGJhY2tncm91bmQ6IHJnYmEoODIsIDk2LCAyNTUsIDAuMSk7IGNvbG9yOiAjNTI2MGZmOyB9XG59XG4uY2hpcCB7XG4gIGJvcmRlci1yYWRpdXM6IDE1cHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG59XG5cbi50YWctcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBnYXA6IDZweDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnN1bW1hcnktY2FyZHMge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE4MHB4LCAxZnIpKTtcbiAgZ2FwOiAxMnB4O1xuICBtYXJnaW46IDhweCAwIDE2cHg7XG5cbiAgLnN1bW1hcnktc3RhdC1jYXJkIHtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAxNHB4O1xuICAgIHBhZGRpbmc6IDE0cHg7XG4gICAgbWFyZ2luOiAwO1xuXG4gICAgLnN0YXQtaWNvbi13cmFwIHtcbiAgICAgIHdpZHRoOiA0NHB4O1xuICAgICAgaGVpZ2h0OiA0NHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXByaW1hcnkpO1xuXG4gICAgICBpb24taWNvbiB7IGZvbnQtc2l6ZTogMjJweDsgY29sb3I6ICNmZmY7IH1cbiAgICAgICYuc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1zdWNjZXNzKTsgfVxuICAgICAgJi53YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXdhcm5pbmcpOyB9XG4gICAgICAmLmRhbmdlciAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyKTsgfVxuICAgICAgJi50ZXJ0aWFyeXsgYmFja2dyb3VuZDogIzUyNjBmZjsgfVxuICAgIH1cbiAgICAuc3RhdC1pbmZvIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgbWluLXdpZHRoOiAwO1xuXG4gICAgICAuc3RhdC1sYWJlbCB7IGZvbnQtc2l6ZTogMTFweDsgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC41cHg7IH1cbiAgICAgIC5zdGF0LXZhbHVlIHsgZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmspOyB9XG4gICAgICAuc3RhdC1zdWIgICB7IGZvbnQtc2l6ZTogMTFweDsgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pOyBmb250LXdlaWdodDogNTAwOyB9XG4gICAgfVxuICB9XG59XG5cbi5maWx0ZXJzLWJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgZ2FwOiA4cHg7XG4gIGFsaWduLWl0ZW
3151zOiBjZW50ZXI7XG4gIG1hcmdpbi1ib3R0b206IDRweDtcblxuICBpb24tc2VhcmNoYmFyIHtcbiAgICBmbGV4OiAxIDEgMjQwcHg7XG4gICAgcGFkZGluZzogMDtcbiAgICAtLWJvcmRlci1yYWRpdXM6IDEwcHg7XG4gIH1cbiAgaW9uLXNlbGVjdCwgLmZpbHRlci1zZWxlY3Qge1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2Q3ZDdkNztcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIG1pbi1oZWlnaHQ6IDM2cHg7XG4gICAgLS1wYWRkaW5nLXN0YXJ0OiAxMnB4O1xuICAgIC0tcGFkZGluZy1lbmQ6IDEycHg7XG4gICAgbWF4LXdpZHRoOiAyMjBweDtcbiAgfVxufVxuXG4ubm8tcmVjb3JkcyB7XG4gIHBhZGRpbmc6IDJyZW0gMXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG5cbiAgLmVtcHR5LWljb24ge1xuICAgIGZvbnQtc2l6ZTogM3JlbTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBtYXJnaW46IDAgYXV0byA4cHg7XG4gIH1cbiAgcCB7IG1hcmdpbjogMCAwIDhweDsgfVxufVxuXG4ua3YtZ3JpZCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTtcbiAgZ2FwOiAxMnB4IDE2cHg7XG5cbiAgLmt2IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgbWluLXdpZHRoOiAwO1xuXG4gICAgLmsgeyBmb250LXNpemU6IDExcHg7IGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OyB9XG4gICAgLnYgeyBmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyayk7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7IH1cbiAgICAudi5wcmltYXJ5IHsgY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5KTsgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAuY2xpZW50LWluZm8tZ3JpZCxcbiAgLmt2LWdyaWQge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xuICB9XG59XG5cbi5yZm0tYmFkZ2Uge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG1pbi13aWR0aDogMjJweDsgaGVpZ2h0OiAyMnB4OyBwYWRkaW5nOiAwIDRweDtcbiAgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXdlaWdodDogODAwOyBmb250LXNpemU6IDEyLjVweDtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG5cbiAgJi5yZm0tTiB7IGJhY2tncm91bmQ6IHJnYmEoODIsIDk2LCAyNTUsIDAuMTQpOyBjb2xvcjogIzUyNjBmZjsgfVxuICAmLnJmbS1BIHsgYmFja2dyb3VuZDogcmdiYSg0NSwgMjExLCAxMTEsIDAuMTUpOyBjb2xvcjogIzFlOWU1YTsgfVxuICAmLnJmbS1CIHsgYmFja2dyb3VuZDogcmdiYSgwLCAxNjgsIDIyMSwgMC4xNCk7IGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7IH1cbiAgJi5yZm0tQyB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxOTYsIDksIDAuMTgpOyBjb2xvcjogIzlhNmIwMDsgfVxuICAmLnJmbS1EIHsgYmFja2dyb3VuZDogI2U2ZThlYzsgY29sb3I6ICM3QTdCN0M7IH1cbn1cbiIsIkBpbXBvcnQgJy4uL2NybS1zaGFyZWQvY3JtLXRoZW1lJztcblxuLmNvdW50IHsgZm9udC1zaXplOiAxM3B4OyBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7IH1cbi5wcmltYXJ5LXN0YXIgeyBjb2xvcjogI2ZmYzQwOTsgbWFyZ2luLWxlZnQ6IDRweDsgZm9udC1zaXplOiAxM3B4OyB9XG4ub3duZXItbmFtZSB7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XG4uaXRlbS1lbmQgaW9uLWJ1dHRvbiB7IC0tcGFkZGluZy1zdGFydDogNHB4OyAtLXBhZGRpbmctZW5kOiA0cHg7IG1hcmdpbjogMDsgfVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgLm93bmVyLW5hbWUgeyBkaXNwbGF5OiBub25lOyB9XG59XG4iXX0= */";
316
317/***/ })
318
319}]);
320//# sourceMappingURL=src_app_crm-contacts_crm-contacts_module_ts.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.