@sumaris-net/ngx-components 2.0.0 → 2.0.3

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 (60) hide show
  1. package/esm2020/public_api.mjs +2 -2
  2. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +3 -3
  3. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +3 -3
  4. package/esm2020/src/app/core/settings/settings.page.mjs +2 -2
  5. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +6 -6
  6. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +35 -11
  7. package/esm2020/src/app/shared/pipes/property.pipes.mjs +3 -6
  8. package/esm2020/src/app/shared/shared.module.mjs +3 -3
  9. package/esm2020/src/app/social/job/job.model.mjs +1 -23
  10. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +11 -8
  11. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +1 -1
  12. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +23 -0
  13. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +71 -0
  14. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +4 -5
  15. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +2 -2
  16. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +2 -2
  17. package/fesm2015/sumaris-net.ngx-components.mjs +63 -40
  18. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
  19. package/fesm2020/sumaris-net.ngx-components.mjs +63 -38
  20. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
  21. package/package.json +1 -1
  22. package/plugins/clovelced-plugin-audiomanagement/README.md +66 -0
  23. package/plugins/cordova-plugin-camera/README.md +703 -0
  24. package/plugins/cordova-plugin-device/README.md +309 -0
  25. package/plugins/cordova-plugin-file/README.md +848 -0
  26. package/plugins/cordova-plugin-file-transfer/README.md +598 -0
  27. package/plugins/cordova-plugin-file-transfer/doc/de/README.md +311 -0
  28. package/plugins/cordova-plugin-file-transfer/doc/es/README.md +311 -0
  29. package/plugins/cordova-plugin-file-transfer/doc/fr/README.md +270 -0
  30. package/plugins/cordova-plugin-file-transfer/doc/it/README.md +311 -0
  31. package/plugins/cordova-plugin-file-transfer/doc/ja/README.md +311 -0
  32. package/plugins/cordova-plugin-file-transfer/doc/ko/README.md +311 -0
  33. package/plugins/cordova-plugin-file-transfer/doc/pl/README.md +311 -0
  34. package/plugins/cordova-plugin-file-transfer/doc/zh/README.md +311 -0
  35. package/plugins/cordova-plugin-ionic-keyboard/README.md +220 -0
  36. package/plugins/cordova-plugin-ionic-webview/README.md +181 -0
  37. package/plugins/cordova-plugin-media-capture/README.md +626 -0
  38. package/plugins/cordova-plugin-splashscreen/README.md +387 -0
  39. package/plugins/cordova-plugin-statusbar/README.md +341 -0
  40. package/plugins/cordova-plugin-telerik-imagepicker/README.md +155 -0
  41. package/plugins/cordova-plugin-whitelist/README.md +185 -0
  42. package/plugins/cordova-sqlite-storage/README.md +1848 -0
  43. package/plugins/integrator-cordova-plugin-downloader/README.md +49 -0
  44. package/public_api.d.ts +1 -1
  45. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +2 -2
  46. package/src/app/core/form/entity/entity-editor.class.d.ts +2 -2
  47. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +3 -3
  48. package/src/app/shared/pipes/date-format.pipe.d.ts +22 -11
  49. package/src/app/shared/pipes/property.pipes.d.ts +4 -6
  50. package/src/app/social/job/job.model.d.ts +0 -11
  51. package/src/app/social/job/progression/job-progression.icon.d.ts +2 -2
  52. package/src/app/social/job/progression/job-progression.list.d.ts +1 -1
  53. package/src/app/social/job/progression/job-progression.model.d.ts +11 -0
  54. package/src/app/social/job/{job.service.d.ts → progression/job-progression.service.d.ts} +5 -5
  55. package/src/app/social/job/testing/job-progression.testing.d.ts +4 -4
  56. package/src/app/social/job/testing/job-progression.testing.service.d.ts +2 -2
  57. package/src/assets/i18n/en-US.json +20 -5
  58. package/src/assets/i18n/en.json +18 -4
  59. package/src/assets/i18n/fr.json +13 -5
  60. package/esm2020/src/app/social/job/job.service.mjs +0 -71
@@ -0,0 +1,49 @@
1
+ Android Downloader Cordova plugin
2
+ ========
3
+
4
+ This plugin is designed to support downloading files using Android DownloadManager.
5
+
6
+
7
+ Installation
8
+ --------
9
+
10
+ ```bash
11
+ cordova plugin add integrator-cordova-plugin-downloader
12
+ ```
13
+
14
+ Usage
15
+ --------
16
+
17
+ ```javascript
18
+
19
+ var request = {
20
+ uri: '',
21
+ title: '',
22
+ description: '',
23
+ mimeType: '',
24
+ visibleInDownloadsUi: true,
25
+ notificationVisibility: 0,
26
+
27
+ // Either of the next three properties
28
+ destinationInExternalFilesDir: {
29
+ dirType: '',
30
+ subPath: ''
31
+ },
32
+ destinationInExternalPublicDir: {
33
+ dirType: '',
34
+ subPath: ''
35
+ },
36
+ destinationUri: '',
37
+ headers: [{header: 'Authorization', value: 'Bearer iaksjfd89aklfdlkasdjf'}]
38
+ };
39
+
40
+ this.downloader.download(request)
41
+ .then((location) => console.log('File download location:' + location))
42
+ .catch((error) => console.error(error));
43
+ ```
44
+
45
+ ## Credits and License ##
46
+
47
+ Based on Emil Bay's cordova-plugin-android-downloadmanager(<https://github.com/emilbayes/cordova-plugin-android-downloadmanager>)
48
+
49
+
package/public_api.d.ts CHANGED
@@ -205,7 +205,7 @@ export * from './src/app/social/user-event/user-event.service';
205
205
  export * from './src/app/social/user-event/notification/user-event-notification.icon';
206
206
  export * from './src/app/social/job/job.module';
207
207
  export * from './src/app/social/job/job.model';
208
- export * from './src/app/social/job/job.service';
208
+ export * from './src/app/social/job/progression/job-progression.service';
209
209
  export * from './src/app/social/job/progression/job-progression.icon';
210
210
  export * from './src/app/social/job/progression/job-progression.list';
211
211
  export * from './src/app/social/message/message.module';
@@ -6,7 +6,7 @@ import { Entity } from '../../services/model/entity.model';
6
6
  import { UsageMode } from '../../services/model/settings.model';
7
7
  import { FormGroup } from '@angular/forms';
8
8
  import { AppTabEditor, AppTabEditorOptions } from './editor.class';
9
- import { DateFormatPipe } from '../../../shared/pipes/date-format.pipe';
9
+ import { DateFormatService } from '../../../shared/pipes/date-format.pipe';
10
10
  import { Environment } from '../../../../environments/environment.class';
11
11
  import { WaitForOptions } from '../../../shared/observables';
12
12
  import { FormErrorTranslator } from '../../../shared/validator/form-error-adapter.class';
@@ -30,7 +30,7 @@ export declare abstract class AppEntityEditorModal<T extends Entity<T, ID>, ID =
30
30
  private _usageMode;
31
31
  protected _logPrefix: any;
32
32
  protected _isNew: boolean;
33
- protected readonly dateFormat: DateFormatPipe;
33
+ protected readonly dateFormat: DateFormatService;
34
34
  protected readonly cd: ChangeDetectorRef;
35
35
  protected readonly settings: LocalSettingsService;
36
36
  protected readonly modalCtrl: ModalController;
@@ -6,7 +6,7 @@ import { UsageMode } from '../../services/model/settings.model';
6
6
  import { FormGroup } from '@angular/forms';
7
7
  import { AppTabEditor, AppTabEditorOptions, IAppTabEditor } from './editor.class';
8
8
  import { EntityServiceLoadOptions, IEntityService } from '../../../shared/services/entity-service.class';
9
- import { DateFormatPipe } from '../../../shared/pipes/date-format.pipe';
9
+ import { DateFormatService } from '../../../shared/pipes/date-format.pipe';
10
10
  import { Environment } from '../../../../environments/environment.class';
11
11
  import { HistoryPageReference } from '../../services/model/history.model';
12
12
  import { WaitForOptions } from '../../../shared/observables';
@@ -54,7 +54,7 @@ export declare abstract class AppEntityEditor<T extends Entity<T, ID>, S extends
54
54
  private readonly _autoUpdateRoute;
55
55
  private _autoOpenNextTab;
56
56
  private _listenChangesSubscription;
57
- protected readonly dateFormat: DateFormatPipe;
57
+ protected readonly dateFormat: DateFormatService;
58
58
  protected readonly cd: ChangeDetectorRef;
59
59
  protected readonly settings: LocalSettingsService;
60
60
  protected readonly environment: Environment;
@@ -2,16 +2,16 @@ import { OnInit } from '@angular/core';
2
2
  import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
3
3
  import { BehaviorSubject } from 'rxjs';
4
4
  import { Moment } from 'moment';
5
- import { DateFormatPipe } from '../../../pipes/date-format.pipe';
5
+ import { DateFormatService } from '../../../pipes/date-format.pipe';
6
6
  import { DisplayFn } from '../../../form/field.model';
7
7
  import * as i0 from "@angular/core";
8
8
  export declare class SwipeTestPage implements OnInit {
9
9
  protected formBuilder: UntypedFormBuilder;
10
- protected dateFormatPipe: DateFormatPipe;
10
+ protected dateFormat: DateFormatService;
11
11
  form: UntypedFormGroup;
12
12
  $dates: BehaviorSubject<Moment[]>;
13
13
  private _today;
14
- constructor(formBuilder: UntypedFormBuilder, dateFormatPipe: DateFormatPipe);
14
+ constructor(formBuilder: UntypedFormBuilder, dateFormat: DateFormatService);
15
15
  ngOnInit(): void;
16
16
  loadData(): Promise<void>;
17
17
  doSubmit(event?: Event): void;
@@ -1,23 +1,34 @@
1
- import { PipeTransform } from '@angular/core';
1
+ import { OnDestroy, PipeTransform } from '@angular/core';
2
2
  import { Moment } from 'moment';
3
3
  import { TranslateService } from '@ngx-translate/core';
4
4
  import { MomentDateAdapter } from '@angular/material-moment-adapter';
5
5
  import * as i0 from "@angular/core";
6
- export declare class DateFormatPipe implements PipeTransform {
7
- private dateAdapter;
8
- private translate;
9
- private readonly datePattern;
10
- private readonly dateTimePattern;
11
- private readonly dateTimeSecondsPattern;
12
- constructor(dateAdapter: MomentDateAdapter, translate: TranslateService);
6
+ export declare abstract class AbstractDateFormat {
7
+ protected dateAdapter: MomentDateAdapter;
8
+ protected translate: TranslateService;
9
+ private datePattern;
10
+ private dateTimePattern;
11
+ private dateTimeSecondsPattern;
12
+ protected constructor(dateAdapter: MomentDateAdapter, translate: TranslateService);
13
13
  transform(value: string | Moment | Date, args?: {
14
14
  pattern?: string;
15
15
  time?: boolean;
16
16
  seconds?: boolean;
17
17
  }): string;
18
- format(date: Moment, pattern: any): string;
19
- parse(value: string, parseFormat: any): Moment;
18
+ protected _updateTranslations(translations: any): void;
19
+ protected _getTranslationValue(translations: any, key: string, defaultValue: string): string;
20
+ }
21
+ export declare class DateFormatPipe extends AbstractDateFormat implements PipeTransform {
22
+ constructor(dateAdapter: MomentDateAdapter, translate: TranslateService);
20
23
  static ɵfac: i0.ɵɵFactoryDeclaration<DateFormatPipe, never>;
21
24
  static ɵpipe: i0.ɵɵPipeDeclaration<DateFormatPipe, "dateFormat", false>;
22
- static ɵprov: i0.ɵɵInjectableDeclaration<DateFormatPipe>;
25
+ }
26
+ export declare class DateFormatService extends AbstractDateFormat implements OnDestroy {
27
+ private _subscription;
28
+ constructor(dateAdapter: MomentDateAdapter, translate: TranslateService);
29
+ ngOnDestroy(): void;
30
+ format(date: Moment, pattern: any): string;
31
+ parse(value: string, parseFormat: any): Moment;
32
+ static ɵfac: i0.ɵɵFactoryDeclaration<DateFormatService, never>;
33
+ static ɵprov: i0.ɵɵInjectableDeclaration<DateFormatService>;
23
34
  }
@@ -1,5 +1,5 @@
1
- import { OnDestroy, PipeTransform } from '@angular/core';
2
- import { DateFormatPipe } from './date-format.pipe';
1
+ import { PipeTransform } from '@angular/core';
2
+ import { DateFormatService } from './date-format.pipe';
3
3
  import { FormFieldDefinition } from '../form/field.model';
4
4
  import { TranslateService } from '@ngx-translate/core';
5
5
  import * as i0 from "@angular/core";
@@ -11,14 +11,12 @@ export declare class PropertyGetPipe implements PipeTransform {
11
11
  static ɵfac: i0.ɵɵFactoryDeclaration<PropertyGetPipe, never>;
12
12
  static ɵpipe: i0.ɵɵPipeDeclaration<PropertyGetPipe, "propertyGet", false>;
13
13
  }
14
- export declare class PropertyFormatPipe implements PipeTransform, OnDestroy {
14
+ export declare class PropertyFormatPipe implements PipeTransform {
15
15
  private dateFormat;
16
16
  private translate;
17
- private _subscription;
18
17
  private _i18nYes;
19
18
  private _i18nNo;
20
- constructor(dateFormat: DateFormatPipe, translate: TranslateService);
21
- ngOnDestroy(): void;
19
+ constructor(dateFormat: DateFormatService, translate: TranslateService);
22
20
  transform(obj: any, keyOrDefinition: string | FormFieldDefinition): string | Promise<string>;
23
21
  get i18nYes(): string;
24
22
  get i18nNo(): string;
@@ -1,5 +1,4 @@
1
1
  import { Moment } from 'moment';
2
- import { Entity } from '../../core/services/model/entity.model';
3
2
  export declare type JobStatus = 'PENDING' | 'RUNNING' | 'SUCCESS' | 'ERROR' | 'FAILED' | 'WARNING' | 'CANCELLED';
4
3
  export interface IJob {
5
4
  id: number;
@@ -21,13 +20,3 @@ export declare class Job implements IJob {
21
20
  configuration: string;
22
21
  report: string;
23
22
  }
24
- export declare class JobProgression extends Entity<JobProgression> {
25
- static fromObject: (source: any, opts?: any) => JobProgression;
26
- id: number;
27
- name: string;
28
- message: string;
29
- current: number;
30
- total: number;
31
- constructor(id?: number);
32
- fromObject(source: any): void;
33
- }
@@ -1,8 +1,8 @@
1
1
  import { ChangeDetectorRef, EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
2
  import { ThemePalette } from '@angular/material/core';
3
3
  import { ProgressSpinnerMode } from '@angular/material/progress-spinner';
4
- import { IJobProgressionService } from '../job.service';
5
- import { JobProgression } from '../job.model';
4
+ import { IJobProgressionService } from './job-progression.service';
5
+ import { JobProgression } from './job-progression.model';
6
6
  import { PopoverController } from '@ionic/angular';
7
7
  import * as i0 from "@angular/core";
8
8
  export interface JobProgressionOptions {
@@ -1,5 +1,5 @@
1
1
  import { OnInit } from '@angular/core';
2
- import { JobProgression } from '../job.model';
2
+ import { JobProgression } from './job-progression.model';
3
3
  import * as i0 from "@angular/core";
4
4
  export interface JobProgressionListOptions {
5
5
  titleI18n?: string;
@@ -0,0 +1,11 @@
1
+ import { Entity } from '../../../core/services/model/entity.model';
2
+ export declare class JobProgression extends Entity<JobProgression> {
3
+ static fromObject: (source: any, opts?: any) => JobProgression;
4
+ id: number;
5
+ name: string;
6
+ message: string;
7
+ current: number;
8
+ total: number;
9
+ constructor(id?: number);
10
+ fromObject(source: any): void;
11
+ }
@@ -1,12 +1,12 @@
1
1
  import { InjectionToken } from '@angular/core';
2
- import { JobProgression } from './job.model';
3
- import { BaseGraphqlService } from '../../core/services/base-graphql-service.class';
4
- import { GraphqlService } from '../../core/graphql/graphql.service';
5
- import { Environment } from '../../../environments/environment.class';
2
+ import { JobProgression } from './job-progression.model';
3
+ import { BaseGraphqlService } from '../../../core/services/base-graphql-service.class';
4
+ import { GraphqlService } from '../../../core/graphql/graphql.service';
5
+ import { Environment } from '../../../../environments/environment.class';
6
6
  import { Observable } from 'rxjs';
7
7
  import { FetchPolicy, WatchQueryFetchPolicy } from '@apollo/client/core';
8
8
  import * as i0 from "@angular/core";
9
- export declare const APP_JOB_PROGRESSION_SERVICE: InjectionToken<JobProgressionService>;
9
+ export declare const APP_JOB_PROGRESSION_SERVICE: InjectionToken<IJobProgressionService>;
10
10
  export interface IJobProgressionService {
11
11
  watchAll(): Observable<JobProgression[]>;
12
12
  addJob(id: number, job?: JobProgression): any;
@@ -1,14 +1,14 @@
1
1
  import { JobProgressionIcon, JobProgressionOptions } from '../progression/job-progression.icon';
2
- import { JobProgression } from '../job.model';
3
- import { JobProgressionService } from '../job.service';
2
+ import { JobProgression } from '../progression/job-progression.model';
3
+ import { IJobProgressionService } from '../progression/job-progression.service';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class JobProgressionTestingPage {
6
- protected jobProgressionService: JobProgressionService;
6
+ protected jobProgressionService: IJobProgressionService;
7
7
  jobProgressionIcon: JobProgressionIcon;
8
8
  jobId: number;
9
9
  job: JobProgression;
10
10
  options: JobProgressionOptions;
11
- constructor(jobProgressionService: JobProgressionService);
11
+ constructor(jobProgressionService: IJobProgressionService);
12
12
  incrementJob(value: number): void;
13
13
  addJob(): void;
14
14
  private createJob;
@@ -1,7 +1,7 @@
1
- import { IJobProgressionService } from '../job.service';
1
+ import { IJobProgressionService } from '../progression/job-progression.service';
2
2
  import { FetchPolicy } from '@apollo/client/core';
3
3
  import { Observable } from 'rxjs';
4
- import { JobProgression } from '../job.model';
4
+ import { JobProgression } from '../progression/job-progression.model';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class JobProgressionTestService implements IJobProgressionService {
7
7
  private jobsSubject;
@@ -337,7 +337,7 @@
337
337
  "LABEL": "Organization code",
338
338
  "NAME": "Organization name"
339
339
  },
340
- "STATUS": "Status",
340
+ "STATUS": "State",
341
341
  "PUBKEY": "Public key",
342
342
  "PROFILE": "Profile",
343
343
  "PROFILE_ENUM": {
@@ -348,6 +348,7 @@
348
348
  },
349
349
  "LIST": {
350
350
  "TITLE": "Users",
351
+ "BTN_SEND_MESSAGE": "Send a message",
351
352
  "FILTER": {
352
353
  "SEARCH": "Search"
353
354
  }
@@ -362,6 +363,7 @@
362
363
  "OFFLINE": "Unreachable node",
363
364
  "SELECT_MODAL": {
364
365
  "TITLE": "Network nodes",
366
+ "BTN_SET_MANUALLY": "Define manually",
365
367
  "HELP": "Please choose a network node to connect to:",
366
368
  "NOT_COMPATIBLE_HELP": "Required version: v{{version}} or +"
367
369
  }
@@ -376,7 +378,7 @@
376
378
  "IMPORTATION_SUCCEED": "Import successfully completed!<br/><b>Offline mode</b> is now available.",
377
379
  "OFFLINE": "No network connection.",
378
380
  "OFFLINE_OR_UNAUTHORIZED": "No network connection, or unauthorized access.",
379
- "ONLINE": "Sucesfully connected to the network!",
381
+ "ONLINE": "Successfully connected to the network!",
380
382
  "OFFLINE_HELP": "The application works in <b>offline mode</b>.",
381
383
  "RETRY_TO_CONNECT": "<i>Retrying <b>to connect to the network...</b></i>",
382
384
  "UPDATE_OFFLINE_MODE": "<b>Offline mode</b> update available.",
@@ -386,11 +388,20 @@
386
388
  "NOT_COMPATIBLE_PEER": "The application works in <b>offline mode</b>, because the node <b>use a too old version</b>.<br/><small>If the problem persists, please <b>contact your administrator</b>, or select a node v{{version}} or superior.</small>"
387
389
  }
388
390
  },
391
+ "MAP": {
392
+ "ZOOM_IN": "Zoom in",
393
+ "ZOOM_OUT": "Zoom out",
394
+ "ENTER_FULLSCREEN": "Fullscreen mode",
395
+ "EXIT_FULLSCREEN": "Exit fullscreen mode",
396
+ "SHOW_GRATICULE": "Show graticule",
397
+ "HIDE_GRATICULE": "Hide graticule"
398
+ },
389
399
  "SOCIAL": {
390
400
  "USER_EVENT": {
391
401
  "NOTIFICATION": {
392
402
  "TITLE": "Notifications",
393
- "EMPTY": "No notification"
403
+ "EMPTY": "No notification",
404
+ "READ_ALL": "Mark all as read"
394
405
  },
395
406
  "EVENT_TYPE": "Type",
396
407
  "CREATION_DATE": "Date/Time",
@@ -445,6 +456,10 @@
445
456
  "ERROR": "Error while uploading file"
446
457
  }
447
458
  },
459
+ "IMAGE": {
460
+ "BTN_CAMERA_SOURCE": "Take a picture",
461
+ "BTN_GALLERY_SOURCE": "Open gallery"
462
+ },
448
463
  "ERROR": {
449
464
  "ALERT_HEADER": "Error",
450
465
  "FIELD_REQUIRED": "Value required",
@@ -454,9 +469,9 @@
454
469
  "FIELD_MAX_LENGTH": "Too long value{{ maxLength && (' (max ' + maxLength + 'characters)') }}.",
455
470
  "FIELD_MAX_LENGTH_COMPACT": "Too long value",
456
471
  "FIELD_MIN": "Minimal value: {{min}}",
457
- "FIELD_MIN_COMPACT": "Min value={{min}}",
472
+ "FIELD_MIN_COMPACT": "Min {{min}}",
458
473
  "FIELD_MAX": "Maximum value: {{max}}",
459
- "FIELD_MAX_COMPACT": "Max value={{max}}",
474
+ "FIELD_MAX_COMPACT": "Max {{max}}",
460
475
  "FIELD_MAXIMUM_DECIMALS": "Too many decimals ({{maxDecimals}} max)",
461
476
  "FIELD_MAXIMUM_DECIMALS_COMPACT": "Nb decimals > {{maxDecimals}}",
462
477
  "FIELD_INVALID": "Invalid value",
@@ -337,7 +337,7 @@
337
337
  "LABEL": "Organization code",
338
338
  "NAME": "Organization name"
339
339
  },
340
- "STATUS": "Status",
340
+ "STATUS": "State",
341
341
  "PUBKEY": "Public key",
342
342
  "PROFILE": "Profile",
343
343
  "PROFILE_ENUM": {
@@ -348,6 +348,7 @@
348
348
  },
349
349
  "LIST": {
350
350
  "TITLE": "Users",
351
+ "BTN_SEND_MESSAGE": "Send a message",
351
352
  "FILTER": {
352
353
  "SEARCH": "Search"
353
354
  }
@@ -362,6 +363,7 @@
362
363
  "OFFLINE": "Unreachable node",
363
364
  "SELECT_MODAL": {
364
365
  "TITLE": "Network nodes",
366
+ "BTN_SET_MANUALLY": "Define manually",
365
367
  "HELP": "Please choose a network node to connect to:",
366
368
  "NOT_COMPATIBLE_HELP": "Required version: v{{version}} or +"
367
369
  }
@@ -376,7 +378,7 @@
376
378
  "IMPORTATION_SUCCEED": "Import successfully completed!<br/><b>Offline mode</b> is now available.",
377
379
  "OFFLINE": "No network connection.",
378
380
  "OFFLINE_OR_UNAUTHORIZED": "No network connection, or unauthorized access.",
379
- "ONLINE": "Sucesfully connected to the network!",
381
+ "ONLINE": "Successfully connected to the network!",
380
382
  "OFFLINE_HELP": "The application works in <b>offline mode</b>.",
381
383
  "RETRY_TO_CONNECT": "<i>Retrying <b>to connect to the network...</b></i>",
382
384
  "UPDATE_OFFLINE_MODE": "<b>Offline mode</b> update available.",
@@ -386,6 +388,14 @@
386
388
  "NOT_COMPATIBLE_PEER": "The application works in <b>offline mode</b>, because the node <b>use a too old version</b>.<br/><small>If the problem persists, please <b>contact your administrator</b>, or select a node v{{version}} or superior.</small>"
387
389
  }
388
390
  },
391
+ "MAP": {
392
+ "ZOOM_IN": "Zoom in",
393
+ "ZOOM_OUT": "Zoom out",
394
+ "ENTER_FULLSCREEN": "Fullscreen mode",
395
+ "EXIT_FULLSCREEN": "Exit fullscreen mode",
396
+ "SHOW_GRATICULE": "Show graticule",
397
+ "HIDE_GRATICULE": "Hide graticule"
398
+ },
389
399
  "SOCIAL": {
390
400
  "USER_EVENT": {
391
401
  "NOTIFICATION": {
@@ -446,6 +456,10 @@
446
456
  "ERROR": "Error while uploading file"
447
457
  }
448
458
  },
459
+ "IMAGE": {
460
+ "BTN_CAMERA_SOURCE": "Take a picture",
461
+ "BTN_GALLERY_SOURCE": "Open gallery"
462
+ },
449
463
  "ERROR": {
450
464
  "ALERT_HEADER": "Error",
451
465
  "FIELD_REQUIRED": "Value required",
@@ -455,9 +469,9 @@
455
469
  "FIELD_MAX_LENGTH": "Too long value{{ maxLength && (' (max ' + maxLength + 'characters)') }}.",
456
470
  "FIELD_MAX_LENGTH_COMPACT": "Too long value",
457
471
  "FIELD_MIN": "Minimal value: {{min}}",
458
- "FIELD_MIN_COMPACT": "Min value={{min}}",
472
+ "FIELD_MIN_COMPACT": "Min {{min}}",
459
473
  "FIELD_MAX": "Maximum value: {{max}}",
460
- "FIELD_MAX_COMPACT": "Max value={{max}}",
474
+ "FIELD_MAX_COMPACT": "Max {{max}}",
461
475
  "FIELD_MAXIMUM_DECIMALS": "Too many decimals ({{maxDecimals}} max)",
462
476
  "FIELD_MAXIMUM_DECIMALS_COMPACT": "Nb decimals > {{maxDecimals}}",
463
477
  "FIELD_INVALID": "Invalid value",
@@ -103,11 +103,14 @@
103
103
  "YES": "Oui",
104
104
  "NO": "Non",
105
105
 
106
+ "DEBUG": "Debug",
106
107
  "UPDATED_ON": "Mise à jour le",
107
108
  "RECORDER": "Saisisseur",
108
109
  "RESULT_COUNT": "{{count}} résultats",
109
110
  "NO_RESULT": "Aucun résultat",
110
111
  "LOADING_DOTS": "Chargement...",
112
+ "PLEASE_WAIT": "Veuillez patienter...",
113
+ "NO_DATA": "Aucune donnée",
111
114
  "MISSING": "Manquant",
112
115
 
113
116
  "DISPLAYED_COLUMNS": "Paramétrage des colonnes",
@@ -128,10 +131,10 @@
128
131
  },
129
132
  "CONFIGURATION": {
130
133
  "OPTIONS": {
131
- "ANDROID_INSTALL_URL": "Android > Adresse d'installation App",
134
+ "ANDROID_INSTALL_URL": "Android > URL d'installation App",
132
135
  "LOGO": "Menu > Logo (largeur max 110px)",
133
136
  "FAVICON": "favicon",
134
- "GRAVATAR_URL": "Utilisateur > URL Gravatar (avec '{md5}'",
137
+ "GRAVATAR_URL": "Utilisateur > URL Gravatar (avec '{md5}')",
135
138
  "ENABLE_GRAVATAR": "Utilisateur > Utiliser Gravatar ?",
136
139
  "DEFAULT_LOCALE": "Langue par défaut",
137
140
  "DEFAULT_LATLONG_FORMAT": "Format lat/lon par défaut",
@@ -305,6 +308,8 @@
305
308
  "OFFLINE_MODE": "Forcer le mode hors-ligne ?",
306
309
  "DATA_ENTRY_DIVIDER": "Paramètres de saisie",
307
310
  "USAGE_MODE": "Mode de saisie",
311
+ "USAGE_MODE_FIELD": "Mode saisie <b>terrain</b>",
312
+ "USAGE_MODE_DESK": "Mode saisie <b>bureau</b>",
308
313
  "USAGE_MODES": {
309
314
  "FIELD": "Saisie terrain",
310
315
  "DESK": "Saisie bureau"
@@ -467,9 +472,9 @@
467
472
  "FIELD_MIN_LENGTH_COMPACT": "Valeur trop courte",
468
473
  "FIELD_MAX_LENGTH": "Valeur trop longue {{maxLength && (' (' + maxLength + ' caract. max)') }}",
469
474
  "FIELD_MAX_LENGTH_COMPACT": "Valeur trop longue",
470
- "FIELD_MIN": "La valeur minimale autorisée est {{min}}",
475
+ "FIELD_MIN": "Valeur minimale : {{min}}",
471
476
  "FIELD_MIN_COMPACT": "Min {{min}}",
472
- "FIELD_MAX": "Valeur maximale autorisée: {{max}}",
477
+ "FIELD_MAX": "Valeur maximale : {{max}}",
473
478
  "FIELD_MAX_COMPACT": "Max {{max}}",
474
479
  "FIELD_MAXIMUM_DECIMALS": "Trop de décimales (max: {{maxDecimals}})",
475
480
  "FIELD_MAXIMUM_DECIMALS_COMPACT": "Nb décimale > {{maxDecimals}}",
@@ -533,6 +538,7 @@
533
538
  "LOAD_ENTITIES_ERROR": "Erreur lors de chargement de la liste",
534
539
  "SAVE_ENTITY_ERROR": "Erreur lors de la sauvegarde",
535
540
  "SAVE_ENTITIES_ERROR": "Erreur lors de la sauvegarde de la liste",
541
+ "DELETE_ENTITY_ERROR": "Erreur lors de la suppression. <small><br/>Si le problème persiste, veuillez contacter votre administrateur.</small>",
536
542
  "SUBSCRIBE_ENTITY_ERROR": "Erreur lors de l'abonnement aux modifications distantes",
537
543
  "CONTROL_ENTITY_ERROR": "Erreur lors du contrôle de la validité des données",
538
544
  "TERMINATE_ENTITY_ERROR": "Terminaision de la saisie impossible. <small><br/>Si le problème persiste, veuillez contacter votre administrateur.</small>",
@@ -543,7 +549,9 @@
543
549
  "LOAD_ERROR": "Erreur de chargement",
544
550
  "SAVE_ERROR": "Erreur de sauvegarde",
545
551
  "SUBSCRIBE_ERROR": "Echec de l'abonnement distant aux modifications",
546
- "FIREFOX_NO_STORAGE": "L'application ne peut pas fonctionner sur Firefox en mode 'navigation privée' ou si la conservation de l'historique est désactivée"
552
+ "FIELD_NOT_EXISTS": "Cette valeur n'existe pas",
553
+ "FIREFOX_NO_STORAGE": "L'application ne peut pas fonctionner sur Firefox en mode 'navigation privée' ou si la conservation de l'historique est désactivée",
554
+ "FEATURE_NOT_IMPLEMENTED": "Fonctionnalité non implémentée ! <small><br/>Veuillez contacter votre administrateur.</small>"
547
555
  },
548
556
  "CONFIRM": {
549
557
  "ALERT_HEADER": "Confirmation",
@@ -1,71 +0,0 @@
1
- import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
2
- import { JobProgression } from './job.model';
3
- import { BaseGraphqlService } from '../../core/services/base-graphql-service.class';
4
- import { ENVIRONMENT } from '../../../environments/environment.class';
5
- import { of } from 'rxjs';
6
- import { gql } from '@apollo/client/core';
7
- import { isNil, toNumber } from '../../shared/functions';
8
- import { map } from 'rxjs/operators';
9
- import { SocialErrorCodes } from '../social.errors';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../../core/graphql/graphql.service";
12
- import * as i2 from "../../../environments/environment.class";
13
- export const APP_JOB_PROGRESSION_SERVICE = new InjectionToken('JobProgressionService');
14
- const QUERIES = {
15
- listenChanges: gql `subscription UpdateJobProgression($id: Int!, $interval: Int){
16
- data: updateJobProgression(id: $id, interval: $interval) {
17
- id
18
- name
19
- message
20
- current
21
- total
22
- }
23
- }`
24
- };
25
- export class JobProgressionService extends BaseGraphqlService {
26
- constructor(graphql, environment) {
27
- super(graphql, environment);
28
- this.graphql = graphql;
29
- this.environment = environment;
30
- this._logPrefix = '[job-progression-service] ';
31
- // For DEV only
32
- this._debug = environment && !environment.production;
33
- }
34
- watchAll(options) {
35
- return of([]); // TODO
36
- }
37
- addJob(id, job) {
38
- throw new Error('no implemented');
39
- }
40
- removeJob(id) {
41
- throw new Error('no implemented');
42
- }
43
- listenChanges(id, options) {
44
- if (isNil(id))
45
- throw new Error(`${this._logPrefix}Missing argument 'id'`);
46
- if (this._debug)
47
- console.debug(`${this._logPrefix}[WS] Listening changes for job progression {${id}}...`);
48
- return this.graphql.subscribe({
49
- query: QUERIES.listenChanges,
50
- fetchPolicy: options?.fetchPolicy,
51
- variables: { id, interval: toNumber(options?.interval, 10) },
52
- error: { code: SocialErrorCodes.SUBSCRIBE_JOB_PROGRESSION_ERROR, message: 'SOCIAL.ERROR.SUBSCRIBE_JOB_PROGRESSION_ERROR' }
53
- }).pipe(map(({ data }) => {
54
- const progression = data && JobProgression.fromObject(data);
55
- if (progression && this._debug)
56
- console.debug(`${this._logPrefix}Job progression ${id} updated on server`, progression);
57
- return progression;
58
- }));
59
- }
60
- }
61
- JobProgressionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: JobProgressionService, deps: [{ token: i1.GraphqlService }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
62
- JobProgressionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: JobProgressionService });
63
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: JobProgressionService, decorators: [{
64
- type: Injectable
65
- }], ctorParameters: function () { return [{ type: i1.GraphqlService }, { type: i2.Environment, decorators: [{
66
- type: Optional
67
- }, {
68
- type: Inject,
69
- args: [ENVIRONMENT]
70
- }] }]; } });
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC9qb2Ivam9iLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBRXBGLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBYyxHQUFHLEVBQXdCLE1BQU0scUJBQXFCLENBQUM7QUFDNUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFHcEQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxjQUFjLENBQXdCLHVCQUF1QixDQUFDLENBQUM7QUFFOUcsTUFBTSxPQUFPLEdBQUc7SUFDZCxhQUFhLEVBQUUsR0FBRyxDQUFBOzs7Ozs7OztJQVFoQjtDQUNILENBQUE7QUFVRCxNQUFNLE9BQU8scUJBQ1gsU0FBUSxrQkFBa0M7SUFHMUMsWUFDWSxPQUF1QixFQUNVLFdBQXdCO1FBRW5FLEtBQUssQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFIbEIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUduRSxJQUFJLENBQUMsVUFBVSxHQUFHLDRCQUE0QixDQUFDO1FBQy9DLGVBQWU7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7SUFDdkQsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUVSO1FBQ0MsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPO0lBQ3hCLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBVSxFQUFFLEdBQW9CO1FBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQVU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxhQUFhLENBQUMsRUFBVSxFQUFFLE9BR3pCO1FBRUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLHVCQUF1QixDQUFDLENBQUM7UUFDMUUsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSwrQ0FBK0MsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUxRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFnQjtZQUMzQyxLQUFLLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDNUIsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXO1lBQ2pDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUM7WUFDM0QsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLCtCQUErQixFQUFFLE9BQU8sRUFBRSw4Q0FBOEMsRUFBQztTQUN6SCxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRTtZQUNiLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVELElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN4SCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBRUosQ0FBQzs7a0hBakRVLHFCQUFxQixnREFNVixXQUFXO3NIQU50QixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFEakMsVUFBVTs7MEJBT04sUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEpvYlByb2dyZXNzaW9uIH0gZnJvbSAnLi9qb2IubW9kZWwnO1xuaW1wb3J0IHsgQmFzZUdyYXBocWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9iYXNlLWdyYXBocWwtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBHcmFwaHFsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvZ3JhcGhxbC9ncmFwaHFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtGZXRjaFBvbGljeSwgZ3FsLCBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3l9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHsgaXNOaWwsIHRvTnVtYmVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTb2NpYWxFcnJvckNvZGVzIH0gZnJvbSAnLi4vc29jaWFsLmVycm9ycyc7XG5pbXBvcnQge0Jhc2VFbnRpdHlHcmFwaHFsUXVlcmllc30gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9iYXNlLWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IEFQUF9KT0JfUFJPR1JFU1NJT05fU0VSVklDRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxKb2JQcm9ncmVzc2lvblNlcnZpY2U+KCdKb2JQcm9ncmVzc2lvblNlcnZpY2UnKTtcblxuY29uc3QgUVVFUklFUyA9IHtcbiAgbGlzdGVuQ2hhbmdlczogZ3FsYHN1YnNjcmlwdGlvbiBVcGRhdGVKb2JQcm9ncmVzc2lvbigkaWQ6IEludCEsICRpbnRlcnZhbDogSW50KXtcbiAgICBkYXRhOiB1cGRhdGVKb2JQcm9ncmVzc2lvbihpZDogJGlkLCBpbnRlcnZhbDogJGludGVydmFsKSB7XG4gICAgICBpZFxuICAgICAgbmFtZVxuICAgICAgbWVzc2FnZVxuICAgICAgY3VycmVudFxuICAgICAgdG90YWxcbiAgICB9XG4gIH1gXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUpvYlByb2dyZXNzaW9uU2VydmljZSB7XG4gIHdhdGNoQWxsKCk6IE9ic2VydmFibGU8Sm9iUHJvZ3Jlc3Npb25bXT47XG4gIGFkZEpvYihpZDogbnVtYmVyLCBqb2I/OiBKb2JQcm9ncmVzc2lvbik7XG4gIHJlbW92ZUpvYihpZDogbnVtYmVyKTtcbiAgbGlzdGVuQ2hhbmdlcyhpZDogbnVtYmVyLCBvcHRpb25zPzogeyBpbnRlcnZhbD86IG51bWJlcjsgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeSB9KTogT2JzZXJ2YWJsZTxKb2JQcm9ncmVzc2lvbj47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKb2JQcm9ncmVzc2lvblNlcnZpY2VcbiAgZXh0ZW5kcyBCYXNlR3JhcGhxbFNlcnZpY2U8Sm9iUHJvZ3Jlc3Npb24+XG4gIGltcGxlbWVudHMgSUpvYlByb2dyZXNzaW9uU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGdyYXBocWw6IEdyYXBocWxTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnRcbiAgKSB7XG4gICAgc3VwZXIoZ3JhcGhxbCwgZW52aXJvbm1lbnQpO1xuICAgIHRoaXMuX2xvZ1ByZWZpeCA9ICdbam9iLXByb2dyZXNzaW9uLXNlcnZpY2VdICc7XG4gICAgLy8gRm9yIERFViBvbmx5XG4gICAgdGhpcy5fZGVidWcgPSBlbnZpcm9ubWVudCAmJiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIHdhdGNoQWxsKG9wdGlvbnM/OiB7XG4gICAgZmV0Y2hQb2xpY3k/OiBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3lcbiAgfSk6IE9ic2VydmFibGU8Sm9iUHJvZ3Jlc3Npb25bXT4ge1xuICAgIHJldHVybiBvZihbXSk7IC8vIFRPRE9cbiAgfVxuXG4gIGFkZEpvYihpZDogbnVtYmVyLCBqb2I/OiBKb2JQcm9ncmVzc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignbm8gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIHJlbW92ZUpvYihpZDogbnVtYmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdubyBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgbGlzdGVuQ2hhbmdlcyhpZDogbnVtYmVyLCBvcHRpb25zPzoge1xuICAgIGludGVydmFsPzogbnVtYmVyO1xuICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3lcbiAgfSk6IE9ic2VydmFibGU8Sm9iUHJvZ3Jlc3Npb24+IHtcblxuICAgIGlmIChpc05pbChpZCkpIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLl9sb2dQcmVmaXh9TWlzc2luZyBhcmd1bWVudCAnaWQnYCk7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1bV1NdIExpc3RlbmluZyBjaGFuZ2VzIGZvciBqb2IgcHJvZ3Jlc3Npb24geyR7aWR9fS4uLmApO1xuXG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhxbC5zdWJzY3JpYmU8eyBkYXRhOiBhbnkgfT4oe1xuICAgICAgcXVlcnk6IFFVRVJJRVMubGlzdGVuQ2hhbmdlcyxcbiAgICAgIGZldGNoUG9saWN5OiBvcHRpb25zPy5mZXRjaFBvbGljeSxcbiAgICAgIHZhcmlhYmxlczogeyBpZCwgaW50ZXJ2YWw6IHRvTnVtYmVyKG9wdGlvbnM/LmludGVydmFsLCAxMCl9LFxuICAgICAgZXJyb3I6IHtjb2RlOiBTb2NpYWxFcnJvckNvZGVzLlNVQlNDUklCRV9KT0JfUFJPR1JFU1NJT05fRVJST1IsIG1lc3NhZ2U6ICdTT0NJQUwuRVJST1IuU1VCU0NSSUJFX0pPQl9QUk9HUkVTU0lPTl9FUlJPUid9XG4gICAgfSkucGlwZShcbiAgICAgIG1hcCgoe2RhdGF9KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzaW9uID0gZGF0YSAmJiBKb2JQcm9ncmVzc2lvbi5mcm9tT2JqZWN0KGRhdGEpO1xuICAgICAgICBpZiAocHJvZ3Jlc3Npb24gJiYgdGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUpvYiBwcm9ncmVzc2lvbiAke2lkfSB1cGRhdGVkIG9uIHNlcnZlcmAsIHByb2dyZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzaW9uO1xuICAgICAgfSlcbiAgICApO1xuXG4gIH1cbn1cbiJdfQ==