ngx-scandoc 1.0.1 → 1.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.
- package/core/components/base.component.d.ts +6 -0
- package/core/components/camera-switch/camera-switch.component.d.ts +11 -0
- package/core/components/components.module.d.ts +10 -3
- package/core/components/scan/scan.component.d.ts +119 -0
- package/core/components/scan-results/scan-results.component.d.ts +20 -0
- package/core/components/webcam/webcam/webcam.component.d.ts +5 -2
- package/core/interfaces/config.d.ts +16 -0
- package/dialogs/components/blank/blank.component.d.ts +2 -3
- package/dialogs/components/scan-profile/scan-profile.component.d.ts +10 -116
- package/dialogs/components/turn-document/turn-document.component.d.ts +12 -0
- package/dialogs/dialogs.core.provider.d.ts +1 -1
- package/dialogs/dialogs.module.d.ts +2 -2
- package/esm2020/core/components/base.component.mjs +15 -0
- package/esm2020/core/components/camera-switch/camera-switch.component.mjs +22 -0
- package/esm2020/core/components/components.module.mjs +34 -6
- package/esm2020/core/components/scan/scan.component.mjs +582 -0
- package/esm2020/core/components/scan-results/scan-results.component.mjs +38 -0
- package/esm2020/core/components/webcam/webcam/webcam.component.mjs +23 -12
- package/esm2020/core/interfaces/config.mjs +2 -0
- package/esm2020/dialogs/components/blank/blank.component.mjs +6 -7
- package/esm2020/dialogs/components/scan-profile/scan-profile.component.mjs +33 -741
- package/esm2020/dialogs/components/scan-selfie/scan-selfie.component.mjs +2 -2
- package/esm2020/dialogs/components/turn-document/turn-document.component.mjs +32 -0
- package/esm2020/dialogs/dialogs.core.provider.mjs +18 -9
- package/esm2020/dialogs/dialogs.module.mjs +7 -7
- package/esm2020/lib/ngx-scandoc.module.mjs +1 -1
- package/esm2020/providers/auth.provider.mjs +3 -2
- package/esm2020/providers/camera.provider.mjs +40 -0
- package/esm2020/providers/interceptor.provider.mjs +2 -2
- package/esm2020/providers/layout.provider.mjs +28 -0
- package/esm2020/providers/scan.provider.mjs +4 -6
- package/esm2020/public-api.mjs +4 -2
- package/fesm2015/ngx-scandoc.mjs +1765 -1752
- package/fesm2015/ngx-scandoc.mjs.map +1 -1
- package/fesm2020/ngx-scandoc.mjs +1962 -1949
- package/fesm2020/ngx-scandoc.mjs.map +1 -1
- package/lib/ngx-scandoc.module.d.ts +1 -15
- package/package.json +1 -1
- package/providers/auth.provider.d.ts +1 -1
- package/providers/camera.provider.d.ts +17 -0
- package/providers/layout.provider.d.ts +11 -0
- package/providers/scan.provider.d.ts +3 -5
- package/public-api.d.ts +3 -1
- package/dialogs/components/scan-mobile/scan-mobile.component.d.ts +0 -16
- package/esm2020/dialogs/components/scan-mobile/scan-mobile.component.mjs +0 -43
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
import { ModuleWithProviders } from '@angular/core';
|
|
2
|
+
import { ScanDataConfig } from '../core/interfaces/config';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
import * as i1 from "../core/components/components.module";
|
|
4
5
|
import * as i2 from "../dialogs/dialogs.module";
|
|
5
|
-
export interface AuthConfig {
|
|
6
|
-
path: string;
|
|
7
|
-
tokenName: string;
|
|
8
|
-
clientId: string;
|
|
9
|
-
}
|
|
10
|
-
export interface ScanConfig {
|
|
11
|
-
extractionPath: string;
|
|
12
|
-
validationPath: string;
|
|
13
|
-
errorLoggingPath: string;
|
|
14
|
-
stateLessPath: string;
|
|
15
|
-
}
|
|
16
|
-
export interface ScanDataConfig {
|
|
17
|
-
auth: AuthConfig;
|
|
18
|
-
scan: ScanConfig;
|
|
19
|
-
}
|
|
20
6
|
export declare class NgxScandocModule {
|
|
21
7
|
static forRoot(config: ScanDataConfig): ModuleWithProviders<NgxScandocModule>;
|
|
22
8
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgxScandocModule, never>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { AuthConfig } from '../
|
|
3
|
+
import { AuthConfig } from '../core/interfaces/config';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class AuthProvider {
|
|
6
6
|
private http;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class NgxScandocCameraProvider {
|
|
4
|
+
mediaDevices: any;
|
|
5
|
+
deviceId: any;
|
|
6
|
+
switchCamera: Subject<unknown>;
|
|
7
|
+
cameraReady: boolean;
|
|
8
|
+
cameraSwitched: Subject<unknown>;
|
|
9
|
+
multipleWebcamsAvailable: boolean;
|
|
10
|
+
constructor();
|
|
11
|
+
setup(): void;
|
|
12
|
+
selectCamera(event: any): void;
|
|
13
|
+
cameraWasSwitched(deviceId: string): void;
|
|
14
|
+
get nextWebcamObservable(): import("rxjs").Observable<unknown>;
|
|
15
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxScandocCameraProvider, never>;
|
|
16
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<NgxScandocCameraProvider>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BreakpointObserver } from '@angular/cdk/layout';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class LayoutProvider {
|
|
4
|
+
private breakpointObserver;
|
|
5
|
+
isMobile: boolean;
|
|
6
|
+
readonly breakpoint$: import("rxjs").Observable<import("@angular/cdk/layout").BreakpointState>;
|
|
7
|
+
constructor(breakpointObserver: BreakpointObserver);
|
|
8
|
+
init(): void;
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LayoutProvider, never>;
|
|
10
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<LayoutProvider>;
|
|
11
|
+
}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import {
|
|
4
|
-
import { ScanConfig } from '../lib/ngx-scandoc.module';
|
|
3
|
+
import { ScanConfig } from '../core/interfaces/config';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
6
5
|
export declare class ScanProvider {
|
|
7
6
|
private http;
|
|
8
|
-
|
|
9
|
-
private config;
|
|
7
|
+
config: ScanConfig;
|
|
10
8
|
enableVerification: boolean;
|
|
11
9
|
canStoreImages: boolean;
|
|
12
|
-
constructor(http: HttpClient,
|
|
10
|
+
constructor(http: HttpClient, config: ScanConfig);
|
|
13
11
|
genderList(): {
|
|
14
12
|
M: string;
|
|
15
13
|
'M/M': string;
|
package/public-api.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export { BlankComponent } from './dialogs/components/blank/blank.component';
|
|
|
16
16
|
export { LoadingComponent } from './dialogs/components/loading/loading.component';
|
|
17
17
|
export { ScanProfileComponent } from './dialogs/components/scan-profile/scan-profile.component';
|
|
18
18
|
export { ScanSelfieComponent } from './dialogs/components/scan-selfie/scan-selfie.component';
|
|
19
|
-
export {
|
|
19
|
+
export { TurnDocumentComponent } from './dialogs/components/turn-document/turn-document.component';
|
|
20
20
|
export { WebcamModule } from './core/components/webcam/webcam.module';
|
|
21
21
|
export { NgxScandocModule } from './lib/ngx-scandoc.module';
|
|
22
|
+
export { ScanComponent } from './core/components/scan/scan.component';
|
|
23
|
+
export { CameraSwitchComponent } from './core/components/camera-switch/camera-switch.component';
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { OnInit } from '@angular/core';
|
|
2
|
-
import { MatDialogRef } from '@angular/material/dialog';
|
|
3
|
-
import { webRtcProvider } from '../../../providers/webrtc.provider';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export declare class ScanMobileComponent implements OnInit {
|
|
6
|
-
dialogRef: MatDialogRef<ScanMobileComponent>;
|
|
7
|
-
data: any;
|
|
8
|
-
private rtcProvider;
|
|
9
|
-
code: any;
|
|
10
|
-
constructor(dialogRef: MatDialogRef<ScanMobileComponent>, data: any, rtcProvider: webRtcProvider);
|
|
11
|
-
ngOnInit(): void;
|
|
12
|
-
close(): void;
|
|
13
|
-
action(): void;
|
|
14
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ScanMobileComponent, never>;
|
|
15
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ScanMobileComponent, "app-scan-mobile", never, {}, {}, never, never, false>;
|
|
16
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/material/dialog";
|
|
5
|
-
import * as i2 from "../../../providers/webrtc.provider";
|
|
6
|
-
import * as i3 from "angularx-qrcode";
|
|
7
|
-
import * as i4 from "@angular/material/button";
|
|
8
|
-
import * as i5 from "@angular/flex-layout";
|
|
9
|
-
import * as i6 from "@angular/flex-layout/extended";
|
|
10
|
-
import * as i7 from "@ngx-translate/core";
|
|
11
|
-
export class ScanMobileComponent {
|
|
12
|
-
constructor(dialogRef, data, rtcProvider) {
|
|
13
|
-
this.dialogRef = dialogRef;
|
|
14
|
-
this.data = data;
|
|
15
|
-
this.rtcProvider = rtcProvider;
|
|
16
|
-
}
|
|
17
|
-
ngOnInit() {
|
|
18
|
-
this.rtcProvider.setup();
|
|
19
|
-
this.rtcProvider.subject.subscribe((msg) => {
|
|
20
|
-
console.log('[MSG]' + msg);
|
|
21
|
-
}, // Called whenever there is a message from the server.
|
|
22
|
-
(err) => console.log(err), // Called if at any point WebSocket API signals some kind of error.
|
|
23
|
-
() => console.log('complete') // Called when connection is closed (for whatever reason).
|
|
24
|
-
);
|
|
25
|
-
console.log(this.data);
|
|
26
|
-
const path = 'https://192.168.1.104:4200/';
|
|
27
|
-
this.code = path + 'mobile?id=1';
|
|
28
|
-
}
|
|
29
|
-
close() {
|
|
30
|
-
this.dialogRef.close();
|
|
31
|
-
}
|
|
32
|
-
action() { }
|
|
33
|
-
}
|
|
34
|
-
ScanMobileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScanMobileComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.webRtcProvider }], target: i0.ɵɵFactoryTarget.Component });
|
|
35
|
-
ScanMobileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ScanMobileComponent, selector: "app-scan-mobile", ngImport: i0, template: "<header class=\"page-header\" fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <div class=\"title\" ngClass.lt-sm=\"title-small\">\n Send to mobile\n\n <!-- {{ data.text.statusText }} {{ data.text.status }} -->\n </div>\n\n <span fxFlex></span>\n\n <!-- <div class=\"separator\"></div>\n\n <button mat-button (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button> -->\n <!-- <mat-icon class=\"mr-16\" style=\"color:#888;\">info_outline</mat-icon> -->\n</header>\n\n<div fxLayout=\"column\" fxLayoutAlign=\"center center\">\n <!-- <img\n style=\"height: 240px; margin: 34px 0px;display: none;\"\n [src]=\"'/assets/images/illustrations/' + images[type]\"\n /> -->\n <!-- <img style=\"width:60px;\" src=\"/assets/images/illustrations/door-lock.png\"> -->\n\n<qrcode [qrdata]=\"code\" [width]=\"256\" [errorCorrectionLevel]=\"'M'\"></qrcode>\n\n\n</div>\n\n<!-- -->\n\n<footer>\n <div class=\"actions\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button (click)=\"close()\" mat-raised-button>\n {{ \"core.page.cancel\" | translate }}\n </button>\n\n <button (click)=\"action()\" color=\"accent\" mat-raised-button>\n <ng-container>\n {{ \"core.page.ok\" | translate }}\n </ng-container>\n </button>\n </div>\n</footer>\n", styles: [":host{display:flex;flex-direction:column;flex:1;height:100%;width:100%}.title{font-size:18px}.text{padding:0 30px;text-align:center;font-size:16px;margin:40px 0}.actions{min-height:60px}.actions button{min-width:120px;margin-right:16px;box-shadow:none;text-transform:uppercase}footer{background-color:#fff}footer button{box-shadow:none!important;border:1px solid rgba(0,0,0,.12);font-size:13px}\n", ".page-header{z-index:2000;height:64px;padding:0;background-color:#fff;border-bottom:1px solid rgba(0,0,0,.12)}.page-header .title{padding-left:24px;line-height:64px;font-size:18px}.page-header .separator{width:1px;background-color:#0000001f;height:100%}.page-header .total{line-height:64px}.page-header .total span{font-weight:700}.page-footer{height:64px}.page-footer button{margin-left:24px;box-shadow:none!important}\n"], dependencies: [{ kind: "component", type: i3.QRCodeComponent, selector: "qrcode", inputs: ["allowEmptyString", "colorDark", "colorLight", "cssClass", "elementType", "errorCorrectionLevel", "imageSrc", "imageHeight", "imageWidth", "margin", "qrdata", "scale", "version", "width", "alt", "ariaLabel", "title"], outputs: ["qrCodeURL"] }, { kind: "component", type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i5.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i5.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i6.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
|
|
36
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScanMobileComponent, decorators: [{
|
|
37
|
-
type: Component,
|
|
38
|
-
args: [{ selector: 'app-scan-mobile', template: "<header class=\"page-header\" fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <div class=\"title\" ngClass.lt-sm=\"title-small\">\n Send to mobile\n\n <!-- {{ data.text.statusText }} {{ data.text.status }} -->\n </div>\n\n <span fxFlex></span>\n\n <!-- <div class=\"separator\"></div>\n\n <button mat-button (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button> -->\n <!-- <mat-icon class=\"mr-16\" style=\"color:#888;\">info_outline</mat-icon> -->\n</header>\n\n<div fxLayout=\"column\" fxLayoutAlign=\"center center\">\n <!-- <img\n style=\"height: 240px; margin: 34px 0px;display: none;\"\n [src]=\"'/assets/images/illustrations/' + images[type]\"\n /> -->\n <!-- <img style=\"width:60px;\" src=\"/assets/images/illustrations/door-lock.png\"> -->\n\n<qrcode [qrdata]=\"code\" [width]=\"256\" [errorCorrectionLevel]=\"'M'\"></qrcode>\n\n\n</div>\n\n<!-- -->\n\n<footer>\n <div class=\"actions\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button (click)=\"close()\" mat-raised-button>\n {{ \"core.page.cancel\" | translate }}\n </button>\n\n <button (click)=\"action()\" color=\"accent\" mat-raised-button>\n <ng-container>\n {{ \"core.page.ok\" | translate }}\n </ng-container>\n </button>\n </div>\n</footer>\n", styles: [":host{display:flex;flex-direction:column;flex:1;height:100%;width:100%}.title{font-size:18px}.text{padding:0 30px;text-align:center;font-size:16px;margin:40px 0}.actions{min-height:60px}.actions button{min-width:120px;margin-right:16px;box-shadow:none;text-transform:uppercase}footer{background-color:#fff}footer button{box-shadow:none!important;border:1px solid rgba(0,0,0,.12);font-size:13px}\n", ".page-header{z-index:2000;height:64px;padding:0;background-color:#fff;border-bottom:1px solid rgba(0,0,0,.12)}.page-header .title{padding-left:24px;line-height:64px;font-size:18px}.page-header .separator{width:1px;background-color:#0000001f;height:100%}.page-header .total{line-height:64px}.page-header .total span{font-weight:700}.page-footer{height:64px}.page-footer button{margin-left:24px;box-shadow:none!important}\n"] }]
|
|
39
|
-
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
40
|
-
type: Inject,
|
|
41
|
-
args: [MAT_DIALOG_DATA]
|
|
42
|
-
}] }, { type: i2.webRtcProvider }]; } });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi1tb2JpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2RpYWxvZ3MvY29tcG9uZW50cy9zY2FuLW1vYmlsZS9zY2FuLW1vYmlsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvZGlhbG9ncy9jb21wb25lbnRzL3NjYW4tbW9iaWxlL3NjYW4tbW9iaWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7QUFTekUsTUFBTSxPQUFPLG1CQUFtQjtJQUc5QixZQUNTLFNBQTRDLEVBQ25CLElBQVMsRUFDakMsV0FBMkI7UUFGNUIsY0FBUyxHQUFULFNBQVMsQ0FBbUM7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7SUFDbEMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDaEMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBTTdCLENBQUMsRUFBRSxzREFBc0Q7UUFDekQsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsbUVBQW1FO1FBQ25HLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsMERBQTBEO1NBQ3pGLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyw2QkFBNkIsQ0FBQztRQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxhQUFhLENBQUM7SUFDbkMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxNQUFNLEtBQUksQ0FBQzs7Z0hBaENBLG1CQUFtQiw4Q0FLcEIsZUFBZTtvR0FMZCxtQkFBbUIsdURDVmhDLCt3Q0E0Q0E7MkZEbENhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7OzBCQVN4QixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyB3ZWJSdGNQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3Byb3ZpZGVycy93ZWJydGMucHJvdmlkZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2Nhbi1tb2JpbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2Nhbi1tb2JpbGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY2FuLW1vYmlsZS5jb21wb25lbnQuc2NzcycsICcuLy4uLy4uL3Njc3MvZGlhbG9nLnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU2Nhbk1vYmlsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvZGU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8U2Nhbk1vYmlsZUNvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXG4gICAgcHJpdmF0ZSBydGNQcm92aWRlcjogd2ViUnRjUHJvdmlkZXJcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucnRjUHJvdmlkZXIuc2V0dXAoKTtcblxuICAgIHRoaXMucnRjUHJvdmlkZXIuc3ViamVjdC5zdWJzY3JpYmUoXG4gICAgICAobXNnOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tNU0ddJyArIG1zZyk7XG5cblxuXG5cblxuICAgICAgfSwgLy8gQ2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGEgbWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICAoZXJyOiBhbnkpID0+IGNvbnNvbGUubG9nKGVyciksIC8vIENhbGxlZCBpZiBhdCBhbnkgcG9pbnQgV2ViU29ja2V0IEFQSSBzaWduYWxzIHNvbWUga2luZCBvZiBlcnJvci5cbiAgICAgICgpID0+IGNvbnNvbGUubG9nKCdjb21wbGV0ZScpIC8vIENhbGxlZCB3aGVuIGNvbm5lY3Rpb24gaXMgY2xvc2VkIChmb3Igd2hhdGV2ZXIgcmVhc29uKS5cbiAgICApO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZGF0YSk7XG4gICAgY29uc3QgcGF0aCA9ICdodHRwczovLzE5Mi4xNjguMS4xMDQ6NDIwMC8nO1xuICAgIHRoaXMuY29kZSA9IHBhdGggKyAnbW9iaWxlP2lkPTEnO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxuICBhY3Rpb24oKSB7fVxufVxuIiwiPGhlYWRlciBjbGFzcz1cInBhZ2UtaGVhZGVyXCIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ0aXRsZVwiIG5nQ2xhc3MubHQtc209XCJ0aXRsZS1zbWFsbFwiPlxuICAgIFNlbmQgdG8gbW9iaWxlXG5cbiAgICA8IS0tIHt7IGRhdGEudGV4dC5zdGF0dXNUZXh0IH19IHt7IGRhdGEudGV4dC5zdGF0dXMgfX0gLS0+XG4gIDwvZGl2PlxuXG4gIDxzcGFuIGZ4RmxleD48L3NwYW4+XG5cbiAgPCEtLSA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yXCI+PC9kaXY+XG5cbiAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+IC0tPlxuICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTE2XCIgc3R5bGU9XCJjb2xvcjojODg4O1wiPmluZm9fb3V0bGluZTwvbWF0LWljb24+IC0tPlxuPC9oZWFkZXI+XG5cbjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuICA8IS0tIDxpbWdcbiAgICBzdHlsZT1cImhlaWdodDogMjQwcHg7IG1hcmdpbjogMzRweCAwcHg7ZGlzcGxheTogbm9uZTtcIlxuICAgIFtzcmNdPVwiJy9hc3NldHMvaW1hZ2VzL2lsbHVzdHJhdGlvbnMvJyArIGltYWdlc1t0eXBlXVwiXG4gIC8+IC0tPlxuICA8IS0tIDxpbWcgc3R5bGU9XCJ3aWR0aDo2MHB4O1wiIHNyYz1cIi9hc3NldHMvaW1hZ2VzL2lsbHVzdHJhdGlvbnMvZG9vci1sb2NrLnBuZ1wiPiAtLT5cblxuPHFyY29kZSBbcXJkYXRhXT1cImNvZGVcIiBbd2lkdGhdPVwiMjU2XCIgW2Vycm9yQ29ycmVjdGlvbkxldmVsXT1cIidNJ1wiPjwvcXJjb2RlPlxuXG5cbjwvZGl2PlxuXG48IS0tICAtLT5cblxuPGZvb3Rlcj5cbiAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xvc2UoKVwiIG1hdC1yYWlzZWQtYnV0dG9uPlxuICAgICAge3sgXCJjb3JlLnBhZ2UuY2FuY2VsXCIgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cblxuICAgIDxidXR0b24gKGNsaWNrKT1cImFjdGlvbigpXCIgY29sb3I9XCJhY2NlbnRcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cbiAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgIHt7IFwiY29yZS5wYWdlLm9rXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9vdGVyPlxuIl19
|