ngx-scandoc 0.0.1 → 1.0.1
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/app.worker.d.ts +1 -0
- package/core/components/components.module.d.ts +8 -0
- package/core/components/webcam/domain/webcam-image.d.ts +35 -0
- package/core/components/webcam/domain/webcam-init-error.d.ts +4 -0
- package/core/components/webcam/domain/webcam-mirror-properties.d.ts +3 -0
- package/core/components/webcam/util/webcam.util.d.ts +8 -0
- package/core/components/webcam/webcam/webcam.component.d.ts +202 -0
- package/core/components/webcam/webcam.module.d.ts +9 -0
- package/core/pipes/pipes.module.d.ts +7 -0
- package/core/pipes/safeResourceUrl.pipe.d.ts +10 -0
- package/core/shared/material.module.d.ts +28 -0
- package/dialogs/components/blank/blank.component.d.ts +17 -0
- package/dialogs/components/confirm/confirm.component.d.ts +30 -0
- package/dialogs/components/loading/loading.component.d.ts +5 -0
- package/dialogs/components/scan-mobile/scan-mobile.component.d.ts +16 -0
- package/dialogs/components/scan-profile/scan-profile.component.d.ts +124 -0
- package/dialogs/components/scan-selfie/scan-selfie.component.d.ts +83 -0
- package/dialogs/dialogs.core.provider.d.ts +18 -0
- package/dialogs/dialogs.module.d.ts +21 -0
- package/esm2020/core/app.worker.mjs +236 -0
- package/esm2020/core/components/components.module.mjs +18 -0
- package/esm2020/core/components/webcam/domain/webcam-image.mjs +58 -0
- package/esm2020/core/components/webcam/domain/webcam-init-error.mjs +3 -0
- package/esm2020/core/components/webcam/domain/webcam-mirror-properties.mjs +3 -0
- package/esm2020/core/components/webcam/util/webcam.util.mjs +48 -0
- package/esm2020/core/components/webcam/webcam/webcam.component.mjs +861 -0
- package/esm2020/core/components/webcam/webcam.module.mjs +22 -0
- package/esm2020/core/pipes/pipes.module.mjs +19 -0
- package/esm2020/core/pipes/safeResourceUrl.pipe.mjs +20 -0
- package/esm2020/core/shared/material.module.mjs +162 -0
- package/esm2020/dialogs/components/blank/blank.component.mjs +47 -0
- package/esm2020/dialogs/components/confirm/confirm.component.mjs +53 -0
- package/esm2020/dialogs/components/loading/loading.component.mjs +12 -0
- package/esm2020/dialogs/components/scan-mobile/scan-mobile.component.mjs +43 -0
- package/esm2020/dialogs/components/scan-profile/scan-profile.component.mjs +756 -0
- package/esm2020/dialogs/components/scan-selfie/scan-selfie.component.mjs +392 -0
- package/esm2020/dialogs/dialogs.core.provider.mjs +100 -0
- package/esm2020/dialogs/dialogs.module.mjs +89 -0
- package/esm2020/forms/form.module.mjs +87 -0
- package/esm2020/forms/types/avatar.type.mjs +53 -0
- package/esm2020/forms/types/profile.image.type.mjs +54 -0
- package/esm2020/forms/types/title.type.mjs +60 -0
- package/esm2020/lib/ngx-scandoc.module.mjs +28 -11
- package/esm2020/providers/auth.provider.mjs +57 -0
- package/esm2020/providers/interceptor.provider.mjs +61 -0
- package/esm2020/providers/scan.form.mjs +386 -0
- package/esm2020/providers/scan.provider.mjs +490 -0
- package/esm2020/providers/translation.provider.mjs +50 -0
- package/esm2020/providers/webrtc.provider.mjs +58 -0
- package/esm2020/public-api.mjs +22 -4
- package/fesm2015/ngx-scandoc.mjs +4178 -32
- package/fesm2015/ngx-scandoc.mjs.map +1 -1
- package/fesm2020/ngx-scandoc.mjs +4154 -32
- package/fesm2020/ngx-scandoc.mjs.map +1 -1
- package/forms/form.module.d.ts +18 -0
- package/forms/types/avatar.type.d.ts +14 -0
- package/forms/types/profile.image.type.d.ts +14 -0
- package/forms/types/title.type.d.ts +12 -0
- package/lib/ngx-scandoc.module.d.ts +20 -2
- package/package.json +6 -2
- package/providers/auth.provider.d.ts +21 -0
- package/providers/interceptor.provider.d.ts +13 -0
- package/providers/scan.form.d.ts +13 -0
- package/providers/scan.provider.d.ts +239 -0
- package/providers/translation.provider.d.ts +9 -0
- package/providers/webrtc.provider.d.ts +11 -0
- package/public-api.d.ts +21 -3
- package/esm2020/lib/ngx-scandoc.component.mjs +0 -22
- package/esm2020/lib/ngx-scandoc.service.mjs +0 -14
- package/lib/ngx-scandoc.component.d.ts +0 -8
- package/lib/ngx-scandoc.service.d.ts +0 -6
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./components/scan-profile/scan-profile.component";
|
|
3
|
+
import * as i2 from "./components/blank/blank.component";
|
|
4
|
+
import * as i3 from "./components/loading/loading.component";
|
|
5
|
+
import * as i4 from "./components/confirm/confirm.component";
|
|
6
|
+
import * as i5 from "./components/scan-mobile/scan-mobile.component";
|
|
7
|
+
import * as i6 from "./components/scan-selfie/scan-selfie.component";
|
|
8
|
+
import * as i7 from "angularx-qrcode";
|
|
9
|
+
import * as i8 from "@angular/forms";
|
|
10
|
+
import * as i9 from "@angular/common";
|
|
11
|
+
import * as i10 from "../forms/form.module";
|
|
12
|
+
import * as i11 from "@ngx-translate/core";
|
|
13
|
+
import * as i12 from "../core/shared/material.module";
|
|
14
|
+
import * as i13 from "../core/components/components.module";
|
|
15
|
+
import * as i14 from "../core/pipes/pipes.module";
|
|
16
|
+
import * as i15 from "@angular/flex-layout";
|
|
17
|
+
export declare class DialogsModule {
|
|
18
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DialogsModule, never>;
|
|
19
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<DialogsModule, [typeof i1.ScanProfileComponent, typeof i2.BlankComponent, typeof i3.LoadingComponent, typeof i4.ConfirmComponent, typeof i5.ScanMobileComponent, typeof i6.ScanSelfieComponent], [typeof i7.QRCodeModule, typeof i8.ReactiveFormsModule, typeof i9.CommonModule, typeof i8.FormsModule, typeof i10.AppFormModule, typeof i11.TranslateModule, typeof i12.MaterialModule, typeof i13.CoreComponentsModule, typeof i14.CorePipesModule, typeof i15.FlexModule, typeof i15.FlexLayoutModule], [typeof i1.ScanProfileComponent, typeof i3.LoadingComponent, typeof i2.BlankComponent, typeof i5.ScanMobileComponent, typeof i12.MaterialModule, typeof i6.ScanSelfieComponent]>;
|
|
20
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<DialogsModule>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
export const workertext = `
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
let readStream = true;
|
|
5
|
+
async function blobToBase64(blob) {
|
|
6
|
+
return new Promise((resolve, _) => {
|
|
7
|
+
const reader = new FileReader();
|
|
8
|
+
reader.onloadend = () => resolve(reader.result);
|
|
9
|
+
reader.readAsDataURL(blob);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
async function delay(ms) {
|
|
13
|
+
return new Promise((resolve) =>
|
|
14
|
+
ms > 0 ? setTimeout(resolve, ms) : resolve(0)
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function calculateDelay(startTime) {
|
|
19
|
+
const endTime = Date.now();
|
|
20
|
+
// difference in ms
|
|
21
|
+
const dt = endTime - startTime;
|
|
22
|
+
const delay = 100 - dt;
|
|
23
|
+
// console.log('[WORKER TIME]', dt, '[DELAY 100-x]', delay);
|
|
24
|
+
return delay > 4 ? delay : 0;
|
|
25
|
+
}
|
|
26
|
+
async function parseFrame(frameStream, trackSettings) {
|
|
27
|
+
const reader = frameStream.getReader();
|
|
28
|
+
|
|
29
|
+
while (readStream) {
|
|
30
|
+
const time = Date.now();
|
|
31
|
+
const result = await reader.read();
|
|
32
|
+
if (result.done) break;
|
|
33
|
+
|
|
34
|
+
const frameFromCamera = result.value;
|
|
35
|
+
|
|
36
|
+
await parseFrameFromCamera(frameFromCamera, trackSettings);
|
|
37
|
+
// wait
|
|
38
|
+
await delay(calculateDelay(time));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function parseFrameFast(frameStream, trackSettings) {
|
|
43
|
+
console.warn('FAST', performance.now());
|
|
44
|
+
const reader = frameStream.getReader();
|
|
45
|
+
const { width, height } = trackSettings;
|
|
46
|
+
const offscreenSmall = new OffscreenCanvas(384, 384);
|
|
47
|
+
const context = offscreenSmall.getContext('2d');
|
|
48
|
+
let time = 0;
|
|
49
|
+
while (true) {
|
|
50
|
+
// const t0 = performance.now();
|
|
51
|
+
// console.time('result');
|
|
52
|
+
const result = reader.read();
|
|
53
|
+
// console.timeEnd('result');
|
|
54
|
+
if (result.done) break;
|
|
55
|
+
|
|
56
|
+
const frameFromCamera = result.value;
|
|
57
|
+
// console.log(frameFromCamera.timestamp);
|
|
58
|
+
|
|
59
|
+
// const tt = frameFromCamera.timestamp - time;
|
|
60
|
+
// console.log(tt / 1000);
|
|
61
|
+
// time = frameFromCamera.timestamp;
|
|
62
|
+
|
|
63
|
+
// console.time('bitmap');
|
|
64
|
+
const bitmap = await createImageBitmap(frameFromCamera, {
|
|
65
|
+
premultiplyAlpha: 'default',
|
|
66
|
+
});
|
|
67
|
+
console.warn(new Date().getTime());
|
|
68
|
+
// console.timeEnd('bitmap');
|
|
69
|
+
|
|
70
|
+
// context.clearRect(0, 0, 384, 384);
|
|
71
|
+
// console.time('draw');
|
|
72
|
+
// context.drawImage(bitmap, 0, 0, width, height, 0, 0, 384, 384);
|
|
73
|
+
// console.timeEnd('draw');
|
|
74
|
+
// console.time('transfer');
|
|
75
|
+
// const bitmapSmall = offscreenSmall.transferToImageBitmap();
|
|
76
|
+
// console.timeEnd('transfer');
|
|
77
|
+
|
|
78
|
+
frameFromCamera.close();
|
|
79
|
+
// //
|
|
80
|
+
// const t1 = performance.now();
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
// await parseFrameFromCamera(frameFromCamera, trackSettings);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function parseFrameFromCamera(frameFromCamera, trackSettings) {
|
|
88
|
+
const { width, height } = trackSettings;
|
|
89
|
+
const offscreenSmall = new OffscreenCanvas(384, 384);
|
|
90
|
+
// console.time('bit2');
|
|
91
|
+
const bitmap = await createImageBitmap(frameFromCamera, {
|
|
92
|
+
premultiplyAlpha: 'default',
|
|
93
|
+
});
|
|
94
|
+
// console.timeEnd('bit2');
|
|
95
|
+
const context = offscreenSmall.getContext('2d');
|
|
96
|
+
|
|
97
|
+
// console.time('buffer');
|
|
98
|
+
// const buffer = new Uint8Array(frameFromCamera.allocationSize());
|
|
99
|
+
// let layout = await frameFromCamera.copyTo(buffer);
|
|
100
|
+
|
|
101
|
+
// const base64 = await blobToBase64(new Blob([buffer]));
|
|
102
|
+
// console.log(base64)
|
|
103
|
+
// console.timeEnd('buffer');
|
|
104
|
+
|
|
105
|
+
if (context) {
|
|
106
|
+
context.imageSmoothingEnabled = false;
|
|
107
|
+
|
|
108
|
+
// let videoFrame2 = frameFromCamera.clone();
|
|
109
|
+
|
|
110
|
+
// createImageBitmap();
|
|
111
|
+
|
|
112
|
+
// console.time('clear');
|
|
113
|
+
// context.clearRect(0, 0, width, height);
|
|
114
|
+
// console.timeEnd('clear');
|
|
115
|
+
// console.time('draw');
|
|
116
|
+
context.drawImage(bitmap, 0, 0, width, height, 0, 0, 384, 384);
|
|
117
|
+
// console.timeEnd('draw');
|
|
118
|
+
// context.drawImage(bit, 0, 0);
|
|
119
|
+
// bit2.close();
|
|
120
|
+
// bit.close();
|
|
121
|
+
// console.timeEnd('draw');
|
|
122
|
+
// console.time('capture');
|
|
123
|
+
|
|
124
|
+
// const bitmapsmall = offscreenSmall.transferToImageBitmap();
|
|
125
|
+
|
|
126
|
+
// const imageData = context.getImageData(0, 0, 384, 384);
|
|
127
|
+
// console.timeEnd('capture');
|
|
128
|
+
// console.time('blob');
|
|
129
|
+
const resized = await offscreenSmall.convertToBlob({
|
|
130
|
+
type: 'image/jpeg',
|
|
131
|
+
});
|
|
132
|
+
// console.timeEnd('blob');
|
|
133
|
+
// console.log(resized);
|
|
134
|
+
// console.time('base64');
|
|
135
|
+
const base64 = await blobToBase64(resized);
|
|
136
|
+
//console.timeEnd('base64');
|
|
137
|
+
// console.log(blob);
|
|
138
|
+
|
|
139
|
+
// console.time('convert')
|
|
140
|
+
// await convert(bitmap, trackSettings)
|
|
141
|
+
// console.timeEnd('convert');
|
|
142
|
+
// console.log(
|
|
143
|
+
// '%c ',
|
|
144
|
+
// 'font-size:384px; background:url('+blob+') no-repeat;'
|
|
145
|
+
// );
|
|
146
|
+
|
|
147
|
+
// console.timeEnd('blob');
|
|
148
|
+
postMessage({ base64, bitmap }, [bitmap]);
|
|
149
|
+
// videoFrame2.close();
|
|
150
|
+
}
|
|
151
|
+
frameFromCamera.close();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function convert(image, trackSettings) {
|
|
155
|
+
const { width, height } = trackSettings;
|
|
156
|
+
|
|
157
|
+
const offscreenSmall = new OffscreenCanvas(width, height);
|
|
158
|
+
|
|
159
|
+
const context = offscreenSmall.getContext('2d');
|
|
160
|
+
|
|
161
|
+
// console.time('buffer');
|
|
162
|
+
// const buffer = new Uint8Array(frameFromCamera.allocationSize());
|
|
163
|
+
// let layout = await frameFromCamera.copyTo(buffer);
|
|
164
|
+
// console.timeEnd('buffer');
|
|
165
|
+
|
|
166
|
+
if (context) {
|
|
167
|
+
context.imageSmoothingEnabled = false;
|
|
168
|
+
// let videoFrame2 = frameFromCamera.clone();
|
|
169
|
+
console.warn(image);
|
|
170
|
+
// createImageBitmap();
|
|
171
|
+
|
|
172
|
+
// console.time('clear');
|
|
173
|
+
// context.clearRect(0, 0, width, height);
|
|
174
|
+
// console.timeEnd('clear');
|
|
175
|
+
|
|
176
|
+
context.drawImage(image, 0, 0);
|
|
177
|
+
// context.drawImage(bit, 0, 0);
|
|
178
|
+
// image.close();
|
|
179
|
+
// console.timeEnd('drawB');
|
|
180
|
+
console.time('blob2');
|
|
181
|
+
const resized = await offscreenSmall.convertToBlob({
|
|
182
|
+
type: 'image/jpeg',
|
|
183
|
+
});
|
|
184
|
+
console.timeEnd('blob2');
|
|
185
|
+
|
|
186
|
+
// image.close();
|
|
187
|
+
// console.time('base64');
|
|
188
|
+
const base64 = await blobToBase64(resized);
|
|
189
|
+
|
|
190
|
+
// console.log(blob);
|
|
191
|
+
|
|
192
|
+
// console.log(
|
|
193
|
+
// '%c ',
|
|
194
|
+
// 'font-size:384px; background:url(' + base64 + ') no-repeat;'
|
|
195
|
+
// );
|
|
196
|
+
|
|
197
|
+
// console.timeEnd('base64');
|
|
198
|
+
//postMessage({ type: 'convert', base64 });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
addEventListener('message', ({ data }) => {
|
|
202
|
+
const { type, image, frameStream, trackSettings } = data;
|
|
203
|
+
// console.log(data);
|
|
204
|
+
switch (type) {
|
|
205
|
+
case 'start':
|
|
206
|
+
readStream = true;
|
|
207
|
+
parseFrame(frameStream, trackSettings);
|
|
208
|
+
break;
|
|
209
|
+
|
|
210
|
+
case 'fast':
|
|
211
|
+
readStream = true;
|
|
212
|
+
parseFrameFast(frameStream, trackSettings);
|
|
213
|
+
break;
|
|
214
|
+
|
|
215
|
+
case 'stop':
|
|
216
|
+
console.warn('STOP WORKER');
|
|
217
|
+
readStream = false;
|
|
218
|
+
break;
|
|
219
|
+
|
|
220
|
+
case 'convert':
|
|
221
|
+
convert(image, trackSettings);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// const canvas = document.createElement('canvas');
|
|
226
|
+
// const ctx = canvas.getContext('2d');
|
|
227
|
+
|
|
228
|
+
// if (data.canvas) {
|
|
229
|
+
// postMessage('ok');
|
|
230
|
+
// } else {
|
|
231
|
+
|
|
232
|
+
// postMessage(response);
|
|
233
|
+
// }
|
|
234
|
+
});
|
|
235
|
+
`;
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLndvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zY2FuZG9jL3NyYy9jb3JlL2FwcC53b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EwT3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3Qgd29ya2VydGV4dCA9IGBcblxuXG5sZXQgcmVhZFN0cmVhbSA9IHRydWU7XG5hc3luYyBmdW5jdGlvbiBibG9iVG9CYXNlNjQoYmxvYikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIF8pID0+IHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICB9KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGRlbGF5KG1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICBtcyA+IDAgPyBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSA6IHJlc29sdmUoMClcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlRGVsYXkoc3RhcnRUaW1lKSB7XG4gIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAvLyBkaWZmZXJlbmNlIGluIG1zXG4gIGNvbnN0IGR0ID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgY29uc3QgZGVsYXkgPSAxMDAgLSBkdDtcbiAvLyBjb25zb2xlLmxvZygnW1dPUktFUiBUSU1FXScsIGR0LCAnW0RFTEFZIDEwMC14XScsIGRlbGF5KTtcbiAgcmV0dXJuIGRlbGF5ID4gNCA/IGRlbGF5IDogMDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlRnJhbWUoZnJhbWVTdHJlYW0sIHRyYWNrU2V0dGluZ3MpIHtcbiAgY29uc3QgcmVhZGVyID0gZnJhbWVTdHJlYW0uZ2V0UmVhZGVyKCk7XG5cbiAgd2hpbGUgKHJlYWRTdHJlYW0pIHtcbiAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChyZXN1bHQuZG9uZSkgYnJlYWs7XG5cbiAgICBjb25zdCBmcmFtZUZyb21DYW1lcmEgPSByZXN1bHQudmFsdWU7XG5cbiAgICBhd2FpdCBwYXJzZUZyYW1lRnJvbUNhbWVyYShmcmFtZUZyb21DYW1lcmEsIHRyYWNrU2V0dGluZ3MpO1xuICAgIC8vIHdhaXRcbiAgICBhd2FpdCBkZWxheShjYWxjdWxhdGVEZWxheSh0aW1lKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VGcmFtZUZhc3QoZnJhbWVTdHJlYW0sIHRyYWNrU2V0dGluZ3MpIHtcbiAgY29uc29sZS53YXJuKCdGQVNUJywgcGVyZm9ybWFuY2Uubm93KCkpO1xuICBjb25zdCByZWFkZXIgPSBmcmFtZVN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0cmFja1NldHRpbmdzO1xuICBjb25zdCBvZmZzY3JlZW5TbWFsbCA9IG5ldyBPZmZzY3JlZW5DYW52YXMoMzg0LCAzODQpO1xuICBjb25zdCBjb250ZXh0ID0gb2Zmc2NyZWVuU21hbGwuZ2V0Q29udGV4dCgnMmQnKTtcbiAgbGV0IHRpbWUgPSAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIGNvbnN0IHQwID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgLy8gIGNvbnNvbGUudGltZSgncmVzdWx0Jyk7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVhZGVyLnJlYWQoKTtcbiAgICAvLyAgY29uc29sZS50aW1lRW5kKCdyZXN1bHQnKTtcbiAgICBpZiAocmVzdWx0LmRvbmUpIGJyZWFrO1xuXG4gICAgY29uc3QgZnJhbWVGcm9tQ2FtZXJhID0gcmVzdWx0LnZhbHVlO1xuICAgIC8vIGNvbnNvbGUubG9nKGZyYW1lRnJvbUNhbWVyYS50aW1lc3RhbXApO1xuXG4gICAgLy8gY29uc3QgdHQgPSBmcmFtZUZyb21DYW1lcmEudGltZXN0YW1wIC0gdGltZTtcbiAgICAvLyBjb25zb2xlLmxvZyh0dCAvIDEwMDApO1xuICAgIC8vIHRpbWUgPSBmcmFtZUZyb21DYW1lcmEudGltZXN0YW1wO1xuXG4gICAgLy8gY29uc29sZS50aW1lKCdiaXRtYXAnKTtcbiAgICBjb25zdCBiaXRtYXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChmcmFtZUZyb21DYW1lcmEsIHtcbiAgICAgIHByZW11bHRpcGx5QWxwaGE6ICdkZWZhdWx0JyxcbiAgICB9KTtcbiAgICBjb25zb2xlLndhcm4obmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuICAgIC8vIGNvbnNvbGUudGltZUVuZCgnYml0bWFwJyk7XG5cbiAgICAvLyBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCAzODQsIDM4NCk7XG4gICAgLy8gY29uc29sZS50aW1lKCdkcmF3Jyk7XG4gICAgLy8gY29udGV4dC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCAzODQsIDM4NCk7XG4gICAgLy8gY29uc29sZS50aW1lRW5kKCdkcmF3Jyk7XG4gICAgLy8gY29uc29sZS50aW1lKCd0cmFuc2ZlcicpO1xuICAgIC8vIGNvbnN0IGJpdG1hcFNtYWxsID0gb2Zmc2NyZWVuU21hbGwudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7XG4gICAgLy8gY29uc29sZS50aW1lRW5kKCd0cmFuc2ZlcicpO1xuXG4gICAgZnJhbWVGcm9tQ2FtZXJhLmNsb3NlKCk7XG4gICAgLy8gLy9cbiAgICAvLyBjb25zdCB0MSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cbiAgICAvLyBhd2FpdCBwYXJzZUZyYW1lRnJvbUNhbWVyYShmcmFtZUZyb21DYW1lcmEsIHRyYWNrU2V0dGluZ3MpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlRnJhbWVGcm9tQ2FtZXJhKGZyYW1lRnJvbUNhbWVyYSwgdHJhY2tTZXR0aW5ncykge1xuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRyYWNrU2V0dGluZ3M7XG4gIGNvbnN0IG9mZnNjcmVlblNtYWxsID0gbmV3IE9mZnNjcmVlbkNhbnZhcygzODQsIDM4NCk7XG4gIC8vIGNvbnNvbGUudGltZSgnYml0MicpO1xuICBjb25zdCBiaXRtYXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChmcmFtZUZyb21DYW1lcmEsIHtcbiAgICBwcmVtdWx0aXBseUFscGhhOiAnZGVmYXVsdCcsXG4gIH0pO1xuICAvLyBjb25zb2xlLnRpbWVFbmQoJ2JpdDInKTtcbiAgY29uc3QgY29udGV4dCA9IG9mZnNjcmVlblNtYWxsLmdldENvbnRleHQoJzJkJyk7XG5cbiAgLy8gICAgICBjb25zb2xlLnRpbWUoJ2J1ZmZlcicpO1xuICAvLyAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGZyYW1lRnJvbUNhbWVyYS5hbGxvY2F0aW9uU2l6ZSgpKTtcbiAgLy8gICAgICBsZXQgbGF5b3V0ID0gYXdhaXQgZnJhbWVGcm9tQ2FtZXJhLmNvcHlUbyhidWZmZXIpO1xuXG4gIC8vICAgICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IGJsb2JUb0Jhc2U2NChuZXcgQmxvYihbYnVmZmVyXSkpO1xuICAvLyBjb25zb2xlLmxvZyhiYXNlNjQpXG4gIC8vICAgICAgY29uc29sZS50aW1lRW5kKCdidWZmZXInKTtcblxuICBpZiAoY29udGV4dCkge1xuICAgIGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG5cbiAgICAvLyBsZXQgdmlkZW9GcmFtZTIgPSBmcmFtZUZyb21DYW1lcmEuY2xvbmUoKTtcblxuICAgIC8vICAgY3JlYXRlSW1hZ2VCaXRtYXAoKTtcblxuICAgIC8vIGNvbnNvbGUudGltZSgnY2xlYXInKTtcbiAgICAvLyBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAvLyAgY29uc29sZS50aW1lRW5kKCdjbGVhcicpO1xuICAgIC8vIGNvbnNvbGUudGltZSgnZHJhdycpO1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgMCwgMzg0LCAzODQpO1xuICAgIC8vIGNvbnNvbGUudGltZUVuZCgnZHJhdycpO1xuICAgIC8vIGNvbnRleHQuZHJhd0ltYWdlKGJpdCwgMCwgMCk7XG4gICAgLy8gIGJpdDIuY2xvc2UoKTtcbiAgICAvLyAgYml0LmNsb3NlKCk7XG4gICAgLy8gIGNvbnNvbGUudGltZUVuZCgnZHJhdycpO1xuICAgIC8vIGNvbnNvbGUudGltZSgnY2FwdHVyZScpO1xuXG4gICAgLy8gY29uc3QgYml0bWFwc21hbGwgPSBvZmZzY3JlZW5TbWFsbC50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtcblxuICAgIC8vIGNvbnN0IGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIDM4NCwgMzg0KTtcbiAgICAvLyAgY29uc29sZS50aW1lRW5kKCdjYXB0dXJlJyk7XG4gICAgLy8gY29uc29sZS50aW1lKCdibG9iJyk7XG4gICAgY29uc3QgcmVzaXplZCA9IGF3YWl0IG9mZnNjcmVlblNtYWxsLmNvbnZlcnRUb0Jsb2Ioe1xuICAgICAgdHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgIH0pO1xuICAgIC8vIGNvbnNvbGUudGltZUVuZCgnYmxvYicpO1xuICAgIC8vICBjb25zb2xlLmxvZyhyZXNpemVkKTtcbiAgICAvLyAgY29uc29sZS50aW1lKCdiYXNlNjQnKTtcbiAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCBibG9iVG9CYXNlNjQocmVzaXplZCk7XG4gICAgLy9jb25zb2xlLnRpbWVFbmQoJ2Jhc2U2NCcpO1xuICAgIC8vIGNvbnNvbGUubG9nKGJsb2IpO1xuXG4gICAgLy8gY29uc29sZS50aW1lKCdjb252ZXJ0JylcbiAgICAvLyBhd2FpdCBjb252ZXJ0KGJpdG1hcCwgdHJhY2tTZXR0aW5ncylcbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ2NvbnZlcnQnKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgICclYyAnLFxuICAgIC8vICAgJ2ZvbnQtc2l6ZTozODRweDsgYmFja2dyb3VuZDp1cmwoJytibG9iKycpIG5vLXJlcGVhdDsnXG4gICAgLy8gKTtcblxuICAgIC8vICAgY29uc29sZS50aW1lRW5kKCdibG9iJyk7XG4gICAgcG9zdE1lc3NhZ2UoeyBiYXNlNjQsIGJpdG1hcCB9LCBbYml0bWFwXSk7XG4gICAgLy8gdmlkZW9GcmFtZTIuY2xvc2UoKTtcbiAgfVxuICBmcmFtZUZyb21DYW1lcmEuY2xvc2UoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29udmVydChpbWFnZSwgdHJhY2tTZXR0aW5ncykge1xuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRyYWNrU2V0dGluZ3M7XG5cbiAgY29uc3Qgb2Zmc2NyZWVuU21hbGwgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGNvbnN0IGNvbnRleHQgPSBvZmZzY3JlZW5TbWFsbC5nZXRDb250ZXh0KCcyZCcpO1xuXG4gIC8vIGNvbnNvbGUudGltZSgnYnVmZmVyJyk7XG4gIC8vIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGZyYW1lRnJvbUNhbWVyYS5hbGxvY2F0aW9uU2l6ZSgpKTtcbiAgLy8gbGV0IGxheW91dCA9IGF3YWl0IGZyYW1lRnJvbUNhbWVyYS5jb3B5VG8oYnVmZmVyKTtcbiAgLy8gY29uc29sZS50aW1lRW5kKCdidWZmZXInKTtcblxuICBpZiAoY29udGV4dCkge1xuICAgIGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgLy8gbGV0IHZpZGVvRnJhbWUyID0gZnJhbWVGcm9tQ2FtZXJhLmNsb25lKCk7XG4gICAgY29uc29sZS53YXJuKGltYWdlKTtcbiAgICAvLyAgIGNyZWF0ZUltYWdlQml0bWFwKCk7XG5cbiAgICAvLyBjb25zb2xlLnRpbWUoJ2NsZWFyJyk7XG4gICAgLy8gY29udGV4dC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgLy8gY29uc29sZS50aW1lRW5kKCdjbGVhcicpO1xuXG4gICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApO1xuICAgIC8vIGNvbnRleHQuZHJhd0ltYWdlKGJpdCwgMCwgMCk7XG4gICAgLy8gaW1hZ2UuY2xvc2UoKTtcbiAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ2RyYXdCJyk7XG4gICAgY29uc29sZS50aW1lKCdibG9iMicpO1xuICAgIGNvbnN0IHJlc2l6ZWQgPSBhd2FpdCBvZmZzY3JlZW5TbWFsbC5jb252ZXJ0VG9CbG9iKHtcbiAgICAgIHR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICB9KTtcbiAgICBjb25zb2xlLnRpbWVFbmQoJ2Jsb2IyJyk7XG5cbiAgICAvLyBpbWFnZS5jbG9zZSgpO1xuICAgIC8vIGNvbnNvbGUudGltZSgnYmFzZTY0Jyk7XG4gICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgYmxvYlRvQmFzZTY0KHJlc2l6ZWQpO1xuXG4gICAgLy8gY29uc29sZS5sb2coYmxvYik7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgICclYyAnLFxuICAgIC8vICAgJ2ZvbnQtc2l6ZTozODRweDsgYmFja2dyb3VuZDp1cmwoJyArIGJhc2U2NCArICcpIG5vLXJlcGVhdDsnXG4gICAgLy8gKTtcblxuICAgIC8vICBjb25zb2xlLnRpbWVFbmQoJ2Jhc2U2NCcpO1xuICAgIC8vcG9zdE1lc3NhZ2UoeyB0eXBlOiAnY29udmVydCcsIGJhc2U2NCB9KTtcbiAgfVxufVxuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGEgfSkgPT4ge1xuICBjb25zdCB7IHR5cGUsIGltYWdlLCBmcmFtZVN0cmVhbSwgdHJhY2tTZXR0aW5ncyB9ID0gZGF0YTtcbiAgLy8gY29uc29sZS5sb2coZGF0YSk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgIHJlYWRTdHJlYW0gPSB0cnVlO1xuICAgICAgcGFyc2VGcmFtZShmcmFtZVN0cmVhbSwgdHJhY2tTZXR0aW5ncyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2Zhc3QnOlxuICAgICAgcmVhZFN0cmVhbSA9IHRydWU7XG4gICAgICBwYXJzZUZyYW1lRmFzdChmcmFtZVN0cmVhbSwgdHJhY2tTZXR0aW5ncyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3N0b3AnOlxuICAgICAgY29uc29sZS53YXJuKCdTVE9QIFdPUktFUicpO1xuICAgICAgcmVhZFN0cmVhbSA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb252ZXJ0JzpcbiAgICAgIGNvbnZlcnQoaW1hZ2UsIHRyYWNrU2V0dGluZ3MpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgLy8gY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgLy8gaWYgKGRhdGEuY2FudmFzKSB7XG4gIC8vICAgcG9zdE1lc3NhZ2UoJ29rJyk7XG4gIC8vIH0gZWxzZSB7XG5cbiAgLy8gICBwb3N0TWVzc2FnZShyZXNwb25zZSk7XG4gIC8vIH1cbn0pO1xuYDtcbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { WebcamModule } from './webcam/webcam.module';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class CoreComponentsModule {
|
|
6
|
+
}
|
|
7
|
+
CoreComponentsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CoreComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
8
|
+
CoreComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: CoreComponentsModule, imports: [CommonModule, WebcamModule], exports: [WebcamModule] });
|
|
9
|
+
CoreComponentsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CoreComponentsModule, imports: [CommonModule, WebcamModule, WebcamModule] });
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CoreComponentsModule, decorators: [{
|
|
11
|
+
type: NgModule,
|
|
12
|
+
args: [{
|
|
13
|
+
imports: [CommonModule, WebcamModule],
|
|
14
|
+
declarations: [],
|
|
15
|
+
exports: [WebcamModule],
|
|
16
|
+
}]
|
|
17
|
+
}] });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL2NvbXBvbmVudHMubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFPdEQsTUFBTSxPQUFPLG9CQUFvQjs7aUhBQXBCLG9CQUFvQjtrSEFBcEIsb0JBQW9CLFlBSnJCLFlBQVksRUFBRSxZQUFZLGFBRTFCLFlBQVk7a0hBRVgsb0JBQW9CLFlBSnJCLFlBQVksRUFBRSxZQUFZLEVBRTFCLFlBQVk7MkZBRVgsb0JBQW9CO2tCQUxoQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUM7b0JBQ3JDLFlBQVksRUFBRSxFQUFFO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgV2ViY2FtTW9kdWxlIH0gZnJvbSAnLi93ZWJjYW0vd2ViY2FtLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFdlYmNhbU1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW10sXG4gIGV4cG9ydHM6IFtXZWJjYW1Nb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3JlQ29tcG9uZW50c01vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container class for a captured webcam image
|
|
3
|
+
* @author basst314, davidshen84
|
|
4
|
+
*/
|
|
5
|
+
export class WebcamImage {
|
|
6
|
+
constructor(imageAsDataUrl, mimeType, imageData, resized) {
|
|
7
|
+
this._mimeType = mimeType;
|
|
8
|
+
this._imageAsDataUrl = imageAsDataUrl;
|
|
9
|
+
this._imageData = imageData;
|
|
10
|
+
this._imageResized = resized;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Extracts the Base64 data out of the given dataUrl.
|
|
14
|
+
* @param dataUrl the given dataUrl
|
|
15
|
+
* @param mimeType the mimeType of the data
|
|
16
|
+
*/
|
|
17
|
+
static getDataFromDataUrl(dataUrl, mimeType) {
|
|
18
|
+
return dataUrl.replace(`data:${mimeType};base64,`, '');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the base64 encoded image data
|
|
22
|
+
* @returns base64 data of the image
|
|
23
|
+
*/
|
|
24
|
+
get imageAsBase64() {
|
|
25
|
+
return this._imageAsBase64
|
|
26
|
+
? this._imageAsBase64
|
|
27
|
+
: (this._imageAsBase64 = WebcamImage.getDataFromDataUrl(this._imageAsDataUrl, this._mimeType));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the encoded image as dataUrl
|
|
31
|
+
* @returns the dataUrl of the image
|
|
32
|
+
*/
|
|
33
|
+
get imageAsDataUrl() {
|
|
34
|
+
return this._imageAsDataUrl;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the ImageData object associated with the canvas' 2d context.
|
|
38
|
+
* @returns the ImageData of the canvas's 2d context.
|
|
39
|
+
*/
|
|
40
|
+
get imageData() {
|
|
41
|
+
return this._imageData;
|
|
42
|
+
}
|
|
43
|
+
get imageResized() {
|
|
44
|
+
return this._imageResized;
|
|
45
|
+
}
|
|
46
|
+
get dataUrl() {
|
|
47
|
+
const canvas = document.createElement('canvas');
|
|
48
|
+
const { width, height } = this._imageData;
|
|
49
|
+
canvas.width = width;
|
|
50
|
+
canvas.height = height;
|
|
51
|
+
const ctx = canvas.getContext('2d');
|
|
52
|
+
if (ctx) {
|
|
53
|
+
ctx.putImageData(this._imageData, 0, 0);
|
|
54
|
+
}
|
|
55
|
+
return canvas.toDataURL(this._mimeType, 1);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLWltYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2NvcmUvY29tcG9uZW50cy93ZWJjYW0vZG9tYWluL3dlYmNhbS1pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUN0QixZQUNFLGNBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLFNBQW9CLEVBQ3BCLE9BQVk7UUFFWixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBU0Q7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFlLEVBQUUsUUFBZ0I7UUFDakUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsUUFBUSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjO1lBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYztZQUNyQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDbkQsSUFBSSxDQUFDLGVBQWUsRUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FDZixDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEQsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRXZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxHQUFHLEVBQUU7WUFDUCxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250YWluZXIgY2xhc3MgZm9yIGEgY2FwdHVyZWQgd2ViY2FtIGltYWdlXG4gKiBAYXV0aG9yIGJhc3N0MzE0LCBkYXZpZHNoZW44NFxuICovXG5leHBvcnQgY2xhc3MgV2ViY2FtSW1hZ2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaW1hZ2VBc0RhdGFVcmw6IHN0cmluZyxcbiAgICBtaW1lVHlwZTogc3RyaW5nLFxuICAgIGltYWdlRGF0YTogSW1hZ2VEYXRhLFxuICAgIHJlc2l6ZWQ6IGFueVxuICApIHtcbiAgICB0aGlzLl9taW1lVHlwZSA9IG1pbWVUeXBlO1xuICAgIHRoaXMuX2ltYWdlQXNEYXRhVXJsID0gaW1hZ2VBc0RhdGFVcmw7XG4gICAgdGhpcy5faW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgIHRoaXMuX2ltYWdlUmVzaXplZCA9IHJlc2l6ZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9taW1lVHlwZTogc3RyaW5nO1xuICBwcml2YXRlIF9pbWFnZUFzQmFzZTY0Pzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbWFnZUFzRGF0YVVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbWFnZURhdGE6IEltYWdlRGF0YTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW1hZ2VSZXNpemVkOiBzdHJpbmc7XG5cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIEJhc2U2NCBkYXRhIG91dCBvZiB0aGUgZ2l2ZW4gZGF0YVVybC5cbiAgICogQHBhcmFtIGRhdGFVcmwgdGhlIGdpdmVuIGRhdGFVcmxcbiAgICogQHBhcmFtIG1pbWVUeXBlIHRoZSBtaW1lVHlwZSBvZiB0aGUgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RGF0YUZyb21EYXRhVXJsKGRhdGFVcmw6IHN0cmluZywgbWltZVR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiBkYXRhVXJsLnJlcGxhY2UoYGRhdGE6JHttaW1lVHlwZX07YmFzZTY0LGAsICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJhc2U2NCBlbmNvZGVkIGltYWdlIGRhdGFcbiAgICogQHJldHVybnMgYmFzZTY0IGRhdGEgb2YgdGhlIGltYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlQXNCYXNlNjQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faW1hZ2VBc0Jhc2U2NFxuICAgICAgPyB0aGlzLl9pbWFnZUFzQmFzZTY0XG4gICAgICA6ICh0aGlzLl9pbWFnZUFzQmFzZTY0ID0gV2ViY2FtSW1hZ2UuZ2V0RGF0YUZyb21EYXRhVXJsKFxuICAgICAgICAgIHRoaXMuX2ltYWdlQXNEYXRhVXJsLFxuICAgICAgICAgIHRoaXMuX21pbWVUeXBlXG4gICAgICAgICkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZW5jb2RlZCBpbWFnZSBhcyBkYXRhVXJsXG4gICAqIEByZXR1cm5zIHRoZSBkYXRhVXJsIG9mIHRoZSBpbWFnZVxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUFzRGF0YVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbWFnZUFzRGF0YVVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEltYWdlRGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYW52YXMnIDJkIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHRoZSBJbWFnZURhdGEgb2YgdGhlIGNhbnZhcydzIDJkIGNvbnRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlRGF0YSgpOiBJbWFnZURhdGEge1xuICAgIHJldHVybiB0aGlzLl9pbWFnZURhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGltYWdlUmVzaXplZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbWFnZVJlc2l6ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFVcmwoKSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuX2ltYWdlRGF0YTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4LnB1dEltYWdlRGF0YSh0aGlzLl9pbWFnZURhdGEsIDAsIDApO1xuICAgIH1cblxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKHRoaXMuX21pbWVUeXBlLCAxKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export class WebcamInitError {
|
|
2
|
+
}
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLWluaXQtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL3dlYmNhbS9kb21haW4vd2ViY2FtLWluaXQtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGVBQWU7Q0FHM0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgV2ViY2FtSW5pdEVycm9yIHtcbiAgcHVibGljIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIHB1YmxpYyBtZWRpYVN0cmVhbUVycm9yPzphbnk7XG59XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export class WebcamMirrorProperties {
|
|
2
|
+
}
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLW1pcnJvci1wcm9wZXJ0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2NvcmUvY29tcG9uZW50cy93ZWJjYW0vZG9tYWluL3dlYmNhbS1taXJyb3ItcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sc0JBQXNCO0NBRWxDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFdlYmNhbU1pcnJvclByb3BlcnRpZXMge1xuICBwdWJsaWMgeD86IHN0cmluZzsgIC8vIFtcImF1dG9cIiwgXCJhbHdheXNcIiwgXCJuZXZlclwiXVxufVxuIl19
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { from, Observable } from 'rxjs';
|
|
2
|
+
import { switchMap, tap } from 'rxjs/operators';
|
|
3
|
+
export class WebcamUtil {
|
|
4
|
+
/**
|
|
5
|
+
* Lists available videoInput devices
|
|
6
|
+
* @returns a list of media device info.
|
|
7
|
+
*/
|
|
8
|
+
static getAvailableVideoInputs() {
|
|
9
|
+
return new Observable((observer) => {
|
|
10
|
+
if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
|
|
11
|
+
return observer.error(null);
|
|
12
|
+
}
|
|
13
|
+
const _window = window;
|
|
14
|
+
let streams;
|
|
15
|
+
from(navigator.mediaDevices.getUserMedia({
|
|
16
|
+
video: { deviceId: undefined },
|
|
17
|
+
}))
|
|
18
|
+
.pipe(tap((s) => { streams = s; }), switchMap((s) => from(navigator.mediaDevices.enumerateDevices())))
|
|
19
|
+
.subscribe((devices) => {
|
|
20
|
+
// console.log(streams);
|
|
21
|
+
if (streams) {
|
|
22
|
+
streams.getTracks().forEach((track) => {
|
|
23
|
+
track.stop();
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
observer.next(devices.filter((device) => device.kind === 'videoinput'));
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
// return new Promise((resolve, reject) => {
|
|
30
|
+
// navigator.mediaDevices.getUserMedia({
|
|
31
|
+
// video: undefined,
|
|
32
|
+
// });
|
|
33
|
+
// navigator.mediaDevices
|
|
34
|
+
// .enumerateDevices()
|
|
35
|
+
// .then((devices: MediaDeviceInfo[]) => {
|
|
36
|
+
// resolve(
|
|
37
|
+
// devices.filter(
|
|
38
|
+
// (device: MediaDeviceInfo) => device.kind === 'videoinput'
|
|
39
|
+
// )
|
|
40
|
+
// );
|
|
41
|
+
// })
|
|
42
|
+
// .catch((err) => {
|
|
43
|
+
// reject(err.message || err);
|
|
44
|
+
// });
|
|
45
|
+
// });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL3dlYmNhbS91dGlsL3dlYmNhbS51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFNLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEQsTUFBTSxPQUFPLFVBQVU7SUFDckI7OztPQUdHO0lBRUksTUFBTSxDQUFDLHVCQUF1QjtRQUNuQyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFO2dCQUN2RSxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0I7WUFDRCxNQUFNLE9BQU8sR0FBUSxNQUFNLENBQUM7WUFDakMsSUFBSSxPQUFZLENBQUM7WUFDWixJQUFJLENBQ0YsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQ2xDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7YUFDL0IsQ0FBQyxDQUNIO2lCQUNFLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFFLE9BQU8sR0FBRyxDQUFDLENBQUEsQ0FBQSxDQUFDLENBQUMsRUFDekIsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDZCxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQ2hELENBQ0Y7aUJBQ0EsU0FBUyxDQUFDLENBQUMsT0FBMEIsRUFBRSxFQUFFO2dCQUMxQyx5QkFBeUI7Z0JBRXZCLElBQUksT0FBTyxFQUFFO29CQUNYLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTt3QkFDekMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNmLENBQUMsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELFFBQVEsQ0FBQyxJQUFJLENBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FDWixDQUFDLE1BQXVCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUMxRCxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsNENBQTRDO1FBQzVDLDBDQUEwQztRQUMxQyx3QkFBd0I7UUFDeEIsUUFBUTtRQUNSLDJCQUEyQjtRQUMzQiwwQkFBMEI7UUFDMUIsOENBQThDO1FBQzlDLGlCQUFpQjtRQUNqQiwwQkFBMEI7UUFDMUIsc0VBQXNFO1FBQ3RFLFlBQVk7UUFDWixXQUFXO1FBQ1gsU0FBUztRQUNULHdCQUF3QjtRQUN4QixvQ0FBb0M7UUFDcEMsVUFBVTtRQUNWLE1BQU07SUFDUixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJjYW1VdGlsIHtcbiAgLyoqXG4gICAqIExpc3RzIGF2YWlsYWJsZSB2aWRlb0lucHV0IGRldmljZXNcbiAgICogQHJldHVybnMgYSBsaXN0IG9mIG1lZGlhIGRldmljZSBpbmZvLlxuICAgKi9cblxuICBwdWJsaWMgc3RhdGljIGdldEF2YWlsYWJsZVZpZGVvSW5wdXRzKCk6IE9ic2VydmFibGU8TWVkaWFEZXZpY2VJbmZvW10+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBpZiAoIW5hdmlnYXRvci5tZWRpYURldmljZXMgfHwgIW5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcykge1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IobnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBfd2luZG93OiBhbnkgPSB3aW5kb3c7XG4gbGV0IHN0cmVhbXM6IGFueTtcbiAgICAgIGZyb20oXG4gICAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcbiAgICAgICAgICB2aWRlbzogeyBkZXZpY2VJZDogdW5kZWZpbmVkIH0sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgocykgPT4ge3N0cmVhbXMgPSBzfSksXG4gICAgICAgICAgc3dpdGNoTWFwKChzKSA9PlxuICAgICAgICAgICAgZnJvbShuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZGV2aWNlczogTWVkaWFEZXZpY2VJbmZvW10pID0+IHtcbiAgICAgICAgLy8gIGNvbnNvbGUubG9nKHN0cmVhbXMpO1xuXG4gICAgICAgICAgaWYgKHN0cmVhbXMpIHtcbiAgICAgICAgICAgIHN0cmVhbXMuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodHJhY2s6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChcbiAgICAgICAgICAgIGRldmljZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZGV2aWNlOiBNZWRpYURldmljZUluZm8pID0+IGRldmljZS5raW5kID09PSAndmlkZW9pbnB1dCdcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgLy8gICAgIHZpZGVvOiB1bmRlZmluZWQsXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIG5hdmlnYXRvci5tZWRpYURldmljZXNcbiAgICAvLyAgICAgLmVudW1lcmF0ZURldmljZXMoKVxuICAgIC8vICAgICAudGhlbigoZGV2aWNlczogTWVkaWFEZXZpY2VJbmZvW10pID0+IHtcbiAgICAvLyAgICAgICByZXNvbHZlKFxuICAgIC8vICAgICAgICAgZGV2aWNlcy5maWx0ZXIoXG4gICAgLy8gICAgICAgICAgIChkZXZpY2U6IE1lZGlhRGV2aWNlSW5mbykgPT4gZGV2aWNlLmtpbmQgPT09ICd2aWRlb2lucHV0J1xuICAgIC8vICAgICAgICAgKVxuICAgIC8vICAgICAgICk7XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgLy8gICAgICAgcmVqZWN0KGVyci5tZXNzYWdlIHx8IGVycik7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH0pO1xuICB9XG59XG4iXX0=
|